运维同事反馈服务起不来。下面为了方便,写了一个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

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

最新文章

  1. H3 BPM初次安装常见错误详解5-7
  2. express中url的参数传递和获取
  3. MongoDB 文档的更新操作
  4. [ZigBee] 3、ZigBee基础实验——GPIO输出控制实验-控制Led亮灭
  5. 宿主系统为Ubuntu 14,CentOS 6.5 安装VirtualBox增强工具失败:Building the OpenGL support module[FAILED]
  6. react mixins编写
  7. Mysql性能调优
  8. 近期专案PM相关收获
  9. oracle 查看用户表数目,表大小,视图数目等
  10. 关于scala和java 在maven项目中混编的问题
  11. 程序媛也话Android 之 自定义控件(垂直方向滑动条)
  12. 【ios开发】ios开发问题集锦
  13. 第一个windows 小游戏 贪吃蛇
  14. AI佳作解读系列(三)——深度学习中的合成数据研究
  15. c——闰年
  16. python 全栈开发,Day129(玩具开机提示语,为多个玩具发送点播,聊天界面,app录音,app与服务器端文件传输,简单的对话)
  17. vue2.0leaflet
  18. mysql之主从配置实现
  19. Shiro遇到的SecurityManager红色警告
  20. maven 生命周期、生命周期阶段、插件、目标

热门文章

  1. MySQL 的架构与组件
  2. etcd安装常用操作
  3. css三大特性 & 选择器的权重
  4. c++学习笔记4(函数重载)
  5. Forest v1.5.13 发布,声明式 HTTP 框架,已超 1.7k star
  6. 菜鸡的Java笔记 Object 类
  7. 记一次 .NET 某电商无货源后端服务 死锁分析
  8. [atARC124F]Chance Meeting
  9. Lilypond+TexLive(LuaLatex+lyluatex)+VS Code实现谱文混排
  10. 【CSS】水平居中和垂直居中