最近想一个问题如何快速判断IPv6地址是否为同网段?

比如给定一个前缀prefix 和一个掩码位数mask_len, 那么一个IPv6地址与前缀怎么对比比较快呢。

我大概想了一下,把mask_len变成mask, (IPv6 & mask) ^ prefix == 0 ? 这种位操作的判断应该是比较快的。

mask_len变成mask就要麻烦一点了,毕竟IPv6有16个字节,不像IPv4可以直接位移4字节的unsigned int那么简单。

经过一番调试(经历了分批位移失败的教训后),写出了如下代码,终于还是单字节操作比较方便。

#include <stdio.h>
#include <string.h>

typedef unsigned char         u8;
typedef unsigned short        u16;
typedef unsigned int          u32;
typedef unsigned long long    u64;


typedef union
{
      u8 as_u8[16];
      u16 as_u16[8];
      u32 as_u32[4];
      u64 as_u64[2];
}
ip6_address_t;


#define BYTE_TO_BINARY_PATTERN "%c%c%c%c%c%c%c%c"

#define BYTE_TO_BINARY(byte)   \
    (byte & 0x80 ? '1' : '0'), \
    (byte & 0x40 ? '1' : '0'), \
    (byte & 0x20 ? '1' : '0'), \
    (byte & 0x10 ? '1' : '0'), \
    (byte & 0x08 ? '1' : '0'), \
    (byte & 0x04 ? '1' : '0'), \
    (byte & 0x02 ? '1' : '0'), \
    (byte & 0x01 ? '1' : '0') 


int print_ip6(ip6_address_t* ip)
{
        int i = 0;
        for (i = 0; i < 16; i++) {
                printf(" "BYTE_TO_BINARY_PATTERN, BYTE_TO_BINARY(ip->as_u8[i]));
                if (i == 7) {
                        printf(" ");
                }
        }
        printf("\n");
        return 0;
}

int cal_bitmask(ip6_address_t* p, int len)
{
        if (len < 0) {
                return -1;
        }

        int i = 0;
        p->as_u64[0] = 0;
        p->as_u64[1] = 0;
        for (i = 0; i < 16 && len > 0; i++) {
                if (len < 8) {
                        p->as_u8[i] = 0xFF << (8-len);
                        break;
                }
                p->as_u8[i] = 0xFF;
                len -= 8;
        }

        return 0;
}

int main()
{
        ip6_address_t mask;
        memset(&mask, 0, sizeof(mask));

        int i = 0;
        for (i = 0; i <= 128; i++) {
                memset(&mask, 0, sizeof(mask));
                cal_bitmask(&mask, i);

                print_ip6(&mask);
        }
        return 0;
}

代码中测试了0~128位掩码,二进制输出还是很美观的(前提是屏幕足够大)

[ckun@localhost test]$ gcc a.c
[ckun@localhost test]$ ./a.out 
 00000000 00000000 00000000 00000000 00000000 00000000 00000000 00000000  00000000 00000000 00000000 00000000 00000000 00000000 00000000 00000000
 10000000 00000000 00000000 00000000 00000000 00000000 00000000 00000000  00000000 00000000 00000000 00000000 00000000 00000000 00000000 00000000
 11000000 00000000 00000000 00000000 00000000 00000000 00000000 00000000  00000000 00000000 00000000 00000000 00000000 00000000 00000000 00000000
 11100000 00000000 00000000 00000000 00000000 00000000 00000000 00000000  00000000 00000000 00000000 00000000 00000000 00000000 00000000 00000000
 11110000 00000000 00000000 00000000 00000000 00000000 00000000 00000000  00000000 00000000 00000000 00000000 00000000 00000000 00000000 00000000
 11111000 00000000 00000000 00000000 00000000 00000000 00000000 00000000  00000000 00000000 00000000 00000000 00000000 00000000 00000000 00000000
 11111100 00000000 00000000 00000000 00000000 00000000 00000000 00000000  00000000 00000000 00000000 00000000 00000000 00000000 00000000 00000000
 11111110 00000000 00000000 00000000 00000000 00000000 00000000 00000000  00000000 00000000 00000000 00000000 00000000 00000000 00000000 00000000
 11111111 00000000 00000000 00000000 00000000 00000000 00000000 00000000  00000000 00000000 00000000 00000000 00000000 00000000 00000000 00000000
 11111111 10000000 00000000 00000000 00000000 00000000 00000000 00000000  00000000 00000000 00000000 00000000 00000000 00000000 00000000 00000000
 11111111 11000000 00000000 00000000 00000000 00000000 00000000 00000000  00000000 00000000 00000000 00000000 00000000 00000000 00000000 00000000
 11111111 11100000 00000000 00000000 00000000 00000000 00000000 00000000  00000000 00000000 00000000 00000000 00000000 00000000 00000000 00000000
 11111111 11110000 00000000 00000000 00000000 00000000 00000000 00000000  00000000 00000000 00000000 00000000 00000000 00000000 00000000 00000000
 11111111 11111000 00000000 00000000 00000000 00000000 00000000 00000000  00000000 00000000 00000000 00000000 00000000 00000000 00000000 00000000
 11111111 11111100 00000000 00000000 00000000 00000000 00000000 00000000  00000000 00000000 00000000 00000000 00000000 00000000 00000000 00000000
 11111111 11111110 00000000 00000000 00000000 00000000 00000000 00000000  00000000 00000000 00000000 00000000 00000000 00000000 00000000 00000000
 11111111 11111111 00000000 00000000 00000000 00000000 00000000 00000000  00000000 00000000 00000000 00000000 00000000 00000000 00000000 00000000
 11111111 11111111 10000000 00000000 00000000 00000000 00000000 00000000  00000000 00000000 00000000 00000000 00000000 00000000 00000000 00000000
 11111111 11111111 11000000 00000000 00000000 00000000 00000000 00000000  00000000 00000000 00000000 00000000 00000000 00000000 00000000 00000000
 11111111 11111111 11100000 00000000 00000000 00000000 00000000 00000000  00000000 00000000 00000000 00000000 00000000 00000000 00000000 00000000
 11111111 11111111 11110000 00000000 00000000 00000000 00000000 00000000  00000000 00000000 00000000 00000000 00000000 00000000 00000000 00000000
 11111111 11111111 11111000 00000000 00000000 00000000 00000000 00000000  00000000 00000000 00000000 00000000 00000000 00000000 00000000 00000000
 11111111 11111111 11111100 00000000 00000000 00000000 00000000 00000000  00000000 00000000 00000000 00000000 00000000 00000000 00000000 00000000
 11111111 11111111 11111110 00000000 00000000 00000000 00000000 00000000  00000000 00000000 00000000 00000000 00000000 00000000 00000000 00000000
 11111111 11111111 11111111 00000000 00000000 00000000 00000000 00000000  00000000 00000000 00000000 00000000 00000000 00000000 00000000 00000000
 11111111 11111111 11111111 10000000 00000000 00000000 00000000 00000000  00000000 00000000 00000000 00000000 00000000 00000000 00000000 00000000
 11111111 11111111 11111111 11000000 00000000 00000000 00000000 00000000  00000000 00000000 00000000 00000000 00000000 00000000 00000000 00000000
 11111111 11111111 11111111 11100000 00000000 00000000 00000000 00000000  00000000 00000000 00000000 00000000 00000000 00000000 00000000 00000000
 11111111 11111111 11111111 11110000 00000000 00000000 00000000 00000000  00000000 00000000 00000000 00000000 00000000 00000000 00000000 00000000
 11111111 11111111 11111111 11111000 00000000 00000000 00000000 00000000  00000000 00000000 00000000 00000000 00000000 00000000 00000000 00000000
 11111111 11111111 11111111 11111100 00000000 00000000 00000000 00000000  00000000 00000000 00000000 00000000 00000000 00000000 00000000 00000000
 11111111 11111111 11111111 11111110 00000000 00000000 00000000 00000000  00000000 00000000 00000000 00000000 00000000 00000000 00000000 00000000
 11111111 11111111 11111111 11111111 00000000 00000000 00000000 00000000  00000000 00000000 00000000 00000000 00000000 00000000 00000000 00000000
 11111111 11111111 11111111 11111111 10000000 00000000 00000000 00000000  00000000 00000000 00000000 00000000 00000000 00000000 00000000 00000000
 11111111 11111111 11111111 11111111 11000000 00000000 00000000 00000000  00000000 00000000 00000000 00000000 00000000 00000000 00000000 00000000
 11111111 11111111 11111111 11111111 11100000 00000000 00000000 00000000  00000000 00000000 00000000 00000000 00000000 00000000 00000000 00000000
 11111111 11111111 11111111 11111111 11110000 00000000 00000000 00000000  00000000 00000000 00000000 00000000 00000000 00000000 00000000 00000000
 11111111 11111111 11111111 11111111 11111000 00000000 00000000 00000000  00000000 00000000 00000000 00000000 00000000 00000000 00000000 00000000
 11111111 11111111 11111111 11111111 11111100 00000000 00000000 00000000  00000000 00000000 00000000 00000000 00000000 00000000 00000000 00000000
 11111111 11111111 11111111 11111111 11111110 00000000 00000000 00000000  00000000 00000000 00000000 00000000 00000000 00000000 00000000 00000000
 11111111 11111111 11111111 11111111 11111111 00000000 00000000 00000000  00000000 00000000 00000000 00000000 00000000 00000000 00000000 00000000
 11111111 11111111 11111111 11111111 11111111 10000000 00000000 00000000  00000000 00000000 00000000 00000000 00000000 00000000 00000000 00000000
 11111111 11111111 11111111 11111111 11111111 11000000 00000000 00000000  00000000 00000000 00000000 00000000 00000000 00000000 00000000 00000000
 11111111 11111111 11111111 11111111 11111111 11100000 00000000 00000000  00000000 00000000 00000000 00000000 00000000 00000000 00000000 00000000
 11111111 11111111 11111111 11111111 11111111 11110000 00000000 00000000  00000000 00000000 00000000 00000000 00000000 00000000 00000000 00000000
 11111111 11111111 11111111 11111111 11111111 11111000 00000000 00000000  00000000 00000000 00000000 00000000 00000000 00000000 00000000 00000000
 11111111 11111111 11111111 11111111 11111111 11111100 00000000 00000000  00000000 00000000 00000000 00000000 00000000 00000000 00000000 00000000
 11111111 11111111 11111111 11111111 11111111 11111110 00000000 00000000  00000000 00000000 00000000 00000000 00000000 00000000 00000000 00000000
 11111111 11111111 11111111 11111111 11111111 11111111 00000000 00000000  00000000 00000000 00000000 00000000 00000000 00000000 00000000 00000000
 11111111 11111111 11111111 11111111 11111111 11111111 10000000 00000000  00000000 00000000 00000000 00000000 00000000 00000000 00000000 00000000
 11111111 11111111 11111111 11111111 11111111 11111111 11000000 00000000  00000000 00000000 00000000 00000000 00000000 00000000 00000000 00000000
 11111111 11111111 11111111 11111111 11111111 11111111 11100000 00000000  00000000 00000000 00000000 00000000 00000000 00000000 00000000 00000000
 11111111 11111111 11111111 11111111 11111111 11111111 11110000 00000000  00000000 00000000 00000000 00000000 00000000 00000000 00000000 00000000
 11111111 11111111 11111111 11111111 11111111 11111111 11111000 00000000  00000000 00000000 00000000 00000000 00000000 00000000 00000000 00000000
 11111111 11111111 11111111 11111111 11111111 11111111 11111100 00000000  00000000 00000000 00000000 00000000 00000000 00000000 00000000 00000000
 11111111 11111111 11111111 11111111 11111111 11111111 11111110 00000000  00000000 00000000 00000000 00000000 00000000 00000000 00000000 00000000
 11111111 11111111 11111111 11111111 11111111 11111111 11111111 00000000  00000000 00000000 00000000 00000000 00000000 00000000 00000000 00000000
 11111111 11111111 11111111 11111111 11111111 11111111 11111111 10000000  00000000 00000000 00000000 00000000 00000000 00000000 00000000 00000000
 11111111 11111111 11111111 11111111 11111111 11111111 11111111 11000000  00000000 00000000 00000000 00000000 00000000 00000000 00000000 00000000
 11111111 11111111 11111111 11111111 11111111 11111111 11111111 11100000  00000000 00000000 00000000 00000000 00000000 00000000 00000000 00000000
 11111111 11111111 11111111 11111111 11111111 11111111 11111111 11110000  00000000 00000000 00000000 00000000 00000000 00000000 00000000 00000000
 11111111 11111111 11111111 11111111 11111111 11111111 11111111 11111000  00000000 00000000 00000000 00000000 00000000 00000000 00000000 00000000
 11111111 11111111 11111111 11111111 11111111 11111111 11111111 11111100  00000000 00000000 00000000 00000000 00000000 00000000 00000000 00000000
 11111111 11111111 11111111 11111111 11111111 11111111 11111111 11111110  00000000 00000000 00000000 00000000 00000000 00000000 00000000 00000000
 11111111 11111111 11111111 11111111 11111111 11111111 11111111 11111111  00000000 00000000 00000000 00000000 00000000 00000000 00000000 00000000
 11111111 11111111 11111111 11111111 11111111 11111111 11111111 11111111  10000000 00000000 00000000 00000000 00000000 00000000 00000000 00000000
 11111111 11111111 11111111 11111111 11111111 11111111 11111111 11111111  11000000 00000000 00000000 00000000 00000000 00000000 00000000 00000000
 11111111 11111111 11111111 11111111 11111111 11111111 11111111 11111111  11100000 00000000 00000000 00000000 00000000 00000000 00000000 00000000
 11111111 11111111 11111111 11111111 11111111 11111111 11111111 11111111  11110000 00000000 00000000 00000000 00000000 00000000 00000000 00000000
 11111111 11111111 11111111 11111111 11111111 11111111 11111111 11111111  11111000 00000000 00000000 00000000 00000000 00000000 00000000 00000000
 11111111 11111111 11111111 11111111 11111111 11111111 11111111 11111111  11111100 00000000 00000000 00000000 00000000 00000000 00000000 00000000
 11111111 11111111 11111111 11111111 11111111 11111111 11111111 11111111  11111110 00000000 00000000 00000000 00000000 00000000 00000000 00000000
 11111111 11111111 11111111 11111111 11111111 11111111 11111111 11111111  11111111 00000000 00000000 00000000 00000000 00000000 00000000 00000000
 11111111 11111111 11111111 11111111 11111111 11111111 11111111 11111111  11111111 10000000 00000000 00000000 00000000 00000000 00000000 00000000
 11111111 11111111 11111111 11111111 11111111 11111111 11111111 11111111  11111111 11000000 00000000 00000000 00000000 00000000 00000000 00000000
 11111111 11111111 11111111 11111111 11111111 11111111 11111111 11111111  11111111 11100000 00000000 00000000 00000000 00000000 00000000 00000000
 11111111 11111111 11111111 11111111 11111111 11111111 11111111 11111111  11111111 11110000 00000000 00000000 00000000 00000000 00000000 00000000
 11111111 11111111 11111111 11111111 11111111 11111111 11111111 11111111  11111111 11111000 00000000 00000000 00000000 00000000 00000000 00000000
 11111111 11111111 11111111 11111111 11111111 11111111 11111111 11111111  11111111 11111100 00000000 00000000 00000000 00000000 00000000 00000000
 11111111 11111111 11111111 11111111 11111111 11111111 11111111 11111111  11111111 11111110 00000000 00000000 00000000 00000000 00000000 00000000
 11111111 11111111 11111111 11111111 11111111 11111111 11111111 11111111  11111111 11111111 00000000 00000000 00000000 00000000 00000000 00000000
 11111111 11111111 11111111 11111111 11111111 11111111 11111111 11111111  11111111 11111111 10000000 00000000 00000000 00000000 00000000 00000000
 11111111 11111111 11111111 11111111 11111111 11111111 11111111 11111111  11111111 11111111 11000000 00000000 00000000 00000000 00000000 00000000
 11111111 11111111 11111111 11111111 11111111 11111111 11111111 11111111  11111111 11111111 11100000 00000000 00000000 00000000 00000000 00000000
 11111111 11111111 11111111 11111111 11111111 11111111 11111111 11111111  11111111 11111111 11110000 00000000 00000000 00000000 00000000 00000000
 11111111 11111111 11111111 11111111 11111111 11111111 11111111 11111111  11111111 11111111 11111000 00000000 00000000 00000000 00000000 00000000
 11111111 11111111 11111111 11111111 11111111 11111111 11111111 11111111  11111111 11111111 11111100 00000000 00000000 00000000 00000000 00000000
 11111111 11111111 11111111 11111111 11111111 11111111 11111111 11111111  11111111 11111111 11111110 00000000 00000000 00000000 00000000 00000000
 11111111 11111111 11111111 11111111 11111111 11111111 11111111 11111111  11111111 11111111 11111111 00000000 00000000 00000000 00000000 00000000
 11111111 11111111 11111111 11111111 11111111 11111111 11111111 11111111  11111111 11111111 11111111 10000000 00000000 00000000 00000000 00000000
 11111111 11111111 11111111 11111111 11111111 11111111 11111111 11111111  11111111 11111111 11111111 11000000 00000000 00000000 00000000 00000000
 11111111 11111111 11111111 11111111 11111111 11111111 11111111 11111111  11111111 11111111 11111111 11100000 00000000 00000000 00000000 00000000
 11111111 11111111 11111111 11111111 11111111 11111111 11111111 11111111  11111111 11111111 11111111 11110000 00000000 00000000 00000000 00000000
 11111111 11111111 11111111 11111111 11111111 11111111 11111111 11111111  11111111 11111111 11111111 11111000 00000000 00000000 00000000 00000000
 11111111 11111111 11111111 11111111 11111111 11111111 11111111 11111111  11111111 11111111 11111111 11111100 00000000 00000000 00000000 00000000
 11111111 11111111 11111111 11111111 11111111 11111111 11111111 11111111  11111111 11111111 11111111 11111110 00000000 00000000 00000000 00000000
 11111111 11111111 11111111 11111111 11111111 11111111 11111111 11111111  11111111 11111111 11111111 11111111 00000000 00000000 00000000 00000000
 11111111 11111111 11111111 11111111 11111111 11111111 11111111 11111111  11111111 11111111 11111111 11111111 10000000 00000000 00000000 00000000
 11111111 11111111 11111111 11111111 11111111 11111111 11111111 11111111  11111111 11111111 11111111 11111111 11000000 00000000 00000000 00000000
 11111111 11111111 11111111 11111111 11111111 11111111 11111111 11111111  11111111 11111111 11111111 11111111 11100000 00000000 00000000 00000000
 11111111 11111111 11111111 11111111 11111111 11111111 11111111 11111111  11111111 11111111 11111111 11111111 11110000 00000000 00000000 00000000
 11111111 11111111 11111111 11111111 11111111 11111111 11111111 11111111  11111111 11111111 11111111 11111111 11111000 00000000 00000000 00000000
 11111111 11111111 11111111 11111111 11111111 11111111 11111111 11111111  11111111 11111111 11111111 11111111 11111100 00000000 00000000 00000000
 11111111 11111111 11111111 11111111 11111111 11111111 11111111 11111111  11111111 11111111 11111111 11111111 11111110 00000000 00000000 00000000
 11111111 11111111 11111111 11111111 11111111 11111111 11111111 11111111  11111111 11111111 11111111 11111111 11111111 00000000 00000000 00000000
 11111111 11111111 11111111 11111111 11111111 11111111 11111111 11111111  11111111 11111111 11111111 11111111 11111111 10000000 00000000 00000000
 11111111 11111111 11111111 11111111 11111111 11111111 11111111 11111111  11111111 11111111 11111111 11111111 11111111 11000000 00000000 00000000
 11111111 11111111 11111111 11111111 11111111 11111111 11111111 11111111  11111111 11111111 11111111 11111111 11111111 11100000 00000000 00000000
 11111111 11111111 11111111 11111111 11111111 11111111 11111111 11111111  11111111 11111111 11111111 11111111 11111111 11110000 00000000 00000000
 11111111 11111111 11111111 11111111 11111111 11111111 11111111 11111111  11111111 11111111 11111111 11111111 11111111 11111000 00000000 00000000
 11111111 11111111 11111111 11111111 11111111 11111111 11111111 11111111  11111111 11111111 11111111 11111111 11111111 11111100 00000000 00000000
 11111111 11111111 11111111 11111111 11111111 11111111 11111111 11111111  11111111 11111111 11111111 11111111 11111111 11111110 00000000 00000000
 11111111 11111111 11111111 11111111 11111111 11111111 11111111 11111111  11111111 11111111 11111111 11111111 11111111 11111111 00000000 00000000
 11111111 11111111 11111111 11111111 11111111 11111111 11111111 11111111  11111111 11111111 11111111 11111111 11111111 11111111 10000000 00000000
 11111111 11111111 11111111 11111111 11111111 11111111 11111111 11111111  11111111 11111111 11111111 11111111 11111111 11111111 11000000 00000000
 11111111 11111111 11111111 11111111 11111111 11111111 11111111 11111111  11111111 11111111 11111111 11111111 11111111 11111111 11100000 00000000
 11111111 11111111 11111111 11111111 11111111 11111111 11111111 11111111  11111111 11111111 11111111 11111111 11111111 11111111 11110000 00000000
 11111111 11111111 11111111 11111111 11111111 11111111 11111111 11111111  11111111 11111111 11111111 11111111 11111111 11111111 11111000 00000000
 11111111 11111111 11111111 11111111 11111111 11111111 11111111 11111111  11111111 11111111 11111111 11111111 11111111 11111111 11111100 00000000
 11111111 11111111 11111111 11111111 11111111 11111111 11111111 11111111  11111111 11111111 11111111 11111111 11111111 11111111 11111110 00000000
 11111111 11111111 11111111 11111111 11111111 11111111 11111111 11111111  11111111 11111111 11111111 11111111 11111111 11111111 11111111 00000000
 11111111 11111111 11111111 11111111 11111111 11111111 11111111 11111111  11111111 11111111 11111111 11111111 11111111 11111111 11111111 10000000
 11111111 11111111 11111111 11111111 11111111 11111111 11111111 11111111  11111111 11111111 11111111 11111111 11111111 11111111 11111111 11000000
 11111111 11111111 11111111 11111111 11111111 11111111 11111111 11111111  11111111 11111111 11111111 11111111 11111111 11111111 11111111 11100000
 11111111 11111111 11111111 11111111 11111111 11111111 11111111 11111111  11111111 11111111 11111111 11111111 11111111 11111111 11111111 11110000
 11111111 11111111 11111111 11111111 11111111 11111111 11111111 11111111  11111111 11111111 11111111 11111111 11111111 11111111 11111111 11111000
 11111111 11111111 11111111 11111111 11111111 11111111 11111111 11111111  11111111 11111111 11111111 11111111 11111111 11111111 11111111 11111100
 11111111 11111111 11111111 11111111 11111111 11111111 11111111 11111111  11111111 11111111 11111111 11111111 11111111 11111111 11111111 11111110
 11111111 11111111 11111111 11111111 11111111 11111111 11111111 11111111  11111111 11111111 11111111 11111111 11111111 11111111 11111111 11111111

在有了根据mask length获取mask之后,判断IPv6是否和prefix同网段就方便了。

如果有更快判断IPv6和Prefix判断同网段的方法,也不灵赐教,嘻嘻。

Logo

DAMO开发者矩阵,由阿里巴巴达摩院和中国互联网协会联合发起,致力于探讨最前沿的技术趋势与应用成果,搭建高质量的交流与分享平台,推动技术创新与产业应用链接,围绕“人工智能与新型计算”构建开放共享的开发者生态。

更多推荐