知識回顧
在前面的文章中,我們已經介紹了以太網卡的封裝接口,其中主要是以下幾個接口:
netdev_init():初始化網卡的ip地址、mac地址和mtu的值
netdev_receive():發送以太網幀數據
netdev_transmit():發送以太網幀數據
這幾個接口是我們封裝ARP數據接口的基礎,最好還是先搞明白原理。
ARP協議的由來
在上面,我們介紹netdev_receive()函數的時候,已經發現了以太網幀類型主要分兩大類型,一種是IP數據幀,另一種是ARP數據幀。也就是說ARP數據幀與IP數據幀同屬于網絡層的數據幀。如下圖:
IP數據幀我們知道,是用來傳輸用戶數據的。哪ARP數據幀有什么用呢?
其實,ARP協議是用來將目標主機的IP地址轉換為對應的以太網(MAC)地址的。因為當我們的應用程序要向目標主機發送信息時,它只知道目標主機的IP地址,而IP地址是無法直接用于物理鏈路上傳輸數據的,所以需要ARP數據幀來把IP地址轉化為對應的MAC地址。
我們可以主動發起ARP查詢幀,在本地建立起IP地址和MAC地址的映射關系,也必須要及時回復別人的ARP查詢幀!
ARP報文組織結構
ARP數據幀位于以太網數據幀的上一層,我們先來了解一下它的報文結構,如下圖:
我們來詳解學習一下,里面每個字段所代表的具體含義;
硬件協議:發送方想要知道的硬件接口類型,對于以太網接口來說,該值為1
協議類型:映射的協議地址類型,我們要把MAC地址映射為IP地址,該值為0x0800
硬件地址長度:對于MAC地址來說,該值為6
協議地址長度:對于IP地址來說,該值為4
OP:表示ARP數據包的具體類型,1為ARP請求,2為ARP應答
剩余四個字段的具體含義非常簡單易懂,就不羅列出來講解了。
了解ARP報文組織結構之后,下一步,自然就是用c語言結構體來構造這個ARP報文組織,level-ip的ARP報文組織結構體保存在includeethernet.h文件中,如下圖:
這兩個結構體的成員變量,與我們剛才介紹的ARP報文的每個字段是一一對應的,這里不再重復解析。
ARP請求發送接口
ARP數據幀的發送接口為arp_request()函數。該函數保存在src/arp.c文件中。當我們在發送IP數據幀時,如果在ARP緩存表中找不到該IP所對應的MAC地址時,就會通過廣播的形式,來進行ARP請求數據包的發送。
如下圖:
第8行,動態申請一個sk_buff來繼續發送數據的存儲。
第12行,選擇使用哪個網卡來繼續數據幀的發送
第13行,在sk_buff中,向前移動arp_ipv4結構體大小的位置,把得到的指針賦值給payload指針
第14行,用網卡(netdev)中記錄的源主機mac地址,填充arp-ipv4結構體中的源主機mac地址(smac)
第15行,填充arp-ipv4結構體中的源主機ip地址(sip)
第16行,用廣播地址(broadcast_hw),填充arp-ipv4結構體中的目的主機mac地址(dmac)
第17行,填充arp-ipv4結構體中的目的主機ip地址(dip)
第18行,在sk_buff中,向前移動arp_hdr結構體大小的位置,把得到的指針賦值給arp指針
第19~29行,初始化ARP報文的硬件協議、協議類型、報文類型等等,htons()函數為進行數據的大小端切換。到這里ARP報文就初始化好了
第31行,調用netdev_transmit()函數,進一步構建以太網數據幀發送
ARP數據讀取接口
ARP數據接收接口為arp_rcv()函數。該函數在以太網數據幀讀取接口netdev_receive()函數中調用。我們來了解一下這個函數,如下圖:
第8行,從讀取到的數據中獲取arp數據幀
第10~12行,獲取arp數據幀中的硬件類型、協議類型、報文類型
第25~28行,獲取源主機和目的主機的ip地址
第30行,繼續arp緩存表數據的更新
第32行,判斷該arp數據幀,是不是發送給本機的
第37行,如果arp數據幀中的IP地址還沒有緩存在本機的ARP緩存表中的話,那么把這個IP地址插入到ARP緩存表中保存
第42行,判斷ARP數據幀的報文類型
第43、44行,如果報文類型為ARP請求幀,那么調用arp_reply()函數進行ARP應答幀的發送
ARP應答幀發送接口
在上面我們介紹ARP數據讀取接口時,當我們如果接收到了ARP請求幀,那么我們要調用arp_reply()函數進行ARP應答幀的發送,我們來學習一下這個函數。
如下圖:
第6行,獲取arp報文的數據
第8行,使用skb_reserve()函數來調整sk_buff中數據指針的位置,表示以太網首部和ARP報文的數據都還沒有填充
第9行,使用skb_push()函數,參數為ARP_HDR_LEN + ARP_DATA_LEN,表示填充了ARP報文
第11~28行,將該ARP請求數據包的源主機信息和目的主機信息交換位置,并把操作字段op置為2
第30行,選擇發送網卡
第32行,調用netdev_transmit()函數,進一步構建以太網數據幀發送
總結
通過我們這邊文章,我們已經明白了ARP協議的報文結構、ARP數據包的發送、ARP數據包的接收處理等等。知道了ARP協議在TCP協議棧中的重要地位。不過文中對ARP緩存表沒有做深入介紹,這是因為該知識點比較基礎,主要是對鏈表的插入、刪除等操作。
-
以太網
+關注
關注
40文章
5460瀏覽量
172721 -
接口
+關注
關注
33文章
8691瀏覽量
151911 -
ARP協議
+關注
關注
0文章
10瀏覽量
6917 -
TCP協議
+關注
關注
1文章
101瀏覽量
12121
原文標題:ARP協議是什么鬼?這一篇源碼分析!
文章出處:【微信號:zhuyandz,微信公眾號:FPGA之家】歡迎添加關注!文章轉載請注明出處。
發布評論請先 登錄
相關推薦
評論