我有一个写入网络的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()输出的所有?似乎找不到任何东西..
答案 0 :(得分:3)
按顺序回答您的问题:
1)使用TCP时,多个发送调用合并是完全正常的,因为它是一个流协议,因此不会以任何方式保留用户级别的发送边界。我没有在你的跟踪中看到任何IP碎片(这可能是坏的)的证据,只是TCP分段(这是完全正常的)。
2)是的,这是大小 - 更具体地说,是报告系统调用在恢复后返回的值。
3)您可以使用“-e write = all”或“-e write =”来获取strace来报告整个书面数据。