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番目のバイトの最下位ビットです。ただし、リトルエンディアンシステムで4つの32ビット数の配列としてu6_addr32と呼ばれる場合、最下位ビットは4番目と最後の数字の25番目のビットになります。この0x01000000 32ビット整数のバイトは、実際には16進数0x00、0x00、0x00、0x01の形式でメモリに格納されます。したがって、IPv6アドレスは0x00 x 15、0x01として保存されます。

関連情報