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。這解決了問題,但意味著您無法在 LAN 上使用巨型幀(至少從這台電腦)。
  • 如果這是在 Linux 上:用於iptables限制該主機的 TCP MSS。 --set-mss 1460

解決方案:

  • 修復伺服器配置以降低 MTU 或使路徑 MTU 發現工作。

碰巧的是,我終於在 CDN 公司找到了可以實施解決方案的人,他們降低了 MTU,解決了問題。

相關內容