ARP協(xié)議的流程示意
ARP協(xié)議我們雖然已經(jīng)說(shuō)過(guò)很多次了,但是這個(gè)協(xié)議的重要性值得我們?cè)俅蝸?lái)探討一下它的基本概念和流程過(guò)程。這對(duì)我們防范ARP攻擊和欺騙的重要途徑,所謂知己知彼百戰(zhàn)不殆也是這個(gè)道理。
這里我們要介紹的是 Address Resolution Protocol (ARP)。 ARP是 TCP IP 設(shè)計(jì)者利用乙太網(wǎng)的廣播性質(zhì)﹐設(shè)計(jì)出來(lái)的地址解釋協(xié)定。它的主要特性和優(yōu)點(diǎn)是它的地址對(duì)應(yīng)關(guān)系是動(dòng)態(tài)的﹐它以查詢(xún)的方式來(lái)獲得 IP協(xié)議地址和實(shí)體地址的對(duì)應(yīng)。它的工作原理非常簡(jiǎn)單:
1. 首先﹐每一臺(tái)主機(jī)都會(huì)在 ARP快取緩沖區(qū) (ARPCache)中建立一個(gè) ARP表格﹐用來(lái)記錄 IP協(xié)議地址和實(shí)體地址的對(duì)應(yīng)關(guān)系。這個(gè) Table 的每一筆資料會(huì)根據(jù)自身的存活時(shí)間遞減而最終消失﹐以確保資料的真實(shí)性。
2. 當(dāng)發(fā)送主機(jī)有一個(gè)封包要傳送給目的主機(jī)的時(shí)候﹐并且獲得目的主機(jī)的 IP協(xié)議地址﹔那發(fā)送主機(jī)會(huì)先檢查自己的 ARP表格中有沒(méi)有該 IP協(xié)議地址的實(shí)體地址對(duì)應(yīng)。如果有﹐就直接使用此地址來(lái)傳送框包﹔如果沒(méi)有﹐則向網(wǎng)路發(fā)出一個(gè) ARPRequest 廣播封包﹐查詢(xún)目的主機(jī)的實(shí)體地址。這個(gè)封包會(huì)包含發(fā)送端的 IP協(xié)議地址和實(shí)體地址資料。
3. 這時(shí)﹐網(wǎng)路上所有的主機(jī)都會(huì)收到這個(gè)廣播封包﹐會(huì)檢查封包的 IP 欄位是否和自己的 IP協(xié)議地址一致。如果不是則忽略﹔如果是則會(huì)先將發(fā)送端的實(shí)體地址和 IP 資料更新到自己的 ARP表格去﹐如果已經(jīng)有該 IP 的對(duì)應(yīng)﹐則用新資料覆蓋原來(lái)的﹔然后再回應(yīng)一個(gè) ARPReply 封包給對(duì)方﹐告知發(fā)送主機(jī)關(guān)于自己的實(shí)體地址;
4. 當(dāng)發(fā)送端接到 ARPReply 之后﹐也會(huì)更新自己的 ARP表格﹔然后就可以用此紀(jì)錄進(jìn)行傳送了。
5. 如果發(fā)送端沒(méi)有得到 ARPReply ﹐則宣告查詢(xún)失敗。
ARP的查詢(xún)過(guò)程可參考下圖:
ARP的查詢(xún)過(guò)程
ARP的查詢(xún)過(guò)程
前面說(shuō)的 ARP表格﹐只有在 TCP IP 協(xié)定被載入核心之后才會(huì)建立﹐如果 TCP IP 協(xié)定被卸載或關(guān)閉機(jī)器﹐那么表格就會(huì)被清空﹔到下次協(xié)定載入或開(kāi)機(jī)的時(shí)候再重新建立﹐而同時(shí)會(huì)向網(wǎng)路發(fā)出一個(gè) A廣播﹐告訴其它機(jī)器它的目前地址是什么﹐以便所有機(jī)器都能保持最正確的資料。
然而﹐ARPcache 的大小是有所限制的﹐如果超過(guò)了界限﹐那么越長(zhǎng)時(shí)間沒(méi)被使用過(guò)渡資料就必須清理掉﹐以騰出空間來(lái)儲(chǔ)存更新的資料。所以﹐當(dāng)機(jī)器收到 ARPequest 封包時(shí)﹐如果查詢(xún)對(duì)象不是自己﹐則不會(huì)根據(jù)發(fā)送端地址資料來(lái)更新自己的 ARP表格﹐而是完全忽略該封包。同時(shí)﹐每筆存在 cache 中的資料﹐都不是永久保存的﹕每筆資料再更新的時(shí)候﹐都會(huì)被賦予一個(gè)存活倒數(shù)計(jì)時(shí)值﹐如果在倒數(shù)時(shí)間到達(dá)的時(shí)候﹐該資料就會(huì)被清掉。然而﹐如果該資料在倒數(shù)時(shí)間到達(dá)之前被使用過(guò)﹐則計(jì)時(shí)值會(huì)被重新賦予。
當(dāng)然了﹐ARP尚有一套機(jī)制來(lái)處理當(dāng) ARP表格資料不符合實(shí)際地址資料的狀況(例如﹐在當(dāng)前連線(xiàn)尚未結(jié)束前﹐收到目的端的地址資料更新訊息)﹔或是目的主機(jī)太忙碌而未能回答 ARP請(qǐng)求等狀況。