我有一个正在写入网络的 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 输出,等号 <... sendto resumed> 行之后的数字是发送的总数吗?即第 3 行和第 5 行总共发送了 764b?还是每行发送 764 个字节?
3) 是否有任何选项可以传递给 strace 以记录所有sendto() 输出?好像什么都找不到。。