网络分层模型及协议简介
1.OSI七层模型和TCP/IP四层模型
从应用程序的角度出发,主要掌握TCP/IP模型。
OSI七层模型:物数网传会表应
(1)物理层:主要定义物理设备标准,如网线的接口类型、光纤的接口类型、各种传输介质的传输速率等。它的主要作用是传输比特流(就是由1、0转化为电流强弱来进行传输,到达目的地后再转化为1、0,也就是我们常说的数模转换与模数转换)。这一层的数据叫做比特。
(2)数据链路层:定义了如何让格式化数据以帧为单位进行传输,以及如何让控制对物理介质的访问。这一层通常还提供错误检测和纠正,以确保数据的可靠传输
。如:串口通信中使用到的115200、8、N、1。
(3)网络层:在位于不同地理位置的网络中的两个主机系统之间提供连接和路径选择。Internet的发展使得从世界各站点访问信息的用户数大大增加,而网络层正是管理这种连接的层。
(4)传输层:定义了一些传输数据的协议和端口号
(WWW端口80等),如:TCP(传输控制协议,传输效率低,可靠性强,用于传输可靠性要求高,数据量大的数据),UDP(用户数据报协议,与TCP特性恰恰相反,用于传输可靠性要求不高,数据量小的数据,如QQ聊天数据就是通过这种方式传输的)。 主要是将从下层接收的数据进行分段和传输,到达目的地址后再进行重组。常常把这一层数据叫做段。
(5)会话层:通过传输层(端口号:传输端口与接收端口)建立数据传输的通路。主要在你的系统之间发起会话或者接受会话请求(设备之间需要互相认识可以是IP也可以是MAC或者是主机名)。
(6)表示层:可确保一个系统的应用层所发送的信息可以被另一个系统的应用层读取。例如,PC程序与另一台计算机进行通信,其中一台计算机使用扩展二一十进制交换码(EBCDIC),而另一台则使用美国信息交换标准码(ASCII)来表示相同的字符。如有必要,表示层会通过使用一种通格式来实现多种数据格式之间的转换。
(7)应用层:是最靠近用户的OSI层。这一层为用户的应用程序(例如电子邮件、文件传输和终端仿真)提供网络服务。
2.通信过程
两台计算机通过TCP/IP协议通讯的过程如下所示:
当用户A要通过网络给用户B发送消息(数据)时,必须先进行逐层封装,才能进行发送。假如有数据Data,则用户A必须对数据段依次封装应用层协议,传输层协议,网络层协议,最后封装链路层(头和尾),这样封装过的数据才能正常的通过网络进行传输。当然,当用户B接收到消息时,需要对接收到的数据一层一层的去掉,得到数据Data。
3. 数据包的封装过程
传输层及其以下的机制由内核提供,应用层由用户进程提供(后面将介绍如何使用socket API编写应用程序),应用程序对通讯数据的含义进行解释,而传输层及其以下处理通讯的细节,将数据从一台计算机通过一定的路径发送到另一台计算机。应用层数据通过协议栈发到网络上时,每层协议都要加上一个数据首部(header),称为封装(Encapsulation),如下图所示:
不同的协议层对数据包有不同的称谓,在传输层叫做段(segment),在网络层叫做数据报(datagram),在链路层叫做帧(frame)。数据封装成帧后发到传输介质上,到达目的主机后每层协议再剥掉相应的首部,最后将应用层数据交给应用程序处理。
4.路由器寻路一般思想
数据报在通信过程中的处理,经过路由器的时候会进行半解包,再打包,如此循环,直到最后达到端B进行数据报全解包取出数据报中封装的数据。
半解包是去掉以太网帧和网络层,根据目的IP(目的IP封装在IP段(网络层)中),通过路由器的路由表(每个路由结点都有一个路由表,记录路由节点信息,如与之相连的路由器等)进行寻路。
其中,源路由和目的路由建立通信的过程中,要用到ARP协议,来获取目的路由的MAC地址,从而建立起通信。
总之,整个数据报的传输过程就是一个一步一步往前摸索的方式。
Note:TCP进行一次寻路,之后的数据报就会顺着之前的路进行传输;而UDP每次传输数据报都需要进行寻路。因此相比而言,TCP更加稳定。
Note1:对于上图的说明,当封装好的数据包在网络中传输需要进行路由寻路(可能会经历N个路由器)时,均要进行半解包(即,只去掉以太网帧头、帧尾以及IP段段头),从而根据ARP协议及下一跳路由器的MAC地址,从而与下一跳路由器建立通信,完成数据传输。
Note2:对于以上去掉以太网帧头、帧尾、IP段段头的具体说明,①先去掉以太网帧头、帧尾,可以得到IP数据段,利用ARP协议,进行ARP请求,获得下一跳路由的MAC地址;② 再去掉IP数据段段头,可以得到IP段的数据,即目的IP地址,以判断是否已经寻路结束,达到目的IP。
Note3:源端到目的端的传输最长生命周期为TTL
,单位为1跳。
原因:因为数据报在网络中传输的过程中,可以会因为网络断开的问题,使得数据报在路由器之间不断的循环,从而导致网络拥塞
。这时,设置TTL就可以避免这种问题出现,如果数据报在路由器之间的跳数达到上限(也即TTL),就将此数据报丢弃
。
关于TTL举个例子:源主机为数据包设定一个生存时间,比如64,每过一个路由器就把该值减1,如果减到0就表示路由已经太长了仍然找不到目的主机的网络,就丢弃该包,因此这个生存时间的单位不是秒,而是跳(hop)。
5.以太网帧格式(网络接口层)
以太网帧格式如下所示:
其中的源地址和目的地址是指网卡的硬件地址(也叫MAC地址),长度是48位,是在网卡出厂时固化的。可在shell中使用ifconfig
命令查看,“HWaddr 00:15:F2:14:9E:3F”部分就是硬件地址。协议字段有三种值,分别对应IP、ARP、RARP。帧尾
是CRC校验码。
以太网帧中的数据长度规定最小46字节,最大1500字节,ARP和RARP数据包的长度不够46字节,要在后面补填充位(PAD)。最大值1500称为以太网的最大传输单元(MTU),不同的网络类型有不同的MTU,如果一个数据包从以太网路由到拨号链路上,数据包长度大于拨号链路的MTU,则需要对数据包进行分片(fragmentation)。ifconfig命令输出中也有“MTU:1500”。注意,MTU这个概念指数据帧中有效载荷的最大长度,不包括帧头长度。
Note1:所谓MAC地址也就是网卡的编号,对于每台电脑来说是唯一的标识。
Note2:ARP协议报中的18字节是为了填充,没有实际意义。因为IP数据报的最小字节数为46。
Note3:以太网帧格式是整个数据报封装的最外层。
6.ARP协议报格式
本质:ARP协议主要是获取下一跳数据报要投递的路由的MAC地址。
作用:主要为以太网帧获取需要的目的MAC地址。
在网络通讯时,源主机的应用程序知道目的主机的IP地址和端口号,却不知道目的主机的硬件地址,而数据包首先是被网卡接收到再去处理上层协议的,如果接收到的数据包的硬件地址与本机不符,则直接丢弃。因此在通讯前必须获得目的主机的硬件地址。ARP协议就起到这个作用。源主机发出ARP请求,询问“IP地址是192.168.0.1的主机的硬件地址是多少”,并将这个请求广播到本地网段(以太网帧首部的硬件地址填FF:FF:FF:FF:FF:FF表示广播),目的主机接收到广播的ARP请求,发现其中的IP地址与本机相符,则发送一个ARP应答数据包给源主机,将自己的硬件地址填写在应答包中。
每台主机都维护一个ARP缓存表,可以用arp -a命令查看。缓存表中的表项有过期时间(一般为20分钟),如果20分钟内没有再次使用某个表项,则该表项失效,下次还要发ARP请求来获得目的主机的硬件地址。
ARP数据报的格式如下所示:
7.IP段格式(网络层)
4位版本号记录IPV4或者IPV6;4位首部长度记录首部长度;8位生存时间(TTL,Time to live)记录能够经过的最大跳数,2=256跳。还有存32位(4字节)的源IP地址,32位(4字节)的目的IP地址。
IP地址如192.168.24.54为点分十进制形式,即字符串。在程序中不能用这种方式传输,要转换为数值类型(unsigned int)。
Note1:IP段格式相对于以太网帧来说,就是以太网帧的数据部分。
原因:数据的封装从里面到外面的顺序是 应用层,传输层,网络层,网络接口层。
Note2:IP段首部中的32位源IP地址和32位的目的IP地址分别是数据报起始IP和数据报的终止IP。
8.UDP数据报(传输层)
备注:IP地址是为了正确寻找到目的端,而端口号的为了能够正确寻找到目的端的相应进程。
9.TCP数据报(传输层)
与UDP协议一样也有源端口号和目的端口号,通讯的双方由IP地址和端口号标识。32位序号、32位确认序号、窗口大小稍后详细解释。4位首部长度和IP协议头类似,表示TCP协议头的长度,以4字节为单位,因此TCP协议头最长可以是4x15=60字节,如果没有选项字段,TCP协议头最短20字节。URG、ACK、PSH、RST、SYN、FIN是六个控制位,本节稍后将解释SYN、ACK、FIN、RST四个位,其它位的解释从略。
10.NAT映射
所谓NAT映射,也就是与终端连接的路由器中有一个NAT映射表用来记录与路由器连接的各终端的IP映射信息,从而实现通过映射后的IP地址与服务器或者其他终端的通信。
Note1:路由器中不仅存在路由表,还有NAT映射表,记录当前所有连接到该路由器的局域IP地址和公网IP地址的对应关系
。
Note2:192.168. . 为局域网IP,在公网中是不可见的。
Note3:路由器对于外网来说只有一个公有IP,对于连接在路由器上的各终端来说有n个私有IP。
Note4:因为私有IP在公网中是不可见的,所以才需要NAT映射机制将私有IP与公网IP之间建立映射关系,从而达到与公网IP通信的目的。
11.打洞机制
中间服务器为两端的客户端建立一条通道,使得两个客户端能够进行通信。目的是为了提高客户端之间数据传输的效率。
12.总结
公网IP–公网IP:直接访问
公网IP–私网IP:NAT映射
私网IP–公网IP:NAT映射
私网IP–私网IP:NAT映射和打洞机制
局域网中的私网IP–私网IP:直接访问