Proc
IPv6環回地址的二進制格式
在一個終端中,我跑了
$ nc -l -6 ::1 5000
在另一個終端,我跑了
$ cat /proc/net/tcp6
並看到了這一行:
0: 00000000000000000000000001000000:1388 00000000000000000000000000000000:0000 ...
為什麼說我在聽
::1:0:0:0
而不是在聽::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 時,作為 little-endian 系統上 4 個 32 位數字的數組,最低有效位成為第 4 個和最後一個數字的第 25 位。該 0x01000000 32 位整數的字節實際上以(十六進制)0x00、0x00、0x00、0x01 的形式儲存在記憶體中。所以 IPv6 地址儲存為 0x00 x 15, 0x01。