引用:
路徑最大傳輸單元 (PMTU) 黑洞路由器(簡體版)
檢測 PMTU 黑洞路由器PMTU 黑洞路由器會給 TCP 連接帶來問題。例如,Microsoft® Windows® XP 和 Windows Server™2003 中的 TCP/IP 協議默認情況下會使用 PMTU 發現。TCP 會發送 DF 標記設置為 1 的數據段,並且在需要時,會根據符合 RFC 1191 定義的“ICMP Destination Unreachable-Fragmentation Needed and DF Set”消息的回執(其中包含 IP MTU),更改 TCP MSS 值。
在 TCP 三次握手期間交換的 TCP 數據段不會太大,因而不會被 PMTU 黑洞路由器丟棄。但是,一旦開始在連接上傳輸數據—假定基於協商的 MSS 確定的 PMTU 比實際 PMTU 大—TCP 數據段的大於實際 PMTU 的 IP 包就會被直接丟棄。
例如,您可以用 FTP 命令行工具成功地與 FTP 服務器建立連接並登錄。但是,當您試圖下載或者上載文件時,中間的 PMTU 黑洞路由器就會丟棄達到最大大小的 TCP 數據段,從而導致錯誤和文件傳輸失敗。
您可以按照下面的語法使用 Ping 工具來檢測 PMTU 黑洞路由器:
Pingdestination –f –lICMPEchoPayloadSize
• 此處的 destination 可以是一個 IP 地址,也可以是一個可解析為 IP 地址的名稱。
• -f 選項可將 DF 標記設置為 1。
• -l 選項指定 ICMP Echo 消息的有效負載的大小。
• ICMPEchoPayloadSize 是 ICMP Echo 消息的有效負載的字節數。
要計算 ICMPEchoPayloadSize,可用您想發送的 IP 包的大小減去 28。這是因為,IP 報頭的大小為 20 字節,而 ICMP Echo 消息的 ICMP 報頭的大小為 8 字節。下圖顯示了二者的關係。
例如,要發送長度為 1500 字節的 ICMP Echo 消息,您應使用以下命令:
ping destination –f –l 1472
如果有 IP MTU 更小的中間鏈路,且路由器發送了“ICMP Destination Unreachable-Fragmentation Needed and DF Set”消息,則 Ping 工具會顯示“Packet needs to be fragmented but DF set”消息。如果有 IP MTU 更小的中間鏈路,且 PMTU 黑洞路由器直接丟棄了包,則 Ping 工具會顯示“Request timed out”消息。
要找出包含 PMTU 黑洞路由器的路徑的有效 IP MTU,請使用 Ping 工具,同時不斷增大 Echo 消息的有效負載的大小。因為典型子網的最小 IP MTU 是 576 字節,因此開始時可將 ICMP Echo 消息的有效負載設置為 548 字節,然後每次遞增 100 字節,直到找到有效 PMTU。
例如,如果 ping 10.0.0.10 -f -l 972 命令顯示“Reply from 10.0.0.10”,而命令 ping 10.0.0.10 -f -l 973 顯示“Request timed out”,則 IP 地址為 10.0.0.10 的節點的有效 PMTU 為 1000 字節 (972+28)。
PMTU 黑洞路由器的解決方案和工作方法以下的 PMTU 黑洞路由器的解決方案和工作方法按照從最簡單的解決方案到最困難的工作方法的順序排列。
1. 配置中間路由器以支持路由器端 PMTU 發現解決專用 Intranet 中的 PMTU 黑洞路由器問題的最簡單的方法,是將您的所有路由器配置為支持路由器端 RFC 1191,並支持發送 ICMP Destination Unreachable-Fragmentation Needed and DF Set 消息(其中帶有轉發失敗的鏈路的 IP MTU)。這與將路由器配置為支持主機端 RFC 1191 是有區別的,後者的路由器會對自己的 TCP 連接使用 PMTU 發現。
在 Internet 上進行通信時,通常不太可能將 Internet 路由器配置為支持路由器端 PMTU 發現。在這種情況下,您可以使用以下各節介紹的工作方法。
2. 啟用 PMTU 黑洞路由器檢測基於性能方面的考慮,Windows 2000、Windows XP 和 Windows Server 2003 中默認關閉了 TCP/IP 的 PMTU 黑洞路由器檢測。如無法將路由器配置為支持路由器端 RFC 1191,則可配置以下註冊表設置:
複製程式
Setting: EnablePMTUBHDetect
Key: HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\Services\Tcpip\Parameters
Value Type: REG_DWORD
Value: 1
因為此註冊表條目在默認情況下不存在,所以您必須使用註冊表編輯器工具添加此條目,然後重啟 Windows 使設置生效。
PMTU 黑洞路由器檢測得到啟用後,如果 TCP 數次重新傳輸某分段但仍未得到確認,則它會試圖發送 DF 標記設置為 0 的分段。如果接收到對 DF 標記設置為 0 的分段的確認,則連接中後續分段的 MSS 將減小,且其 DF 標記會設置為 1。啟用 PMTU 黑洞路由器檢測會增加重新傳輸給定分段的最大次數,從而會影響整體性能。
3. 確定最佳 IP MTU 並通過 MTU 註冊表設置來設置該值啟用 PMTU 黑洞路由器檢測的替代方法,是根據本文前面部分的介紹使用 Ping 工具確定所有相關路徑的 PMTU 值,然後使用註冊表設置手動配置發送接口的 IP MTU。
該方法通過不停發送 DF 標記設置為 1,大小又不會導致 PMTU 黑洞路由器將其直接丟棄的 IP 包來避開 PMTU 黑洞路由器。手動指定 IP MTU 意味著所有通信量(包括本地子網通信量和不包含 PMTU 黑洞路由器的路徑上的通信量)都將使用較小的 IP MTU。
確定有效的 PMTU 後,您可以通過以下步驟手動指定 TCP/IP 接口的 IP MTU:
1. 打開 Network Connections 文件夾,記下 LAN 連接的名稱,如“Local Area Connection”。
2. 單擊開始,單擊“運行”,鍵入“regedit.exe”,然後單擊“確定”。
3. 使用註冊表編輯器工具的樹圖(左邊窗格)打開如下鍵:HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\Control \Network\{4D36E972-E325-11CE-BFC1-08002BE10318}
4. 此鍵下面是與已安裝的 LAN 連接相關聯的全局唯一標識符 (GUID) 的一個或多個鍵。這些 GUID 鍵中的每一個都有一個 Connection 子鍵。打開每個 GUID\Connection 鍵,尋找值與第一步中記下的 LAN 連接的名稱匹配的 Name 設置。
5. 如果找到包含與 LAN 連接匹配的 Name 設置的 GUID\Connection 鍵,請寫下或記下該 GUID 值。
6. 使用註冊表編輯器的樹視圖打開如下鍵:HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\Services\Tcpip \Parameters\Interfaces\GUID
7. 右鍵單擊樹視圖中的“GUID”鍵,指向“新建”,然後單擊“DWORD值”。
8. 在註冊表編輯器工具的內容窗格(右窗格)中,為新註冊表設置的值鍵入 MTU,然後按 ENTER。
9. 在內容窗格中,雙擊新的 MTU 設置,並在“編輯雙字節值”對話框中選擇“十進制”,然後在“數值數據”中鍵入有效 MTU 值。
10. 單擊“確定”。關閉註冊表編輯器工具。
11. 重新啟動計算機使 MTU 設置生效。
4. 禁用 PMTU 發現如果確定網絡上基於 Windows 計算機的所有 LAN 接口的合適的 PMTU 值並進行配置不太可行,則可以使用最後一招:禁用 PMTU 發現。我們不推薦使用此方法,因為如果禁用 PMTU 發現,所有遠程目的地的 IP MTU 都將設置為 576 字節,而這會影響性能。
要關閉 PMTU 發現,請配置如下註冊表設置:
複製程式
Setting: EnablePMTUDiscovery
Key: HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\Services\Tcpip\Parameters
Value Type: REG_DWORD
Value: 0
因為此註冊表條目在默認情況下不存在,所以您必須使用註冊表編輯器工具添加此條目,然後重啟 Windows 使設置生效。
這個功能~小弟是把它列入網路優化的部份~