PPPOE接入IPv4协议栈用的是IPCP协议,IPCP可以分配IPv4地址和DNS服务器,但是不支持IPv6协议,所以就有了IPV6CP协议。
PPP连接建立后开始执行IPPCP和IPV6CP协议,IPV6CP目前仅定义了接口标识和IPV6压算法(主要是IPv6头压缩),不过目前很少有支持压缩的,所以本文主要说接口标识协商。
通过Wireshark抓包发现,PPPOE建立连接后会互相发送附带本机接口标识的Request请求给对方,对方收到后会回复Ack包,ack包会携带Request包中的接口标识。
RFC5072中并没有明确指定接口标识符的生成规则,原话是:
If an IEEE global identifier is not available, a different source of uniqueness should be used. Suggested sources of uniqueness include link-layer addresses, machine serial numbers, et cetera. In this case, the “u” bit of the interface identifier MUST be set to zero (0).
If a good source of uniqueness cannot be found, it is recommended that a random number be generated. In this case, the “u” bit of the interface identifier MUST be set to zero (0).
翻译过来就是可以使用唯一性的链路层地址,机器序列号等,如果没有好的唯一性来源推荐使用随机数来生成。经过测试openwrt和华为AR系列路由器都是用的随机生成,每次拨号接口标识符都会变化。
IPV6CP协商完成后本端和对端都获得了自己的链路层IPv6地址,并且也知道对方的链路层地址,下一步就可以用ICMP RA或DHCPv6来分配IPv6网络参数了。
参考:
IPv6CP主机标识协商
https://datatracker.ietf.org/doc/rfc5072/
IPv6CP压缩协议协商
https://datatracker.ietf.org/doc/rfc5172/
IPCP
https://datatracker.ietf.org/doc/rfc1332/