欢迎来到天天文库
浏览记录
ID:42770135
大小:66.50 KB
页数:10页
时间:2019-09-20
《Linux下IP――分片与重组――详解》由会员上传分享,免费在线阅读,更多相关内容在工程资料-天天文库。
1、Linux下IP――分片与重组――详解原理介绍为一个数据包片再次分片为数据包分片和为数据包片再次分片之间的细微差别就在于网关处理MF比特的不同。但一个网关为原来为分片的数据包分片时,除了末尾的数据包片,它将其余所有分片上的MF比特都置为一,最后一片为0。然而,当网关为一个非末尾的数据包片再次分片时,它会把生成的所有子分片中的MF比特全部设置为1,因为所有这些子分片都不可能是整个数据包的末尾的数据包片。对于分片,需要拷贝IP首部和选项,以及数据。而选项的拷贝要注意:根据协议标准,某些选项只应当出现在的一个
2、数据包片中,而其他一些则必须出现在所有的数据包中。数据包重组数据结构为了使数据包的重组效率更高,用于保存数据包的数据结构必须能够做到:为构成某一个特定数据包的一组数据包片快速定位;在一组数据包片中快速插入新的数据包片;有效地判断一个完整的数据包是否已经全部抵达;具有数据包片超时机制(ip_expire),并且,如果在重组完成之前定时器溢出,则删除数据包片。互斥操作重组程序代码使用了一个互斥信号量。Ipfrag_lock在链表中加入一个数据包片查找方式:链表的线性查找溢出时的丢弃分片列表空间以全满的情况下
3、:丢弃对应的数据包的所有分片。Ip_evictor测试是否组成一个完整的数据包ip_frag_queue判断IP_MF位是否为0!将数据包片组装成完整的数据包LAST_IN,ip_frag_reasm数据包片链表的维护管理为了使丢失数据包片的数据包不再浪费存储资源 ,并防止因为标示符字段的重新使用而给IP带来混乱,但已经不可能再受到剩余数据包片时,IP必须定期检查数据包片列表。Ipq_unlinkIpq_putIpq_killIpqhashfnLinux下的实现IP分片如何提高分片处理的效率ip_fra
4、gment(非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=(structip
5、hdr*)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丢弃分组并返回错误消息。如果该数据包是在本地生成的,则传输层协议把该错误传回该进程如果分组是
6、被转发的,则ip_forward生成一个ICMP目的不可达差错报文,并指出不分片就我发转发该分组。路径发现机制?该算法用来搜索到目的主机的路径,并发现所有中间网络支持的最大传送单元MTU。新的分片包含:IP首部、某些原始分组中的选项以及最多len的长度的数据。Linux下没有分片队列,分一个片就发一个分片包。offset=(ntohs(iph->frag_off)&IP_OFFSET)<<3;取出偏移位(13位),并乘8算出总字节数――算该包的偏移字节数not_last_frag=iph->frag_o
7、ff&htons(IP_MF);取出MF位(第14位)循环进行分片:while(left>0){len=left;/*IF:itdoesn'tfit,use'mtu'-thedataspaceleft*/if(len>mtu)如果剩下的数据left还比MTU大,则以MTU为分片的数据长度;否则,就用left作为数据长度(对于最后一片)len=mtu;/*IF:wearenotsendinguptoandincludingthepacketendthenalignthenextstartonaneight
8、byteboundary下一个开始出是八字节的边界对齐*/if(len
此文档下载收益归作者所有