2011-10-24 48 views
1

我有一个正在写入网络的Java应用程序。它正在写入764b,+/- 5b区域的信息。 pcap显示该流正在分割IP,我们无法解释这一点。TCP消息得到合并

的Linux 2.6.18-238.1.1.el5

甲strace的显示:

strace的-vvvv -f -tt -o strace.out -e跟踪=网络-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输出,是等号< ...之后的数字重新开始>发送的内容总数>即第3行和第5行共发送764b?或者每行发送764字节?

3)是否有任何选项可以传递给日志所有的sendto()输出?似乎无法找到任何东西..

回答

3

回答您的问题,依次是:

1)它是多个发送完全正常通话使用TCP的时候,因为它是一个流协议,并没有被合并以任何方式保持用户级别发送边界。我没有看到任何迹象显示IP碎片(这将是不好的),只是TCP分段(这是完全正常的)。

2)是的,这是大小 - 更具体地说,它是报告系统调用恢复后返回的值。 3)您可以使用“-e write = all”或“-e write =”来获取strace来报告整个写入的数据。

+0

+1我喜欢write = all提示,非常有用。 – hochl

+0

同意。该跟踪中没有显示IP碎片。 – caf

+0

特别针对#1,这被称为“Nagle算法” – Alnitak