網路傳輸單元最大值MTU(Maximum Transmission Unit)是指在特定網路通訊協定下,通過網路能夠傳輸的最巨量資料包大小。在網路傳輸中,當遇到大包傳輸效率低或頻繁發生分區重組問題的情境時,可能需要調整MTU以確保資料包能更高效、無損地通過網路中的路由器和鏈路層限制,從而提升網路傳輸速度和穩定性。
MTU的分類
根據不同的網路層和應用情境,MTU有幾種不同的分類,包括:
鏈路層MTU
鏈路層能夠傳輸的最巨量資料載荷(Payload)的大小。在乙太網路中,MTU通常為1500位元組,不包含乙太網路頭部。標準乙太網路幀大小 (1518位元組)= 目的MAC地址(6位元組) + 源MAC地址(6位元組) + 類型/長度欄位(2位元組) + 資料載荷(1500位元組) + 幀校正序列(4位元組)。
IP MTU
網路層可以處理的最巨量資料包的大小,包括IP頭部和資料負載,不包括乙太網路幀的頭部和尾部。在阿里雲環境中,當我們提到MTU,通常指的是IP MTU。
如果考慮到IP頭部和TCP頭部的最小尺寸(可能會因為選項的存在而更長),IP MTU (1500位元組)= IP頭部(20位元組)+ TCP頭部(20位元組)+ 資料載荷(1460位元組)。
巨型幀MTU
巨型幀(Jumbo Frames)是一些廠商提出的概念,它將標準乙太網路幀的大小擴充到了9K位元組。巨型幀包括二層以太幀頭及CRC部分,而IP MTU通常不包括這些部分。合理使用巨型幀可以減少網路中資料包的數量,提高網路效率。阿里雲支援8500位元組的巨型幀,詳細資料,請參見巨型幀(Jumbo Frames)。
路徑傳輸單元最大值PMTU
路徑傳輸單元最大值PMTU(Path Maximum Transmission Unit)是指在兩個網路節點之間,不包括分區的情況下,能夠傳輸的最巨量資料包大小。這個路徑包括了從源節點到目的節點之間的所有網路裝置和鏈路,如路由器、交換器和通訊鏈路。
路徑傳輸單元最大值發現PMTUD(Path MTU Discovery)是一種TCP/IP協議棧功能,用於動態發現路徑上允許的傳輸單元最大值PMTU,以避免資料包在傳輸過程中被分區。詳細資料,請參見路徑MTU發現機制(PMTUD)。
影響MTU大小的因素
MTU的大小可以由多種因素決定,包括:
網路裝置:不同網路裝置如路由器、交換器在設計時會規定其支援的最大的MTU值,這是由硬體能力決定的。如果網路中的某個裝置的MTU小於其他裝置,那麼整個網路通訊過程中的MTU大小將被該裝置所限制。
網路類型:不同類型的網路連接,如乙太網路、無線網路等,對MTU的要求也不盡相同。例如,無線網路的MTU往往較小,因為無線訊號傳輸的穩定性相對較差,較大的MTU容易導致資料包的丟失和重傳。
傳輸介質:不同類型的網路介質(如雙絞線、光纖、無線等)可能有不同的MTU限制。
網路通訊協定:不同的網路通訊協定可能會對MTU有不同的要求,例如,乙太網路的標準MTU大小是1500位元組。
應用需求:某些特定應用可能對MTU有特殊要求,這也會間接影響整體網路的MTU。
MTU對網路效能的影響
正確地設定MTU對於網路通訊的效能和效率至關重要,通常體現在:
分區與重組
當一個資料包從一個網路傳到另一個具有不同MTU值的網路時,如果未經處理資料包的大小超過目的網路的MTU限制,資料包就需要被分割成多個小的資料包(分區)。這些分區在到達目的地後需要重新組裝起來(重組)。這個過程會增加網路延遲,降低傳輸效率,並可能增加網路裝置的處理負擔,因為分區和重組都需要額外的計算資源。
傳輸效率降低
由於分區和重組帶來的額外開銷,資料包在需要通過MTU較小的鏈路時,可能會導致整體的網路傳輸速率下降。此外,分區還可能導致某些協議或應用的效能問題,例如TCP的重傳機制可能會因分區丟失而被不當觸發,進一步降低效率。
網路擁塞
如果MTU設定得過小,會導致資料被分割為過多的小分區進行傳輸,增加了網路擁塞的可能性。而較大的MTU可以減少分組的數量,降低了網路的擁塞程度,提高了網路的輸送量。
為了最佳化網路效能,通常建議將網路路徑中的所有環節的MTU設定為一致,且儘可能地大,但又不超過路徑中任何一環節的MTU限制。這樣可以減少分區和重組的需求,提高傳輸效率。對於特定的應用情境,如視頻會議、大檔案傳輸等高頻寬需求的應用,適當調整MTU大小可以提升傳輸效率和品質。
查看ECS網路介面的MTU
MTU限定了網卡一次最多傳輸資料的位元組數。當前所有ECS執行個體都預設支援1500 MTU(網路介面遵循乙太網路標準封裝和傳輸資料)。如果您的ECS執行個體支援並開啟了巨型幀(Jumbo Frames),則支援8500的MTU。您可以遠端連線執行個體,通過作業系統命令查看目前網卡的MTU的值。
查看Windows執行個體的MTU
樣本作業系統:Windows Server 2022。
樣本執行個體規格類型系列:ecs.g8i.large。
遠端連線ECS執行個體。
具體操作,請參見通過密碼或密鑰認證登入Windows執行個體。
開啟命令提示字元或Windows PowerShell工具。
執行以下命令,查看當前網路介面的MTU。
netsh interface ipv4 show subinterfaces
開啟巨型幀之前
可以看到主網卡乙太網路和輔助彈性網卡乙太網路2的MTU均為預設支援的1500:
開啟巨型幀之後
可以看到主網卡乙太網路和輔助彈性網卡乙太網路2的MTU均變成8500:
查看Linux執行個體的MTU
樣本作業系統:Alibaba Cloud Linux 3.2。
樣本執行個體規格類型系列:ecs.g8i.large。
遠端連線ECS執行個體。
具體操作,請參見通過密碼或密鑰認證登入Linux執行個體。
執行以下命令,查看當前網路介面的MTU。
ip a
開啟巨型幀之前
可以看到主網卡eth0和輔助彈性網卡eth1的MTU均為預設支援的1500:
開啟巨型幀之後
可以看到主網卡eth0和輔助彈性網卡eth1的MTU均為8500:
使用ping命令手動探測PMTU
作為手動測試方式,您也可以通過ping
命令,手動探測PMTU。詳細方法如下:
進行此類測試可能會影響網路通訊,請在非高峰時段進行。
測試方法:通過發送一個包含“不分區”標誌的資料包,並逐漸增加資料包的大小,直到收到“需要分區但設定了不分區標誌”的ICMP錯誤訊息,表明前一個大小就是PMTU減去IP頭部(20位元組)和ICMP頭部(8位元組)的大小。
測試命令:執行以下命令,測試網路鏈路上的MTU大小。
ping -c 1 -M do -s [包大小] 目標地址
命令解釋:
-c 1:表示只發送一個資料包。
-M do:表示設定DF(Don't Fragment)不分區標誌。
-s [包大小]:指定資料包的大小(ICMP的PDU),初始值可以從一個常見的值開始(例如1472)。
說明ping 使用的是ICMP協議,ICMP的下層協議是IP協議,ICMP頭部共8位元組,IP頭部共20位元組,ICMP的IP資料包 = IP頭部大小 + ICMP頭部大小 + ICMP的PDU,所以 -s 1472 表示整個IP資料包的長度等於20+8+1472 = 1500 位元組。
測試樣本:
兩端主機MTU資訊:
FROM:172.17.0.127 ,為方便測試對比,啟用ECS巨型幀,MTU為8500位元組。關於啟用巨型幀,請參見開啟/關閉巨型幀。
TO:172.17.0.128 MTU為1500。
測試:執行以下命令,嘗試發送8472位元組的資料包(不包括IP和ICMP頭部大小)。
ping -c 1 -M do -s 8472 172.17.0.128
測試結果:收到了一個ICMP錯誤訊息,顯示"Frag needed and DF set(mtu=1500)",表示資料包因為超過了MTU(1500位元組)而需要分區,但是由於DF標誌位被設定,資料包不能被網路路徑上的轉寄裝置分區,因此被丟棄。
手動修改網路介面的MTU
在阿里雲上,一些通訊情境或網路產品(例如VPN網關、流量鏡像)對ECS發出的資料包大小有著更加嚴格的要求,需要您主動縮小資料包尺寸,以保證網路連通性或更好的使用者體驗。您需要修改ECS網路介面的MTU值,以滿足這些產品的要求。
在修改MTU之前,請確保瞭解降低或提高MTU可能對網路效能產生的影響。不恰當的MTU值可能導致某些類型的資料包需要分區,從而影響網路效率。
Linux作業系統的MTU會通過DHCP伺服器自動擷取,如果您沒有主動禁用DHCP或者不是在VPN網關等隧道情境中,一般情況下無需手動修改網卡MTU。
如果您是在巨型幀等特定情境下,請參考相關的最佳實務來解決,而不是手動修改MTU。關於巨型幀,請參見開啟/關閉巨型幀。
修改ECS網卡MTU時,注意不要超過ECS執行個體支援的MTU上限(開啟巨型幀時為8500,關閉或不支援巨型幀時為1500),否則可能導致網路不通。
在本樣本中,我們示範不同作業系統下手動修改ECS網卡MTU到1399位元組。
Windows執行個體
樣本作業系統:Windows Server 2022。
遠端連線Windows執行個體。
具體操作,請參見通過密碼或密鑰認證登入Windows執行個體。
開啟命令提示字元或Windows PowerShell工具。
執行以下命令,查看乙太網路網卡的MTU。
netsh interface ipv4 show subinterfaces
返回資訊如下所示,表示乙太網路網卡當前的MTU值為1500。
執行以下命令,設定乙太網路網路介面的MTU為1399,且設定永久生效。
netsh interface ipv4 set subinterface "乙太網路" mtu=1399 store=persistent
返回“確定”表示命令執行成功。如果返回有錯誤資訊,根據錯誤資訊提示修改即可。
再次查看乙太網路網卡的MTU,可以看到變更已經生效。
Linux執行個體
樣本作業系統:Alibaba Cloud Linux 3.2。
ip 命令臨時修改
此方式為臨時修改網卡介面的MTU值,如果重啟網路服務或重啟執行個體,修改會失效。
遠端連線Linux執行個體。
具體操作,請參見通過密碼或密鑰認證登入Linux執行個體。
執行以下命令,查看當前網卡的MTU。
ip a
可以看到,當前執行個體主網卡eth0和輔助彈性網卡eth1的MTU均為1500。
執行以下命令,臨時修改網路介面eth1的MTU為1399。
sudo ip link set dev eth1 mtu 1399
再次查看網卡資訊,可以看到eth1的MTU已經變為1399:
編輯網路設定檔(永久生效)
您可以通過編輯網路設定檔的方式修改網路介面的MTU,並且重啟網路介面服務或者重啟執行個體,使修改永久生效。
不同Linux發行版及版本不同,網路設定檔不同,本文以RHEL/CentOS系的Alibaba Cloud Linux 3.2為例說明具體配置。
如果您綁定了輔助彈性網卡(如eth1),且需要修改輔助彈性網卡的MTU,請您確保輔助彈性網卡已經正確配置。具體操作,請參見配置輔助彈性網卡。
遠端連線Linux執行個體。
具體操作,請參見通過密碼或密鑰認證登入Linux執行個體。
執行以下命令,查看當前網卡的MTU。
ip a
可以看到,當前執行個體主網卡eth0和輔助彈性網卡eth1的MTU均為1500。
執行以下命令,查看網路介面的設定檔資訊。
ls /etc/sysconfig/network-scripts
以下為當前執行個體的網路介面eth0和eth1的主網路設定檔
執行以下命令,禁用cloud-init的網路設定功能。
sudo vim /etc/cloud/cloud.cfg.d/99-disable-network-config.cfg
添加如下配置項:
network: {config: disabled}
執行以下命令,編輯eth1的網路設定檔,增加MTU配置。
sudo vi /etc/sysconfig/network-scripts/ifcfg-eth1
執行以下命令,重啟網路服務,使配置生效。
sudo systemctl restart NetworkManager
執行成功後,再次查看網路介面資訊,可以看到當前網路介面eth1的MTU值已經是1399:
實際應用中MTU的限制
ECS互訪鏈路MTU限制
支援巨型幀(Jumbo Frames)的ECS執行個體作為源主機時,目的主機在不同通訊情境下的鏈路最大MTU限制如下表所示:
目的主機 | 允許的最大MTU |
“同VPC內” 或 “同region對等串連的VPC內” 開啟巨型幀的ECS執行個體 | 8500 |
“同VPC內” 或 “同region對等串連的VPC內” 未開啟巨型幀的ECS執行個體 | 1500 |
“通過CEN實現互連的VPC內”任意ECS執行個體 | |
“通過Express Connect串連的線下IDC內”的主機 | |
“通過EIP、PIP訪問”的外部主機 |
雲網路產品MTU限制
當您處於以下情境時,需要關注網路產品自身的MTU限制:
在阿里雲網路內,鏈路預設支援1500 MTU,對於不支援巨型幀的ECS執行個體通訊時,需要關注VPN網關等網路組件自身的MTU限制。
在使用非TCP協議(UDP、ICMP)訪問特定網路產品時,需要注意不同網路產品自身的MTU限制。
當前阿里雲雲產品普遍不支援巨型幀,部分網路產品的最大MTU限制如下表所示:
網路產品 | 支援的最大MTU | 說明 |
NAT Gateway | 1500 | 無 |
負載平衡(包括ALB、NLB、CLB) | ALB和CLB不支援分區報文的轉寄,因此使用UDP/ICMP進行通訊時,需要嚴格控制源ECS執行個體發出的資料包的整包大小不超過1500。 | |
雲端服務(OSS,RDS等) | 由於流量會經過負載平衡產品,需注意負載平衡產品的限制。 | |
Global Acceleration | 無 | |
Cloud Firewall | 無 | |
私網串連PrivateLink | 無 | |
VPN網關 | 1399 | 更多資訊,請參見IPsec-VPN串連中MTU配置說明。 |
如何合理設定MTU
最佳化MTU的設定可以提高網路效率和效能,減少分區和重組資料包的需求,從而降低網路延遲和提高輸送量。以下是一些關於MTU設定的最佳實務:
確定合理的MTU:
瞭解實際網路環境的標準MTU值:乙太網路預設MTU通常是1500位元組。詳細資料,請參見MTU的分類。
可以通過ping命令探測PMTU。詳細資料,請參見使用ping命令手動探測PMTU。
啟用和適配PMTUD:確保作業系統或網路裝置支援並啟用PMTUD,這樣可以通過動態方式發現和適應網路路徑上允許的PMTU,應用程式通過適配感知並響應ICMP訊息,對資料包進行處理(縮小資料包長度),避免分區。詳細資料,請參見PMTUD工作原理。
考慮網路裝置的限制:確保路由器、交換器等網路裝置的MTU設定與作業系統的MTU設定一致,以避免資料包在傳輸過程中被分區或丟棄。
適應特定應用:某些應用程式或協議有其推薦的MTU大小。VoIP、視頻會議等即時應用可能從較小的MTU中受益,減少延遲和提高包傳輸效率。
定期監測網路效能:應定期監視網路效能和MTU大小的變化,以便及時調整以適應網路條件的變化,包括但不限於網路輸送量測試、延遲測試以及特定應用效能的評估。