![IPv6环回地址的二进制格式](https://linux22.com/image/211481/IPv6%E7%8E%AF%E5%9B%9E%E5%9C%B0%E5%9D%80%E7%9A%84%E4%BA%8C%E8%BF%9B%E5%88%B6%E6%A0%BC%E5%BC%8F.png)
在一个终端中,我跑了
$ 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。