TCP消息合并

时间:2011-10-24 13:15:33

标签: linux pcap fragmentation strace sendto

我有一个写入网络的Java应用程序。它在764b,+ / - 5b的区域内写入消息。 pcap显示流正在变为IP碎片,我们无法解释这一点。

Linux 2.6.18-238.1.1.el5

一个strace显示:

strace -vvvv -f -tt -o strace.out -e trace = network -p $ PID

1: 2045  12:48:23.984173 sendto(45, "\0\0\0\0\0\0\2\374\0\0\0\0\0\3\n\0\0\0\0\3upd\365myData"..., 764, 0, NULL, 0) = 764
2: 15206 12:48:23.984706 sendto(131, "\0\0\0\0\0\0\2\374\0\0\0\0\0\3\n\0\0\0\0\3upd\365myData"..., 764, 0, NULL, 0 <unfinished ...>
3: 2046  12:48:23.984811 sendto(46, "\0\0\0\0\0\0\2\374\0\0\0\0\0\3\n\0\0\0\0\3upd\365myData"..., 764, 0, NULL, 0 <unfinished ...>
4: 15206 12:48:23.984893 <... sendto resumed> ) = 764
5: 2046  12:48:23.984948 <... sendto resumed> ) = 764

当我捕获网络时,我看到的数据包大于MTU,这导致了碎片。

4809   5.848987 10.0.0.2 -> 10.0.0.5 TCP 40656 > taiclock [ACK] Seq=325501 Ack=1 Win=46 Len=1448 TSV=344627654 TSER=270108068        # First Fragment
4810   5.848991 10.0.0.5 -> 10.0.0.2 TCP taiclock > 40656 [ACK] Seq=1 Ack=326949 Win=12287 Len=0 TSV=270108081 TSER=344627643       # TCP ack
4811   5.849037 10.0.0.2 -> 10.0.0.5 TCP 40656 > taiclock [PSH, ACK] Seq=326949 Ack=1 Win=46 Len=82 TSV=344627654 TSER=270108081    # Second Frag

问题:

1)服务器似乎试图将两个sendto()批量处理成一个IP数据包,这个数据包大于MTU,因此变得支离破碎。为什么呢?

2)查看PID 2046的strace输出,是等号后的数字&lt; ... sendto resumed&gt;排队总共发送了什么?即第3行和第5行总共发送了764b?或者每行发送764个字节?

3)我是否可以通过任何选项来记录sendto()输出的所有?似乎找不到任何东西..

1 个答案:

答案 0 :(得分:3)

按顺序回答您的问题:

1)使用TCP时,多个发送调用合并是完全正常的,因为它是一个流协议,因此不会以任何方式保留用户级别的发送边界。我没有在你的跟踪中看到任何IP碎片(这可能是坏的)的证据,只是TCP分段(这是完全正常的)。

2)是的,这是大小 - 更具体地说,是报告系统调用在恢复后返回的值。

3)您可以使用“-e write = all”或“-e write =”来获取strace来报告整个书面数据。