linux IP分片原理和实现

     分片,从字面上也可以猜到是什么意思,就是当一个skb包长度大于传输设备或者链路上物理设备的mtu时,会根据一定的方式进行切割,从而使报文得以发送出去。但是这里需要说明,分片又分为IP和TCP分片两种,由于tcp报文有自己的机制去分片,不需要依赖IP层分片;而对于udp或者icmp等报文,只能依赖IP层去分片。

    1.IP分片

      首先ip层如何认出一个报文是另外一个较大报文的分片? 这里不得不提到是ip报文头中的OFFSET和MF字段。如果报文未被分片,那么Offset和MF字段的值为0,相反的就是分片报文,分片报文可以按照情况分为三种第一片、中间片、最后一片,分别对应以下的条件:

<1> 第一片报文Offset=0且MF=1

<2>中间片报文Offset 和MF都非0

<3>最后一片MF=0且Offset不为0

   其次ip分片长什么样或者说怎么分片呢?看以下这个图就可以明白大体的情况了。

          

     最后回归到代码的层面去了解一下实现,分片主要的函数就是ip_fragment(int ip_fragment(struct sk_buff *skb, int (*output)(struct sk_buff *))),首先ip_fragment必须处理如下两种情况:

  <1>必须切成小块的大数据,要切割大数据就需要分配新的缓冲区,并且在大的缓冲区和小缓冲区见做内存的拷贝。

  <2>不需要再分片的数据链表或数组,如果分配的缓冲区又足够的空间新增较抵层的L3头和L2头,则ip_fragment处理这些缓冲区不需要进行内存拷贝。ip层要做的就是

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值