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尝试只会进行一次。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值