前面发了一篇文章(无类别域间路由 (CIDR):Internet 地址分配和聚合计划),里面有张图引起了一定争议。
争议的点主要集中在n.n.n.x/31这一条,后面备注是“点对点链路”。很多人就问了:一般点对点链路用的都是30位的掩码啊,这博主真没文化,误人子弟。
相信大家在学网络的时候,培训人员一般都会说一个地址段内可用地址的计算方式,比如正常1个C类地址段192.168.1.0/24,主机位是8位,可用地址数量为2^8 - 2 = 254个。地址池内有地址192.168.1.0 - 192.168.1.255共256个,其中192.168.1.0是网络地址(网络号),192.168.1.255是广播地址,这2个就是要从256个地址中减掉的2个地址,所以我们常见的地址范围就是192.168.1.1 - 192.168.1.254。
也正是因为上述原因,我们常用的最长掩码就是30位,这样主机位有2位,可用地址数量就是2^2 - 2 = 2 个。一般的互联链路就是这么配置的,比如192.168.1.0/30网段,大家会习惯用192.168.1.1和192.168.1.2去作为互联地址。
还按照上面的计算方法,当掩码长度是31位时,可用地址数量就是2^1 - 2 = 0 个,10.1.1.0/31对应的两个地址10.1.1.0和10.1.1.1,一个是网络号,一个是广播地址,没有可用的主机地址。
但RFC文档不能瞎写啊,厂商是要按照这个规范开发设备协议栈的,让我们来看看H3C是怎么实现的。正好MSR810又可以上场了。
我们直接在接口下配置IP地址为10.1.1.0/31,发现可以直接配置,没有任何报错。
怎么样,不吹牛的说,我相信超过90%的人都是第一次见10.1.1.0/31这样的IP地址。
那10.1.1.0/30和10.1.1.3/30的地址能不能配置呢?
好家伙,10.1.1.0/30直接配上了,10.1.1.3/30因为是广播地址不能配置。那就测试一下业务访问情况吧。
我们按照上图所示连接设备,并配置相关的接口IP地址,其中SW设备使用VLAN虚接口vlan-inf1。
先从RT2测试点对点链路的连通性。
确认连通性正常,ARP学习正常。
抓包查看通信过程,首先是二层广播查找10.1.1.1的ARP信息。
然后10.1.1.1响应请求。
后面就是正常的ICMP交互报文了。
我们再看30位掩码的这边。
虽然可以ping通,但是没有ARP表项信息。
通过抓包,我们发现,11.1.1.1发出的每一个ICMP请求报文都是二层广播报文,而且没有ARP请求报文。但是每个响应报文都是正常的单播报文。
那这样会有什么问题呢?
我们给设备增加一条路由,会发现无法通信。
此时再抓包查看,发现有ARP请求报文了,而且响应也是正常的。但是就是没有报文发出来,为什么呢?我们看一下FIB表项。
去往10.1.1.0/31的下一跳是11.1.1.0,但是11.1.1.0有一个32位掩码的主机条目,下一跳就是接口本身的11.1.1.1,而11.1.1.1/32是设备自身的接口地址,下一跳就是127.0.0.1,设备上没有ARP表项,所以转发不出去。
为什么没有ARP表项,因为设备认为11.1.1.0/30这个地址是一个网络地址号。
那我们把11.1.1.0/30换成标准的互联地址11.1.1.2/30再测试一下。
可以看到ARP表项和路由表项都正常了。那如果把SW和RT1的互联地址换一下呢?
啊哦,VLAN虚接口配不了这个地址。但是在MSR810上面就是可以的,说明设备间还是有些差别的。
同样,有些非点对点接口也是不支持配置31位掩码的。
2GFH_COR_SW_2(conf1g-1f)#ip add 1.1.1.1 255.255.255.254 % Warning: use /31 mask on non point-to-point interface cautiously ZGFH_COR_SW_2(config-if)#ip add 1.1.1.0 255.255.255.254 % Warning: use /31 mask on non point-to-point interface cautiously
简单总结一下,30位掩码长度的互联地址还是比较规范的使用方式,部分场景下可能可以配置网络号到接口上,但通信异常。31位掩码长度仅适用于点对点链路,非点对点接口无法配置,如果能配置31位长度的掩码,那路由转发也是和正常一样的。