浅显易懂地讲述OSI参考模型、TCP、UDP

 

 

如果不想看相关知识点,直接跳到第七

一、网络

1.概念

这里的网络指的是计算机网络,计算机网络就是通过通信线路将多台有独立功能的计算机连接起来的一种组织形式,通过网络计算机就能够相互传递信息。

2.网络三要素

  1. 可以共享的某些资源–网络服务(NetworkServices)。
  2. 保证相互接触的通道–传输介质(TransmissionMedia)。
  3. 保证通信的规则–协议(Protocols)。

3.网络的分类

局域网(LAN)

LAN全称Local Area Network
特点
范围小,一般覆盖范围为10公里以内数据传输速率高,速率为10Mbps~100Mbps,少部分可以达到1000Mbps,协议简单,传输媒介可以是有线的也可以是无线的,建网成本低
想我们常连的wifi也是属于局域网

域域网(MAN)

MAN全程Metropolitan Area Network,域域网又称都会网域
特点
范围比局域网的大,一般覆盖范围为10~100公里,大概能覆盖一个城市,数据传输速率为100Mbps以上,传输媒介主要采用光缆,建网成本较高
城域网中所有城市网络设备,光缆建设等工作,都是由中国的三大运营商(电信、移动、联通)来建设的

广域网(WAN)

WAN全称Wide Area Network
范围比域域网的大,覆盖范围100~1000公里,广域网能够连接多个地区、城市、国家,传输媒介主要是电话线或光纤,建网成本高

区别

从其他地方截了个图,很好的解释三个网之间的关系,如果以前我能看到这个图,我就不会搞不懂OSI参考模型了
在这里插入图片描述
我们连上一个wifi,然后发出一个信息,信息传输的路线是这样的:手机》局域网》域域网》广域网》域域网》局域网》手机
所以这三个网之间并不是独立存在的,而是一个套着一个的

国际互联网(Internet)

国际互联网简称因特网,也被成为world wide web,
范围更大,传输速率更快,建网成本更高
国际互联网是世界上最大计算机网络,它由世界各地计算机网络组成,一旦进入internet就可以与世界各地的计算机进行通信,但是目前中国境内不能对国际互联网的访问

二、OSI参考模型

OSI参考模型一共有七层,由低层至高层分别为:物理层、数据链路层、网络层、传输层、会话层、表示层、应用层,其中会话层、表示层、应用层在OSI参考模型中属于高层
资源子网:传输层、会话层、表示层、应用层
通信子网:物理层、数据链路层、网络层
OSI参考模型只是一种参考,是帮助我们理解网络构成的工具

我觉得还是从最高层往下讲会比较清晰一点

7.应用层

应用层是OSI参考模型中的最高层,在这一层中为应用程序提供网络接口,让程序能够使用网络服务,该层的数据传输单位为数据,也可以称为报文。
常见协议:
HTTP、SMTP、POP3、TELNET、SNMP、FTP、DHCP、TFTP
常见设备:
应用程序

6.表示层

表示层主要功能是提供数据格式转换服务,统一数据的表现形式,能够把应用层的数据转换成统一的数据格式,该层的数据传输单位为数据
常见协议:
TIFF,GIF,JPEG,PICT,ASCII,EBCDIC,encryption
常见设备:
应用程序

5.会话层

会话层为不同设备的应用程序之间提供访问验证和会话管理的服务,相当于为不同设备上的应用程序提供一个长连接,该层的数据传输单位为数据
常见协议:
RPC,SQL,NFS,NetBIOS,names,AppleTalk
常见设备:
应用程序

4.传输层

传输层是OSI参考模型中最重要的一层,它是连接通信子网(1、2、3)和资源子网(5、6、7)的桥梁,属于通信功能中的最高层,用户功能中的最低层,传输层建立主机端到端的链接,为上层协议提供端到端的可靠和透明的数据传输服务,还有处理数据包错误、数据包次序等功能,传输层的数据传输单位为数据报(UDP)/数据段(TCP)
常见协议:
TCP,UDP,SPX
常见设备:
进程、端口

3.网络层

网络层是OSI参考模型中最复杂的一层,是通信子网的最高层,网络层通过IP寻址来建立两个端之间的链接,它会通过路由算法,在通信子网中选择一条合适的路径。网络层屏蔽了通信子网的细节,向上层提供了一致的服务只要提供IP地址就能够找到对应的端口网络层的数据传输单位为数据包/报文分组
常见协议:
IP,IPX,AppleTalk DDP
常见设备:
路由器、防火墙

2.数据链路层

数据链路层是OSI参考模型的第二层,它把物理层的原始数据打包成帧,完成网络之间相邻节点的可靠传输。数据链路层向网络层屏蔽物理层,提供数据传输服务数据链路层传输数据的基本单位是帧
常见协议:
Frame Relay,HDLC,PPP, IEEE 802.3/802.2
常见设备:
网卡、网桥、交换机

1.物理层

物理层是OSI参考模型的最底层,为数据端设备提供传送数据的通路,完成相邻节点之间比特流的传输物理层传输数据的基本单位是比特
特点:
机械特性性、电气特性、功能特性、规程特性
常见协议:
EIA/TIA-232, EIA/TIA-499,V.35, V.24,RJ45, Ethernet, 802.3
常见设备:
中继器、集线器、RJ-45接口 和5类线(网线),RJ-11插口(电话线)
总的来说,所有网络中的传输都会落实到物理层的传输上,真正干活的只有物理层

划分原则

  1. 所有的上层都是使用下层提供的服务,为上层提供的服务
  2. 每一层的分工明确,职责单一
  3. 每个层次的接口清晰

七层模型传输数据过程

从其他地方截了个图,这是比较简单的七层模型结构,但是实际上,只有资源子网的三层才会是简单的一层套一层,而通信子网之间的结构就没有这么简单了,在通信子网中,高层往往是包含着下层的

像我们的电脑就已经具备了六层模型,我们只需要插上网线或者连上wifi,就可以有完整的七层模型,然后通过传输媒介发生请求到路由器上,路由器通过网线和其他路由器或者运营商提供的端口连接,再转发请求
在这里插入图片描述
可以看出这七层模型都是在做打包和解包数据

三、IP地址的分类

在互联网中,IP地址是每一台电脑的唯一标识
这里普及IP地址的分类
IP地址的长度是四个字节(三十二位)

网络类型ip地址范围(点分十进制)子网掩码(点分十进制)私有ip地址范围(点分十进制)用途
A类 0.0.0.0~127.255.255.255 255.0.0.0 10.0.0.0~10.255.255.255 /127.0.0.0~127.255.255.255 大型网络
B类 128.0.0.0~191.255.255.255 255.255.0.0 172.16.0.0~172.31.255.255 中等规模网络
C类 192.0.0.0~223.255.255.255 255.255.255.0 192.168.0.0~192.168.255.255 小型网络
D类 224.0.0.0~239.255.255.255     多路广播用户
E类 240.0.0.1~ 255.255.255.254     保留地址

子网掩码是用来标识每个ip地址中对应网络地址的32位二进制数
A类地址的第一个字节为网络号,其余为主机号,网络号第一位为0
B类地址的前两个字节为网络号,其余为主机号,网络号前两位为10
C类地址的前三个字节为网络号,其余为主机号,网络号前三位为110
D类地址,前四位为1110
E类地址,前五位为11110

网络地址,主机号全为0,广播地址,主机号全为1,这两个地址是不可用的

四、TCP

我们要实现网络编程,肯定不可能从物理层、数据链路层、网络层开始,所以我们要跟应用程序一个起点,从传输层开始

1.概念

TCP全称Transmission Control Protocol,是面向连接的通信协议,不同的应用程序通过TCP协议可以在”握手“之后,建立一个可靠的全双工的链接,然后通过这个链接相互传递数据

2.TCP报文格式

这里只做一个大概的了解,想深入了解的可以去搜TCP报文格式
在这里插入图片描述

3.TCP三次握手

三次握手就是客户端向服务端建立可靠连接的一个过程,在这个过程中客户端和服务端总共发送了三个包,在Socket编程中由客户端的connect方法来触发

这里放一张从别的地方截过来的图,这里不对三次握手中的数据详细讲解,有兴趣的可以直接搜TCP三次握手
在这里插入图片描述
进行三次握手是为了确保双方都能够收到对方传来的信息,然后建立一个可靠的全双工通信链接
用打电话的例子来总结一下TCP三次握手
C打电话给S
C:你好,我是C,你听的到吗?
S:我听得到,你是C是吧,我是S,你听的到吗?
C:S,你好,我听得到,那我们开始通话吧。
S/C:·····

4.TCP四次挥手

四次挥手就是在数据传输完成之后,由客户端向服务端发起断开连接的一个过程,在这个过程中客户端和服务端总共发送了四个包,在Socket编程中由客户端的close方法来触发

这里放一张从别的地方截过来的图,这里不对四次挥手中的数据详细讲解,有兴趣的可以直接搜TCP四次挥手
在这里插入图片描述
同样也是用打电话的例子来做一个总结
C和S一直保持着通信,当C想要挂断电话了
C:我要挂断电话了,你还有什么要说的吗?
S:我听到了,让我想想还有什么要说的
S:我也没什么要说的了,挂断电话吧
C:好,挂了吧

可以看出在TCP三次握手和TCP四次挥手中,都是客户端主动发起的,而服务端都是被动接收和关闭的

五、UDP

1.概念

在初期的网络环境中,如果存在太多通过TCP建立的长连接的话,会给网络造成很大的压力,于是UDP就产生了。UDP(User Datagram Protocol)也是面向无连接的的通信协议,应用程序只能通过UDP协议向另一个应用程序发送数据,不能建立稳定可靠的链接,也不能保证数据的完整性

2.UDP报文格式

这里只做一个大概的了解,想深入了解的可以去搜UDP报文格式在这里插入图片描述

3.UDP和TCP的区别

  1. UDP基于无连接,TCP基于连接
  2. UDP不可靠,TCP可靠
  3. UDP不能保证数据的顺序,TCP可以保证
  4. UDP不能保证数据的完整性,TCP可以
  5. UDP比TCP开销小、速度快
  6. UDP有数据边界,TCP没有。UDP是以数据包单独发送的,而TCP是以字节流的方式发生的
  7. UDP发送数据前后没有动作。UDP没有TCP的三次握手和四次挥手

六、总结

上面就是全部理论部分的知识点了,虽然也有很多地方没有详细说明,但也不妨碍我们接下来的实操部分。
先做一个总结吧
首先是网络,我们接触到的网络一般都是局域网,当我们想要通过网络访问其他地方的数据时,我们发出的请求就会从局域网转发到域域网,如果在域域网中也找不到,就会再转发到广域网。当我们想要访问外国的数据时,就会再转发到国际互联网
其次是OSI参考模型,由低层至高层分别为:物理层、数据链路层、网络层、传输层、会话层、表示层、应用层,关注数据传输的是物理层、数据链路层、网络层、传输层,这四层的关系就像三个领导和一个员工一样,数据链路层、网络层、传输层能够处理信息和做出决定,然后一层一层下放,最后物理层来进行传输,关注应用功能的是会话层、表示层、应用层,这三层的关系就比较平等了,每一层都对数据进行处理然后交给其他层
最后是TCP和UDP,这两个协议都是位于传输层的,不想丢失数据用TCP,如果对数据传输速度有要求,又不介意少量丢包的话,就用UDP

七、java Socket网络编程

1.网络编程三要素

  1. IP地址。在网络中,IP地址是每一台计算机的唯一标识,只有通过IP地址才能找到计算机
  2. 端口。在计算机中,端口则是每个进程的标识,通过端口就能找到进程,一般进程会占用一个端口来接收外界的信息
  3. 协议。网络协议是计算机通信必须要遵守的约定,如果不遵守则不能进行通信

2.代码

需要关注的类:InetSocketAddress(封装IP地址)、Socket(套接字)、ServerSocket(服务器套接字)
Socket是使用TCP协议的
Client.java

/**
 * @author xxj
 * 客户端
 */
public class Client {
    public static void main(String[] args) throws Exception{
        //ip地址,巡回地址
        String host="127.0.0.1";
        //端口号
        int port=8080;
        //创建地址
        InetSocketAddress address=new InetSocketAddress(host,port);
        //创建socket套接字
        Socket clientSocket=new Socket();
        System.out.println("客户端socket创建完成");
        //连接
        clientSocket.connect(address);
        System.out.println("客户端已启动,ip地址为:"+host+"端口为:"+port);
        //打开输出流
        OutputStream outputStream=clientSocket.getOutputStream();
        //字节流缓存
        byte[] word=null;
        //从控制台读取数据的工具
        Scanner input = new Scanner(System.in);
        System.out.println("请输入:");
        while (true){
            if (input.hasNext()){
                //读取控制台的数据
                word=input.next().getBytes();
                if ((new String(word)).equals("关闭连接")){
                    outputStream.write(new String("客户端关闭连接").getBytes());
                    //关闭
                    outputStream.close();
                    clientSocket.close();
                    break;
                }else {
                    outputStream.write(word);
                }
                //发送完数据之后就提示
                System.out.println("请输入:");
            }
        }
    }
}

Server.java

/**
 * @author xxj
 * 服务端
 */
public class Server {
    public static void main(String[] args) throws  Exception{
        //ip地址,巡回地址
        String host="127.0.0.1";
        //端口号
        int port=8080;
        //创建地址封装类对象
        InetSocketAddress address=new InetSocketAddress(host,port);
        //服务器套接字
        ServerSocket serverSocket=new ServerSocket();
        System.out.println("服务端socket创建完成");
        //绑定地址
        serverSocket.bind(address);
        System.out.println("服务端socket绑定地址"+address.toString());
        System.out.println("服务端已启动");
        while (true){
            System.out.println("开始监听,阻塞中·····");
            Socket socket= serverSocket.accept();
            System.out.println("有客户机连接");
            InputStream inputStream= socket.getInputStream();
            byte[] word=new byte[1024];
            String str;
            while (true){
                if (inputStream.read(word)!=-1){
                    str=new String(word).trim();
                    System.out.println(str);
                    if (str.equals("客户端关闭连接")){
                        inputStream.close();
                        socket.close();
                        System.out.println("连接已断开");
                        break;
                    }
                }
            }
        }
    }
}

有兴趣可以跑一下这两个代码,有很多注释,应该也看的懂
等我有空再来实现双向通信

 

posted @ 2020-05-24 09:47  程序员徐小白  阅读(247)  评论(0)    收藏  举报