ping6이 IPv4 소켓을 사용하는 이유는 무엇입니까?

ping6이 IPv4 소켓을 사용하는 이유는 무엇입니까?

CentOS 7 서버에서 IPv6를 활성화했는데 ping6을 제외한 모든 것이 예상대로 작동합니다. 요청 간에 3-5 지연이 표시됩니다(그러나 RTT는 괜찮습니다).

$ ping6 www.google.com
<...5 sec...>
PING www.google.com(2607:f8b0:4002:c09::69) 56 data bytes
<...5 sec...>
64 bytes from 2607:f8b0:4002:c09::69: icmp_seq=1 ttl=55 time=21.1 ms
<...5 sec...>
64 bytes from 2607:f8b0:4002:c09::69: icmp_seq=2 ttl=55 time=21.2 ms
<...5 sec...>
64 bytes from 2607:f8b0:4002:c09::69: icmp_seq=3 ttl=55 time=21.1 ms
<...5 sec...>
64 bytes from 2607:f8b0:4002:c09::69: icmp_seq=4 ttl=55 time=21.1 ms
<...5 sec...>
64 bytes from 2607:f8b0:4002:c09::69: icmp_seq=5 ttl=55 time=21.2 ms
<...5 sec...>
^C64 bytes from 2607:f8b0:4002:c09::69: icmp_seq=6 ttl=55 time=21.1 ms

--- www.google.com ping statistics ---
6 packets transmitted, 6 received, 0% packet loss, time 25216ms
rtt min/avg/max/mdev = 21.119/21.183/21.251/0.043 ms

그런 다음 strace()를 통해 실행하면 strace ping6 www.google.comIPv4 주소에 대한 ping 시도가 처음으로 시간 초과된 다음 계속해서 IPv6 소켓을 열고 성공하는 것을 볼 수 있습니다.

socket(PF_INET, SOCK_DGRAM|SOCK_NONBLOCK, IPPROTO_IP) = 4
connect(4, {sa_family=AF_INET, sin_port=htons(53), sin_addr=inet_addr("209.244.0.3")}, 16) = 0
gettimeofday({1415215545, 657352}, NULL) = 0
poll([{fd=4, events=POLLOUT}], 1, 0)    = 1 ([{fd=4, revents=POLLOUT}])
sendto(4, "\2721\1\0\0\1\0\0\0\0\0\0\3www\6google\3com\0\0\34\0\1", 32, MSG_NOSIGNAL, NULL, 0) = 32
poll([{fd=4, events=POLLIN}], 1, 5000)  = 0 (Timeout)
socket(PF_INET6, SOCK_DGRAM|SOCK_NONBLOCK, IPPROTO_IP) = 5
connect(5, {sa_family=AF_INET6, sin6_port=htons(53), inet_pton(AF_INET6, "2001:4860:4860::8844", &sin6_addr), sin6_flowinfo=0, sin6_scope_id=0}, 28) = 0
gettimeofday({1415215550, 663174}, NULL) = 0
poll([{fd=5, events=POLLOUT}], 1, 0)    = 1 ([{fd=5, revents=POLLOUT}])
sendto(5, "\2721\1\0\0\1\0\0\0\0\0\0\3www\6google\3com\0\0\34\0\1", 32, MSG_NOSIGNAL, NULL, 0) = 32
poll([{fd=5, events=POLLIN}], 1, 3000)  = 1 ([{fd=5, revents=POLLIN}])
ioctl(5, FIONREAD, [60])                = 0
recvfrom(5, "\2721\201\200\0\1\0\1\0\0\0\0\3www\6google\3com\0\0\34\0\1"..., 1024, 0, {sa_family=AF_INET6, sin6_port=htons(53), inet_pton(AF_INET6, "2001:4860:4860::8844", &sin6_addr), sin6_flowinfo=0, sin6_scope_id=0}, [28]) = 60

ping6은 AAAA 레코드를 찾고 특히 IPv6 주소를 열어야 하지 않습니까? 왜 이런 일이 발생합니까?

답변1

출력 strace결과에 따르면 ping6이 www.google.com의 IP 주소를 찾기 위해 DNS 요청을 시도하고 있는 것으로 나타났습니다.

첫 번째 DNS 요청은 209.244.0.3, resolver1.level3.net으로 전달됩니다. 이 DNS 요청은 5초 후에 시간 초과되며, 이때 두 번째 DNS 서버 2001:4860:4860::8844로 대체됩니다. 서버는 거의 즉시 DNS 응답을 반환합니다.

귀하의 서비스 제공업체가 귀하의 컴퓨터를 구성할 때 이를 시스템 구성에 넣었을 수도 있지만, 그것이 귀하의 시스템 구성에 어떻게 적용되었는지는 알 수 없습니다. 귀하가 해당 네트워크에 연결되어 있지 않으면 DNS 서버가 귀하에게 서비스를 제공하지 못할 수도 있습니다.

시스템의 DNS 서버가 에 나열됩니다 /etc/resolv.conf. 사용 중인 DNS 서버가 올바르고 작동하는지 서비스 공급자에게 확인한 후 그곳에서 이를 편집하고 수정할 수 있습니다.

관련 정보