运维同事反馈服务起不来。下面为了方便,写了一个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-tcp自连接的更多相关文章

  1. Node.js学习之TCP/IP数据通讯

    Node.js学习之TCP/IP数据通讯 1.使用net模块实现基于TCP的数据通讯 提供了一个net模块,专用于实现TCP服务器与TCP客户端之间的通信 1.1创建TCP服务器 在Node.js利用 ...

  2. tcp/ip学习笔记-TCP

    tcp/ip学习笔记-TCP 彭会锋 报文发送采用的是tcp_output函数,

  3. 为U盘装备Ubuntu工作学习两不误

        题记: 在上一篇文章中,我介绍了让Ubuntu 10.04完美支持Thinkpad小红点Trackpoint.看上去,显得有些不痛不痒,实际上有些同学会因为小红点中键不能正常使用,而放弃在Th ...

  4. (私人收藏)商务工作学习万能简约大气PPT模板

    商务工作学习万能简约大气PPT模板 https://pan.baidu.com/s/1aPnPZ285N5VSSErro1cPngehoa

  5. 简单尝试利用vultr vps自架PPTP上网用于工作学习需要

    因为学习和工作的需要用到登陆海外网站查阅相关的资料和文档,之前有需要使用的时候是问网友索要的账户登录本地电脑拨号的,但是老是跟别人要还是不好,决定自己尝试搭建一个长期使用.看到有不少的介绍提到VULT ...

  6. swoole深入学习 2. tcp Server和tcp Client

    这节来学习Swoole最基础的Server和Client.会通过创建一个tcp Server来讲解. server <?php class Server { private $serv; pub ...

  7. Netty学习(四)-TCP粘包和拆包

    我们都知道TCP是基于字节流的传输协议.那么数据在通信层传播其实就像河水一样并没有明显的分界线,而数据具体表示什么意思什么地方有句号什么地方有分号这个对于TCP底层来说并不清楚.应用层向TCP层发送用 ...

  8. Android工作学习第5天之Activity的完全退出程序

    注:本文大部分为网上转载,本人只是根据工作的需要略做整合! android 完全退出应用程序 注意:1.单例模式的学习 2.Manifest.xml,注意项目清单文件中要加上 android退出应用程 ...

  9. TCP工作过程;TCP Flood的攻击的原理和现象;TCP协议设计的安全隐患与防范对策

    TCP分三个阶段 连接建立(三次握手) 数据传输 连接释放(四次挥手) TCP工作过程 TCP连接建立阶段 第一次握手:Client将标志位SYN置为1,随机产生一个值seq=J,并将该数据包发送给S ...

随机推荐

  1. 21.10.18 test

    可可大神出题,四款有趣的游戏推荐,第四个好玩/se T1 loopers \(\color{green}{100}\) 考虑钦定 \(a_1,a_i\) 的位置,固定左边一坨,那么剩下的一坨的 \(\ ...

  2. OpenWrt编译报错:Package airfly_receiver is missing dependencies for the following libraries

    今天在编译一个OpenWrt测试用例的时候出现报错 Package airfly_receiver is missing dependencies for the following librarie ...

  3. JAVA笔记11__File类/File类作业/字节输出流、输入流/字符输出流、输入流/文件复制/转换流

    /** * File类:文件的创建.删除.重命名.得到路径.创建时间等,是唯一与文件本身有关的操作类 */ public class Main { public static void main(St ...

  4. Java安全之Thymeleaf SSTI分析

    Java安全之Thymeleaf SSTI分析 写在前面 文章首发:https://www.anquanke.com/post/id/254519 最近看了一遍Thymeleaf,借此机会学习一下Th ...

  5. Trap (陷入/中断) 源码解析

    用户空间和内核空间之间的切换通常称为trap trap的三种形式 系统调用引发 异常发生 设备中断 (时间中断.IO中断.网络中断等) supervise mode的权限 用户态和内核态之间的到底有什 ...

  6. linux系列之: 你知道查看文件空间的两种方法吗?

    目录 简介 du命令 df命令 总结 简介 linux系统中查看文件空间大小应该是一个非常常见的命令了,今天给大家介绍linux系统中查看文件空间的两种方法和在使用中可能会遇到的奇怪问题. 为什么会有 ...

  7. 折腾systemd-nspawn运行centos7

    Archlinux创建Debian/Ubuntu的systemd-nspawn容器是很简单的,因为有debootstrap软件.某天我突然想装个centos7玩玩,搜了半天没发现有什么类似于deboo ...

  8. (一)《SQL进阶教程》学习记录--CASE

    背景:最近用到统计之类的复杂Sql比较多,有种"提笔忘字"的感觉,看书练习,举一反三,巩固加强. (一) <SQL进阶教程>学习记录--CASE (二) <SQL ...

  9. 纯 CSS 自定义多行省略:从原理到实现

    文字溢出怎么展示,你的需求是什么?单行还是多行?截断,省略,自定义样式,自适应高度?在这里你都能找到答案.接下来我会由浅入深,从原理到实现,带你一步步揭开多行省略的面纱.我们先从最简单的单行溢出省略开 ...

  10. Webshell 一句话木马

    Webshell介绍 什么是 WebShell webshell就是以asp.php.jsp或者cgj等网页文件形式存在的一种命令执行环境,也可以将其称做为一种网页后门 由于 webshell其大多是 ...