Linux下IP――分片与重组――详解

本文详细介绍了Linux系统中IP分片和重组的原理与实现,包括数据包分片的处理、重组数据结构、互斥操作、分片和重组的效率优化,以及Linux内核中的具体实现细节。内容涉及分片的条件、分片算法、数据包重组过程、分片队列管理和内存限制等关键点。
摘要由CSDN通过智能技术生成

 

  1. 原理介绍
  1.  
    1. 为一个数据包片再次分片

    为数据包分片和为数据包片再次分片之间的细微差别就在于网关处理MF比特的不同。但一个网关为原来为分片的数据包分片时,除了末尾的数据包片,它将其余所有分片上的MF比特都置为一,最后一片为0。然而,当网关为一个非末尾的数据包片再次分片时,它会把生成的所有子分片中的MF比特全部设置为1,因为所有这些子分片都不可能是整个数据包的末尾的数据包片。

    对于分片,需要拷贝IP首部和选项,以及数据。而选项的拷贝要注意:根据协议标准,某些选项只应当出现在的一个数据包片中,而其他一些则必须出现在所有的数据包中。

  1.  
    1. 数据包重组
  1.  
    1.  
      1. 数据结构

    为了使数据包的重组效率更高,用于保存数据包的数据结构必须能够做到:

  • 为构成某一个特定数据包的一组数据包片快速定位;
  • 在一组数据包片中快速插入新的数据包片;
  • 有效地判断一个完整的数据包是否已经全部抵达;
  • 具有数据包片超时机制(ip_expire),并且,如果在重组完成之前定时器溢出,则删除数据包片。
  1.  
    1.  
      1. 互斥操作

    重组程序代码使用了一个互斥信号量。Ipfrag_lock

  1.  
    1.  
      1. 在链表中加入一个数据包片

    查找方式:链表的线性查找

  1.  
    1.  
      1. 溢出时的丢弃

    分片列表空间以全满的情况下:丢弃对应的数据包的所有分片。Ip_evictor

  1.  
    1. 测试是否组成一个完整的数据包ip_frag_queue

    判断IP_MF位是否为0

  1.  
    1.  
      1. 将数据包片组装成完整的数据包LAST_INip_frag_reasm
  1.  
    1. 数据包片链表的维护管理
  • 为了使丢失数据包片的数据包不再浪费存储资源 ,并防止因为标示符字段的重新使用而给IP带来混乱,但已经不可能再受到剩余数据包片时,IP必须定期检查数据包片列表。

  • Ipq_unlink

  • Ipq_put

  • Ipq_kill

  • Ipqhashfn

  1. Linux下的实现
  1.  
    1. IP分片

如何提高分片处理的效率

  1.  
    1.  
      1. ip_fragment(非UDP使用)
  1.  
    1.  
      1.  
        1. 典型调用者

    ip_sendà ip_fragment(skb, ip_finish_output);一般从转发来

    ip_queue_xmit2à ip_fragment(skb, skb->dst->output)一般从TCP

    因为IP报太大而将其分片以适合于一个帧的传输。

  1.  
    1.  
      1.  
        1. 处理过程

    获取外出设备(由skb决定)

          dev = rt->u.dst.dev;    出口路由设备

    !!!skb->dst=rt=rt->u.dstàdst_entry

    IP包头

          raw = skb->nh.raw;

          iph = (struct iphdr*)raw;   IP

    设定开始值

          hlen=IP头长

          left = ntohs(iph->tot_len) - hlen; 包总长度减去IP头长度――需要分片的数据长度

          mtu = rt->u.dst.pmtu - hlen;  物理MTU减去IP头长度――除去IP头的分片长度

          ptr = raw + hlen;    取数据区指针

    将数据包分片

  • 分片算法很简单,但由于对sk_buff结构和链的操作时的实现非常复杂。
  • 如果DF比特禁止分片,则ip_output丢弃分组并返回错误消息。
  • 如果该数据包是在本地生成的,则传输层协议把该错误传回该进程
  • 如果分组是被转发的,则
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值