您的位置:首页 > 理论基础 > 计算机网络

Linux内核分析 - 网络[十]:ARP杂谈

2011-10-20 15:39 295 查看
内核版本: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尝试只会进行一次。
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: