MTU 不匹配会让连接莫名其妙地卡住或变慢。这篇看 Docker Desktop 的默认 MTU 是多少,怎么给自定义网络设置 MTU,以及它怎样变成 TCP 的 MSS。
虚拟机 eth0 / docker0 的 MTU:65535 65535 默认 bridge 的网络选项 com.docker.network.driver.mtu = 65535 默认容器里 eth0 的 MTU = 65535
Docker Desktop 虚拟机内部的网络 MTU 是 65535,默认 bridge 和容器都继承了这个值。Linux 宿主机上的默认是 1500,这是我知道的惯例,没有在这里验证。
-o com.docker.network.driver.mtu=1400:容器里 eth0 的 MTU = 1400;虚拟机里这个网络的网桥 br-03b2… 的 MTU = 1400 -o com.docker.network.driver.mtu=1280:容器里 eth0 的 MTU = 1280;虚拟机里这个网络的网桥 br-6972… 的 MTU = 1280
创建网络时用 -o com.docker.network.driver.mtu=1400,容器里的 eth0 和虚拟机里的网桥都变成 1400。当容器要经过 VPN、隧道之类有更小 MTU 的链路时,通常要这样降 MTU;我没有复现一个真实的 MTU 黑洞问题。
默认 bridge(MTU 65535):两个容器之间的 TCP MSS = 32741 自定义网络 MTU 1400:两个容器之间的 TCP MSS = 1348 自定义网络 MTU 1280:两个容器之间的 TCP MSS = 1228
读 TCP_MAXSEG 看到:MTU 1400 → 1348,MTU 1280 → 1228,都是 MTU 减 52;默认 65535 的网络上是 32741,不是 65483,具体原因我没有查。我试过让容器连外网地址(github.com:443)读 MSS,连接超时了,所以没有外网路径上的数据。