linux系统下的ip分片程序,Linux下IP――分片与重组――详解

62e50291a81fc54b507f33cb80033297.gif Linux下IP――分片与重组――详解

(10页)

fa47e85278b8317eb96d9009314d925b.png

本资源提供全文预览,点击全文预览即可全文预览,如果喜欢文档就下载吧,查找使用更方便哦!

15.9 积分

Linux下IP――分片与重组――详解原理介绍 为一个数据包片再次分片 为数据包分片和为数据包片再次分片之间的细微差别就在于网关处理MF比特的不同。但一个网关为原来为分片的数据包分片时,除了末尾的数据包片,它将其余所有分片上的MF比特都置为一,最后一片为0。然而,当网关为一个非末尾的数据包片再次分片时,它会把生成的所有子分片中的MF比特全部设置为1,因为所有这些子分片都不可能是整个数据包的末尾的数据包片。 对于分片,需要拷贝IP首部和选项,以及数据。而选项的拷贝要注意:根据协议标准,某些选项只应当出现在的一个数据包片中,而其他一些则必须出现在所有的数据包中。数据包重组 数据结构 为了使数据包的重组效率更高,用于保存数据包的数据结构必须能够做到: 为构成某一个特定数据包的一组数据包片快速定位; 在一组数据包片中快速插入新的数据包片; 有效地判断一个完整的数据包是否已经全部抵达; 具有数据包片超时机制(ip_expire),并且,如果在重组完成之前定时器溢出,则删除数据包片。 互斥操作 重组程序代码使用了一个互斥信号量。Ipfrag_lock在链表中加入一个数据包片 查找方式:链表的线性查找溢出时的丢弃 分片列表空间以全满的情况下:丢弃对应的数据包的所有分片。Ip_evictor测试是否组成一个完整的数据包ip_frag_queue 判断IP_MF位是否为0!将数据包片组装成完整的数据包LAST_IN,ip_frag_reasm 数据包片链表的维护管理 为了使丢失数据包片的数据包不再浪费存储资源 ,并防止因为标示符字段的重新使用而给IP带来混乱,但已经不可能再受到剩余数据包片时,IP必须定期检查数据包片列表。Ipq_unlinkIpq_putIpq_killIpqhashfnLinux下的实现 IP分片 如何提高分片处理的效率ip_fragment(非UDP使用) 典型调用者 ip_sendà ip_fragment(skb, ip_finish_output);一般从转发来 ip_queue_xmit2à ip_fragment(skb, skb->dst->output)一般从TCP来 因为IP报太大而将其分片以适合于一个帧的传输。处理过程 获取外出设备(由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丢弃分组并返回错误消息。 如果该数据包是在本地生成的,则传输层协议把该错误传回该进程 如果分组是被转发的,则ip_forward生成一个ICMP目的不可达差错报文,并指出不分片就我发转发该分组。 路径发现机制?该算法用来搜索到目的主机的路径,并发现所有中间网络支持的最大传送单元MTU。 新的分片包含:IP首部、某些原始分组中的选项以及最多len的长度的数据。 Linux下没有分片队列,分一个片就发一个分片包。 offset = (ntohs(iph->frag_off) & IP_OFFSET) << 3; 取出偏移位(13位),并乘8算出总字节数――算该包的偏移字节数 not_last_frag = iph->frag_off & htons(IP_MF);取出MF位(第14位) 循环进行分片: while(left > 0) { len = left; /* IF: it doesn't fit, use 'mtu' - the data space left */ if (len > mtu) 如果剩下的数据left还比MTU大,则以MTU为分片的数据长度;否则,就用left作为数据长度(对于最后一片) len = mtu; /* IF: we are not sending upto and including the packet end then align the next start on an eight byte boundary下一个开始出是八字节的边界对齐 */ if (len < left) { 当len

524d6daf746efaa52c3c71bbfe7ba172.gif  天天文库所有资源均是用户自行上传分享,仅供网友学习交流,未经上传用户书面授权,请勿作他用。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值