MTU , Maximum Transmission Unit工窍,最大傳輸單元。
一前酿、基本概念
指通信協(xié)議某一層上面能傳輸?shù)淖畲笞止?jié)數(shù)患雏。這個(gè)參數(shù)通常和網(wǎng)絡(luò)接口有關(guān)。以太網(wǎng)MTU都是1500bytes罢维。
一個(gè)英文字母占一個(gè)一節(jié)淹仑,假如要模擬發(fā)送最大的字節(jié)數(shù),比如1500言津,就寫(xiě)1500個(gè)a攻人。
每種協(xié)議頭部和尾部字段都是規(guī)定好的,所以每種協(xié)議MTU減去頭部尾部的長(zhǎng)度剩下就是有效數(shù)據(jù)的長(zhǎng)度悬槽。
分片,因?yàn)殒溌范紩?huì)傳輸大數(shù)據(jù)的情況瞬浓,假如這臺(tái)機(jī)器正好不能把這個(gè)大包傳輸初婆,這個(gè)時(shí)候分片的概念就出現(xiàn)了,在一端分片以后,另一端還需要進(jìn)行重組磅叛,分片和重組對(duì)性能的損耗比較大屑咳,所以盡量減少分片情況出現(xiàn),于是就有了鏈路MTU的概念弊琴。
鏈路MTU兆龙,整條鏈路,單次傳輸能傳輸?shù)淖畲笞止?jié)數(shù)敲董。一般是由鏈路中最小的點(diǎn)決定的紫皇。這一點(diǎn)很好理解,就像不同大小水管拼接起來(lái)腋寨,是由最窄水管決定能傳多少水聪铺。
在進(jìn)行端到端的傳輸時(shí),傳輸之前先定位出來(lái)這條路上最窄的水管能裝多少水萄窜,之后就按照那個(gè)大小來(lái)發(fā)送铃剔。如何定位呢?
定位工具是常用的traceroute命令
traceroute主要是利用icmp錯(cuò)誤包來(lái)判斷端到端路徑中的每一跳的延時(shí)查刻,第一次先發(fā)ttl為1的包udp包键兜,這時(shí)會(huì)收到第一跳路由器ttl為0,產(chǎn)生的icmp錯(cuò)誤包穗泵,目的地不可達(dá)普气,依次增大ttl為 2,3火欧,4…直到收到的錯(cuò)誤包不是ttl超時(shí)而是udp端口不可達(dá)棋电,這樣就證明了確實(shí)到了對(duì)端。
二苇侵、定位手段
1.現(xiàn)象
最典型的現(xiàn)象赶盔,小包傳輸正常,大包傳輸失敗榆浓,一般這種問(wèn)題只能用抓包來(lái)看于未。
case 1:
場(chǎng)景抓包截圖如下:
看第一副圖,這個(gè)很明顯client一直在努力的發(fā) 長(zhǎng)度為 1460的包陡鹃,直到對(duì)方發(fā)回來(lái)reset烘浦。這種小包正常,大包重傳基本可以認(rèn)定是mtu問(wèn)題
server端萍鲸,中間丟了包闷叉,所以一直發(fā)ack,告訴對(duì)端中間有丟包
這個(gè)case是經(jīng)過(guò)了負(fù)載均衡轉(zhuǎn)發(fā)脊阴,所以源和目的地址對(duì)不上握侧,還有Fin和Reset的行為對(duì)不上蚯瞧。不過(guò)中間的傳輸是沒(méi)有問(wèn)題的,可以通過(guò)兩邊的行為品擎,典型的一邊一直再發(fā)埋合,另一邊收不到,所以一直告訴對(duì)方丟了中間的包萄传,直到重傳導(dǎo)致連接斷開(kāi)
case 2:
和case1一樣甚颂,wireshark顯示長(zhǎng)度為1514的包重傳,導(dǎo)致連接中斷
case 3:
以下這種情況收到icmp error以后秀菱,修正自己的發(fā)包大小
查到中間路徑返回的icmp error 振诬,告訴他下一跳的MTU是 1452,這樣發(fā)送端調(diào)整發(fā)送大小答朋,服務(wù)正常進(jìn)行下去贷揽。
case 4:
udp包測(cè)試最大MTU,udp沒(méi)有分片的情況梦碗,因?yàn)閁DP協(xié)議本身就是無(wú)狀態(tài)的禽绪,所以u(píng)dp發(fā)大包,會(huì)直接丟棄洪规。
udp模擬印屁,nc是很好的工具
client端運(yùn)行,nc serverip port
server端運(yùn)行? nc -l -u port
ping -M do www.baidu.com -s 1472
可以在server直觀的看到是否收到對(duì)端發(fā)來(lái)的包
三斩例、后記
想要探測(cè)沿途的mtu雄人,盡管大多數(shù)的系統(tǒng)不支持路徑MTU發(fā)現(xiàn)功能,但可以很容易地修改traceroute程序念赶,用它來(lái)確定路徑MTU础钠。要做的是發(fā)送分組,并設(shè)置“不可分片”標(biāo)志比特叉谜。發(fā)送的第一個(gè)分組的長(zhǎng)度正好與出口MTU相等旗吁,每次收到ICMP“不能分片”差錯(cuò)時(shí)就減小分組的長(zhǎng)度。如果路由器發(fā)送的ICMP差錯(cuò)報(bào)文是新格式停局,包含出口的MTU很钓,那么就用該MTU值來(lái)發(fā)送,否則就用下一個(gè)最小的MTU值來(lái)發(fā)送董栽。正如RFC1191[Mogul and Deering 1990]聲明的那樣码倦,MTU值的個(gè)數(shù)是有限的,因此在我們的程序中有一些由近似值構(gòu)成的表锭碳,取下一個(gè)最小MTU值來(lái)發(fā)送袁稽。