我创建了一个包含以下参数的套接字:
hints.ai_family = AF_UNSPEC;
hints.ai_socktype = SOCK_STREAM;
getaddrinfo(serverName, port, &hints, &res);
sFd = socket (res_node->ai_family, SOCK_STREAM, 0);
然后我为IPv4和Ipv6服务器地址进行连接调用,这些地址可能存在也可能不存在。当服务器不可访问时,它在IPv4和IPv6地址的情况下具有不同的行为。
在v4的情况下,它会在返回错误之前卡住很长时间(某些内部默认超时)。但是,在IPv6的情况下,行为会发生变化。对于某些地址,呼叫立即返回错误,例如地址如1111 :: 22,而对于某些地址需要更长时间,例如fec0:60:69bc:94:211:25ff:fec4:6但仍远低于IPv4超时。
有人可以解释行为上的差异吗?
答案 0 :(得分:0)
当查找到特定目标主机(任一协议)的路由产生无法访问/禁止/拒绝/等时,connect()可能立即失败。否则它必须发送探测(ARP / NDISC,以及可能的L4数据包,如TCP SYN / SCTP INIT)。
没有到全局IPv6单播路由的系统的路由查找示例:
$ ip r g 2a01::1
unreachable 2a01::1 from :: dev lo table unspec proto kernel src fe80::224:beff:fec2:7f16 metric -1 error -101 hoplimit 255
请注意与IPv6连接的主机的区别:
$ ip r g 2a01::1
2a01::1 from :: via fe80::2d0:3ff:fe93:d123 dev eth0 src 2001:527:500:770f:19e:84ff:fe9e:878 metric 0