第十四章 数据包的分段与重组
14.1 数据包的分段发送
ip_finish_output()-->ip_fragment()-->ip_finish_output2()
ip_fragment()发送前分段及发送
ip_finish_output2()发送分段数据包
14.2 数据包的分段接收和重组
do_softirq()-->net_rx_action()-->process_backlog()-->netif_receive_skb()-->deliver_skb()-->ip_rcv()-->ip_rcv_finish()-->dst_input()-->...
...-->ip_local_deliver()-->ip_defrag()-->ip_find()
-->ip_frag_queue()-->ip_frag_reasm()
ip_defrag()接收重组,将数据包传递给TCP层
ip_find()查找或创建ip分段队列
ip_frag_queue()将分段数据包链入到分段队列中的正确位置.
ip_frag_reasm()重组数据包
14.3 分段数据包的接收队列
struct ipq { //ip分段队列结构
......
};
struct inet_frag_queue { //inet分段队列头结构
......
};
struct netns_frags { //网络空间的分段管理结构
......
};
struct inet_frags { //inet的分段管理结构
......
};
14.4 查找与创建分段队列
ip_defrag()-->ip_find()-->inet_frag_find()-->ip4_frag_match()
-->inet_frag_create()-->inet_frag_intern()
inet_frag_find()在ip4_frags结构队列中查找或创建INET分段队列头
ip4_frag_match()查找比对
inet_frag_create()创建INET分段队列头
inet_frag_intern()将新建的INET分段队列头链入哈希队列和老化队列
14.5 释放和销毁分段队列
ip_defrag()-->ip_evictor()-->inet_frag_evictor()-->inet_frag_kill()
-->inet_frag_destory()
ip_evictor()清除分段队列
inet_frag_evictor()清除分段队列
inet_frag_kill()将INET分段队列头摘链
阅读(688) | 评论(0) | 转发(0) |