全部產品
Search
文件中心

Elastic Compute Service:路徑MTU發現機制(PMTUD)

更新時間:Nov 14, 2024

路徑傳輸單元最大值發現PMTUD(Path MTU Discovery)是一種TCP/IP協議棧功能,用於動態發現路徑上允許的傳輸單元最大值PMTU(Path Maximum Transmission Unit)。當發送的資料包超過路徑上某個鏈路的MTU時,路由器會丟棄該資料包並發送ICMP錯誤訊息給發送方,通知其調整資料包大小,以避免在資料轉送過程中發生分區。這對於最佳化網路效能和避免因資料包過大導致的丟包問題非常有用。

PMTUD對網路效能的影響

PMTUD機制通過發送端和網路裝置之間的互動來動態地發現並適應網路路徑上允許的PMTU。這個過程有助於提高網路的效率和可靠性,同時減少了因分區而導致的潛在問題。

  • 避免IP分區:通過確保資料包大小不超過路徑中任何一跳的最小MTU值,PMTUD可以協助避免在網路中進行IP分區。分區會增加網路裝置的處理負擔,可能導致資料包丟失和延遲。關於TCP串連中如何避免IP分區,請參見TCP串連中如何避免IP分區

  • 提高網路效率:通過使用適當的資料包大小,PMTUD有助於減少網路擁塞和提高資料轉送效率。較大的資料包可以減少頭部開銷,提高輸送量,但前提是路徑上的所有鏈路都能支援這樣的資料包大小。

  • 減少丟包和延遲:避免分區可以減少因分區引起的丟包和延遲問題,因為分區後的資料包如果任何一個片段丟失,整個未經處理資料包都需要重新傳輸。

  • 自動調整資料包大小:PMTUD允許發送端根據網路路徑上的實際MTU動態調整資料包大小,而不需要事Crowdsourced Security Testing道網路的具體配置。

  • 提高網路的健壯性:通過動態發現路徑上的MTU,PMTUD有助於網路適應不同的鏈路類型和配置,提高了網路的健壯性和靈活性。

支援PMTUD的組件或系統

  • 作業系統:許多現代作業系統都支援PMTUD,包括但不限於Linux、Windows等。當前阿里雲ECS執行個體普遍支援PMTUD。

  • 網路裝置:一些先進的網路裝置,如路由器和交換器,可能內建了PMTUD功能,可以在資料包通過時自動進行PMTUD處理。但並非所有裝置都支援PMTUD,不支援PMTUD的裝置在收到大於自身MTU長度且設定了DF標誌的IP資料包時,回送給發送端的ICMP訊息裡可能不會包含其MTU值。

  • 中介軟體或庫:在某些編程環境中,可能會提供專門的庫或中介軟體來處理PMTUD。

  • 應用程式:一些網路應用程式可能會實現自己的PMTUD邏輯,以便在發送資料包時動態調整資料包大小。

  • 網路通訊協定:PMTUD普遍適用於基於IPv4和IPv6的傳輸層協議,包括但不限於TCP、UDP和ICMP等。

  • 雲端服務供應商:阿里雲的網路轉寄組件會依據RFC標準進行PMTUD處理,以保證網路連通性。詳細資料,請參見PMTUD工作原理

PMTUD工作原理

PMTUD通過在IP資料包中設定“不分區”標誌(DF=1),並利用ICMP訊息動態發現和適應兩個網路主機之間通訊路徑上允許的PMTU,以避免資料包在傳輸過程中被分區。具體工作過程如下:

  1. 發送端設定DF標誌:當發送端主機發送IP資料包時,設定IP頭部的“不分區”(DF)標誌位為1,表示在網路路徑上不允許對該資料包進行分區。

  2. 遇到MTU限制:當設定了DF為1的資料包在傳輸過程中遇到一個MTU更小的網路裝置或鏈路時,如果資料包的大小超過了該裝置的MTU,那麼該裝置會丟棄該資料包。

    • IPv4協議中:可以根據DF標誌的選擇來決定是否執行PMTUD。如果DF標誌位為0,且該網路裝置支援分區,那麼當資料包大小超過路徑上某個節點的MTU時,該節點可能會對資料包進行分區,而不是丟棄它。

      說明

      對於阿里雲上部分不支援分區的轉寄裝置(例如專線、跨域等通訊情境下邊緣網關),即使DF標誌位為0,也不會分區,而是丟棄資料包,然後發送ICMP錯誤訊息。

    • IPv6協議中:PMTUD是強制性的,要求所有主機和路由器必須支援PMTUD,因此IPv6資料包的DF標誌是隱含設定的,所有資料包都被視為設定了DF=1。

  3. 發送ICMP錯誤訊息:丟棄資料包的網路裝置如果支援PMTUD,則會向發送端主機發送一個ICMP的錯誤訊息,通知發送方發生了MTU問題。這個訊息中包含了該網路裝置的MTU(即從源端主機到該網路裝置之間的PMTU)。

    • 對於IPv4協議,裝置會發送一個ICMP“需要分區但設定了不分區”(Type 3, Code 4)的錯誤訊息回給發送方。

    • 對於IPv6協議,裝置會發送一個ICMPv6“封裝失效”訊息(Type 2, Code 0)給發送方。

  4. PMTU發現及訊息處理:發送端主機收到ICMP錯誤訊息後,解析並緩衝PMTU,然後根據ICMP訊息中提供的MTU值進行如下處理:

    • 預設情況下,發送端主機的作業系統核心會對資料包按照ICMP訊息中提供的MTU值進行分區,然後重新發送分區後的資料包。

    • 應用程式適配並處理ICMP訊息:當支援PMTUD的應用程式收到這類ICMP訊息時,可以根據ICMP訊息中的MTU,調整資料包的大小,然後重新發送調整後的資料包。這種方式能通過避免網路分區獲得更好的網路效能,但是一般情況下,要求對應用程式做相應修改才能實現。

      說明

      對於TCP串連,PMTUD的發現結果會影響到TCP層的MSS值。TCP層會根據PMTU值調整MSS,使用新的MSS值來發送後續的資料包,以確保TCP資料區段不需要在網路層被分區。詳細資料,請參見資料轉送過程中適配PMTUD機制動態調整MSS避免分區

  5. 緩衝PMTU值:發送端主機會在作業系統的路由表中產生一條路由緩衝,包含發往該目的IP的MTU值,作用於後續發往同一目的地的資料包,以避免在網路路徑上發生分區。

  6. 定期更新PMTU:PMTU值不是永久不變的,當網路路徑發生變化或作業系統路由快取老化時,主機會重新進行PMTUD過程,以更新PMTU值。

如何合理使用PMTUD

啟用PMTUD

您需要確保網路中的所有裝置都支援並啟用了PMTUD(例如在Linux系統中,/proc/sys/net/ipv4/ip_no_pmtu_disc檔案內容為0)。當前阿里雲ECS執行個體普遍支援PMTUD。

說明
  • 老舊的核心版本或者特定類型作業系統可能不支援PMTUD,導致無法正確處理PMTUD過程中的ICMP訊息,從而無法動態發現路徑上的允許的PMTU。

  • 如果裝置不支援,您可能需要通過手動的方式確認MTU(例如,使用ping命令手動探測PMTU),然後調整發送端資料包大小或者調整網路裝置的MTU(例如,手動修改網路介面的MTU)。

確保發送端可以接收ICMP差錯報文

  • 檢查並配置防火牆和安全裝置:您需要檢查並配置防火牆和安全裝置,以允許必要的ICMP訊息通過。在某些網路環境中,防火牆或其他安全裝置可能會過濾掉ICMP訊息,特別是類型3代碼4的“ICMP需要分區但DF設定”訊息,這會阻斷PMTUD過程。

  • 安全性群組允許存取ICMP流量:ECS執行個體響應PMTUD需要執行個體的安全性群組允許存取ICMP流量以接收來自不同轉寄組件的ICMP協商資料包。詳細資料,請參見安全性群組應用案例之特定協議訪問

  • 檢查網路流量是否達到限速值:網路流量太高可能會導致ICMP訊息被丟棄。您可以檢查網路流量是否達到限速值。

應用適配響應ICMP訊息

修改應用程式以響應PMTUD中的ICMP錯誤判文,並根據PMTU調整資料包大小(縮小資料包長度)。

說明
  • 如果應用程式沒有適配PMTUD機制,或者在接收到PMTUD相關的ICMP訊息後沒有適當調整資料包大小。這可能導致作業系統核心對資料包進行分區,造成資料包無法成功傳輸。

  • 如果應用程式無法適配PMTUD動態調整資料包大小,您可以在應用程式中手動設定一個較小的MSS值,以適應PMTU。

TCP串連中如何避免IP分區

TCP是一個連線導向的、可靠的傳輸層協議,旨在確保資料的完整性和順序。IP分區可能導致分區丟失或重組錯誤,影響TCP傳輸的可靠性。通過MSS協商和PMTUD機制,TCP串連可以在大多數情況下避免IP分區,從而提高網路效能和可靠性。

建立串連時通過MSS協商機制避免發生IP分區

最大報文段長度MSS(Maximum Segment Size)是傳輸控制通訊協定TCP中的一個參數,它指定了TCP層在每次傳輸中能夠發送的最巨量資料量,不包括TCP頭部。

MSS的協商是TCP/IP協議棧內部自動處理的,無需使用者或應用程式的直接幹預。這個過程確保了資料區段的大小適合於兩端的網路環境,避免了因資料包過大而導致的分區或因資料包過小而導致的效率降低。

在建立TCP串連的過程中,雙方會通過TCP三向交握進行MSS的協商。在SYN報文中,發送端會包含一個MSS選項,這個值通常是基於該端點的MTU減去IP和TCP首部的固定開銷得出的。接收端收到SYN報文後,會根據自己的MTU來確認一個合適的MSS值,並在SYN+ACK報文中返回給發送端。這樣,雙方就確定了通訊時使用的最大段大小,從而有助於避免因IP分區帶來的效率降低和重傳問題。

資料轉送過程中適配PMTUD機制動態調整MSS避免分區

MSS協商並不能保證在傳輸路徑中的所有網路裝置(如路由器)的MTU都大於或等於協商的MSS值。如果傳輸路徑中的某個網路裝置的MTU小於TCP資料包的大小,即使MSS已經協商過,仍然可能發生IP層的分區。另外,不需連線的協議,如UDP、ICMP等沒有MSS協商機制。此時,PMTUD機制就尤為重要。PMTUD允許通訊雙方動態地發現整個傳輸路徑上允許的PMTU,應用通過適配響應ICMP錯誤訊息,並據此調整MSS值,以避免分區的發生。