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

时间:2013-11-08 10:50:07

标签: linux dns ipv6 uclibc

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

设置:使用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 个答案:

答案 0 :(得分:2)

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

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