如果封包没有被分段,offset=0且MF=0.相反的,如果我们手上有一个片段,则满足下列条件:
1.第一个片段有offset=0且MF=1.
2.界于第一个片段和最后的片段之间的所有片段,这两个字段都为非0.
3.最后一个片段有MF=0且offset为非0.
2.4版以前的内核有个名为ip_build_xmit_slow的函数,会以倒序方式为本地产生的封包建立并传输IP片段。这种做法有一些有点:
1.最后一个片段是唯一可以通知接收者原有未分段封包尺寸的片段。尽可能早地知道这件事,有助于重组器对其内存的妥善运用。
2.重组器有可能更快建立起一个封包。片段会以偏移量递增的次序加入一个链表,如果每个片段都比其后片段晚到,则片段就可迅速加入链表头部。
ip_fragment:把等待传输的缓冲区转变成实际的封包。
片段存储在一个会定期改变的hash表内。每个封包都会关联一个定时器。如果定时器到期,该封包就会被删除。每个片段都会检查是否损毁,以及是否和先前接收的片段彼此重叠。
该hash链表定期重新组织表中所有的IP片段,来尽可能避开DoS攻击。重新组织是用一个定时器实现的,默认每10分钟到期一次。每次执行时,会产生一个随机数,然后使用这个随机数重算hash值,并以此重组hash表内的每个元素。
内核为IP片段实现两种垃圾收集:
1.系统内存使用限度
2.重组定时器
《深入理解Linux网络技术内幕》阅读笔记(十九)
最新推荐文章于 2023-03-08 17:42:10 发布