? ? 在排查網(wǎng)絡(luò)錯(cuò)誤的過(guò)程中,PING是我們必不可少的排錯(cuò)手段,PING是基于ICMP協(xié)議,但你真的了解PING么?
列如:
? ? 1.電腦PING一個(gè)包,抓包得到的數(shù)據(jù)包大小是多少字節(jié),請(qǐng)求與回應(yīng)的包結(jié)構(gòu)是什么樣的呢?
? ? 2.如果使用指定PING包攜帶字節(jié)大小為1字節(jié),那么抓包得到的數(shù)據(jù)包請(qǐng)求與回應(yīng)大小又是多少呢?
今天在安全巡檢時(shí)候,運(yùn)維的一個(gè)同事問(wèn)了上面這樣的倆個(gè)問(wèn)題,我給的答案是,最小的應(yīng)該是64字節(jié),一般PING包大小的話,我的看看ICMP占用多長(zhǎng)字節(jié)才知道。
? ? 也許觀察仔細(xì)的同學(xué)知道,電腦一般PING包攜帶32字節(jié),也就是這種:
? ? 那么抓包所得到的字節(jié)大小呢?
? ? 74字節(jié),由以太網(wǎng)頭部14個(gè)字節(jié)(源目MAC各6個(gè)字節(jié),Type 2個(gè)字節(jié))+IP包頭20個(gè)字節(jié)+ICMP 40個(gè)字節(jié)(8個(gè)固定字節(jié)+32個(gè)data字節(jié)),回包也應(yīng)是如此。
? ? 根據(jù)RFC894文檔指明,以太網(wǎng)封裝IP數(shù)據(jù)包的最大長(zhǎng)度是1500字節(jié),也就是說(shuō)以太網(wǎng)最大幀長(zhǎng)應(yīng)該是以太網(wǎng)首部加上1500,再加上7字節(jié)的前導(dǎo)同步碼和1字節(jié)的幀開(kāi)始定界符,具體就是:7字節(jié)前導(dǎo)同步碼 + 1字節(jié)幀開(kāi)始定界符 + 6字節(jié)的目的MAC + 6字節(jié)的源MAC + 2字節(jié)的幀類(lèi)型 + 1500 + 4字節(jié)的FCS。也就是1526字節(jié)!
? ? 但抓包卻是這個(gè)數(shù)值呢?原因是當(dāng)數(shù)據(jù)幀到達(dá)網(wǎng)卡時(shí),在物理層上網(wǎng)卡要先去掉前導(dǎo)同步碼和幀開(kāi)始定界符,然后對(duì)幀進(jìn)行CRC檢驗(yàn),如果幀校驗(yàn)和出錯(cuò),就丟棄此幀。如果校驗(yàn)和正確,就判斷幀的目的硬件地址是否符合自己的接收條件(目的地址是自己的物理硬件地址、廣播地址、可接收的多播硬件地址等),如果符合,就將幀交給“設(shè)備驅(qū)動(dòng)程序”做進(jìn)一步處理。這時(shí)我們抓包的軟件才能抓到數(shù)據(jù),因此,抓包軟件抓到的是去掉前導(dǎo)同步碼、幀開(kāi)始分界符、FCS之外的數(shù)據(jù),其最大值是6 + 6 + 2 + 1500 = 1514。
? ? 那么如果PING指定字節(jié)的長(zhǎng)度呢?比如PING帶一個(gè)字節(jié)長(zhǎng)度,數(shù)據(jù)包字節(jié)大小應(yīng)該是以太網(wǎng)頭部14個(gè)字節(jié)+IP報(bào)頭20個(gè)字節(jié)+ICMP 9個(gè)字節(jié),也就是43個(gè)字節(jié),回包也亦是如此。等等,以太網(wǎng)傳輸最短字節(jié)不應(yīng)該是64字節(jié)么?那么,會(huì)是在IP還是ICMP部分填充,直到達(dá)到64字節(jié)呢?(以下是在請(qǐng)求主機(jī)抓的報(bào)文)
? ? 為什么PING包請(qǐng)求是43字節(jié),回包卻是60字節(jié)?
? ? 這是由于以太網(wǎng)規(guī)定,以太網(wǎng)幀數(shù)據(jù)域部分最小為46字節(jié),也就是以太網(wǎng)幀最小是 6 + 6 + 2 + 46 + 4 = 64。除去4個(gè)字節(jié)的FCS,因此,抓包時(shí)就是60字節(jié)。當(dāng)數(shù)據(jù)字段的長(zhǎng)度小于46字節(jié)時(shí),MAC子層就會(huì)在數(shù)據(jù)字段的后面填充以滿(mǎn)足數(shù)據(jù)幀長(zhǎng)不小于64 字節(jié)。由于填充數(shù)據(jù)是由MAC子層負(fù)責(zé),也就是設(shè)備驅(qū)動(dòng)程序。不同的抓包程序和設(shè)備驅(qū)動(dòng)程序所處的優(yōu)先層次可能不同,抓包程序的優(yōu)先級(jí)可能比設(shè)備驅(qū)動(dòng)程序更高,也就是說(shuō),我們的抓包程序可能在設(shè)備驅(qū)動(dòng)程序還沒(méi)有填充不到64字節(jié)幀的時(shí)候,已經(jīng)捕獲了數(shù)據(jù)。因此不同的抓包工具抓到的數(shù)據(jù)幀的大小可能不同。(比如以上這種情況,就是由于沒(méi)有抓到設(shè)備驅(qū)動(dòng)填充字段)
? ? 現(xiàn)在,我們來(lái)看當(dāng)前請(qǐng)求和回應(yīng)報(bào)文詳細(xì)情況。
請(qǐng)求報(bào)文:
? ? 回應(yīng)報(bào)文:
? ? 也就是,在回應(yīng)報(bào)文的以太網(wǎng)幀填充了數(shù)據(jù),并且填充長(zhǎng)度恰好為17字節(jié)(60回應(yīng)報(bào)文 - 43請(qǐng)求報(bào)文)。剛剛好滿(mǎn)足之前結(jié)論,14(以太網(wǎng)固定字節(jié))+17(以太網(wǎng)填充字段)+20(IP包頭)+9(8個(gè)ICMP固定頭部+一個(gè)data字節(jié))。
? ? 若同時(shí)在回應(yīng)主機(jī)上抓包,會(huì)發(fā)現(xiàn)數(shù)據(jù)包字節(jié)恰好反過(guò)來(lái),也就是請(qǐng)求60字節(jié),回應(yīng)43字節(jié)。
? 那么問(wèn)題來(lái)了,若要恰好滿(mǎn)足數(shù)據(jù)包不填充字段,那么使用PING最少應(yīng)帶多長(zhǎng)字節(jié)才能滿(mǎn)足。