當前位置:
首頁 > 最新 > 網路編程-arp協議

網路編程-arp協議

介紹

arp地址解析協議,它的作用是在ipv4地址和底層網路硬體地址之間的轉換,提供從網路層地址到相關硬體地址的動態映射。

格式

頭14個位元組是乙太網幀,它的前2個欄位DST和SRC分別是目的乙太網地址和源乙太網地址。如果要發送arp包,則目的乙太網地址DST必需設置成ff:ff:ff:ff:ff:ff值。Length or Type欄位必需是0x0806。

Arp包的第一個欄位硬體類型Hard Type必需是1,硬體大小Hard Size大小為6,協議類型Prot Type是ipv4地址值為0x0800,協議長度Prot Size大小是4。操作Op為1代表arp請求,2代表arp響應,3代表rarp請求,4代表rarp響應。接下來的4個欄位分別是:Sender』s Hard Address和乙太網的幀的Src值一樣代表發送者的乙太網地址,Sender』s Protocal Address就是發送者的ipv4地址,Traget Hard Address目標乙太網地址,Target Protocal Address目標ipv4地址。因為發送arp就是為了獲取目標乙太網地址,所以發送arp請求時Traget Hard Address值置為0。為了滿足乙太網最小幀的長度,在後面增加Pad欄位還填充了18個位元組。FCS是校驗值,可以沒有。

代碼

完整的arp包定義結構如下,包含有一個乙太網幀、一個arp幀,以及18個位元組的填充。

我們在初始化數據時,定義發送者的ip和乙太網地址分別為src_ip和my_mac,目標ip為dst_ip,乙太網廣播地址為broad_mac,arpp就是要發送的arp包。

因為需要處理鏈路層的數據收發,所以需要創建一個SOCK_RAW原始套接字。協議族為PF_PACKET,ETH_P_ARP值表示鏈路層只需要把arp的包傳遞給我,其它包不需要。

然後,我們就需要bind我們的地址,因為我們只需要接收這個地址的數據。SOCK_RAW原始套接字使用的是標準的物理層地址結構sockaddr_ll。

在發送之前,我們必需要先把arp包給組裝好,記得在發送之前需要把主機位元組序轉化成網路位元組序。內容就是按照文章開頭arp格式據說的值去填寫就ok。

最後,只需要把arp廣播包對著broad_etheraddr地址發送出去,等著接收arp響應就好。這裡的接收應該創建一個線程來接收,因為你可能在發送之前就收到一個arp包,可能是請求包,也可能是響應包,因為你的鏈路層一直在接收數據。如果在發送以後收包就可能會丟失一些鏈路層傳遞過來的arp包,而且接收也不及時。

接收到arp包時,需要判斷是不是arp響應包,如果是則輸出相應的內容,如果不是則過濾,不處理。

總結

arp協議是tcp/ip協議的一個基本協議,目前arp的攻擊也很多,其主要方式還是通過arp欺騙,發送假的數據給對方來達到目的。arp還有一些其它功能,例如,尋找自己的ip地址,ip地址衝突檢測等等。


喜歡這篇文章嗎?立刻分享出去讓更多人知道吧!

本站內容充實豐富,博大精深,小編精選每日熱門資訊,隨時更新,點擊「搶先收到最新資訊」瀏覽吧!


請您繼續閱讀更多來自 程序員小偉 的精彩文章:

TAG:程序員小偉 |