Chinaunix首页 | 论坛 | 博客
  • 博客访问: 278827
  • 博文数量: 84
  • 博客积分: 3186
  • 博客等级: 中校
  • 技术积分: 852
  • 用 户 组: 普通用户
  • 注册时间: 2009-10-15 15:46
文章分类

全部博文(84)

文章存档

2015年(1)

2014年(12)

2011年(29)

2010年(42)

分类: LINUX

2010-11-24 11:43:28

    在网上找arp相关实现的文章,觉得这位仁兄的文章分析的不错,在此转载。改天将自己的分析成果和使用方法共享出来。
 
 
sendarp.c解析ip冲突解决办法
ip冲突是个很基本,也很不应该犯的错误,我来到这个公司3年来,只遇到过2次,但这两次都很致命,都是在很关键的产品上出了问题,如果您也想仔细了解哦arp相关的更深层次的知识,我愿意把我们研究的结果共享出来。
 
研究了一下arping命令的工作机制和原理,并详细的查看了arping命令的源码。
 
列出几个我们在检查ip地址冲突时候比较有用的参数:
arping  [  -AbDfhqUV]   [  -c count]  [ -w deadline]  [ -s source]  -I interface destination
# 注释 :arping 是用于发送 ARP 请求到一个相邻主机的工具
-b   # 注释 :-b 用于发送以太网广播帧(FFFFFFFFFFFF) 。arping 一开始使用广播地址,在收到响应后就使用 unicast 地址。
-c count # 注释 :-c 表示发送指定数量的 ARP 请求数据包后就停止。
-I interface # 注释 :-I 指定用那个接口来发送 ARP 请求包。这个选项是必须的。
-s source # 注释 :-s 设定 arping 发送的 arp 数据包中的  SPA 字段的值。如果为空,则按下面处理
   #     -)1、如果是 DAD 模式(冲突地址探测),则设置为 0.0.0.0
   #     -)2、如果是 Unsolicited ARP 模式(Gratutious ARP)则设置为目标地址
   #     -)3、否则从路由表得出
-U       # 注释:-U 就是启用 Gratutious 模式,它用于更新别的主机上的 ARP 表中本地主机的条目。不需要响应。
arping命令中发送arp packets时候,是往FF:FF:FF:FF:FF:FF这个以太网内的广播地址发送,包括发送arping命令的本机也会收到这个arp packets(但是本机收到之后不会Reply任何信息)。比如当我们在192.168.10.138上执行下面的命令时:
arping 192.168.10.139
会默认使用eth0,向局域网内所有的主机发送一个:who-has 192.168.10.139的arp request,tell 192.168.10.138 your mac address,类似这样:
"我是主机192.168.10.138 , mac是xxxxxxxxxxx ,ip为192.168.10.139的主机请告之你的mac"
ip为192.168.10.139的主机响应这个广播,应答ARP广播为:"我是192.168.10.139,我的mac为xxxxxxxxxx2",此应答只发回给192.168.10.138而不是广播,收到之后,192.168.10.138主机刷新自己的ARP缓存。
我们平时使用arping命令检测ip地址冲突的情景大概有以下几种:
1、一个ip(192.168.10.139)被绑在了两台或多台不同的机器(A、B...)上
例如我们在192.168.10.138这台机器上进行监控:
方法一:arping -I eth1 -c 1 192.168.10.139  返回多个mac地址(A、B...)
方法二:arping -I eth1 -b 192.168.10.139  持续的返回多个mac地址(A、B...A、B...)
此处执行完命令之后如果出现了多个mac地址,就可以判定是存在ip地址重复绑定的问题
 
2、有ip冲突的一台或多台机器(A、B...)上又错误的绑着监控机的ip(192.168.10.138)
我们仍然在192.168.10.138这台机器上进行监控:
arping -I eth1 -c 1 192.168.10.139  
此时绑着监控机ip(192.168.10.138),同时又绑着(192.168.10.139)机器(假设为A)不会返回自己的mac地址。
因为这台机器A收到arp请求的时候,会比较来源地址和自己的ip地址,发现来源ip存在于自己的网卡上,以太网协议会认为这个包是来自于自己,不予以响应,自然就不会有反馈了。所以此时执行上面的arping命令知会打印出除了机器A之外绑定了(192.168.10.139)的机器mac列表。
解决这种特殊情况,需要使用-s参数,指定一个ip作为我们发送arp packet的source ip。
比如我们在监控机eth1 192.168.10.138上面绑一个192.168.10.138
ifconfig eth1:1 192.168.10.138
arping -I eth1 -c 1 192.168.10.139 -s 192.168.10.138,此时绑着监控机ip(192.168.10.138)同时又拥有(192.168.10.139)的这台机器A的mac地址又会正常的打印出来。因为它收到arp packet的时候,对比来源ip,在自己的网卡上没有发现来源ip,所以会像正常arp包一样反馈自己的mac地址。
 
3、当有新的ip(192.168.10.139)绑定在机器A上时,手工执行
arping 192.168.10.139
这样arp会在局域网里发广播,Gratutious ARP,告诉局域网内其它的机器在arp表里添加一项(192.168.10.39和A绑着该地址的网卡mac),表示这个ip已经被使用了,这样能更进一步在其它机器绑定ip时避免重复绑定的问题。
阅读(1538) | 评论(0) | 转发(0) |
给主人留下些什么吧!~~