Linux内核分析 - 网络[十]:ARP杂谈
内核版本:2.6.34 杂谈一:重复地址检测 Linux协议栈中处理重复地址检测报文的是arp_process()中的一段代码, RFC2131是DHCP的草案,相应的sip==0是DHCP服务器用来检测它所分发的地址是否重复的。 /* Special case: IPv4 duplicate address detection packet (RFC2131) */ if (sip == 0) { if (arp->ar_op == htons(ARPOP_REQUEST) && inet_addr_type(net, tip) == RTN_LOCAL && !arp_ignore(in_dev, sip, tip)) arp_send(ARPOP_REPLY, ETH_P_ARP, sip, dev, tip, sha, dev->dev_addr, sha); goto out; } 而根据RFC826中描述,正常的重复地址检测报文特征是sip==tip The gratuitous ARP packet is an ARP request with both sender's and the target's IP address fields containing the configured IP address. A gratuitous ARP packet on an Ethernet is defined as 48.bit Destination Address = 0xffffffffffff (broadcast) 48.bit Source Address = Hardware adderss of interface 16.bit Frame type = 0x806 (ARP) ---------------------- 16.bit Hardware type = 0x1 (Ethernet) 16.bit Protocol Type = 0x800 (IP) 8.bit Hardware Address size = 6 8.bit Protocol Address size = 4 16.bit Opcode = 1 (Request) 48.bit Sender Ethernet Address = Hardware address of interface 32.bit Sender IP Address = Configured IP address 48.bit Target Ethernet Address = Don't care 32.bit Target IP Address = Configured IP Address 问题: linux协议栈除了对RFC2131规定的DHCP服务器使用的地址检测格式进行响应,对RFC826中 规定的gratuitous arp报文不作处理,该报文会被协议栈直接丢弃掉。 实际情况是,在启动linux网络或配置新的IP时, Linux Host不会进行重复地址检测,并且,对于其它主机发来的重复地址检测报文也不会处理。 测试环境如下: Linux Host的IP为 192.168.1.1,然后配置Windows Host的IP为192.168.1.1,Windows Host会发送gratuitous arp,但Linux Host并不会回应,默 许了两个重复地址的存在。[谁能帮忙解释下,感激] 杂谈2:NUD状态转移的实际理解 根据NUD的状态转移,实际测试两种 情况:NUD_INCOMPLETE和NUD_PROBE。 NUD_INCOMPLETE Linux Host随便telnet一个没有使用的IP1,协议栈会为会IP1创建 一个邻居表项,状态由NUD_NONE迁移到NUD_INCOMPLETE,具体的协议栈流程在上篇ARP [http://blog.csdn.net/qy532846454/article/details/6806197]中分析的。 在Linux Host上telnet XX.XX.86.198,捕获到 的发包状况如下: 这三个报文是在进入NUD_INCOMPLETE状态后,尝试了3次ARP广播(因为还未收到对方报文),对应arp_tbl中的参数 mcast_probe=3次数,每次尝试间的时间间隔近似1s,对应arp_tbl中的参数retrans_time = 1HZ。 NUD_PROBE NUD_PROBE测 试复杂一点,先由一台Host1(IP2)向Linux Host发送arp request请求,协议栈会为IP2创建一个邻居表项,状态由NUD_NONE - > NUD_STALE,然后Linux Host会响应request,状态由NUD_STALE -> NUD_DELAY -> NUD_PROBE,具体的协议栈流程在 上篇ARP[http://blog.csdn.net/qy532846454/article/details/6806197]中分析的。 由Host1构造假arp request(sip=未被 使用IP, tip=Linux Host IP)给Linux Host,捕获到的发包状况如下: 每一个包是Host1发出的request,每二个包是Linux Host的回复,后三个包是3次ARP单播尝试,此时处于NUD_PROBE状态要尝 试对方是否存活,由于sip使用的是虚假址,因此没有响应,在尝试了最大次数3次,对应arp_tbl中的参数ucast_probe=3次数, 每次尝试的间隔时间近似1s,对应arp_tbl中的参数retrans_time=1HZ。 对比下windows这方面的处理可以发现,两者在这方 面的行为相差很大:比如windows的网络协议栈会处理RFC826所规定的gratuitous arp报文;windows的arp尝试只会进行一次。 (编辑:开发网_开封站长网) 【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容! |