首页 文章

ipv6通信失败时的后备ipv4机制

提问于
浏览
0

我有一些问题需要了解一个与网络通信中的回退机制有关的问题 .

设置:使用uclibc和busybox的嵌入式设备(mips)

我是ipv6地址的客户 . 我需要联系xxx.com上的服务 . 当我使用nslookup测试我的服务的主机名时 . 我得到了两个结果,一个ipv4和一个ipv6地址 . 所以我有两种方法可以联系我的服务器 .

在我的理解中,我得到了这个结果,这要归功于dns机制,它读取我的resolv.conf文件并通过socket联系dns服务器以获取与请求的主机名相关联的ip

测试:我运行ping6 -I eth0 myservice.com

谢谢strace,我看这个命令 . 结果是:

execve("/bin/ping6", ["ping6", "-I", "eth0", "myservice"], [/* 7 vars */]) = 0
...
open("/etc/resolv.conf", O_RDONLY)
...
socket(PF_INET, SOCK_DGRAM, IPPROTO_UDP) = 3
connect(3, {sa_family=AF_INET, sin_port=htons(53), sin_addr=inet_addr("192.168.20.20")}, 28) = 0
   -> **192.168.20.20** is my dns server ip fill in resolv.conf
...
send(3, "myservice.."..., 33, 0) = 33
poll([{fd=3, events=POLLIN}], 1, 5000)  = 1 ([{fd=3, revents=POLLIN}])
recv(3, "myservice.."..., 512, MSG_DONTWAIT) = 285
...
sendto(3, "\200\0\0\0iD\0\0\335\2130\7\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0"..., 64, 0, {sa_family=AF_INET6, sin6_port=htons(0), inet_pton(AF_INET6, "**Y:Y:Y:Y:Y:Y:Y:Y**", &sin6_addr), sin6_flowinfo=0, sin6_scope_id=2}, 28) = -1 ENETUNREACH (Network is unreachable)
write(2, "ping6: sendto: Network is unreac"..., 38) = 38
exit_group(1)

由于某种原因,我无法通过ipv6 Y:Y:Y:Y:Y:Y:Y:Y联系服务器myservice . 在我看来,有一个回退机制,当ipv6方式失败时,允许我通过ipv4联系我的服务器 . 不幸的是,正如你所看到的,在ipv6尝试之后,我看不到对ipv4方式的任何尝试 .

问题:获取此当前行为是否正常?哪里必须实现这种后备机制?在ping代码端的busybox里面 . 在uclibc内部感谢dns机制?别的地方 ?

谢谢,亚瑟 .

1 回答

  • 2

    这可能是因为你使用ping6,它只会执行IPv6(而ping只会执行IPv4) .

    回退机制的实现将取决于您 . 您已经了解了如何从名称查找中检索多个地址,所以现在剩下的就是尝试每个地址,直到您设置连接为止 .

相关问题