uIP的ARP協議分析

2021-07-06 08:20:52 字數 1701 閱讀 1970

位址解析協議,即arp(address resolution protocol),是根據ip位址獲取實體地址(mac)的乙個tcp/ip協議。在三層網路層我們確定了ip位址後,資訊來到了二層進行再封裝,在二層需要mac位址,這時就通過三層的ip去尋找二層的mac。

資訊沿著下圖的黑線路徑進行傳播,從高層往低層是不斷封包,從低層往高層是不斷解包。

下圖是arp的幀格式

結構ether_header定義了乙太網幀首部;結構arphdr定義了其後的5個字段,其資訊用於在任何型別的介質上傳送arp請求和回答;ether_arp結構除了包含arphdr結構外,還包含源主機和目的主機的位址。

分析一下arp包頭。頭兩個位元組是硬體型別0x0001,接著兩個位元組是協議型別,即arp使用的是ip協議代號0x0800。硬體位址長度和協議位址長度分別是6和4。這與arp報文格式是對應的。後面的2個位元組op指示當前包是請求包還是應答包,對應的值分別是0x0001和0x0002。

下圖是用wireshark抓取的arp包,上圖是請求包(pc發往uip),請求時,是向區域網詢問,而不是向整個internet詢問,下圖是應答包(uip發往pc),可以注意到的是,請求包是42位元組,而應答包是經過填充的60位元組。至於原因,其實還沒有想清楚。

//uip初始化

int i;

uip_ipaddr_t ipaddr;

struct timer periodic_timer, arp_timer;

timer_set(&periodic_timer, clock_second / 2);

timer_set(&arp_timer, clock_second * 10);

tapdev_init();

uip_init();

uip_ipaddr(ipaddr, 192,168,0,2);

uip_sethostaddr(ipaddr);

uip_ipaddr(ipaddr, 192,168,0,1);

uip_setdraddr(ipaddr);

uip_ipaddr(ipaddr, 255,255,255,0);

uip_setnetmask(ipaddr);

while(1)

}else

if(buf->type == htons(uip_ethtype_arp))}}

else

if(timer_expired(&periodic_timer))

}#if uip_udp

for(i = 0; i < uip_udp_conns; i++)

}#endif /* uip_udp */

if(timer_expired(&arp_timer)) }}

【reference】

uIP協議棧分析

uip特性 由於uip協議棧專門為嵌進式系統而設計,因此還具有如下優越功能 1 非常少,其協議棧 不到6k,很方便閱讀和移植。2 占用的記憶體數非常少,ram占用僅幾百位元組。3 其硬體處理層 協議棧層和應用層共用乙個全域性快取區,不存在資料的拷貝,且傳送和接收都是依靠這個快取區,極大的節省空間和時...

uip協議棧分析(2)

uip的記憶體管理方法 記憶體管理的實現在memb.c memb.h裡。這兩個檔案負責uip的記憶體塊的管理,記憶體塊是由memb 巨集宣告。記憶體從宣告的記憶體塊裡用memb alloc 分配,用memb free 釋放。因為命名空間的衝突,每個c模組只能有乙個memb 巨集宣告。先看memb.h...

uip協議棧分析(1)

uip的原始碼目錄結構 研究unix下的 可以知道uip是如何使用的,關鍵是理解uip協議棧的主控制迴圈。int main void int i uip ipaddr t ipaddr struct timer periodic timer,arp timer 設定tcp超時處理時間和arp老化時間...