加入收藏 | 设为首页 | 会员中心 | 我要投稿 PHP编程网 - 黄冈站长网 (http://www.0713zz.com/)- 数据应用、建站、人体识别、智能机器人、语音技术!
当前位置: 首页 > 服务器 > 搭建环境 > Linux > 正文

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

发布时间:2016-10-16 06:06:33 所属栏目:Linux 来源:站长网
导读:内核版本:2.6.34 杂谈一:重复地址检测 Linux协议栈中处理重复地址检测报文的是arp_process()中的一段代码, RFC2131是DHCP的草案,相应的sip==0是DHCP服务器用来检测它所分发的地址是否重复的。 /* Special case: IPv4 duplicate address detection pack

内核版本: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内核分析 - 网络[十]:ARP杂谈

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,捕获到 的发包状况如下:

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

这三个报文是在进入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,捕获到的发包状况如下:

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

每一个包是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尝试只会进行一次。

(编辑:PHP编程网 - 黄冈站长网)

【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容!

    热点阅读