我有一些问题需要了解一个与网络通信中的回退机制有关的问题。
设置:使用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机制?在其他地方?
谢谢, 亚瑟。
答案 0 :(得分:2)
这可能是因为你正在使用ping6,它只会执行IPv6(而ping只会执行IPv4)。
回退机制的实现将取决于您。您已经了解了如何从名称查找中检索多个地址,所以现在剩下的就是尝试每个地址,直到您设法连接为止。