我遇到了 mtu 问题。我做了以下操作:
root@sa-headend:/home/sa# ifconfig lo mtu 1500
root@sa-headend:/home/sa# ifconfig lo
lo Link encap:Lokale Schleife
inet Adresse:127.0.0.1 Maske:255.0.0.0
inet6-Adresse: ::1/128 Gültigkeitsbereich:Maschine
UP LOOPBACK RUNNING MTU:1500 Metrik:1
RX packets:143 errors:0 dropped:0 overruns:0 frame:0
TX packets:143 errors:0 dropped:0 overruns:0 carrier:0
Kollisionen:0 Sendewarteschlangenlänge:0
RX bytes:58028 (58.0 KB) TX bytes:58028 (58.0 KB)
root@sa-headend:/home/sa# ip route flush cache
我怎么可能得到这样的数据包:(使用 Wireshark 捕获)
15 0.028587 127.0.0.1 127.0.0.1 TCP 10005 > 49152 [ACK]
Seq=4717 Ack=53 Win=14600 Len=1608
TCP 数据包由 Java 套接字生成 - 如果有任何相关性的话。
请不要问我为什么要更改 MTU - 我只是必须这样做。
答案1
抱歉,我错误地认为所有类 Unix 操作系统都是相似的,但是您的内核是否可能认为您的环回接口支持 TCP 分段卸载 (TSO)?
在 Mac OS X(类似“BSD”)中,如果您在发送数据包的同一台机器上进行数据包捕获,则可以看到发送到卡上的 TCP 帧大得不可思议,因为堆栈知道卡将执行 TSO 将其切成 1500 字节的块。在 Mac OS X 上,您可以使用 禁用它sudo sysctl -w net.inet.tcp.tso=0
。
在 Linux 上,对于以太网接口,似乎可以执行sudo ethtool -K eth0 tso off
。但我不知道这是否可以在环回接口(而不是 ethX)上工作。