产品上要支持LLA,即link-local 地址,Link Local地址也被称为:链路本地地址(link local address),是设备在本地网络中通讯时用的地址,网段为169.254.0.1~169.254.254.255

  当DHCP服务器故障,或者DHCP超时,不致于设备没有IP而造成连接不上。

  LLA是本地链路的地址,是在本地网络通讯的,不通过路由器转发,因此网关为0.0.0.0。它的掩码为255.255.0.0。

  LLA在RFC3927中有详细的描述,它分为三个阶段,先PROBING,探测网络中某个IP有没有被占用,如果有,则换一个IP重新探测,如果没有则ANNOUNCING,即绑定该IP,向网络中发ARP,公告该IP被我绑定了,如果此时没有冲突,则进入BOUND,表示IP绑定成功。

 

  下面给出一幅流程图,这样就更清楚了:

图1:主流程图

 

图2:ARP回应流程图

 

  流程图中有一些时间的定义,在RFC3927中是这样描述的:

  l   PROBE_WAIT :表示初次探测的延时,规定的值为1秒;

  l   PROBE_MIN: 重复探测的最小延时 ,规定的值为1秒;

  l   PROBE_MAX : 重复探测的最大延时 ,规定的值为2秒;在连续发ARP探测包的时候,相隔的时间要在这个最大和最小的范围。

  l   PROBE_NUM:发送探测数据包的数量,这里规定的值是3;

  l   ANNOUNCE_WAIT :三个探测包发出去后,要有足够的时间等ARP的回应,然后再进入公告阶段,这个时间规定为2秒;

  l   ANNOUNCE_NUM:发送公告包的数量,规定值为2;

  l   ANNOUNCE_INTERVAL:连续发公告包的延迟 ,规定值为2秒;

  l   MAX_CONFLICTS:有一种情况,就是连续探测多次后,还是没有成功绑定到IP,这需要将首次发送探测包的间隔时间拉长一点,以避开其它设备也在探测同样的IP,这个参数是最大冲突的次数,规定值为10;

  l   RATE_LIMIT_INTERVAL:这个是超过MAX_CONFLICTS后,设置的间隔时间,规定值为60S;

  l   DEFEND_INTERVAL:IP探测时没有发现冲突,而绑定后发现了冲突,这里会重复发一个ARP包确定一次,只要是在DEFEND_INTERVAL时间内不重复出现冲突,则忽略该冲突。否则重新配制。规定值为10s。

 

  下面我们来看一下详细的工作过程:

  首先,在开始Local link时,需要将自已的IP和掩码网关都设为0,并随机生成一个IP,网段在169.254.1.0 to 169.254.254.255这个范围,RFC3927中建议使用MAC来生成IP地址,这样可以使每个设备生成的IP都不一样,将设备同时探测同一个IP的可能性降到了最低。

 

  发送ARP探测包,选择合适的IP地址:将目的IP地址指向要探测的IP,这里假设该IP为A;如果网络中,IP A被绑定,则占用该IP的主机会回应,设备在收到的ARP回应中,如果发现源IP是A,则表示冲突;当然,还有一种情况,可能有其它的设备也在探测这个IP,那么,在这种情况下,选择放弃该IP,重新开始配置。

 

  探测包发完了,并且在规定的时间内没有收到来自源IP为A的主机回应,则认为该IP没有被占用,于是设置本机IP为A,RFC3927  2.5节中描述,地址冲突的检测并不局限于地址选择阶段,在任何时候,如果设备收到一个ARP,其中源IP地址和本机IP一致,但MAC不一致,都将认为这是一个冲突。于是就有了图2中的阶段2。

 

结语:

 RFC3927 中的IP冲突检测机制还是很完善的,考虑了多个设备在同时local link时的情况;考虑到每到主机都必须要有一个IP地址,169.254.X.X跟IPV6的fe80开头的地址是作用是一样的。

Logo

开放原子开发者工作坊旨在鼓励更多人参与开源活动,与志同道合的开发者们相互交流开发经验、分享开发心得、获取前沿技术趋势。工作坊有多种形式的开发者活动,如meetup、训练营等,主打技术交流,干货满满,真诚地邀请各位开发者共同参与!

更多推荐