講個有用的東西:ping X.X.X.X -l 1400,這個 1400 大小是什么?如何定位鏈路 MTU?
本期給大家分享網絡基本原理。
我們在判斷鏈路是否支持傳輸大包,一般就會使用如下命令:
ping X.X.X.X -l 1400 //表示數據部分長度為1400字節那么問題來了:
- 問題1:實際從電腦網卡發出去的數據包大小到底是多少?
- 問題2:如果ping不通,是否可以確定鏈路中的MTU的具體值?下面一條一條解釋。

問題1:實際從電腦網卡發出去的包大小到底是多少?
ping -l 1400 中 -l 指定的是ICMP報文的數據部分長度(1400字節),但實際在網絡中傳輸的報文總長度更大,相關計算如下:
電腦發出去的ICMP報文的總長度 = 數據部分(1400字節) + ICMP頭部(8字節) + IP頭部(至少20字節,若帶選項則更長)+MAC頭部(18字節)
以最小IP頭部計算,所以電腦發出的數據包:
- 幀總長度為 1400+8+20+18=1446字節
- IP包長度為 1400+8+20=1428字節
如下:

問題2:如果ping不通,是否可以確定鏈路中的MTU的具體值?
可以,一般情況下以太網傳輸中MTU為1500字節,如下:

但一些奇怪的鏈路中(如VPN、VXLAN、物聯網等)可能會存在MTU<1500字節且不允許分片包轉發的情況,從而導致電腦、路由器、路由器按照MTU=1500發包會給鏈路丟掉,所以要解決這樣的問題:
- 需要測試該鏈路中的MTU值,也就是鏈路允許能轉發的最大IP包長度(不考慮MAC幀)
- 然后再對應的改小路由、PC中出接口的MTU值以適配鏈路。
1. 用ping命令探測鏈路MTU的核心邏輯
鏈路MTU是指從源到目標的整個路徑中最小的MTU值,ping命令通過指定不同的-l參數(ICMP數據部分長度),可判斷路徑是否支持該長度的報文:
- 若報文總長度(含頭部)≤ 鏈路MTU:ping成功,返回響應。
- 若報文總長度(含頭部)>鏈路MTU:此時ping失敗。
2. 用ping命令加字節長度根據結果分析
按照之前我給的例子,輸入:
ping X.X.X.X -l 1400我們知道了他的IP包長度是1428字節(不含MAC層頭部),如果:
- Ping成功,說明鏈路MTU至少為1428字節或支持分片傳輸,能支持大小為1428字節的IP包轉發:


- ping失敗,報文被丟棄,說明鏈路MTU小于1428字節并且不支持分片,收到大小為1428字節的IP包直接丟棄:


類似的我們可以通過逐步調整ping的長度參數以確定準確的鏈路MTU。我是不是講的有點抽象?但我個人覺得應該很好理解了。

























