0

我有一些问题要理解与网络通信中的后备机制有关的问题。

设置:带有 uclibc 和 busybox 的嵌入式设备 (mips)

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

据我了解,我得到了这个结果,这要归功于 dns 机制,它读取了我的 resolv.conf 文件并通过套接字联系 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 代码端的忙箱内。感谢 dns 机制在 uclibc 内部?别的地方 ?

谢谢,亚瑟。

4

1 回答 1

2

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

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

于 2013-11-08T11:52:43.060 回答