ターミナルで私は走った
$ 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として保存されます。