目录
一、什么是分片?
二、如何分片?
三、如何组装?(16位分片标识、3位标志、13位片偏移)
1、回顾16位分片标识、3位标志、13位片偏移
2、组合分片报文
四、分片的影响
1、对UDP的影响
2、对TCP的影响
一、什么是分片?
网络层再继续向下传递的时候,会限制报文的大小,mtu(max transform unit)是最大传送单元,代表了每次所能传输报文的大小(含IP报头)。当我们的报文大小(含IP报头)超过了1500 个字节的时候,将一个报文分成多部份来传递,这就是“分片”。
注意:分片不是大多数情况,而是特殊情况。本来传递一个报文就有着丢包的风险,现在要传递一堆报文,丢包的概率会增加。
二、如何分片?
假设 IP协议 收到上层的报文大小为 1700 字节。这1700字节在IP协议看来就是数据,不考虑选项字段,加上IP报头的20个字节,要向下传递的大小为1720个字节,很显然超出了传输限制。
那么说明需要对这1700个字节进行分片,注意,是1700个字节分片,而不是1720个字节,先对数据进行分片,然后每一部分再加上报头。因为是分成多个报文来发送,每一个报文都要送到对端,那就必须加上报头来告诉下一层目标主机的IP地址。
三、如何组装?(16位分片标识、3位标志、13位片偏移)
1、回顾16位分片标识、3位标志、13位片偏移
因为这些报文由一个完整的报文分片得到,不能随意组合。这就需要用到IP报头中的三个字段16位分片标识、3位标志、13位片偏移。
-
13位片偏移:分片以后,各个部分在原始报文的哪个位置,即在原始报文中的偏移量。
-
16位分片标识:如果一个报文不分片,不同报文之间的16位标识符是不同的;如果一个报文分片了,分片报文的16位标识符是一样的,说明这些分片报文原本属于一个完整的报文。
-
3位标识:1位保留、1位标识禁止分片、1位标识更多报文(1说明后面跟了具有16位标志符的报文,0说明后面没有)
2、组合分片报文
第一步,通过三位标识符的第三位标识“更多报文”判断当前收到的报文后面是否存在其他分片报文。
如果第三位标识为1,说明当前报文是分片报文,加入到具有相同16位标识符的集合中。,进入下一步;如果为0,可能为普通报文,也有可能是分片报文的最后一部分,此时需要根据片偏移判断。
- 如果片偏移为0,说明是普通报文,结束判断,直接向上层交付;
- 如果不为0,说明是分片报文,加入到具有相同16位标识符的集合中。
第二步,判断所有的报文是否收全。将集合中的报文按照片偏移进行升序排序。
判断起始分片报文是否收到:如果第一个报文的片偏移为0,说明起始分片报文收到了。
判断末尾分片报文是否收到:如果最后一个报文的三位标志位中的第三位为0,说明末尾分片报文收到了
判断中间报文是否收到:以第二个报文为例,第二个报文的片偏移理应等于 第一个报文的片偏移 + 第一个报文的数据长度,以此来判断第二个报文是否收到;依此类推,可以判断中间报文是否收到。
=》该集合中一旦发现少了任意一个报文,整个集合中的报文直接全部丢弃!也不会通知上层TCP
四、分片的影响
分片有风险,只要有一部分丢了,如果对端网络层无法组装,要组装的几部分会全部丢弃,对方TCP没有收到报文,就认为是丢包了。所以一般不建议分片,分片会增加丢包概率。
1、对UDP的影响
UDP没有发送缓冲区,应用层要发多少,到了网络层就是多少,这个时候就得老老实实分片。分片会增加丢包的概率,一旦某个分片报文丢了导致无法组装就会将相关的分片报文全部丢弃。(是否相关可以根据16位分片标识来判断)
2、对TCP的影响
因为TCP有缓冲区的存在,想发多少、什么时候发都由TCP决定,TCP可以做到自己控制数据段的长度,然后再传到网络层,此时就无需网络层来分片了。文章来源:https://www.toymoban.com/news/detail-455510.html
但TCP每次可以发送的数据长度不是无限大,受制于MTU和对方主机的MSS(Max Segment Size),即最大消息长度。文章来源地址https://www.toymoban.com/news/detail-455510.html
- 受制于MTU的意思是,为了不分片,TCP每次最多携带的数据是多少。不同系统的MTU可能有所不同,MTU减去TCP报头和IP报头的大小,就是TCP每次最多可以发送的数据量。
- 受制于对方主机的MSS的意思是,对方每次最多可以接收多少。双方在发送SYN的时候会在TCP头部写入自己可以支持的MSS值,在得知对方的MSS以后,选取较小的作为最终MSS。MSS的值就是在TCP首部的40字节变长选项中(kind=2);
到了这里,关于报文分片(16位分片标识、3位标志、13位片偏移字段详解)的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!