IP协议(下)

IP协议(下)_第1张图片

目录

一、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报头信息

IP协议(下)_第2张图片

(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字节。

IP协议(下)_第3张图片

2.实际的IP判断

上面的处理是我们自己凭感觉进行的分片流程,TCP/IP会通过一些报文长度的上限值控制传输的过程。

MTU(最大传送单元):限制了IP报文字节的最大值,一般为1500字节。

MSS (最大段尺寸):由于IP标准报头为20字节,所以IP的有效数据最大为1480字节。而TCP标准报头也为20字节,TCP报头是IP报文的有效数据,所以TCP的最大有效载荷为1460字节,也叫最大段尺寸。所以TCP会通过滑动窗口进行分包,保证每个TCP报文的有效数据不超过MSS。

从这里,我们也再次理解了,为了保证数据的安全传输,避免IP分片,需要TCP控制好自己的报文长度。

你可能感兴趣的:(Linux,网络,网络协议,服务器,ip,tcp/ip)