IPv6环回地址的二进制格式

IPv6环回地址的二进制格式

在一个终端中,我跑了

$ nc -l -6 ::1 5000

在另一个终端,我跑了

$ cat /proc/net/tcp6

并看到这一行:

   0: 00000000000000000000000001000000:1388 00000000000000000000000000000000:0000 ...

为什么说我在听::1:0:0:0而不是在听::1

答案1

如果你看生成该文件内容的代码, 你看:

    seq_printf(seq,
           "%4d: %08X%08X%08X%08X:%04X %08X%08X%08X%08X:%04X "
           "%02X %08X:%08X %02X:%08lX %08X %5u %8d %lu %d %pK %lu %lu %u %u %d\n",
           i,
           src->s6_addr32[0], src->s6_addr32[1],
           src->s6_addr32[2], src->s6_addr32[3], srcp,

struct in6_addr {
        union {
                __u8            u6_addr8[16];
#if __UAPI_DEF_IN6_ADDR_ALT
                __be16          u6_addr16[8];
                __be32          u6_addr32[4];
#endif
        } in6_u;
#define s6_addr                 in6_u.u6_addr8
#if __UAPI_DEF_IN6_ADDR_ALT
#define s6_addr16               in6_u.u6_addr16
#define s6_addr32               in6_u.u6_addr32
#endif
};

128 位 IPv6 地址是一个 16 字节的数组,地址的最低有效位是第 16 个字节的最低有效位。但是,当引用为 u6_addr32 时,作为小端系统上的 4 个 32 位数字的数组,最低有效位将成为第四个也是最后一个数字的第 25 位。该 0x01000000 32 位整数的字节实际上以(十六进制)0x00、0x00、0x00、0x01 的形式存储在内存中。因此 IPv6 地址存储为 0x00 x 15、0x01。

相关内容