在網路通訊時,源主機的應用程式知道目的主機的IP地址和連接埠號碼,卻不知道目的主機的硬 件地址,而資料包首先是被網卡接收到再去處理上層協議的,如果接收到的資料包的硬體地址與本機不符,則直接丟棄。因此在通訊前必須獲得目的主機的硬體地址。ARP協議就起到這 個作用。
源主機發出ARP請求,詢問“IP地址是192.168.0.1的主機的硬體地址是多少”,並將這個請求 廣播到本地網段(乙太網路幀首部的硬體地址填FF:FF:FF:FF:FF:FF表示廣播),目的主機接收到 廣播的ARP請求,發現其中的IP地址與本機相符,則發送一個ARP應答資料包給源主機,將自己的硬體地址填寫在應答包中。
每台主機都維護一個ARP緩衝表,可以用arp -a命令查看。緩衝表中的表項有到期時間(一 般為20分鐘),如果20分鐘內沒有再次使用某個表項,則該表項失效,下次還要發ARP請求來獲得目的主機的硬體地址。
ARP資料報的格式如下所示:
源MAC地址、目的MAC地址在乙太網路首部和ARP請求中各出現一次,對於鏈路層 為乙太網路 的情況是多餘的,但如果鏈路層是其它類型的網路則有可能是必要的。
硬體類型指鏈路層網路類型,1為乙太網路,協議類型指要轉換的地址類型,0x0800為IP地址,後面兩個地址長度對於乙太網路地址和IP地址分別為6和4(位元組),op欄位為1表示ARP請求,op欄位為2表⽰示ARP應答。
對乙太網路首部來說:如果是請求ARP報文的話,
乙太網路目的地址: 是(全1)的,是廣播報,目的是讓同一個區域網路上所有主機都收到ARP請求包 乙太網路源地址: 就是發送端地址。
框架類型:如果是ARP報文,值為0x0806 硬體類型: 表明ARP協議實現在那種類型的網路上,它的值為1,即表示乙太網路地址
協議類型:表示解析協議(上層協議),這裡一般是0800,即IP 硬體地址長度:也就是MAC地址長度,即6個位元組
協議地址長度:也就是IP地址長度,即4個位元組
操作類型:表示ARP協議資料報類型。1ARP表示請求包,2ARP表示應答包,3表示RARP請求包,4表示RARP應答包
發送端乙太網路地址:也就是源MAC地址 發送端IP地址:也就是源IP地址 目的端乙太網路地址:目標端MAC地址(如果是請求報文,是全0)
目地端IP地址:也就是目地端的IP地址
編寫arp指令碼抓取對應主機mac地址:
arp.sh
#!/bin/bashi=1count=0while [ $i -le 254 ]do if [ $count -gt 20 ];then count=0 sleep 3 fi ping -c1 "192.168.0.$i" & let i++ let count++done
運行結果:
可以看出,已經有兩個電腦連上了該網路。