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

    之所以抛弃char*的字符串而选用C++标准程序库中的string类,是因为他和前者比较起来,不必 担心内存是否足够.字符串长度等等,而且作为一个类出现,他集成的操作函数足以完成我们大多数情况下(甚至 ...

  2. centos7 二进制安装mysql-8.0.19

    安装包下载地址:https://dev.mysql.com/get/Downloads/MySQL-8.0/mysql-8.0.19-linux-glibc2.12-x86_64.tar.xz 1.检 ...

  3. sql注入理解

    一.SQL注入产生的原因和危害 1.原因 SQL注入攻击指的是通过构建特殊的输入作为参数传入Web应用程序.而这些输入大都是SQL语法里的一些组合,通过执行SQL语句进而执行攻击者所要的操作,其主要原 ...

  4. JavaScript事件捕获冒泡与捕获

    事件流 JavaScript中,事件流指的是DOM事件流. 概念 事件的传播过程即DOM事件流.事件对象在 DOM 中的传播过程,被称为"事件流".举个例子:开电脑这个事,首先你是 ...

  5. idea Mark Directory as 的几种文件类型

    1. Source roots (or source folders) 源文件夹 通过为该类别分配文件夹,可以告诉IntelliJ IDEA该文件夹及其子文件夹包含应在构建过程中进行编译的源代码. 2 ...

  6. redis数据存储的细节

    redis是一个K-V NoSql非关系型数据库,redis有物种数据类型,分别是String,Hash,list,set,zset:这五种类型都是针对K-V中的V设计的. 1.总体介绍:关于redi ...

  7. 一次Java线程池误用(newFixedThreadPool)引发的线上血案和总结

    一次Java线程池误用(newFixedThreadPool)引发的线上血案和总结 这是一个十分严重的线上问题 自从最近的某年某月某天起,线上服务开始变得不那么稳定(软病).在高峰期,时常有几台机器的 ...

  8. python实现图像梯度

    一,定义与作用 图像梯度作用:获取图像边缘信息 二,Sobel 算子与函数的使用 (1)Sobel 算子------来计算变化率 (2)Sobel函数的使用 (3-1)代码实现(分别): (3-2)代 ...

  9. VC练习一

    1 #include<windows.h> 2 #include<stdio.h> 3 LRESULT CALLBACK WinSunProc(HWND hwnd,UINT u ...

  10. [cf1421E]Swedish Heroes

    令$p_{i}$为最终$a_{i}$之前的系数($p_{i}\in \{-1,1\}$),则有$n+\sum_{i=1}^{n}[p_{i}=-1]\equiv 1(mod\ 3)$ 证明:对于两个满 ...