IPv4和IPv6的链路本地地址的自动分配

链路本地地址(Link-local Address)是一类特殊的IP地址,仅用于在网段内、同一广播域内的主机相互通信使用,这类主机可认为是不需要外部互联网服务的。其中IPv4的链路本地地址定义在169.254.0.0/16范围内,IPv6定义在fe80::/10范围。

什么时候使用链路本地地址?其在两种IP协议中的角色稍有不同。

IPv4场景:

IPv4中通常只用于网络接口没有外部的、有状态的IP地址的情况下(比如没有DHCP服务或其他地址配置失效的情况),即各种外部获取IP地址的途径失败时,主机会随机在169.254.0.0范围内随机选择一个地址(除两端的169.254.0.0/16和169.254.255.0/16,用作保留),用随机选的地址进行ACD(冲突地址检测),直到发现一个不发生冲突的随机地址则将其使用。这也是无状态地址自动配置的一种,IPv4的这个可以称作APIPA(自动专用IP寻址)。因为伪随机数的生成与种子相关,种子不变化时伪随机数基本也是固定的,所以有的主机会使用MAC地址作为伪随机数的生成种子,降低同一网段内随机选取的链路本地地址在ACD后发现冲突的概率。

IPv6场景:

IPv6中的链路本地地址的生成是强制的。即主机如果支持IPv6协议栈则强制性的需要生成一个链路本地地址,这与IPv6本身的设计有关。IPv4中有广播的概念,域内广播到达路由器时是不会被转发到其他网段的,但IPv6没有广播的概念,IPv6尽可能用组播来代替IPv4的这一特性。如何实现的?IPv6中使用链路本地地址表示该报文不需要被跨网段转发,其最常见的应用即在于邻居发现协议,IPv6的ND协议是用于替代IPv4的ARP协议的从协议地址向硬件地址映射的功能。所以某种角度上看IPv6的链路本地地址其实就是一个用在二层的协议地址,与主机的MAC地址一一对应,效果上也与IPv4的链路本地地址一致,即只能在本网段内通信,不考虑互联网服务,尽管这不是它最常见的用法。

IPv6的链路本地地址需要强制生成,其生成方式与IPv4有显著区别,不是用随机生成方式获得,毕竟对于IPv6即使是定义了fe80的前缀,要在后面的数量宏大的地址内随机选地址再发起ACD显得有点多余。IPv6的链路本地地址以IID(接口标识符)为基础来分配,IID长度通常为64位,内容由主机的MAC地址按一定格式规则形成,常见的格式规则有EUI-48和EUI-64两种。EUI(扩展唯一标识符)由IEEE定义,EUI-48和EUI-64分别属于短格式和长格式,其开头24位都是OUI(组织唯一标识符),由IEEERA机构统一向全球厂商分配,后面的24位或40位由各个组织自行分配,显然EUI-64为组织提供更多的分配空间,但EUI-48还是很常用的。两种EUI格式中,第一个字节的低两位用于表示全局管理/本地管理、个人地址/组地址,分别叫做u位和g位。u位置1时表示该地址是本地管理的,否则是统一管理的(通常在互联网环境下);g位置1时表示该地址是组地址,否则是个人地址。在最终的IPv6链路本地地址中,EUI都是在低位的。

EUI-48地址基本可以理解为就是48位的MAC地址,格式也一样,即前24位是OUI,后24位是组织自己分配的。EUI-48向EUI-64的转换则另有一些规则:首先前24位的OUI保留,然后紧接着的第4、5字节替换为FFFE,EUI-48的后24位再补到第6字节及以后,便得到EUI-64地址。从EUI-64得到IPv6的IID还需要将u位取反,最终得到的地址就是我们抓包时比较常见的那个链路本地地址。

举例说明以上过程:

1、主机MAC地址为00-11-22-33-44-55

2、对应EUI-48地址即同为00-11-22-33-44-55

3、替换第4、5字节,得到EUI-64地址为00-11-22-FF-FE-33-44-55

4、u位取反,得到02-11-22-FF-FE-33-44-55

5、链路本地地址前缀为fe80,把EUI-64放在低位,中间部分用0补全

6、最终得到链路本地地址:fe80::211:22ff:fe33:4455/10

链路本地地址的生成方式不只有以上这种,主机在无状态配置地址时生成的IPv6地址也能改一下前缀作为链路本地地址,具体待更。

 

附:

Windows Vista生成IPv6地址的介绍:

https://docs.microsoft.com/zh-cn/previous-versions/technet-magazine/cc137983(v=msdn.10)?redirectedfrom=MSDN

 

=========================2020.4.28补充===========================

各种系统生成IPv6地址的情况:(如有误敬请指正,此处阐述本人看到的情况)

centOS:
很明显能看到,自动配置的链路本地地址是按EUI-64规则生成的

Deepin:
链路本地地址不是EUI生成,全球地址只有1个且与链路本地地址无关

Windows 10:
可能是自己的算法实现,其链路本地地址和两个全球地址(一个首选一个临时)都不是EUI规则生成的

华为MATE30手机:
可能是自己的算法实现,三个地址也不是EUI规则生成的,且全球地址也不是链路本地地址得来的

 

  • 2
    点赞
  • 18
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值