Chinaunix

标题: 关于内核TCP重组的函数 [打印本页]

作者: qps104    时间: 2007-12-17 10:45
标题: 关于内核TCP重组的函数
请教高手,linux内核2.6中关于ip重组的函数是ip_frag,那么关于tcp重组的函数是什么?
作者: yikaikai    时间: 2007-12-17 18:23
?
不明白你的意思, 协议你仔细看了没有? TCP包是在IP包之上的, IP包重组了, TCP包不也就重组了吗?
作者: qps104    时间: 2007-12-18 18:04
发送很大数据的时候是先在TCP分包,再IP分片吧. 那接收很大的数据不是一样的吗?
比如我tcp送655350字节的数据,先再tcp层分为65535大小的ip包10个,再在ip层分为1024大小的ip包65535/1024个,再发送出去.
是这样吧
作者: platinum    时间: 2007-12-18 23:53
TCP 协议有 MSS 选项,这样就不用在 IP 层分片了
作者: qps104    时间: 2007-12-19 12:00
谢谢 yikaikai  platinum的回答
我想知道的是在2.6内核的tcp/ip协议栈中,数据是如何实现tcp层的重组的?
作者: samzc2010    时间: 2010-03-11 09:48
这个问题MS没有答案???
作者: jiufei19    时间: 2010-03-11 14:13
回复 1# qps104


    正在阅读tcp部分的实现代码,不能给出精确的答案。但是原理上tcp和分段没有关系,tcp的数据是封装在IP报文中的,只要IP被正确重组后,那么tcp的内容自然就可以被直接合并在一起了
作者: samzc2010    时间: 2010-03-11 14:33
回复  qps104


    正在阅读tcp部分的实现代码,不能给出精确的答案。但是原理上tcp和分段没有关系,t ...
jiufei19 发表于 2010-03-11 14:13



    不是这样的,你说的是TCP协议内核实现吧?应该不是TCP Segment重组实现。TCP是流式协议,面向字节流的,但是由于IP传输的特性,需要分段传输,TCP会根据协商的MSS进行分段传输,IP层会根据Path MTU进行分片fragment(注意不是分段segment)。

举个例子或许更加清晰:比如100kB的数据需要使用TCP协议传输,我们知道IP传输的最大报文时64K,而以太网帧的最大frame长度基本上是1518(包含FCS),TCP是面向连接和流控的协议,所以TCP会对需要传输的数据进行分段segment,然后通过IP传输出去。如果没有启用selective ack,那么每个分段都需要确认。再说个实际例子,你用FTP下载个100MB的东西,那肯定不是一个IP包传输过来的饿,肯定是很多tCP分段传输过来的,FTP根据协议重组为你的文件或者其他格式数据。

我也研究很久HTTP over TCP的重组,TCP的分段比较复杂,结合HTTP协议分析,会简化细节,不过我也么有搞清楚细节,研究中。。
作者: jiufei19    时间: 2010-03-12 09:44
回复 8# samzc2010


    恩,关键是tcp的分段大小是怎样选择的,如果要避免最后封装在IP报文中被进行分片,则在选择大小是可能就和PMTU有关,这样选择的MSS大小才不会被中间节点分片
作者: samzc2010    时间: 2010-03-12 09:54
回复 9# jiufei19


    这个很难控制,TCP根据协商的MSS以及IP MTU分割TCP的分段,但是不能保证在传输路径上经过其他IP设备时添加其他协议封装后IP包超过MTU,不如VLAN tag或者其他的IP over IP或者GTP封装等协议封装,从而导致再次的ip碎片产生。这个问题相对比较复杂。




欢迎光临 Chinaunix (http://bbs.chinaunix.net/) Powered by Discuz! X3.2