uip中如何检测IP被占用?
产品上要支持LLA,即link-local 地址,
Link Local地址也被称为:链路本地地址(link local address),是设备在本地网络中通讯时用的地址,网段为169.254.0.1~169.254.254.255
当DHCP服务器故障,或者DHCP超时,不致于设备没有IP而造成连接不上。
LLA要求,先设置一个IP,然后检测网络中该IP有没有被占用,如果占用,则重设,直到设置的IP没有被占用,才表示设置成功。
上网了解了一些资料,说是IP设置后,在板子上通过发送一个ip detect 的ARP request报文即可达到检测IP是否冲突的目的。在这个ARP request报文中,sender ip 和 destination ip 都指向自己获得的ip(这里即为169.254.1.3),发出去之后。拥有"169.254.1.3"这个IP的pc机收到这个ARP request之后,或回应一个ARP reply的报文,并且此报文中的sender ip 和 destination ip相同(这里都为169.254.1.3)。 那么只需在我的程序中判断收到的ARP reply报文中的sender ip 和 destination ip是否相同就可以判断板子的IP是否和PC机或移动终端发生了冲突。
大家说这样可行吗?
这几天仔细研究了uip的代码,了解了大概的流程,但还不知道如何发ARP包。
有没有做过IP冲突检测的朋友,要是能有相关代码参考一下。就好了,谢谢
提问者:60user28
地点:-
浏览次数:7319
提问时间:02-02 11:01
我有更好的答案
- 7条回答
-
60user74
02-02 21:20
uIP因为要做得小型化,只完成了此基本的功能,这个LLA,lwip印象中是有的。
ARP那边,uIP本来是没有意图开放给应用的,只作内部使用。你想实现这个功能,得好好看uIP的代码,把 RFC 3927协议加进去。要不,每二个方案,你就直接用PING(ICMP)来测试IP有没有被占用好呢(你有可能说我这个方案不行。是,这个方案有问题。最突出的情况就是,如果你本身是IP A, 你是没法去判断IP A是否已经被占用,只能通过IP B来判断IP A 是否被占用),但这是不改uIP的唯一方案。
-
南山铝业13
02-11 15:44
楼上的一看,就是行家
你说的“uIP本来是没有意图开放给应用的”,是不是说我下的的方法,uip不支持?
方法1、在板子上通过发送一个ip detect 的ARP request报文。在这个ARP request报文中,sender ip 和 destination ip 都指向自己获得的ip(这里即为169.254.1.3),发出去之后。拥有"169.254.1.3"这个IP的pc机收到这个ARP request之后,会回应一个ARP reply的报文,如果收到的ARP reply报文中的sender ip 和 destination ip是相同就可以判断板子的IP是否和PC机或移动终端发生了冲突。
方法2:发一个arp请求,请求169.254.1.3的mac地址,如果有回应,则表示该IP在网段中已存在。
-
cmh12
02-12 08:57
LLA是在RFC 3927中定义的,你理解的LLA倒是没有错的。做为协议栈的实现,都会把已实现现的协议写出来的,uIP就就没有支持RFC 3927。但当然,如果你只要去在uIP上补充实现类似的功能,可以按你的方法2去做。
-
q510954672
02-09 00:14
先做吧,有什么问题再来。
-
hfgjdgs
02-06 10:26
谢谢楼上的朋友。方法二是能检测出ip冲突,和方法一其实也是一回事。老实说我还是不太理解LLA,正常DHCP后的地址是192.168.1.x ,如果DHCP失败,开始LLA,分配的IP又是169.254.x.x。这和路由及pc都不是同一网段,那么pc还是连接不上设备,那分配这样的地址又有什么用。
-
byyyyyyyyyyyy
02-10 05:49
是的,分配到这种地址,只能和同样是采用这个方案分配地址的设备通讯。一般只在本地使用,不会穿过路由器,这也就是LLA第二L(Local)的含义。他的存在意义在于:在没有DHCP服务器时,可以在本地范围内通过这种办法去临时分配地址。
一定是本地原因就是:ARP请求是穿不过路由器的,因此,这种方案不能避免路由器的两侧是否有两个相同的都由LLA分配的地址,因为,不让这些IP数据包穿过路由器是最好的选择。
在PC网管看来,网卡采用自动分配地址是出现这个网段地址,就会断定是DHCP服务器坏了。我们很少会用LLA去做事情,至少我不会去用。
呵呵。所以你问这个问题,我还去重新查一下才答你。
-
bbs注册
02-07 19:55
lwip中确实是有RFC 3927的实现
准备将它移植到uip中来。