TCP乱序队列(Out-Of-Order)

发布网友

我来回答

1个回答

热心网友

内核函数tcp_data_queue负责处理套接点数据接收,对于开始序列号sequence位于套接点下一个接收序列后,并在接收窗口内的数据包,若属于乱序报文,将其添加到TCP乱序队列中。此队列由红黑树组织,并通过ooo_last_skb缓存最后一个成员。若为首个乱序报文,直接插入队列,并更新最后一个skb指针;若支持SACK,则初始化一个SACK块。若队列非空,内核尝试将乱序报文与队列末尾数据包合并,或在树中查找合适位置插入。合并或插入后,遍历队列检查其他节点是否被覆盖,处理覆盖情况。

在接收保序数据包后,调用tcp_ofo_queue检查乱序队列中是否有可用数据包。若存在,内核将发送ACK确认报文,通知对端新请求数据包序号。遍历函数tcp_ofo_queue首先检查队列中首个节点的开始序号与套接点下一个接收序号的关系。若开始序号之后,表明存在缺口,跳出循环;若结束序号之前,则释放数据包。尝试将节点数据包与sk_receive_queue队列末尾数据包合并,若成功释放数据包,否则将节点添加至队列末尾。若节点带有FIN标志,调用tcp_fin处理,并清空队列。

接收缓存过载时,内核使用tcp_prune_queue函数尝试回收缓存。首先使用tcp_collapse_ofo_queue合并重复数据,接着使用tcp_collapse折叠sk_receive_queue队列数据。最后,若缓存仍过载,调用tcp_prune_ofo_queue删除队列中的数据包。在寻找连续序号节点时,若遇到缺口或队列结尾,合并head至skb之间的节点数据,并更新开始查找。若下一个节点与上一阶段有重叠,则更新开始序号。核心函数tcp_collapse检查能否折叠并找到最佳折叠点,进行折叠操作,重组序列号在指定范围内的数据包。

对于out_of_order_queue队列,先将新skb结构链接至临时列表,完成折叠后,将列表中的数据包插入队列树结构中。此过程涉及数据组织与树结构操作,以优化接收缓存管理与数据包排序。

声明声明:本网页内容为用户发布,旨在传播知识,不代表本网认同其观点,若有侵权等问题请及时与本网联系,我们将在第一时间删除处理。E-MAIL:11247931@qq.com