位址解析協議,即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老化時間...