Daniel Walker Asked: 2022-10-02 10:47:01 +0800 CST2022-10-02 10:47:01 +0800 CST 2022-10-02 10:47:01 +0800 CST IPv6环回地址的二进制格式 772 在一个终端中,我跑了 $ nc -l -6 ::1 5000 在另一个终端,我跑了 $ cat /proc/net/tcp6 并看到了这一行: 0: 00000000000000000000000001000000:1388 00000000000000000000000000000000:0000 ... 为什么说我在听::1:0:0:0而不是在听::1? ipv6 proc 1 个回答 Voted Best Answer Stéphane Chazelas 2022-10-02T11:21:52+08:002022-10-02T11:21:52+08:00 如果您查看生成该文件内容的代码,您会看到: 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 时,作为 little-endian 系统上 4 个 32 位数字的数组,最低有效位成为第 4 个和最后一个数字的第 25 位。该 0x01000000 32 位整数的字节实际上以(十六进制)0x00、0x00、0x00、0x01 的形式存储在内存中。所以 IPv6 地址存储为 0x00 x 15, 0x01。
如果您查看生成该文件内容的代码,您会看到:
与:
128 位 IPv6 地址是一个 16 字节的数组,地址的最低有效位是第 16 个字节的最低有效位。但是当引用为 u6_addr32 时,作为 little-endian 系统上 4 个 32 位数字的数组,最低有效位成为第 4 个和最后一个数字的第 25 位。该 0x01000000 32 位整数的字节实际上以(十六进制)0x00、0x00、0x00、0x01 的形式存储在内存中。所以 IPv6 地址存储为 0x00 x 15, 0x01。