Proc

IPv6環回地址的二進制格式

  • October 1, 2022

在一個終端中,我跑了

$ 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。

引用自:https://unix.stackexchange.com/questions/719440