欢迎您访问程序员文章站本站旨在为大家提供分享程序员计算机编程知识!
您现在的位置是: 首页

04、ARP

程序员文章站 2024-02-22 18:09:46
...

百度百科关于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命令窗敲这个命令即可
04、ARP
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;//生存时间

相关标签: LwIP