服务端不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进行查找时,就找到了,就成功了
先说结论:是可以的,但是有前提条件,而且概率非常小,前提条件是两边同时链接对方,五元组一样
有人说是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进行查找时,就找到了,就成功了
相关文章推荐
- KDE Connect —— 让 Android 手机成为 KDE 桌面的一部分
- Can't connect to MySQL server on 'localhost' (10048)问题解决方法
- Oracle中的Connect/session和process的区别及关系介绍
- C# 多网卡 Server Listen
- php运行提示Can't connect to MySQL server on 'localhost'的解决方法
- MySQL错误ERROR 2002 (HY000): Can't connect to local MySQL server through socket
- 分析Node.js connect ECONNREFUSED错误
- NodeJS学习笔记之Connect中间件模块(二)
- NodeJS学习笔记之Connect中间件模块(一)
- Node.js connect ECONNREFUSED错误解决办法
- NodeJS学习笔记之Connect中间件应用实例
- 浅谈socket TCP编程中connect的一些坑
- Can't connect to MySQL server on localhost (10061)解决方法
- MySQL性能参数详解之Max_connect_errors 使用介绍
- [网络开发]RakNet文档翻译(2)——Connecting
- nginx对PHP文件报File not found.错
- Designing Virtual Connect for vSphere 5.x
- nginx 常用 URL 重写的方法
- web php 大并发优化调整参数
- Nginx+tomcat 实现负载均衡和动静分离