作者:孫曉明,華清遠(yuǎn)見嵌入式學(xué)院講師。
雖然在通常情況下,IP包是根據(jù)IP地址發(fā)送的,但實(shí)際上必須用硬件地址在網(wǎng)絡(luò)鏈路層上傳送數(shù)據(jù)(點(diǎn)到點(diǎn)鏈路除外,在這種鏈路上,目的地址的標(biāo)示有時(shí)是隱含的)。ARP,即地址解析協(xié)議,能發(fā)現(xiàn)與特定IP地址相關(guān)的硬件地址。它可以在所有支持廣播的網(wǎng)絡(luò)上使用,但最常見的還是按以太網(wǎng)的方式來介紹它。
如果主機(jī)A想把一個(gè)包發(fā)送到同一個(gè)以太網(wǎng)上的主機(jī)B,那么它用ARP來發(fā)現(xiàn)B的硬件地址。當(dāng)B與A不在同一個(gè)網(wǎng)絡(luò)上的時(shí)候,主機(jī)A用ARP來發(fā)現(xiàn)目標(biāo)地址為B的包應(yīng)發(fā)往的下一跳路由器的硬件地址。因?yàn)锳RP使用廣播包,這個(gè)包不能跨越網(wǎng)絡(luò)(路由器常?梢耘渲贸勺尨罅繌V播包涌入其他網(wǎng)絡(luò),盡量不要這樣做),所以它只能用于尋找和發(fā)送主機(jī)所在的本地網(wǎng)絡(luò)直接連接的計(jì)算機(jī)的硬件地址。
每個(gè)計(jì)算機(jī)都在它們的內(nèi)存里維護(hù)一張叫做ARP緩存的表,這張表保存了近期ARP查詢的結(jié)果。正常情況下,主機(jī)在啟動(dòng)后很快就能發(fā)現(xiàn)它所需要的許多地址,所以ARP不會(huì)造成大量的網(wǎng)絡(luò)流量。
ARP通過廣播(ARP采用底層鏈路層的廣播約定,而不是IP廣播的約定)這種形式的包“有人知道128.138.11*的硬件地址嗎?”來發(fā)揮作用。被搜索的計(jì)算機(jī)會(huì)識(shí)別出這是自己的IP地址,然后返回一個(gè)應(yīng)答:“是的,這是分配給我的一個(gè)網(wǎng)絡(luò)接口的IP地址,而相應(yīng)的以太網(wǎng)地址是8:0:20:0:fb:6a!
初始查詢包括請(qǐng)求方的IP地址和以太網(wǎng)地址,這樣正被搜索的計(jì)算機(jī)可以在不發(fā)送它自己的ARP查詢的情況下給予應(yīng)答。這樣,這兩臺(tái)計(jì)算機(jī)只要一次包交換就可以知道彼此的ARP映射了。其他*到請(qǐng)求方的初始廣播的計(jì)算機(jī)也可以記錄下它的地址映射。這種被動(dòng)的ARP流量檢測有時(shí)叫做探聽(snooping)。
arp命令可以檢查和處理內(nèi)核的ARP緩存。arp一般用于增加或者刪除一條緩存項(xiàng),它也可以刷新緩存表或者顯示它。arp -a會(huì)顯示ARP緩存的內(nèi)容。例如:
一般情況下,arp命令只有在調(diào)試和涉及特殊硬件的時(shí)候有用。一些設(shè)備還沒有聰明到能使用ARP協(xié)議的程度(例如,網(wǎng)絡(luò)打印機(jī)或者特殊用途的圖形顯示器)。為了支持這樣的設(shè)備,您可能需要配置其他計(jì)算機(jī),作為這些功能欠缺的硬件的代理ARP服務(wù)器(proxy ARP server)。通常也可用arp命令來實(shí)現(xiàn)(使用-s標(biāo)志)。例如:
Linux的2.4及以后版本的內(nèi)核不支持面向整個(gè)子網(wǎng)的proxy ARP服務(wù),但在有一條路由,而接口又配置了轉(zhuǎn)發(fā)包的功能時(shí),它會(huì)自動(dòng)充當(dāng)proxy ARP服務(wù)器。
如果一個(gè)網(wǎng)絡(luò)上的兩臺(tái)主機(jī)使用了相同的IP地址,其中一臺(tái)的ARP表項(xiàng)是正確的,而另一臺(tái)的ARP表項(xiàng)是錯(cuò)誤的。您可以使用arp命令找到這臺(tái)出錯(cuò)的計(jì)算機(jī)。