2.4 MTU
2.4.1 认识MTU
MTU(Maximum Transmission Unit,最大传输单元)描述底层数据帧一次最多可以发送的数据量,该限制是不同的数据链路层对应的物理层产生的
以太网对应MTU的值一般是1500字节,不同的网络类型有不同的MTU。若一次要发送的数据超过了MTU,则需要在IP层对数据进行分片(fragmentation)
以太网规定MAC帧中数据的最小长度为46字节,若发送数据量小于46字节,则需要在数据后面补填充位,如ARP数据包的长度就是不够46字节的
2.4.2 MUT对IP协议的影响
因为数据链路层规定了最大传输单元MTU,所以若IP层一次要发送的数据量超过了MTU,此时IP层就需要先对该数据进行分片(前提IP层没有设置禁止分片,否则报文直接丢弃),然后才能将分片后的数据向下交付
数据的分片和组装发生在IP层,不仅源端主机可能会对数据进行分片,数据在路由过程中的路由器也可能对数据进行分片。因为不同网络的MTU是不一样的,若传输路径上的某个网络的MTU比源端网络的MTU小,那么路由器就可能对IP数据报再次进行分片
具体分片与组装过程可浏览博主另一篇文章:
(28条消息) 网络层——IP协议_GG_Bond19的博客-CSDN博客
https://blog.csdn.net/GG_Bruse/article/details/130640438
2.4.3 MTU对UDP协议的影响
IP报头中若不携带选项字段,那么IP报头的长度为20字节,而UDP采用的是定长的8字节报头,因此若UDP一次携带的数据超过了1500 − 20 − 8 = 1472 字节,此时数据就需要在IP层进行分片
分片后得到的多个IP数据报中有任意一个在传输过程中丢失,都会引起接收端IP层重组失败。假设在网络传输时丢包的概率是万分之一,若将数据拆分为一百份进行发送,那么此时丢包的概率就上升到了百分之一。因为只要有一个分片报文丢包就等同于整个报文整体丢失,因此分片会增加UDP报文丢包的概率
2.4.4 MTU对TCP协议的影响
对于TCP来说,分片也会增加TCP报文丢包的概率,与UDP不同的是TCP丢包后会进行重传,因此TCP应该尽量减少因为分片导致的数据重传
TCP发送的数据报不能无限大,还是受制于MTU,TCP的单个数据报的最大报文长度被称为MSS(Max Segment Size)
TCP通信双方在建立连接的过程中,会进行MSS协商,最终选取双方支持的MSS值中的较小值作为最终MSS
MSS的值在TCP首部的40字节的选项字段中(kind=2)
最理想的情况下,MSS的值正好就是在数据不会在IP层进行分片的最大长度
2.5 数据跨网络传输的过程
以主机A将数据跨网络传输给主机B为例,数据路由的过程如下:
主机A要想将数据跨网络传输给主机B,需要先将数据交给同局域网中的路由器A,因此主机A需要将封装好的MAC帧发送到当前局域网中,此时MAC帧中的源MAC地址和目的MAC地址,对应就是主机A的MAC地址和路由器A的MAC地址
主机A所在局域网中的所有主机都能收到这个MAC帧,但最终只有路由器A发现该MAC帧中的目的MAC地址与自己的MAC地址相同,于是才会对该MAC帧进行解包,并将解包后剩下的IP数据报交付给IP层
路由器A的IP层拿到解包后的IP数据报后,会提取出IP报头中的目的IP地址,然后通过查询路由表后确定需要将该数据转发给路由器B,于是路由器A再将数据向下进行交付,重新封装MAC帧的帧头和帧尾,但此时封装后的MAC帧中的源MAC地址和目的MAC地址,就变成了路由器A的MAC地址和路由器B的MAC地址
与路由器A直接相连的主机虽然也可能有很多,但最终只有路由器B发现该MAC帧中的目的MAC地址与自己的MAC地址相同,于是才会对该MAC帧进行解包,并将解包后剩下的IP数据报交付给IP层
路由器B的IP层拿到解包后的IP数据报后,同样会提取出IP报头中的目的IP地址,并通过查询路由表后确定需要将该数据转发给路由器C,于是路由器B再将数据向下进行交付,重新封装MAC帧的帧头和帧尾,但此时封装后的MAC帧当中的源MAC地址和目的MAC地址又变了,变成了路由器B的MAC地址和路由器C的MAC地址
…
不断重复上述过程,直到最终数据转发至主机B
因此数据在进行跨网络传输时,其对应的源IP地址和目的IP地址一般是不会变化的,而该数据的源MAC地址和目的MAC地址却是一直在变化的,根本原因就是因为该数据对应的上一跳主机和下一跳主机在不断变化
三、ARP协议
地址解析协议(Address Resolution Protocol,ARP)协议,是根据IP地址获取MAC地址的一个TCP/IP协议
3.1 认识ARP协议
为什么会存在ARP这样的协议?
以刚才的例子为例,当数据从主机A经过各种路由转发到达路由器D,此时路由器D就需要将数据转发给主机B完成数据的路由
由于路由器D和主机B是属于同一个局域网的,因此路由器D能够直接将数据交给主机B,但要给同局域网中的一台主机发送数据,前提是得先知道对方的MAC地址(MAC帧中的目的地址)
但路由器D此时只知道主机B的IP地址,因此路由器D必须通过某种方式得到主机B的MAC地址
即在同一个局域网中要给对方发消息,就必须知道对方的MAC地址,而实际大部分情况下只知道对方的IP地址,因此需要通过ARP协议来根据IP地址来获取目标主机的MAC地址。
ARP协议的定位
在TCP/IP四层模型中,网络协议栈自顶向下分为应用层、传输层、网络层和数据链路层
其中应用层最典型的协议有HTTP、HTTPS和DNS等,传输层最典型的协议有TCP和UDP,网络层最典型的协议就是IP,数据链路层最典型的协议就是MAC帧协议,但实际数据链路层还有两种协议叫做ARP和RARP
ARP、RARP和MAC帧协议虽然都属于数据链路层的协议,但ARP协议和RARP协议属于MAC帧的上层协议
MAC帧的上层协议不一定就直接是网络层的协议,MAC帧的上层协议有可能也属于数据链路层的协议
与之类似的,网络层中的ICMP协议和IGMP协议,这两个协议虽然与IP协议都属于网络层,但这两个协议属于IP的上层协议
3.2 ARP数据格式
硬件类型指链路层的网络类型,1为以太网
协议类型指要转换的地址类型,0x0800为IP地址
硬件地址长度对应以太网地址为6字节,因为MAC地址是48位的
协议地址长度对应IP地址为4字节,因为IP地址是32位的
op字段为1表示ARP请求,op字段为2表示ARP应答
从ARP的数据格式也可以看出,ARP是MAC帧协议的上层协议,ARP数据格式中的前3个字段和最后一个字段对应的就是以太网首部,但由于ARP数据包的长度不足46字节,因此ARP数据包在封装成为MAC帧时还需要补上18字节的填充字段
3.3 ARP协议的工作流程
还以之前的例子为例,路由器D要将数据转发给同一局域网当中的主机B,前提是路由器D必须知道主机B的MAC地址,而现在路由器D只知道主机B的IP地址,因此路由器D现在需要向主机B发起ARP请求,然后等待主机B发送ARP应答得知主机B的MAC地址
ARP请求的过程
首先路由器D需要先构建ARP请求
首先,因为路由器D构建的是ARP请求,因此ARP请求中的op字段设置为1
ARP请求中的硬件类型字段设置为1,表示当前使用的是以太网通信
ARP请求中的协议类型设置为0800,因为路由器是要根据主机B的IP地址来获取主机B的MAC地址
ARP请求中的硬件地址长度和协议地址长度分别设置为6和4,因为MAC地址的长度是48位,IP地址的长度是32位
ARP请求中的发送端以太网地址和发送端IP地址,对应就是路由器D的MAC地址和IP地址
ARP请求中的目的以太网地址和目的IP地址,对应就是主机B的MAC地址和IP地址,但由于路由器D不知道主机B的MAC地址,因此将目的以太网地址的二进制序列设置为全1,表示在局域网中进行广播
ARP请求构建完成后,将ARP数据包向下交付给MAC帧协议,封装成MAC帧
封装MAC帧报头时,以太网目的地址和以太网源地址,对应分别是主机B和路由器D的MAC地址,但由于路由器D不知道主机B的MAC地址,因此MAC帧报头当中的以太网目的地址的二进制序列也只能设置为全1,表示在局域网中进行广播
因为这里封装的是一个ARP请求数据包,因此MAC帧中的帧类型字段设置为0806
由于ARP请求数据包的长度只有28字节,不足46字节,因此还需要在MAC帧的有效载荷中补上18字节的填充字段,最后再对MAC帧进行CRC校验即可
MAC帧封装完毕后,路由器D就可以将封装好的MAC帧以广播的方式发送到局域网中
因为这个MAC帧是以广播的方式发出的,因此局域网中的每台主机收到这个MAC帧后,都会对该MAC帧进行解包。当这些主机识别到MAC帧当中的帧类型字段为0806后,便知道这是一个ARP的请求或应答的数据包,于是会将MAC帧的有效载荷向上交付给ARP层
当ARP层收到这个数据包后,发现ARP数据包中的op字段为1,于是判定这是一个ARP请求,然后再提取出ARP数据包中的目的IP地址字段,虽然局域网中的所有主机都会将该数据包交给自己的ARP层,但最终只有主机B发现ARP数据包中的目的IP地址与自己相同,因此只有主机B会对该ARP请求进行应答,而局域网中的其他主机在识别到ARP数据包中的目的IP地址不匹配后,就会将这个ARP请求报文丢弃
局域网当中其他不相干的主机在收到这个ARP请求报文后,不是在MAC帧层丢弃的,而是在ARP层发现该ARP数据包的目的IP与自己的IP不匹配后丢弃的
总结:
发起方构建ARP请求,以广播的方式发送给每一个主机
每台主机都能识别接收,然后根据MAC帧的帧类型字段将有效载荷交付给每个主机的ARP层
其他不相关主机立马根据目的IP,在ARP协议栈内部丢弃ARP请求,仅有目标主机处理请求
ARP应答的过程
主机B在应答时首先需要构建ARP应答
因为主机B构建的是ARP应答,因此ARP应答中的op字段设置为2
ARP应答当中的硬件类型、协议类型、硬件地址长度、协议地址长度的值与ARP请求中设置的值相同
ARP应答中的发送端以太网地址和发送端IP地址,对应就是本机的MAC地址和IP地址
ARP应答中的目的以太网地址和目的IP地址,对应就是路由器D的MAC地址和IP地址。路由器D发来的ARP请求中告知了其MAC地址和IP地址,因此主机B是知道的
ARP应答构建完成后,为了能将ARP应答发送到以太网当中,也需将ARP数据包向下交付给MAC帧协议,封装成MAC帧
封装MAC帧报头时,以太网目的地址和以太网源地址,对应分别是路由器D和主机B的MAC地址
因为这里封装的是一个ARP应答数据包,因此MAC帧当中的帧类型字段设置为0806
由于ARP应答数据包的长度也只有28字节,不足46字节,因此需要在MAC帧的有效载荷中补上18字节的填充字段,最后再对MAC帧进行CRC校验
MAC帧封装完毕后,主机B就可以将封装好的MAC帧发送到局域网中
此时局域网中的每台主机在底层都能收到这个MAC帧,但局域网中的不相干的主机,在发现该MAC帧对应的以太网目的地址与自己不同后,就会将该MAC帧丢弃,而不会交付给上层ARP层,最终路由器D会将解包后MAC帧的有效载荷向上交付给自己的ARP层
当路由器D的ARP层收到这个数据包后,发现ARP数据包中的op字段为2,于是判定这是一个ARP应答,然后就会提取出ARP数据包中的发送端以太网的地址和发送端IP地址,此时路由器D就拿到了主机B的MAC地址
局域网中其他不相干的主机在收到这个ARP应答报文后,直接在MAC帧层就丢弃了,并没有将其交付给自己的ARP层
ARP缓存表
实际不是每次要获取对方的MAC地址时都需要发起ARP请求,每次发起ARP请求后都会建立对应主机IP地址和MAC地址的映射关系,每台主机都维护了一个ARP缓存表,可以使用 arp -a 命令进行查看
缓存表中的表项有过期时间,一般为20分钟,若20分钟内没有再次使用某个表项,那么该表项就会失效,下次使用时就需重新发起ARP请求获得目的主机的MAC地址
什么时候需要发起ARP请求?
上面说的只是路由器D要将数据发送给主机B的时候,需要通过ARP获得主机B的MAC地址,但实际数据在路由过程中的每一跳可能都需要发起ARP请求,询问下一跳主机对应的MAC地址,因为在每一跳时一般都是只知道下一跳的IP地址,而并不知道其对应的MAC地址的
注意:ARP属于局域网通信的协议标准,因此一台主机不能跨网络向另一台主机发起ARP请求
MAC帧的报头中已经涵盖了源和目的MAC地址,为什么ARP的报头中还有这两个字段?
MAC帧和ARP虽然都在数据链路层,但毕竟是上下层的关系,因此不会互相关心彼此的数据
若底层网络采用的不是以太网,而是其他类型的网络,此时ARP层的MAC地址就是必要的了
在进行局域网通信时,为什么不直接以广播的方式发送数据?
在进行局域网通信时,就算只知道对方的IP地址,而不知道对方的MAC地址,也可以以广播的方式将数据发送到局域网中,此时局域网中的主机也能够在IP层比对目的IP地址与自己是否相符,来判断收到的这个数据是否是发送给自己的
理论上可以,但并不妥
对于局域网中的大多数主机来说,收到的这个报文其实早就应该被丢弃,而现在这个报文却交付到了IP层,这对网络资源和系统资源来说都是一种浪费。因此在底层MAC帧层就应该判定这个报文是不是发送给当前主机的,而不是当数据向上交付到了IP层再来判断
此外,若无脑使用广播的方式来进行数据的发送,会使得广播和单播的概念变得模糊不清,明明是想发送数据给局域网中的一台主机,但却采用了广播的方式,这显然是不合理的
RARP协议
RARP(Reverse Address Resolution Protocol,反向地址转换协议),是根据MAC地址获取IP地址的一个TCP/IP协议
在某些情况下可能只知道一台主机的MAC地址,此时要得知该主机的IP地址就可以使用RARP协议
理论上来说,RARP协议一定比ARP协议简单,因为已经知道一台主机的MAC地址了,那么就已经可以直接向给主机发送消息了,直接发消息询问对方的IP地址即可