环回时 Java 套接字忽略 MTU 设置

环回时 Java 套接字忽略 MTU 设置

我遇到了 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)上工作。

相关内容