現今網路速度越來越快的情況下,為了減少路由器的負擔(不讓路由器負責封包重組、分割的動作)
以及提升路由器處理的工作效能,會使用路徑MTU探索
(Path MTU Discovery)的概念
MTU是什麼
在進入路徑MTU探索
之前,先介紹什麼是MTU
,英文:Maximum Transmit Unit
就是在路由器收到一個訊框(Frame)後,能直接替換訊框表頭後轉發的最大封包(Packet)大小
(訊框與封包示意圖,未按比例畫製)
因為路由器不用做重組、分割的動作,因此大大降低封包等待轉發的時間
路徑MTU探索(Path MTU Discovery)
理解了MTU
後,我們可以盡量把每次要發送的封包大小控制在接近MTU
的值,如此就可以獲得封包傳送的最大效率(因為路由器只要轉發,不用負責重組、切割)
可是,封包從傳送端到接收端不一定只會經過一個路由器呀
所以,我們要找出所有封包走過的路徑裡最小的MTU
,這個動作就叫路徑MTU探索
運作說明
要找出路徑裡最小的MTU
,我們會將要傳送的封包IP表頭裡的Don't Fragment Bit
設為1
然後往路由器送,如果夠幸運,得到了接收端的ACK
,那就代表封包的大小比走過的路徑裡最小的MTU
小
如果不幸地,某個路由器發現這個封包大小超過下一段路徑所設定的MTU
,就會將此封包丟棄
並回傳一個ICMP
訊息給發送端,請原發送端將封包大小縮小後再重發
(示意圖)
ICMP錯誤訊息Type3, Code4內容為:Fragmentation required, but Don’t Fragment Flag is set.
來回個幾次後,當路由器不再回傳ICMP
訊息時,代表我們已經找到了路徑裡最小的MTU
。
而以上整個過程即為路徑MTU探索
。
模擬操作
我們可以利用terminal裡的ping
指令模擬路徑MTU探索
ping -Ds 封包大小 主機位址
p.s. -D
是將Don't Fragment Bit
設為1
,-s
後面則是接要設定的封包大小
像我故意把封包大小調成8192個bytes
可以看到回傳的訊息表示資料太長
如果往下調成1024個bytes
則能成功被接收端接收了。
沒想到因為楓之谷外掛而對程式感興趣XD
看到about me的那張角色圖回憶湧上心頭…
+1 勾起童年的回憶~