最近做和Eip相关的裸金属功能,涉及到一个以前开发中接触较少的领域:Ipv6 和 Ipv6 Cidr。Ipv6的概念网上有很多,但是Cidr的概念不多,而且大部分文章讲的也比较啰嗦,不够简明;这里简单记录一下自己的理解,实用为主。
关于Ipv6 Cidr
为了划分一个可用的Ip地址段,供一个小型局域网络来使用,避免浪费地址(ipv4比较珍贵);通常由机房中的一个大网段划分出来。与Ipv4 Cidr一样,也是一个可用的ip地址集合,其规则为:ip地址/后缀(指明前缀的位数,也叫掩码),cidr 是一种可变长子网掩码技术。比如:fd00::1001:100/120,其对应的全写:fd00:0000:0000:0000:0000:0000:1001:0100/120。
ipv6地址一共128位,对于fd00::1001:100/120,其cidr固定位(红色):fd00:0000:0000:0000:0000:0000:1001:01【00】/120,可用位在中括号中。也就是说,如果你传入的IP地址:fd00:0000:0000:0000:0000:0000:1001:02 00,则不在当前cidr段中。同理:fd00:0000:0000:0000:0000:0000:1001:01 01 则在cidr段中。
实际使用中遇到的问题
1、判断ipv6地址是否在指定cidr段内
2、ipv6 cidr是否合法
3、ipv6及其cidr的简写和全写切换
我在代码中使用了googlecode源码包,maven坐标如下:
<dependency>
<groupId>com.googlecode.java-ipv6</groupId>
<artifactId>java-ipv6</artifactId>
<version>0.16</version>
</dependency>
开发中遇到了一些比较有意思的问题也一并记录:fd00::1:1/120 (这是一个错误的cidr,因为他最后一位【2】被占了;正确的应该是fd00::1:0/120,或fd00::1:1/128)。不多写了,上代码自己看吧,愿詹姆斯·高斯林保佑你。
请求实体:
@Data
@EqualsAndHashCode(callSuper=false)
public class CheckIpv6InfomationRequest extends PagingRequest {
@Expose
@Pattern(regexp = Validation.REGEX_IPV6, message = ErrorCode.INVALID_ARGUMENT)
private String targetIpv6; // ip