ICode9

精准搜索请尝试: 精确搜索
首页 > 其他分享> 文章详细

工作学习1-tcp自连接

2021-09-08 01:01:08  阅读:135  来源: 互联网

标签:0.0 监听 tcp 连接 学习 40000 port


运维同事反馈服务起不来。下面为了方便,写了一个demo来展示。

https://gitee.com/northeast_coder/code/tree/master/case/case1_tcp_self_con

 

1、调查问题

查问题先看软件日志,报错日志提示监听管理公开i的port被占用,无法建立监听。

root@DESKTOP-JS5DDL9:~/gitee/code/case/case1_tcp_self_con$ ./srv/srv 0.0.0.0 40000err!file:../../../xcom/xsock.hpp,line:51,last err=98 Address already in useerr!file:main.cpp,line:19,last err=98 Address already in use

根据提示,ss命令看了一下,谁占用了端口

 

root@DESKTOP-JS5DDL9:~$ ss -apn|grep 40000tcp ESTAB 0 0 127.0.0.1:40000 127.0.0.1:40000 users:(("client",pid=275,fd=3))

有一条怪异的连接,local addr和 peer addr居然相同,都是服务要监听的地址。client是管理工具,是connect端,连接服务的,怎么连上自己了呢?原来这里触发了“tcp自连接”


2、分析原因
正常tcp连接

#监听端 bind,listern;

#连接端:connect

#监听端:accept

也就是大名鼎鼎的三次握手过程

1、con:syn

2、srv:syn+ack

3、con:ack

 

非正常tcp连接(simultaneous open)

学习时尽量要找到一手材料,在 RFC-793 Section 3.4, page 32定义了这种同时打开的情况。rfc793 (ietf.org)

 

 

自连接是simultaneous open比较特殊的情况,每次连接时os会给本地随机有一个port,服务没有启动,所以不断重连,当随机的port恰好为服务的port时,则client本地地址为0.0.0.0:40000,目标也是0.0.0.0:40000,达成了simultaneous open的条件,触发了自连接,占用了服务端的端口。


3、问题解决

#检测自连接

连接端:连接成功后,获取对端地址以及本地地址,若相同则主动断开。

 

#修改服务端监听端口

连接端随机端口有个范围,修改监听地址不在此范围即可。

cat /proc/sys/net/ipv4/ip_local_port_range32768   60999

 

全网同名(腾讯&字节&博客园)欢迎关注~

标签:0.0,监听,tcp,连接,学习,40000,port
来源: https://www.cnblogs.com/northeast-coder/p/15240867.html

本站声明: 1. iCode9 技术分享网(下文简称本站)提供的所有内容,仅供技术学习、探讨和分享;
2. 关于本站的所有留言、评论、转载及引用,纯属内容发起人的个人观点,与本站观点和立场无关;
3. 关于本站的所有言论和文字,纯属内容发起人的个人观点,与本站观点和立场无关;
4. 本站文章均是网友提供,不完全保证技术分享内容的完整性、准确性、时效性、风险性和版权归属;如您发现该文章侵犯了您的权益,可联系我们第一时间进行删除;
5. 本站为非盈利性的个人网站,所有内容不会用来进行牟利,也不会利用任何形式的广告来间接获益,纯粹是为了广大技术爱好者提供技术内容和技术思想的分享性交流网站。

专注分享技术,共同学习,共同进步。侵权联系[81616952@qq.com]

Copyright (C)ICode9.com, All Rights Reserved.

ICode9版权所有