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;//生存时间

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值