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로 참조되는 경우 최하위 비트는 네 번째이자 마지막 숫자의 25번째 비트가 됩니다. 이 0x01000000 32비트 정수의 바이트는 실제로 16진수 0x00, 0x00, 0x00, 0x01 형식으로 메모리에 저장됩니다. 따라서 IPv6 주소는 0x00 x 15, 0x01로 저장됩니다.

관련 정보