IPv4和IPv6地址的connect()行为

Behaviour of connect() for IPv4 and IPv6 addresses

本文关键字:行为 connect IPv6 地址 IPv4      更新时间:2023-10-16

我创建了一个带有以下参数的套接字:

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:fc4:6,但仍远小于IPv4超时。

有人能解释行为上的差异吗?

当到特定目标主机(任一协议)的路由查找产生不可访问/禁止/拒绝等时。,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