1) 在Linux内核中, 将能与自已在硬件层直接通信的外部主机的网络接口设备称为"邻居",用neighbour结构描述, 它包含设备的硬件地址信息.系统中所有的IP包都通过路由所绑定的邻居发送到接口设备上.邻居由邻居表(arp_tbl)来索引, 用邻居的IP地址可查询邻居表中某个设备的邻居.
2) 当邻居接收到要发送的IP包时, 如果邻居的硬件地址还未解析,则将发送包暂时缓冲在arp_queue队列中,然后发送地址解析请求, 这时的状态为未完成状态(NUD_INCOMPLETE).如果1秒内没收到外部设备应答, 邻居将重发arp请求, 如果重发达到3次, 则解析失败, 邻居为失败状态(NUD_FAILED).当收到正确应答, 邻居进入连接状态(NUD_REACHABLE),这时arp_queue中发送包将被创建帧头后发送到设备上.
3) 邻居的IP地址与硬件地址的关系并不是固定的, 系统在接收来自邻居的IP包时,会及时地证实(confirm)邻居的IP地址与硬件地址的映射关系. 同时,邻居表每60秒周期性地扫描邻居(neigh_periodic_timer),
一方面从表中清除那些解析失败和长时间(60秒)未被使用的邻居,另一方面识别那些证实时间已超时的邻居, 将它们从连接状态变为过期状态(NUD_STALE). 当邻居在过期状态发送IP包时,就进入延迟状态(NUD_DELAY), 如果在延迟状态5秒后邻居的硬件地址还是未被证实, 邻居则发送arp请求,这时进入探测状态(NUD_PROBE). 在探测状态, IP包并不进行缓冲, 仍旧使用过期的邻居地址发送,如果探测失败,邻居进入失败状态.
4) 为了缩短IP包到设备的传输路径, 在邻居结构上还引入了帧头缓冲结构(hh_cache).如果邻居建立了帧头缓冲, IP包将通过帧头缓冲的输出发送出去. 当邻居处于连接状态时, 帧头缓冲输出直接指向dev_queue_xmit(), 当处于过期状态时, 帧头缓冲输出切换为邻居的输出口, 对以太网设备来说,邻居的输出口指向neigh_resolve_output(),neigh_connect()和neigh_suspect()两个函数用来进行这种切换.
5) 当系统对外部设备arp的请求应答时, 系统将在arp_tbl中创建该外部设备的邻居,刷新为过期状态.当收到对其它设备的地址解析请求时, 系统将源设备的邻居刷新为过期状态. 当收到单发给自已,但目的IP地址不是自已主机地址的arp请求时, 如果设备允许转发并且该IP在代理表有定义,则将它们缓冲到proxy_queue队列, 等待一段随机的时间作出应答, 防止目标设备拥塞,向对方提供的是自已的设备地址.
2) 当邻居接收到要发送的IP包时, 如果邻居的硬件地址还未解析,则将发送包暂时缓冲在arp_queue队列中,然后发送地址解析请求, 这时的状态为未完成状态(NUD_INCOMPLETE).如果1秒内没收到外部设备应答, 邻居将重发arp请求, 如果重发达到3次, 则解析失败, 邻居为失败状态(NUD_FAILED).当收到正确应答, 邻居进入连接状态(NUD_REACHABLE),这时arp_queue中发送包将被创建帧头后发送到设备上.
3) 邻居的IP地址与硬件地址的关系并不是固定的, 系统在接收来自邻居的IP包时,会及时地证实(confirm)邻居的IP地址与硬件地址的映射关系. 同时,邻居表每60秒周期性地扫描邻居(neigh_periodic_timer),
一方面从表中清除那些解析失败和长时间(60秒)未被使用的邻居,另一方面识别那些证实时间已超时的邻居, 将它们从连接状态变为过期状态(NUD_STALE). 当邻居在过期状态发送IP包时,就进入延迟状态(NUD_DELAY), 如果在延迟状态5秒后邻居的硬件地址还是未被证实, 邻居则发送arp请求,这时进入探测状态(NUD_PROBE). 在探测状态, IP包并不进行缓冲, 仍旧使用过期的邻居地址发送,如果探测失败,邻居进入失败状态.
4) 为了缩短IP包到设备的传输路径, 在邻居结构上还引入了帧头缓冲结构(hh_cache).如果邻居建立了帧头缓冲, IP包将通过帧头缓冲的输出发送出去. 当邻居处于连接状态时, 帧头缓冲输出直接指向dev_queue_xmit(), 当处于过期状态时, 帧头缓冲输出切换为邻居的输出口, 对以太网设备来说,邻居的输出口指向neigh_resolve_output(),neigh_connect()和neigh_suspect()两个函数用来进行这种切换.
5) 当系统对外部设备arp的请求应答时, 系统将在arp_tbl中创建该外部设备的邻居,刷新为过期状态.当收到对其它设备的地址解析请求时, 系统将源设备的邻居刷新为过期状态. 当收到单发给自已,但目的IP地址不是自已主机地址的arp请求时, 如果设备允许转发并且该IP在代理表有定义,则将它们缓冲到proxy_queue队列, 等待一段随机的时间作出应答, 防止目标设备拥塞,向对方提供的是自已的设备地址.