LWIP_ARP協議(6個人總結)

功能

根據目標IP地址,尋找網絡中的目的主機,獲取主機MAC地址.

實質

IP地址和MAC地址的映射,對arp緩存表項的建立,更新,查詢操作.

關鍵數據結構

表項數組[]每一個元素(即每一個表項)都有如下重要指標:
IP地址<–>MAC地址
狀態:enum etharp_state{
ETHARP_STATE_EMPTY = 0, //空
ETHARP_STATE_PENDING, //已發出ARP請求包,等待應答.
ETHARP_STATE_STABLE, //已經記錄了IP<->MAC的對應關係,可以發送數據包
ETHARP_STATE_REREQUESTING_1, //表項存在但是15s後即將過期
ETHARP_STATE_REREQUESTING_2, //表項存在但是30s後即將過期

}
生存時間:5min
請求應答等待時間5s
對應網卡信息

表項無效項

1.表項建立時間>5min(生存時間)
2.處於PENDING狀態的表項,等待ARP應答時間>5s

流程

關鍵點:理解發的是請求包還是數據包
ip4_output()
etharp_output()請求包處理,根據上層IP給下來的數據類型做不同處理:
廣播:填寫MAC地址FF_FF_FF_FF_FF_FF
多播:填寫MAC地址01_00_5E_xx_xx_xx
直接調用ethernet_output()
單播:遍歷表項
   找到調用etharp_output_to_arp_index()進一步判斷是否快過期
       若快過期更改狀態:ETHARP_STATE_REREQUESTING_1
       無論怎樣都是可以發送數據了,最終都會調用ethernet_output()進行數據發送.
   找不到表項調用etharp_query()會再次發請求包等獲取到目標MAC後建立表項.

待到調用ethernet_output()真正發出數據包後,
目標網卡調用ethernet_input()接收數據包
對接收到的數據包類型進行分析:
IP數據包:去掉以太網首部(pbuf_remove_header())後,遞交到IP層(ip4_input())處理.
ARP數據包:去掉以太網首部(pbuf_remove_header())後,調用etharp_input()處理.
etharp_input()
1.判斷包的合法性,包括檢查硬件地址類型,硬件地址長度,協議類型,協議長度.
2.拷貝源IP和目標IP.
3.判斷ARP包中的IP地址和目標IP地址是否一致.
4.更新ARP緩存表.
5.根據ARP包類型做處理:
   請求包:
       是發給自己的->調用etharp_arw()進行應答.
       不是發給自己的->不應答,直接丟棄.
       (兩種情況:1.目標主機本身尚未配置IP.2.ARP包中的IP和目標IP不一致.)
   應答包:不處理(說明已經有表項存在了)

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章