您的位置:首页 > 运维架构 > Linux

Linux硬件地址的解析过程

2012-09-25 10:27 162 查看
Linux硬件地址的解析过程
来源: ChinaUnix博客  日期: 2009.03.26 16:54 (共有条评论)

我要评论
 
    最近在看Linux协议栈源码,在ip_finish_output2里面遇到了麻烦,搞不清楚hh->hh_output和dst->neight->output是在哪里初始化的。google了一下,找到一篇文章,特此转载。感谢作者。

Linux的硬件地址解析过程

1) 在网络接口设备的硬件层之间能够直接进行包交换的设备构成了一个局域网, 局域网中的每一设备具有唯一的硬件地址. 对TCPIP协议来说, 局域网中的每一设备又具有唯一的IP地址. 当IP包要从某一设备发向局域网中具有另一IP地址的设备时, 信源设备必须获得信宿设备的硬件地址, 这就需要硬件地址解析.arp协议是根据设备的IP地址获取其硬件地址的方法. 信源设备向局域网广播自已地址解析请求,局域网中其余设备都收到该请求, 具有所请求IP地址的设备向信源设备作出应答, 提供它的硬件地址.由于arp请求的广播特性,
某一设备可以对不是自已IP地址的请求作出应答, 这就是arp代理.

2) 在Linux内核中, 将能与自已在硬件层直接通信的外部主机的网络接口设备称为"邻居", 用neighbour结构描述, 它包含设备的硬件地址信息. 系统中所有的IP包都通过路由所绑定的邻居发送到接口设备上.邻居由邻居表(arp_tbl)来索引, 用邻居的IP地址可查询邻居表中某个设备的邻居.

3) 当邻居接收到要发送的IP包时, 如果邻居的硬件地址还未解析, 则将发送包暂时缓冲在arp_queue队列中,然后发送地址解析请求, 这时的状态为未完成状态(NUD_INCOMPLETE). 如果1秒内没收到外部设备应答, 邻居将重发arp请求, 如果重发达到3次, 则解析失败, 邻居为失败状态(NUD_FAILED). 当收到正确应答, 邻居进入连接状态(NUD_REACHABLE), 这时arp_queue中发送包将被创建帧头后发送到设备上.

4) 邻居的IP地址与硬件地址的关系并不是固定的, 系统在接收来自邻居的IP包时, 会及时地证实(confirm)邻居的IP地址与硬件地址的映射关系. 同时, 邻居表每60秒周期性地扫描邻居(neigh_periodic_timer), 一方面从表中清除那些解析失败和长时间(60秒)未被使用的邻居, 另一方面识别那些证实时间已超时的邻居, 将它们从连接状态变为过期状态(NUD_STALE). 当邻居在过期状态发送IP包时, 就进入延迟状态(NUD_DELAY), 如果在延迟状态5秒后邻居的硬件地址还是未被证实,
邻居则发送arp请求, 这时进入探测状态(NUD_PROBE). 在探测状态, IP包并不进行缓冲, 仍旧使用过期的邻居地址发送, 如果探测失败, 邻居进入失败状态.

5) 为了缩短IP包到设备的传输路径, 在邻居结构上还引入了帧头缓冲结构(hh_cache). 如果邻居建立了帧头缓冲, IP包将通过帧头缓冲的输出发送出去. 当邻居处于连接状态时, 帧头缓冲输出直接指向dev_queue_xmit(), 当处于过期状态时, 帧头缓冲输出切换为邻居的输出口, 对以太网设备来说, 邻居的输出口指向neigh_resolve_output(), neigh_connect()和neigh_suspect()两个函数用来进行这种切换.

6) 当系统对外部设备arp的请求应答时, 系统将在arp_tbl中创建该外部设备的邻居, 刷新为过期状态. 当收到对其它设备的地址解析请求时, 系统将源设备的邻居刷新为过期状态. 当收到单发给自已, 但目的IP地址不是自已主机地址的arp请求时, 如果设备允许转发并且该IP在代理表有定义, 则将它们缓冲到proxy_queue队列, 等待一段随机的时间作出应答, 防止目标设备拥塞, 向对方提供的是自已的设备地址.

…………

本文来自ChinaUnix博客,如果查看原文请点:http://blog.chinaunix.net/u1/49093/showart_1880638.html
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息