小議LWIP ARP協議1

2021-07-24 14:18:47 字數 2413 閱讀 1116

在tcp/ip網路中,arp協議始終是相當重要的乙個環節,它主要是負責將32位的ip位址(ipv6則是128位)對映為48位的mac位址(規定每一種網路通訊裝置具備唯一的mac位址),從而可以在底層資料鏈路層中標記不同的網路通訊裝置。

由於ip位址和mac位址沒有固定的對映規則,所以為了描述這種對映關係,在實現上lwip採用arp快取表這種結構來儲存這種對映關係。簡單的說就是需要將一條條的(ip位址,mac位址)儲存起來,當傳送ip資料報時可以根據該錶進行查詢相應主機的mac位址。

在windows中的控制台中輸入arp -a會得到這台主機的arp快取表:

可以看到區域網中的(ip位址,mac位址)之間一一對應的關係。

如果接觸過虛擬儲存器中的頁表,那麼arp快取表也一定很快就能理解。arp快取表由乙個個快取表項(entry)組成,這些表項的核心當然是剛剛提過的ip位址和mac位址的對映關係。那麼是不是光記錄這個資訊就足夠了呢?我們先來看看lwip中的arp快取表項的實現。

1、arp快取表的實現:

static

struct etharp_entry arp_table[arp_table_size];

即用了簡單的陣列來實現arp快取表。

2、etharp_entry(快取表項)資料結構

struct etharp_entry ;
可以看到上述的結構中不僅有ipaddr(ip位址)和ethaddr(mac位址),還有其他成員。

netif : 描述網路介面,主要是考慮到有些網路裝置(如路由器)連線不同的網路,會有不通的(ip,mac)位址對映對。

p:當上層應用需要傳送ip資料報時,而現在arp快取表尚未建立該目的ip位址的表項,需要將待傳送的ip位址組織起來,待建立好目的ip位址的表項再傳送出去。

state:描述該表項的狀態。主要是由於目前網路拓撲結構不固定,隨時可能有裝置加入或者離開本網路。

ctime:記錄該表項的時間資訊,主要是為更新state而記錄時間。

3、etharp_q_entry(放置帶傳送資料報的鍊錶)的資料結構如下:

struct etharp_q_entry ;
即簡單的將帶傳送的資料報用鍊錶形式串起來,等建立起相應的arp表項再傳送出去。

4、etharp_state(表項的狀態)的資料結構如下:

enum etharp_state ;
#define arp_maxage            240  //240*5s = 20min

#define arp_maxpending 2 //2*5s = 10s

etharp_tmr(void)

else

if (arp_table[i].state == etharp_state_stable_rerequesting) }}}

其實上述**原理並不難,就是依據每個表項中的ctime資訊來對state狀態進行更新。

lwip中的處理流程如下:

由流程圖可以知道,無論接收到的是ip資料報或者arp資料報,均有可能對arp快取表進行更新。下面簡單講述一下arp協議核心的幾個函式:

/*arp資料報處理函式*/

etharp_arp_input(struct netif *netif, struct eth_addr *ethaddr, struct pbuf *p)

else

/*更新arp快取表,若arp包給我們的則硬性更換arp表項,否則採用嘗試更換*/

etharp_update_arp_entry(netif, &sipaddr, &(hdr->shwaddr),

for_us ? etharp_flag_try_hard : etharp_flag_find_only);

/* 通過arp請求型別做出相應的處理 */

switch (hdr->opcode) else

if (ip_addr_isany(&netif->ip_addr)) else

break;

case pp_htons(arp_reply):

/* 若是arp應答報文,則不用再做什麼工作了,因為之前就應經更新了arp表*/

break;

default:

break;

} /* 釋放資料報 */

pbuf_free(p);

}

今天先寫到這裡吧,等後面接著寫arp協議2

lwIP ARP協議分析

總的來說,lwip將鏈路層ethernet的協議分組格式分為ether和etherarp 分開處理。ip分組先進入etharp ip input更新一下arp表項,然後直接進入 netif的input傳遞給上層ip層。arp分組直接進入etharp arp input。不送如ip層。奇怪的是,lwi...

lwIP ARP協議分析0

arp 協議分析 總的來說,lwip將鏈路層ethernet的協議分組格式分為ether和etherarp 分開處理。ip分組先進入etharp ip input更新一下arp表項,然後直接進入 netif的input傳遞給上層ip層。arp分組直接進入etharp arp input。不送如ip層...

lwIP ARP協議分析0

arp 協議分析 總的來說,lwip將鏈路層ethernet的協議分組格式分為ether和etherarp 分開處理。ip分組先進入etharp ip input更新一下arp表項,然後直接進入 netif的input傳遞給上層ip層。arp分組直接進入etharp arp input。不送如ip層...