OS X 路径最大传输单元 (PMTU) 黑洞路由器检测失败

OS X 路径最大传输单元 (PMTU) 黑洞路由器检测失败

这一切都发生在我试图在 Mac 上下载播客时。当以太网接口设置为使用巨型帧时,Snow Leopard 和 Lion 都会发生这种情况。

prompt> curl -v -o x.mpg http://audio.wnyc.org/freakonomics_specials/freakonomics_specials041112.mp3 
* About to connect() to audio.wnyc.org port 80 (#0)
*   Trying 204.93.180.53... Local Interface en0 is ip 172.16.1.2 using address family 2
* Local port: 0
* connected
* Connected to audio.wnyc.org (204.93.180.53) port 80 (#0)
> GET /freakonomics_specials/freakonomics_specials041112.mp3 HTTP/1.1
> User-Agent: curl/7.19.7 (universal-apple-darwin10.0) libcurl/7.19.7 OpenSSL/0.9.8r zlib/1.2.3
> Host: audio.wnyc.org
> Accept: */*
> 
OK
< Server: nginx/0.7.65
< Date: Mon, 16 Apr 2012 23:39:03 GMT
< Content-Type: audio/mpeg
< Content-Length: 42075070
< Last-Modified: Tue, 10 Apr 2012 21:15:08 GMT
< Connection: close
< Content-Disposition: attachment
< Accept-Ranges: bytes
< 
  0 40.1M    0     0    0     0      0      0 --:--:--  0:00:24 --:--:--     0^C

标题可以顺利通过,但下载却无处可去。这是仅有的网络服务器我也遇到了这种问题,但是它仍然很烦人,我想看看除了放弃所有地方的巨型帧之外是否还有其他解决方法。

我确定,只要我下载的块大小不超过 1448 字节,我就可以下载部分文件。我可以使用范围 0-1447 或 10000-11447,因此它不是文件中的位置,而是块的大小。我的路由器上的 WAN MTU 已设置为 1500,因此我尝试逐步将其减少到 1400,但仍然没有任何变化。

我以为这是路径 MTU 黑洞发现的问题,因为当我停止在以太网接口上使用巨型帧时,问题就消失了。但我已经为黑洞发现做好了一切准备(据我所知),ping 没有发现任何问题:

ping  -g1435 -G1445 204.93.180.53PING 204.93.180.53 (204.93.180.53):
(1435 ... 1445) data bytes
1443 bytes from 204.93.180.53: icmp_seq=0 ttl=51 time=69.223 ms
1444 bytes from 204.93.180.53: icmp_seq=1 ttl=51 time=75.542 ms
1445 bytes from 204.93.180.53: icmp_seq=2 ttl=51 time=72.136 ms
1446 bytes from 204.93.180.53: icmp_seq=3 ttl=51 time=73.732 ms
1447 bytes from 204.93.180.53: icmp_seq=4 ttl=51 time=72.057 ms
1448 bytes from 204.93.180.53: icmp_seq=5 ttl=51 time=73.377 ms
1449 bytes from 204.93.180.53: icmp_seq=6 ttl=51 time=71.717 ms
1450 bytes from 204.93.180.53: icmp_seq=7 ttl=51 time=73.293 ms
1451 bytes from 204.93.180.53: icmp_seq=8 ttl=51 time=71.874 ms
1452 bytes from 204.93.180.53: icmp_seq=9 ttl=51 time=73.206 ms
1453 bytes from 204.93.180.53: icmp_seq=10 ttl=51 time=71.289 ms

实际上,ping 最大可以达到 1494 个字节,尽管我认为 Mac 对字节的计数与其他 *nix 不同。(我认为它将 ICMP 标头的 8 个字节算作数据,但不将 IP 标头的 20 个字节算作数据,这与大多数不计算在内而有些则同时计算两者不同。)

我不想为了这个坏掉的网站而放弃 LAN 上巨型帧的性能优势,但我当然想要我的播客。所以我正在寻找可以尝试的建议。

我的 Mac 有 2 个内置以太网端口,所以我尝试过将第二个端口与 MTU 1500 连接并强制curl使用该端口。Curl 说它正在使用该端口,但该端口的 MTU 对下载是否成功没有影响。第一个活动以太网端口的 MTU 才是关键。我也不知道那是什么意思。

有人能给出建议吗?

答案1

解决方法:

  • 将接口 MTU 降低到 1500。系统偏好设置 -> 网络,选择接口(例如内置以太网),单击高级...按钮,以太网选项卡,MTU 下拉菜单或将配置设置为自动。这解决了问题,但意味着您无法在 LAN 上使用巨型帧(至少从这台计算机无法使用)。
  • 如果这是在 Linux 上:用于iptables仅为该主机限制 TCP MSS。 --set-mss 1460

解决方案:

  • 修复服务器配置以降低 MTU 或使路径 MTU 发现正常工作。

碰巧的是,我最终在 CDN 公司找到了可以实施解决方案的人,他们降低了 MTU,从而解决了这个问题。

相关内容