2012-01-27 128 views
1

我创建具有以下PARAMS插座:行为connect()的IPv4和IPv6地址

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超时少。

任何人都可以解释行为的差异?

+1

你有使用例如检查wireshark电线上发生了什么?可能是因为ipv4 syns被丢弃,而ipv6则返回一些icmp错误。 – PlasmaHH 2012-01-27 14:39:06

+0

该行为很可能是操作系统特定的。它也可能取决于您和目标网络之间的网络拓扑。 – 2012-01-27 15:01:08

+0

通常,如果主机无法找到路由,则远程连接可能会立即失败,但如果中间路由器无法路由或防火墙会阻止该连接,则会立即失败,但仍然是异步连接,则立即连接到本地主机应立即成功(或失败)重置,如果目标主机可访问但无响应或者防火墙以静默方式丢弃SYN,则只会超时。 – Useless 2012-01-27 15:39:54

回答

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 
相关问题