tcp自连接问题
时间:2022-05-05
本文章向大家介绍tcp自连接问题,主要内容包括现象重现、原因分析、解决思路、基本概念、基础应用、原理机制和需要注意的事项等,并结合实例形式分析了其使用技巧,希望通过本文能帮助到大家理解应用这部分内容。
现象重现
在linux主机下运行下面的python脚本,等待一会即可出现。
import socketimport timeconnected=Falsewhile (not connected):
try:
sock = socket.socket(socket.AF_INET,socket.SOCK_STREAM)
sock.setsockopt(socket.IPPROTO_TCP,socket.TCP_NODELAY,1)
sock.connect(('127.0.0.1',55555))
connected=True
except socket.error,(value,message): print message if not connected: print "reconnect"print "tcp self connection occurs!"print "try to run follow command : "print "netstat -an|grep 55555"time.sleep(1800)
截图如下:
tcp自连接出现了!
原因分析
从上面的python脚本中,可以看到它只是在不断地尝试连接55555这个端口,并且是没有socket监听这个端口,那么为何最后却建立连接了呢?原因在于客户端在连接服务端时,如果没有指定端口号,系统会随机分配一个。随机就意味着可能分配一个和目的端口一样的数字,此时就会出现自连接情况了。因为对于tcp协议来讲,连接的流程是走的通,三次握手整个阶段都合法,连接自然可以建立。
自连接的坏处显而易见,当程序去connect一个不处于监听的端口时,必然期待其连接失败,如果自连接出现,就意味着该端口被占用了,那么:
- 真正需要监听该端口的服务会启动失败,抛出端口已被占用的异常。
- 客户端无法正常完成数据通信,因为这是个自连接,并不是一个正常的服务。
解决思路
解决办法也很简单,只要保证客户端随机的端口不会和服务监听的端口相同就可以了。那么我们得先了解随机的范围,这个范围对应linux的/etc/sysctl.conf
的net.ipv4.ip_local_port_range
参数,其默认值是32768 61000
。也就是说随机端口会在这个范围内出现,试验中我们选定了55555
这个端口,所以出现了自连接现象。此时只要限定服务监听在32768
端口以下,就不会出现自连接现象了。当然,你可以修改这个配置,只要注意保证监听端口不再配置范围内就可以避免自连接问题了。
- 使用NGINX和NGINX Plus速率限速
- 独家 | 教你用Scrapy建立你自己的数据集(附视频)
- 浏览器平台:Internet Explorer 8
- ASP.NET MVC 1.0 RC 那些事
- 优化SQLServer——表和分区索引(二)
- 关于UNPIVOT 操作符
- XML 在SQLServer中的使用
- 在asp.net mvc上应用新ASP.NET图表控件
- 自定义Unity对象生命周期管理集成ADO.NET Entity Framework
- Mono运行于IPhone之上
- Apache Hadoop入门
- 参数化(三):参数嗅探
- 什么是内存数据库以及它如何有效保存数据
- DATETIME类型和BIGINT 类型互相转换
- JavaScript 教程
- JavaScript 编辑工具
- JavaScript 与HTML
- JavaScript 与Java
- JavaScript 数据结构
- JavaScript 基本数据类型
- JavaScript 特殊数据类型
- JavaScript 运算符
- JavaScript typeof 运算符
- JavaScript 表达式
- JavaScript 类型转换
- JavaScript 基本语法
- JavaScript 注释
- Javascript 基本处理流程
- Javascript 选择结构
- Javascript if 语句
- Javascript if 语句的嵌套
- Javascript switch 语句
- Javascript 循环结构
- Javascript 循环结构实例
- Javascript 跳转语句
- Javascript 控制语句总结
- Javascript 函数介绍
- Javascript 函数的定义
- Javascript 函数调用
- Javascript 几种特殊的函数
- JavaScript 内置函数简介
- Javascript eval() 函数
- Javascript isFinite() 函数
- Javascript isNaN() 函数
- parseInt() 与 parseFloat()
- escape() 与 unescape()
- Javascript 字符串介绍
- Javascript length属性
- javascript 字符串函数
- Javascript 日期对象简介
- Javascript 日期对象用途
- Date 对象属性和方法
- Javascript 数组是什么
- Javascript 创建数组
- Javascript 数组赋值与取值
- Javascript 数组属性和方法
- 一起来学演化计算-matlab基本函数min
- 一起来学演化计算-matlab基本函数find
- 欧拉图和哈密顿图
- python 操作 txt 文件中数据教程[4]-python 去掉 txt 文件行尾换行
- java字符数组char[]和字符串String之间的转换
- python操作txt文件中数据教程[3]-python读取文件夹中所有txt文件并将数据转为csv文件
- python操作txt文件中数据教程[1]-使用python读写txt文件
- python循环删除列表元素常见错误与正确方法
- Python字符串,整型,浮点数相互转化
- python创建与遍历List二维列表
- 论文研读-基于变量分类的动态多目标优化算法
- matplotlib交互模式与pacharm单独Figure设置
- numpy二进制转换和范围缩放
- 使用数组作为索引遍历numpy数组
- enumerate 遍历numpy数组