Net/3中ARP的实现是和路由表紧密关联的,下图显示了我们描述ARP要用到的一个例子。
下面,我们简要概述图中的有关要点。
1.llinfo_arp结构的双向链表包含了每一个ARP已知的硬件地址的少量信息。同名全局变量llinfo_arp是该链表的头结点,图中
没有画出第一位la_prev指针指向最后一项,最后一项的la_next指针指向第一项。该链表由ARP时钟函数每个5分钟处理一次。
2.每一个已知硬件地址的IP地址都对应一个路由表结点(rtentry结构)。llinfo_arp结构的la_rt指针成员用来指向相应的rtentry
结构,同样地,rtentry结构的rt_llinfo指针成员指向llinfo_arp结构。
3.图中的最左边第四个路由表结点则没有llinfo_arp结构,该结点对应于本地以太网(140.252.13.32)的路由项。该结点的
rt_flags中设置了C比特,表明该结点是被用来复制成其他结点的。
4.rtentry结构中的rt_gateway指针成员指向一个sockaddr_dl结构变量。如果保存物理地址长度的结构sdl_alen成员为6,那么
sockaddr_dl结构就包含相应的硬件地址信息。
5.路由结点变量的rt_ifp成员的相应指针指向对应网络设备接口的ifnet结构。中间的两个路由结点对应的是以太网上的其他主机,
这两个结点都指向le_softc[0]。而右边的路由结点指向环回结构loif。因为rt_ifp.if_output指向输出函数,所以目的为本地的数据
报被路由至环回接口。
6.每一个路由结点还有指向相应的in_ifaddr结构的指针变量。
7.la_hold成员是指向mbuf链表的指针。当要想某个IP传送数据报时,就需要广播一个ARP请求。当内核等待ARP回答时,存
放该待发数据报的mbuf链的头结点的地址信息就存放在la_hold里。当收到ARP回答后,la_hold指向的mbuf链表中的IP数据
被发送出去。
8.路由表结点中rt_metric结构的变量rmx_expire存放的是与对应ARP结点相关的定时信息,用来实现删除超时ARP结点。
下图显示了ARP函数与其他内核函数的关系。
1.ARP结构
在以太网中传送的ARP分组的格式如下图所示: