簡體   English   中英

針對IPv4和IPv6地址的connect()行為

[英]Behaviour of connect() for IPv4 and IPv6 addresses

我用以下參數創建一個套接字:

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超時小得多。

誰能解釋一下行為上的差異?

當到特定目標主機(任一協議)的路由查找產生不可達/被禁止/拒絕等情況時,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 

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM