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

LinuxIP――分片与重组――言甚详明

规律引见另碎屑包

    分类打补丁与分类打补丁的忽视分别MF不奇偶性。只是,网关被粉碎为原始分类的摘录。,以及预告包的末了,它同意了等等的人或物的切断。MF位设置为一,经受住大量是0。只是,当网关为非端包再次分离时,它将粉碎尽量的产品的细分。MF这些位都设置为1,因尽量的这些子切断不克不及是WHO末了的预告包。

    打补丁化,必要副本的IP第一流的选择,预告。选择的副本的件要睬:基金一致规范,独自地相当调动球员它葡萄汁出如今预告包中。,其他的必需品出如今尽量的预告包中。。

预告包重组预告建筑风格

    为了使预告包的重组生产率上级的,用于贮存预告包的预告建筑风格必需品能做到这点。:

用于使符合特任分类的一组预告分类。禁食转到;将新的预告包禁食拔出到一组预告包中;灵验地决议人家未受损伤的的预告包可能性的选择曾经抵达。;预告包额外的时期机制ip_expire),而且,万一在重组获得垄断时计漏箱,迅速分开预告包。Mutex手术

    重组程序编码运用了人家互斥臂板信号装置。Ipfrag_lock

向列表中添加预告包

    查找方法:链表的一次的查找

漏箱正中的报废

    切断列表坯已满:戒除尽量的对应的预告包。Ip_evictor

检验可能性的选择使符合未受损伤的的预告包ip_frag_queue

    判别IP_MF座位可能性的选择为0

将预告包任命成人家未受损伤的的预告包LAST_INip_frag_reasm预告包链表的保养支配

为了使错过预告包的预告包不再驱散贮存RESO,并阻止运用检验人接守停止重用。IP拿来杂乱,已经做不到的腰槽残余的预告。,IP必需品按期反省预告包列表。。

Ipq_unlink

Ipq_put

Ipq_kill

Ipqhashfn

Linux下的意识到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->    输出路由准备

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

    IP包工

          raw = skb->

          iph = (建筑风格) iphdr*)raw;   IP

    设置开端值

          hlen=IP头长

          left = ntohs(iph->tot_len) – hlen; 总分类上浆减去IP头上浆――必要分片的预告上浆

          mtu = rt->.pmtu – hlen;  自然规律的MTU减去IP头长去除IP封头上浆

          ptr = raw + hlen;    取预告区域的指状物

    把包粉碎成打补丁

分隔算法异乎寻常的复杂。,已经因sk_buff建筑风格和链的举动是异乎寻常的复杂的。。万一DF一会儿制止片,则ip_output戒除分类并归还不义的行为音讯。万一预告包是住处附近的当地酒店产品的,换乘层一致将不义的行为归还给奔流。万一预告子宫转发,则ip_forward产品人家ICMP无法抵达的不义的行为通讯,并提示我发送的预告包无切断。小路被发现的人机制?该算法用于搜索D的小路。,被发现的人尽量的正中播送网维持的最大换乘单元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位)

    整体的使某物衰微:

          (左) > 0) {

                 len = left;

                 /* IF: it doesn”t fit, use MTU – the data space left */

                 if (伦) > MTU)万一残余预告left还比MTU大,则以MTU分隔预告上浆;另外的,就用left作为预告的上浆(经受住一篇)

                        len = mtu;   

                 /* IF: we are not sending 向上 and including the packet end

                    then align the next start on an eight byte boundary下人家是开端。八词节的包边不相容的 */

                 if (伦) < left) {   len时,即,经受住人家切断上浆没有MTU,不用要重行夺回8音节整体倍

                        len &= ~7;   8音节整体倍

                 }

    在缓冲剂中分派新的预告包sk_buff,体积:五金器具帧上浆 段上浆IP头长

    路堤摘录

包典型:本机、播送、多播、其他的熟练、出路、旋的、禁食路由包优先考虑的事分开组织头的坯约定IPTCP原始指状物raw

                 /*

                  * Charge the memory for the fragment to any owner

                  * it might possess

                  */

万一包装有sock,在包装中sock片材登记簿的尽量的者。繁殖客观的地址,夸大商量计数。繁殖输出准备。拷贝IP拷贝IP块(仅分隔上浆)MTU切成特定尺寸的),缩减总分类上浆left-len,因而下碎屑。Left记载残余预告量。

    填入新的IP

新切断包装的转到IP分隔设置偏移值(鉴于第一流的个切断,值是原始的。IP包装的偏移值offset记载偏移量。。此刻手势位为空。。iph->frag_off = htons((倾斜的) >> 3));  

    万一偏移是0教导包装率先被粉碎

                 if (倾斜的) == 0)                      

    标明这点IP包装是第一流的次填写第一流的个切断并填写SOM。,为了预付款生产率(通常在第一流的PA中定位球调动球员)。。

                        ip_options_fragment(SKB) 

    鉴于多个十足的切断not_last_frag=1教导预告包是人家打补丁化的包——当包是打补丁时。,必要握住MF1

                 if (左) > 0 || not_last_frag)

                        iph->frag_off |= htons(IP_MF);          设置MF1

    使感动怪人IP分类预告指状物ptr

    使感动偏移指状物offset

                 ptr += len;        使感动IP分类预告指状物

                 offset += len;        使感动粉碎指状物

    万一有效地利用用作防火墙,设置用作防火墙值。

    发送切断

包装总上浆的计算分隔包的再生宣布与宣布发送片ip_finish_output

    整体的直到预告摘录完毕left=0

UDP打补丁化(待续)IP重组ip_defrag

    东窗事发,播送网预告报在linux在播送网堆栈中,它是sk_buff建筑风格交付,ip_defrag()该效能是接纳分类预告分类。(sk_buff),试着结成,当整套包装良好接合时,将新的sk_buff缓和,另外的,归还空指状物。

典型打电话者

    if (iph->frag_off & htons(IP_MF|IP_OFFSET))判别它可能性的选择是切断

    ip_local_deliveràip_defrag(skb)

结症预告建筑风格一套)ipq

    这些分片使符合人家双向链表(在linux内核中,万一必要运用链表,除非有特别必要,另外的,使清洁双向链表。,见document/CodingStyle,表现未获得的摘录队列。ip包)。要定位球列表的头指状物ipq建筑风格中:

    /* Describe an entry in the “incomplete datagrams” 排队。 */

    struct ipq {

          struct 下人家IPQ* linked list pointers   */

          u32  saddr;

          u32  daddr;

          u16  id;

          u8  protocol;

          u8  last_in;

    #define 获得4

    #define FIRST_IN  2

    #define LAST_IN   1 

          struct sk_buff *fragments; /* linked list of received fragments */

          英国 total length of original datagram */

          智能肉眼前的分隔上浆的累计值

          spinlock_t lock;

          atomic_t refcnt;

          struct timer_list timer; /* when will this queue expire?  */

          struct ipq **pprev;

          IIF Device index – for icmp replies */

    };

    睬每人家ipq跑表被禁猎地(即struct timer_list timer;)。 

    Ipq运用一HASH体系分隔链的表。

    hash表:

    #define IPQ_HASHSZ   64

    struct ipq *ipq_hash[IPQ_HASHSZ];

    #define ipqhashfn(id, saddr, daddr, 普罗特) /支持、源地址、客观的地址、一致

        (((ID)) >> 1) ^ (saddr) ^ (daddr) ^ (普罗特)) & (IPQ_HASHSZ – 1)) 

    每个IP包由以下四元组表现:(id,saddr,daddr,protocol,四平稳的值的打补丁被散列到人家值。IPQ链中,可以任命成人家未受损伤的的IP包。

FRAG_CB

    #define FRAG_CB(skb) ((建筑风格) ipfrag_skb_cb((SKB))cb))

    cb它是人家把持缓冲剂块。。它为每个层求婚公有预告。。万一你必要把它们禁猎地到其他的层,必需品无性繁殖skb_clone

          Car CB〔48〕

ipfrag_skb_cb

    struct ipfrag_skb_cb

    {

          struct inet_skb_parm h;

          INT偏移量

    };

inet_skb_parm

    struct inet_skb_parm

    {

          struct ip_options opt;  /* Compiled IP options  */

          unsigned 使具有特征选出而尚未上任的 

    #define IPSKB_MASQUERADED 1

    #define IPSKB_TRANSLATED 2

    #define IPSKB_FORWARDED  4

    };

应变量阐明当内核接纳住处附近的当地酒店时IP, 在交付到下层一致垄断, 先停止打补丁重组.IP包装当中的有别于号码(ID)是平稳的的. IP斑块偏倚(frag_off)14(IP_MF)1, 标明这点IP包装袋有接替的人或事物. 下层偏移13一会儿是未受损伤的预告包正中的切断的偏移量。, 8音节为单位. IP_MF位为0, 表现IP包装袋是打补丁的经受住大量.万一60120几乎第二份食物IP_FRAG_TIME常数任命。(30HZ))重组队列内包未到齐, 则重组审阅耽搁, 重组队列被使分娩, 同时向发送者ICMP一致预告耽搁通讯. 重组队列的内存消费不得大于256k(sysctl_ipfrag_high_thresh), 另外的召唤将被召唤(ip_evictor)使分娩每支散列尾端的重组队列.尽量的IP意识到必需品能重行使担负至多576音节预告报。可能性在分隔堆叠。。堆叠处置。阻止内存打补丁化形成内存消费大于正常。,linux设置限度局限以阻止这种境况,万一超越内存运用上限,空内存中最老的队列ipq.所运用的内存的体积禁猎地在变量中。ip_frag_mem中,自然,读写葡萄汁是一种原子举动。atomic_subatomic_addatomic_readetc)。它在发稿中精确地解释。探出分隔缀编编码的程序该一套根本平稳的。,分别符合效能分工变更了。鉴于左右的发生ipfrag禁猎地的建筑风格可以在skbuff中腰槽,在此建筑风格已被注销,并对ipq在建筑风格上作了相当修正。。其他的有意义的事物变奏是:

    1ip_defrag陷入了ip_defragip_frag_queue两零件。

    2ip_glue将著名的更代替ip_frag_reasm,这人审阅根本上无被使感动。。

3)如今ipq中用meat眼前的分隔上浆的累计值(曾经处理堆叠),万一这人值走到总上浆,它残忍的尽量的的分隔抵达,因而它被注销了ip_done应变量,你不用每回都要遍历人家列表,到这程度,巨大地预付款了生产率。,抗拒小摘录袭击的最大限度的腰槽提高。。 

    ip_findàip_frag_createàip_frag-internà IP_FRAG_TIME

程序

    struct sk_buff *ip_defrag(建筑风格) sk_buff SKB)

    {

    万一用于切断处置的内存坯大于最大VA256k,因而它将被洗涤ip_evictor 

    约定IP包装补足语准备dev

    基金HASH值,分隔链正中的包装座位:

万一在分隔链,它标明还要其他的零件抵达,万一不正常的话怎么办?

    将切断拔出到类似的切断队列中,

基金包装手势位与偏移:万一是经受住人家摘录包,但未必获得。,将切断队列的上浆设置为原始包的上浆;万一是比当在夜里的预告包,更改段队列的上浆;万一是前袋。整洁的分隔封装skb指状物:使skb->data标点ip负担(预告区域),skb->tail标点ip负担嵌上。即:skb->data-skb->tailip加载区。因而境况执意这么大的。sk_buff补充部分分隔链,并在重组时缓慢地拼接分片。扫描重组队列正中的包摘录,在摘录链中找到切断的第一流的个切断:运用偏移量offset万一切断找错误第一流的切断prev!=null),率先淘汰与前床的堆叠:求prev尾流与流畅蒙混的矛盾,(胶印包),未必是它方面的哪一个。;与后者堆叠,查找流畅偏移量next堆叠矛盾,万一包装的终点没有包装的后端。,下人家一组建议的重行启动,后堆叠零件清洁,缩减切断统计法的总上浆meat;万一后者切断完整象征在切断中。,倾销它next,缩减切断统计法的总上浆meat将切断拔出切断队列:修理准备,夸大meat切断总上浆,万一偏移是0这是第一流的个包装袋,置上FIRST_IN选出而尚未上任的。反省切断可能性的选择是经受住大量(高球可能性的选择整个在)。,鲍昌独),是:停止分片重组ip_frag_reasm重组前,率先迅速分开切断队列。新发行sk_buff建筑风格,填写类似的值:发展新的IP总上浆(不超越)65535音节);组织头座位、IP头座位、调动球员预告拷贝原始的IP头(Piecewise排队的第一流的个分片中有记载)到新的skb建筑风格整体的拷贝:分隔链上的切断skb预告繁殖到新skb建筑风格中。夸大中等学校范本。设置客观的地址(无性繁殖)、包典型、一致、准备。用作防火墙处置。重行设置IP头、将3位成绩13位偏移设置为0、计算总上浆。回归新IP包。万一它是第一流的个切断(无找到),将新进入拔出到切断队列头中ip_frag_createip_evictor

    当分区中运用的内存超越某个限度局限时(sysctl_ipfrag_high_thresh)会召唤ip_evicator使分娩使想起。

    ip_evicator会被发现的人清空IPQ,清空它,直抵走到可购得的的上限sysctl_ipfrag_low_thresh)。 

    此值为精确地解释列举如下:

    int sysctl_ipfrag_high_thresh = 256*1024;

    int sysctl_ipfrag_low_thresh = 192*1024; 

    同一,用sysctl -a可可饮料主教权限这两个参量,可以同时静态修正。

    sysctl -a

    ……

    net.ipv4.ipfrag_low_thresh = 196608

    net.ipv4.ipfrag_high_thresh = 262144

    ……

    抽象地ip_evicator葡萄汁采取LRU算法,将最陈旧的IPQ倾销。但眼前linux(包含.0)无意识到这人应变量,恰当的有意hash按次清空服务台。,同well复杂易行。。 

    Memory limiting on 打补丁。 Evictor trashes(戒除) the oldest * fragment queue until we are back under the low 门槛。

    Ip_evictor应变量遍历分隔队列,同时戒除到眼前为止曾经搜集到的分片,直到所运用的内存总共收入没有约定的限度局限。。如果内存占领大于他的内存限度局限。,这人应变量叫做Ip_free应变量。当打补丁队列为空且内存级限的也Excel时,Ip_evictor应变量会在内核中动机恐慌。。

    LRU算法,全程变量ipq_hash[64]链表,越近的链,援用计数越老,则

    双周期每回擦掉最陈旧的,计数最少的,直到内存总共收入缩减到sysctl_ipfrag_low_thresh1921024

ip_frag_create

    设定初值一IPPiecewise排队,它包含人家跑表,处置效能是IP_expire。用ip_frag_intern设置链头和拔出时期链。

ip_frag_intern

    ip_frag_nqueues++

发表评论

电子邮件地址不会被公开。 必填项已用*标注