地址解析爲兩種不一樣的地址形式提供映射:32bit的IP和數據鏈路層使用的任何類型的地址。linux
當一臺主機把以太網數據幀發送到位於同一局域網的另外一臺主機,是根據48bit的以太網地址而不是IP地址。設備驅動程序是從不會去檢查IP數據報中的目的IP地址。算法
ARP爲IP地址到對應的硬件地址之間提供動態映射。緩存
例子網絡
這個例子是想經過FTP協議鏈接主機bsdi。tcp
在發送TCP鏈接前,須要將IP地址映射爲硬件地址,這就須要ARP了。翻譯
ARP發送一份稱做ARP請求的以太網數據楨給以太網的全部主機,也就是廣播,目的就是讓是這個IP地址的主機吱一聲。目的主機收到這份廣播報文後,發送一個ARP應答,包含了IP地址和對應的硬件地址。代理
ARP後面的基本概念就是,網絡接口有一個硬件地址。在硬件層次上交換數據就必須有正確的接口地址,內核(如以太網驅動程序)必須知道目的端的硬件地址才能發送數據,IP地址在這裏是毫無用處的。接口
ARP高速緩存路由
ARP高效運行的關鍵是每一個主機都有一個ARP高速緩存。這個緩存存儲了最近的IP和硬件地址之間的映射,通常生存時間爲20分鐘,通常在訪問條目時重設超時值。it
查看ARP高速緩存的命令爲:arp -a。
ARP的分組格式
分組格式分爲14字節的以太網首部和28字節的ARP請求/應答。
首先是以太網首部。
以太網首部的前兩個字段是以太網的源地址和目的地址。目的地址全爲1則是廣播地址,發送請求時就是廣播。
以太網幀類型:表示後面的數據類型,對ARP請求和應答來講,值爲0x0806。
接下來是ARP請求/應答。
硬件類型:硬件地址的類型,好比1表示以太網地址。
協議類型:要映射的協議地址類型,0x0800表示IP地址。值得注意的是,它與IP數據報中的以太網數據幀的類型字段的值相同。
硬件地址長度:單位爲字節,值爲6,也就是48bit硬件地址。
協議地址長度:單位爲字節,值爲4,也就是32bit IP地址。
op:四種操做類型,ARP請求(1),ARP應答(2),RARP請求(3),RARP應答(4)。
剩下的4個字段看字面意思就很清楚了,不贅述。
ARP舉例
執行一個鏈接,而後使用tcpdump(linux下命令)查看。
能夠看到,第一行中有源主機的硬件地址,目的端爲ff:ff:ff:ff,也就是廣播地址。緊接着輸出的是arp,代表幀類型字段值爲0x0806,說明這是一個ARP請求/應答。再後面的60是以太網數據幀的長度。
第二行中咱們能夠看到,儘管ARP請求是廣播的,可是ARP應答是單播的。
第三行是請求創建TCP鏈接。這個不是這章的重點,等18章詳述。
通常狀況下,主機在收到ARP請求或發送應答時,都要把請求端的硬件地址和IP存入ARP高速緩存。這樣在創建TCP鏈接時,應答端就不須要發送ARP來解析IP了。
若是嘗試鏈接的是一臺不存在的主機,那麼會進行屢次ARP請求,並會在ARP高速緩存中保存一個不完整的條目。這裏有個超時重傳的算法問題,TCP時會涉及。
ARP代理
上面討論的是在同一個以太網中的狀況。若是ARP請求是從一個網絡的主機發送到另外一個網絡的主機,那麼鏈接這兩個網絡的路由器能夠回答該請求,這個過程稱爲委託ARP或ARP代理。這樣,發起端就會誤覺得路由器就是目的主機,而路由器做爲目的主機的代理,會把分組轉發給目的主機。
這裏一個疑問是關於解釋一個IP的問題,哪位看懂的請指教。
故意的ARP
通常在系統引導期間進行接口配置時,主機會發送ARP查找本身的IP。這個特性稱爲「故意的ARP」(原文翻譯是免費的ARP,我以爲無心義)。
這個特性有兩個做用:
1)確認是否有另外一個主機設置了同樣的IP。若是IP是惟一的,那麼就應該沒有ARP應答;一旦有應答,就說明IP設置重複了。
2)若是發送故意ARP的主機正好改變了硬件地址,好比換了一塊網卡並重啓,那麼這個ARP請求能夠更新其餘主機高速緩存中的舊的硬件地址。