您的位置:首页 > 其它

服务端不listen 客户端也能链接成功

2017-01-11 10:29 274 查看
服务端不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进行查找时,就找到了,就成功了
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签:  listen connect