04、ARP

百度百科關於ARP的簡介:
https://baike.baidu.com/item/ARP/609343?fr=aladdin

ARP
作用:在局域網中,網絡中實際傳輸的是“幀”,幀裏面是有目標主機的 MAC 地址的。在以太網中,一個主機要和另一個主機進行直接通信,必須要知道目標主機的 MAC 地址, 那就需要ARP 進行地址解析, 所謂“地址解析”就是主機在發送幀前將目標IP 地址轉換成目標MAC 地址的過程。ARP 協議的基本功能就是通過目標設備的 IP 地址,查詢目標設備的 MAC 地址,以保證通信的順利進行。
什麼是MAC?
https://baike.baidu.com/item/MAC%E5%9C%B0%E5%9D%80/1254181?fr=aladdin
簡而言之,網絡中每臺設備都有一個唯一的網絡標識,這個地址叫MAC地址或網卡地址

ARP 緩存表
當要訪問某個IP,計算機必須知道這個IP的物理地址(MAC地址),這時計算機會發一個廣播式的數據包詢問:“ipx.x.x.x對應的mac是什麼?我是IP y.y.y.y , 我的mac是yy-yy-yy-yy-yy-yy” 整個局域網的機子都收到這個詢問,真正擁有這個IP的機子就會回答它:“IP x.x.x.x的mac地址是我這個xx-xx-xx-xx-xx-xx”。

通過arp -a查看緩存表,在cmd命令窗敲這個命令即可
在這裏插入圖片描述
LwIP 使用一個arp_table 數組描述ARP 緩存表
static struct etharp_entry arp_table[ARP_TABLE_SIZE];
etharp_entry結構體源碼如下

struct etharp_entry {
#if ARP_QUEUEING
  /** Pointer to queue of pending outgoing packets on this ARP entry. */
    //指向此ARP表項上掛起的數據包隊列的指針。
  struct etharp_q_entry *q;
#else /* ARP_QUEUEING */
  /** Pointer to a single pending outgoing packet on this ARP entry. */
    //指向此 ARP 表項上的單個掛起數據包的指針
  struct pbuf *q;
#endif /* ARP_QUEUEING */
  ip_addr_t ipaddr;
  struct netif *netif;
  struct eth_addr ethaddr;
  u8_t state;
  u8_t ctime;
};

關於結構體中其他結構的定義
1、ip_addr_t ipaddr;//記錄目標 IP 地址 爲一個u32的整型數

​```
typedef struct ip_addr ip_addr_t;
struct ip_addr {
u32_t addr;
};

struct netif *netif;//對應網卡信息。
struct eth_addr ethaddr;//記錄與目標 IP 地址對應的 MAC 地址 u8_t state;//表項的狀態 ​

enum etharp_state {
  ETHARP_STATE_EMPTY = 0,                //空狀態, 表示這些表項能被使用
  ETHARP_STATE_PENDING,                   //添加狀態
  ETHARP_STATE_STABLE,                    //
  ETHARP_STATE_STABLE_REREQUESTING
#if ETHARP_SUPPORT_STATIC_ENTRIES
  ,ETHARP_STATE_STATIC
#endif /* ETHARP_SUPPORT_STATIC_ENTRIES */
};
u8_t ctime;//生存時間

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