-
网络分层概览
在文章 网络协议基础概念中有提到过大致的网络分层,从这篇文章中可以知道按照国际标准是分了7层,但是按照我们实际开发按照TCP/IP协议分层总共四层,但是作为学术研究上来说最好是从五层开始分析也就是分为 物理层、数据链路层、网络层、运输层、应用层,一下文章主要就是按照这五层讲起,先看一下大致的这五层的数据形式以及分别用到的协议如下:
序号 分层 协议 数据形式 5 应用层(Application) FTP、HTTP、SMTP、DNS、DHCP 报文、用户数据 4 运输层(Transport) TCP、UDP 段(Segments) 3 网络层(Network) IP、ARP、ICMP 包(Packets) 2 数据链路层(Data Link) CSMA/CD、PPP 帧(Frames) 1 物理层(Physical) 比特流(Bits) -
物理层
物理层定义了接口标准、线缆标准、传输速率、传输方式等 通俗点说平时我们办理的宽带是电话线如何还是光纤入户,我们路由器上的接口是百兆接口还是千兆接口,设备之间传输的信号是什么信号比如电话线入户传输过来的是模拟型号然后需要调制解调器转换成数字型号然后再传输到我们的联网设备上,光纤传输的就是光信号,再比如我们使用的传输介质,有的是多条信道,有的是单工信道这些都是有物理层所决定的。
总结上述:物理层的作用其实就是解决两台服务器之间的通信问题,通过电缆(可以是光纤可以是电话线可以是网线(每种线的传输的信号又不同没传输的信道也有可能不同))在两台机器间简历一个理想的比特流传输通道
-
数据链路层
链路:从1个节点到相邻节点的一段物理线路(有线或无线),中间没有其他交换节点如下图所示:
这就算是两个链路(集线器不属于数据链路层也就是不会对数据进行处理)
数据链路:在一条链路上传输数据时,需要有对应的通信协议来控制数据的传输
上文说到物理层是解决两个机器的通信问题,数据链路层就是解决如何正确的传输,传输规则,总结一下就是解决下面是哪个问题:
- 首先要解决这个包是谁发的,然后谁去接收
- 然后就是如果大家都在发送产生混乱怎么办,谁先发谁后发的规则
- 发送的过程中出错了怎么办
先说第二个问题,学名叫做多路访问这里引用一下刘超老师在趣谈网络协议文章中举的一个例子就是车管所车辆管控的例子,解决方式有三种:
- 分多个车道,每个车道一个车,各走各的,这个再计算机网络里面叫做信道划分
- 单双号限行,这个在计算机网络里面叫做轮流协议
- 啥都不管又是就先发出,发现堵塞就回去,等错过高峰期再出发,这个叫做随机接入协议,以太网就是用的这种方式
这样就觉得了问题2
再说第三个问题之前首先要知道的是在数据链路层上会将上一层的数据也就是数据包封装成帧,然后每个帧都会有一个首部和尾部(里面包含了帧开始和结束符),接收的是一个数据流,所以这时候就通过这个帧开始符和帧结束符来判断是否是一个完整的帧如下图所示:(这里的图是引用其他博主的图)
解决第三个问题大概有以下几种方式:
- 透明传输(保证数据完整性)
使用SOH作为帧开始符
使用EOT作为帧结束符
如果数据包中间出现了EOT、SOH、ESC、字符统统进行转义也就是需要字节填充如下图所示:(这里的图是引用其他博主的图) - 差错检验
帧尾部除了有一个帧结束符还有一个FCS标识,而这个FCS是通过数据部分加上首部计算得出,接收端收到信息之后再用数据部分和首部计算和FCS做对比如果不一致这说明数据包有丢失、错误。
最后是解决第一个问题,第一个问题比较简单其实就是将目标MAC地址和源MAC地址封装在帧首部,但是如果不知道目标MAC地址这时候就需要发送一个广播地址去寻找,通俗点讲就是靠“吼”,问所有人这个IP是谁的,你的MAC地址是啥(也就是ARP协议),得到了目标MAC地址之后就封装到帧首部,这里拿以太网帧举例(如果传输技术使用的是以太网技术,封装成的帧就是以太网帧)最开始就是目标MAC地址然后是源MAC地址如下图所示:
其中CRC就是用来差错检验的
-
网络层
网络层数据包又被称为IP数据包,是由首部和数据组成的,他的数据大多都是由传输层中传递下来的。
网络层首部封装者一个比较重要的信息就是IP地址,也就是目标IP和源IP,在文章 网络基础概念中有讲过在数据的传输过程中MAC地址是有可能变的但是目标IP和源IP是始终不变的这里的地址就是指网络层首部中封装的IP地址,同样的在 路由这篇文章中也说过如果通信双方不是在同一个网段的时候,此时就会传递到网关,然后路由器开始解析数据包拿到网络层首部中封装的 IP地址,然后通过静态路由或者是动态路由找到下一跳继续传输。下图就是IP数据包的结构图如下:
由上图可知一般情况下IP数据包的首部一般都是占用20字节,当然如果有填充数据可能会更大,这里可以简单抓个包看一下一般网络请求的首部长度:
接下来就是每个字段的含义
-
版本
就是区分IP版本,ipv4还是ipv6
-
首部长度
顾名思义就是ip首部长度,占用4个字节。它标识ip首部有多少个32位长整型也就是4字节,最大是15所以ip数据包的大小最小20最大60,也就是可填充数据段有40字节
-
区分服务
用于提高网络质量
-
总长度
IP数据包的总长度,占用了16位,所以总长度最大位65535字节,也就是64KB。
上文又说到过,在数据链路层,上一层传下来的数据包被封装成帧这个帧数据部分最大只能是1500字节,而网络层的IP数据包最大的是65535字节,所以如果IP数据包超过了1500此时就需要将数据包分成片传输给数据链路层,每一片都有自己的首部(这里如果抓包的话会发现分成几片对应的就会抓到几条数据)
-
标识
数据包的ID(唯一的)在分片上传的时候会用到,但是每一片的标识都是一样的所以可以通过标识来找完整数据
如下图:
-
标志
同样的是在分片上传的时候用到,每一片的标识以一定是相同的,一共站三位
- 第一位保留位
- 第二位是否允许分片
- 第三位是否是最后一片
如下图
-
片偏移
在分片上传的时候用到,该字段标记该分片在原报文中的相对位置,片偏移以8个字节为偏移单位(应为总共才占13位如果按照原始位置有可能出现13位不够存储),其他分片的偏移值都是 8 字节(64 位)的整数倍。但是如果抓包的话一般呈现的片偏移是乘以8以后的值如下图:
-
生存时间(TTL)
表示数据报在网络中的寿命,其目的是防止无法交付的数据报无限制地在网络中传输,从而消耗网络资源。
路由器在转发数据报之前,先把 TTL 值减 1。若 TTL 值减少到 0,则丢弃这个数据报,不再转发。因此,TTL 指明数据报在网络中最多可经过多少个路由器。TTL 的最大数值为 255。若把 TTL 的初始值设为 1,则表示这个数据报只能在本局域网中传送。 如下图所示:
改报文ttl最小也要是5
无法交互情况:
如果没有ttl这条消息就会一直占用资源,该通道一直不会被关闭
-
协议
表示该数据报文所携带的数据所使用的协议类型,占 8 位。该字段可以方便目的主机的 IP 层知道按照什么协议来处理数据部分。不同的协议有专门不同的协议号。
协议 ICMP IGMP IP TCP EGP IGP UDP Ipv6 ESP OSPF 值(十进制) 1 2 4 6 8 9 17 41 50 89 -
首部检验和
用于校验数据报的首部,占 16 位。数据报每经过一个路由器,首部的字段都可能发生变化(如TTL),所以需要重新校验。而数据部分不发生变化,所以不用重新生成校验值。用于检查IP报头的完整性。
-
源地址
表示数据报的源 IP 地址,占 32 位。
-
目标地址
表示数据报的目标 IP 地址,占 32 位。该字段用于校验发送是否正确。
-