目录
一、IP分片
1.为什么需要IP分片
2.IP报头信息
二、分片的组装
1.接收方怎么知道一个报文被分片了
2.同一个报文的分片怎么全部识别出来的
3.报文如何排序,如何得知报文有没有收全
4.怎么将各分片正确组装
5.怎么确定合成的报文是正确的
6.总结
三、自己进行分片的组装
1.自己做一次分片
2.实际的IP判断
本文章讲解IP协议的分片问题,也是IP协议的最后一部分。
一、IP分片
1.为什么需要IP分片
前面在讲述IP协议报头的时候,我忽略了16位标识、3位标志和13位片偏移这三个字段,由于这三个字段只服务于分片,对跨网络传输没有帮助,所以我将它们同一放在了后面。
在网络分层模型中,IP协议所在的网络层的下一层是数据链路层。
数据链路层使用的协议为MAC桢协议,IP协议依旧需要将数据向下交付,通过MAC桢协议处理后才能将MAC桢数据通过网线发送。(忽略物理层)
但是MAC桢协议的单帧有效载荷不能超过最大传送单元(MTU),大部分为1500字节。
另一方面,IP协议的校验和只负责IP报头的校验,TCP的校验和会同时负责报头和有效载荷的校验。
也就是说,IP报文的长度是由TCP决定的。
正是因为MAC桢协议的限制,TCP只能将数据分包发送,且保证每个数据报文长度不超过MTU。
那如果TCP就给了IP一个超过MTU的报文,MAC桢协议又没法处理,IP该怎么办呢?
所以就需要IP将报文分片,保证每个报文都不超过MTU,然后再向下交付。
因为网络各层协议相互独立,所以IP的分片属于IP自身的行为。
分片只能由当前主机的IP协议来做,组装也只能由对方主机的IP协议来做。
2.IP报头信息
(1)16位标识
16位标识:一个16位整数,保证自己和其他的保文不重复。
(2)3位标志
3位标志:有3个比特位。
- 第一位为保留位,不使用且为0。
- 第二位为1表示禁止分片,若此时报文长度超过MTU,则IP会丢弃报文。若为0表示允许分片,IP正常分片即可。
- 第三位表示更多分片,对于一个TCP报文的分片,最后一个分片该位为0,其他均为1。
(3)13位片偏移
表示该分片的有效数据头部相对未分片的数据的偏移量。若不分片,对应报文在原始报文的偏移量为0。
(4)填入分片数据
IP将一个4500字节的TCP报文,分片成三个1500字节的IP报文。
- 三个1500字节的报文是一组,所以它们的16位标识相同,比如设为1234。
- 第一个报文的片偏移为0,第二个报文的片偏移为1500,第三个报文的片偏移为3000。
- 对三位标志而言,三个报文第一位都为0。因为允许分片,所以第二位都为0。因为三个报文有先后顺序,所以偏移量为0和1500的报文该位为1,偏移量为3000的报文该位为0。
二、分片的组装
1.接收方怎么知道一个报文被分片了
一种情况,如果更多分片标志位为1,表示该报文被分片过。
另一种情况,如果更多分片标志位为0且片偏移大于0,表明该报文是分片的最后一个。
2.同一个报文的分片怎么全部识别出来的
每一组分片的报文的16为标志都相同,当然能识别出报文的归属。
3.报文如何排序,如何得知报文有没有收全
第一个报文的偏移量为0,更多分片为1,最后一个报文的偏移量大于0,更多分片为0。对于其他报文,前一个报文的偏移量+自身长度=后一个报文中偏移量,这样就能确定分包的排序,也能确定报文是否收全。
4.怎么将各分片正确组装
按照片偏移进行升序排列即可。
5.怎么确定合成的报文是正确的
TCP和IP都有校验和,IP协议校验和校验IP报头,不检查有效数据。TCP通过TCP校验和校验有效数据和TCP报头。
6.总结
(1)IP分片属于数据传输的少数情况
TCP在大部分时间里都能保证报文的长度不超过MTU,所以IP分片很少出现。
(2)分片对数据安全传递是有很大威胁的
当IP发送分片后的报文时,如果某一个报文分片丢失了,接收方就不能成功组装,此时所有已接收的分片报文都会被丢弃。而且分片越多,分片丢失的概率越大,更不利于数据传送。
由于TCP协议存在超时重传机制,哪怕IP分片丢失,数据也不会遗失。但由于分片是IP协议自己进行的,所以TCP会将未分片的报文向IP传递,IP还需要重新分片再发送。
(3)安全高效的数据传输需要TCP的合理控制
我们要想从根源上解决问题,就需要让TCP将数据分包成合适的大小,尽量避免IP分片,才能减少丢包率。
三、自己进行分片的组装
1.自己做一次分片
假设TCP向IP传输了一个3000字节的报文,报头为标准报头(20字节)。
IP给TCP报文加上自己的标准报头(20字节),发现IP报文总长为3020字节,超过了MTU的1500字节,需要分片。
IP分片会产生多个IP报文,每个报文都会有IP报头。
- 第一片:IP报头20字节,有效载荷1480字节,1480字节中还包括TCP的报头,总长度1500字节。
- 第二片:IP报头20字节,提取后面的有效载荷1480字节,总长度1500字节。
- 第三片:最后剩下有效载荷60字节,再加上IP报头20字节,总长度80字节。
2.实际的IP判断
上面的处理是我们自己凭感觉进行的分片流程,TCP/IP会通过一些报文长度的上限值控制传输的过程。
MTU(最大传送单元):限制了IP报文字节的最大值,一般为1500字节。
MSS (最大段尺寸):由于IP标准报头为20字节,所以IP的有效数据最大为1480字节。而TCP标准报头也为20字节,TCP报头是IP报文的有效数据,所以TCP的最大有效载荷为1460字节,也叫最大段尺寸。所以TCP会通过滑动窗口进行分包,保证每个TCP报文的有效数据不超过MSS。
从这里,我们也再次理解了,为了保证数据的安全传输,避免IP分片,需要TCP控制好自己的报文长度。