ARP協(xié)議
什么是ARP協(xié)議
協(xié)議分析篇第一個要研究的就是ARP協(xié)議殿如。ARP(Address Resolution Protocol茴扁,地址解析協(xié)議)用于將IP地址解析為物理地址(MAC地址)峭火。這里之所以需要使用MAC地址卖丸,是因?yàn)榫W(wǎng)絡(luò)中用于連接各個設(shè)備的交換機(jī)使用了內(nèi)容可尋址存儲器(CAM稍浆,Coment Addressable Memory)衅枫。該存儲器維護(hù)的ARP表列出了它在每一個端口的所有連接設(shè)備的MAC地址朗伶。
當(dāng)交換機(jī)收到了一個指向特定MAC地址的網(wǎng)絡(luò)流量论皆,它就會使用這個表猾漫,來確定應(yīng)該使用哪一個端口發(fā)送流量悯周。如果目標(biāo)MAC地址是未知的队橙,那么這個傳輸設(shè)備會首先在它的緩存中查找這個地址捐康,如果沒有找到解总,那么這個地址就需要通過在網(wǎng)絡(luò)上額外的通信中解析了姐仅√透啵或者我們可以結(jié)合下圖來說明這個問題:
由上圖可見佳簸,OSI模型將網(wǎng)絡(luò)分為了七層生均,而IP地址位于第三層马胧,也就是網(wǎng)絡(luò)層佩脊,MAC地址位于數(shù)據(jù)鏈路層威彰,也就是第二層抱冷。那么在通過以太網(wǎng)發(fā)送IP數(shù)據(jù)包的時候旺遮,需要首先封裝第三層和第二層的報頭耿眉。但由于發(fā)送數(shù)據(jù)包時只知道目標(biāo)IP地址边翼,不知道其MAC地址,而又不能直接跨越第二鸣剪、三層组底,所以需要地址解析協(xié)議。而在使用了ARP協(xié)議后筐骇,計算機(jī)可以按照網(wǎng)絡(luò)層IP數(shù)據(jù)包的頭部信息债鸡,將硬件地址信息(MAC地址)對應(yīng)起來,以保證通信的順利進(jìn)行铛纬。ARP協(xié)議的基本功能就是將一個已知的IP地址解析成MAC地址厌均,以便主機(jī)之間可以正常地通信。
ARP協(xié)議是在RFC826中定義的告唆。RFC(Request for Comments)是定義各種協(xié)議實(shí)現(xiàn)標(biāo)準(zhǔn)的官方文檔棺弊,建議大家在學(xué)習(xí)網(wǎng)絡(luò)知識的時候,應(yīng)當(dāng)多多參考這些資料擒悬,因?yàn)樗顧?quán)威模她,也最全面。大家可以在RFC Editor的首頁中搜索RFC文檔懂牧,而在本次的課程中侈净,我也給大家提供了RFC826文檔,包括pdf格式以及txt格式归苍,供大家學(xué)習(xí)參考用狱。通過查看RFC826可以知道,其實(shí)ARP協(xié)議的解析過程只使用了兩種數(shù)據(jù)包:一個ARP請求和一個ARP響應(yīng),如下圖所示:
其詳細(xì)工作原理為:
(1)當(dāng)主機(jī)A想要給主機(jī)B發(fā)送數(shù)據(jù)時咏连,主機(jī)A會首先在自己的本地ARP緩存表中檢查與主機(jī)B相匹配的MAC地址骑晶。
(2)如果主機(jī)A在自己的緩存表中沒找到主機(jī)B的相關(guān)條目,那么它就要想辦法獲取主機(jī)B的MAC地址匙头。這就需要將ARP的請求幀廣播到本地網(wǎng)絡(luò)上的所有主機(jī)中电抚。這個請求幀包含有主機(jī)A的IP地址和MAC地址肘迎,以及主機(jī)B的IP地址姻蚓。網(wǎng)絡(luò)中凡是收到請求幀的主機(jī)都會檢查自己的IP地址是否與請求地址一致,如果不一致烧给,則會丟棄該請求幀。對于上圖來說酝惧,主機(jī)C和主機(jī)D會丟棄主機(jī)A發(fā)出的請求幀榴鼎。
(3)主機(jī)B確定ARP請求中的IP地址和自己的IP地址一致涧尿,那么就會將主機(jī)A的IP地址和MAC地址添加到本地的緩存列表中。
(4)主機(jī)B將包含有自己MAC地址的ARP響應(yīng)消息直接回復(fù)給主機(jī)A(單播)檬贰。
(5)主機(jī)A收到從主機(jī)B發(fā)來的ARP響應(yīng)消息后姑廉,會將主機(jī)B的IP地址和MAC地址添加到自己的ARP緩存表中。接下來翁涤,主機(jī)A就可以向主機(jī)B發(fā)送消息了桥言。
如果想要查看ARP緩存表,可以打開cmd葵礼,輸入“arp -a”:
輸出的信息顯示了本機(jī)接口為172.21.79.153地址的ARP緩存表号阿。每行表示一個ARP條目。本地的緩存是有生命周期的鸳粉,默認(rèn)的ARP緩存表的有效期是120秒扔涧,過期后,需要重復(fù)上述過程届谈。
分析ARP數(shù)據(jù)包
掌握了以上知識枯夜,我們就可以分析ARP數(shù)據(jù)包了。這里我們打開Lab6-1.pcap:
可以看到艰山,第1個數(shù)據(jù)包是一個ARP請求湖雹。我們可以通過Packet Details面板,檢查以太網(wǎng)頭部信息來確定這個數(shù)據(jù)包是不是一個真的廣播數(shù)據(jù)包曙搬。
首先在Frame幀中摔吏,可以知道該數(shù)據(jù)包的大小為42個字節(jié)。
其次檢查一下Ethernet部分的內(nèi)容纵装,會發(fā)現(xiàn)這個數(shù)據(jù)包目的地址是ff:ff:ff:ff:ff:ff征讲,這是一個廣播地址,說明當(dāng)前數(shù)據(jù)包會被廣播到當(dāng)前網(wǎng)段中的所有設(shè)備上橡娄。而這個數(shù)據(jù)包中以太網(wǎng)的源地址就是本機(jī)的MAC地址诗箍。
接下來展開ARP請求的頭部信息。按照順序依次為硬件類型瀑踢、協(xié)議類型扳还、硬件地址長度、協(xié)議長度橱夭、操作碼(該值為1,表示這是一個ARP請求包)桑逝、發(fā)送方的MAC和IP地址棘劣,以及接收方的IP地址。而我們想要獲取的目標(biāo)MAC地址還是未知的楞遏,因此就以全0的形式顯示茬暇。
下面我們研究一下第二個數(shù)據(jù)包首昔,來看看ARP的響應(yīng):
其實(shí)ARP響應(yīng)的數(shù)據(jù)包和ARP請求的數(shù)據(jù)包很相像。不同之處表現(xiàn)在以下幾點(diǎn):首先糙俗,用于響應(yīng)的數(shù)據(jù)包的操作碼(Opcode)現(xiàn)在是2勒奇,表明這是一個用于響應(yīng)的數(shù)據(jù)包;其次巧骚,發(fā)送方的MAC地址和IP地址變成了目標(biāo)MAC地址和IP地址赊颠;最后,響應(yīng)數(shù)據(jù)包中的內(nèi)容都是可用的劈彪,也就是說我們已經(jīng)獲取了192.168.0.1主機(jī)的MAC地址竣蹦,即00:13:46:0b:22:ba,那么接下來就可以正常通信了沧奴。
最后我們再討論一個關(guān)于免費(fèi)ARP(gratuitous ARP)的例子痘括。由于網(wǎng)絡(luò)中一個設(shè)備的IP地址是可以改變的,而MAC地址不會改變滔吠。那么一旦出現(xiàn)IP地址改變的情況纲菌,網(wǎng)絡(luò)主機(jī)中緩存的IP和MAC地址映射就不再有效了。那么為了防止由于映射失敗造成的通信錯誤疮绷,免費(fèi)的ARP請求會被發(fā)送到網(wǎng)絡(luò)中驰后,強(qiáng)制所有收到它的設(shè)備使用新的IP以及MAC地址映射來更新緩存。通常矗愧,它發(fā)生在系統(tǒng)引導(dǎo)期間進(jìn)行接口配置或IP地址出現(xiàn)變化的時候灶芝。
這里我們分析一個包含有免費(fèi)ARP的實(shí)驗(yàn)文件(Lab6-2.pcap):
首先我們可以看到這個數(shù)據(jù)包是以廣播的形式發(fā)出的,這樣一來唉韭,網(wǎng)絡(luò)上的所有主機(jī)都能收到它夜涕。接下來我們可以發(fā)現(xiàn),發(fā)送方的IP地址和接收方的IP地址是一致的属愤。網(wǎng)絡(luò)中的其它主機(jī)收到這個數(shù)據(jù)包之后女器,它會讓這些主機(jī)使用新的IP和MAC地址映射關(guān)系來更新它們的ARP表。由于這個ARP數(shù)據(jù)包是源主機(jī)未經(jīng)請求主動發(fā)出的住诸,并導(dǎo)致了目標(biāo)主機(jī)更新了ARP緩存驾胆,所以稱之為免費(fèi)的ARP。