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

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

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

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


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


類似的我們可以通過逐步調(diào)整ping的長度參數(shù)以確定準(zhǔn)確的鏈路MTU。我是不是講的有點抽象?但我個人覺得應(yīng)該很好理解了。















 
 
 







 
 
 
 