服务端不listen,客户端能不能链接成功?
先说结论:是可以的,但是有前提条件,而且概率非常小,前提条件是两边同时链接对方,五元组一样
有人说是time_wait造成的,不是这样的原因,并且要注意关闭监听socket和链接socket(accept返回的)是不一样的
接下来说原因
先说客户端connect的调用流程:connect->inet_stream_connect->tcp_v4_connect->inet_hash_connect->__inet_hash_nolisten->inet_ehash_bucket,从上面的调用流程可以看到,对于调用connect的套接字来说,会被插入到established hash中
再说服务端监听流程:recv skb时:__inet_lookup->__inet_lookup_established,从上面的调用流程来看,在收到syn包时,进行__inet_lookup查找套接字,先找__inet_lookup_established的
再看前提条件,如果客户端和服务端同时链接对方,在很小的概率下,五元组一样,调用__inet_lookup_established进行查找时,就找到了,就成功了