TCP 自连接是什么

  1. while true
  2. do
  3. nc 127.0.0.1 50000
  4. done

使用 netstat 查看当前的 50000 端口的连接状况,如下所示。

Proto Recv-Q Send-Q Local Address           Foreign Address         State       PID/Program name
tcp        0      0 127.0.0.1:50000         127.0.0.1:50000         ESTABLISHED 24786/telnet

自连接原因分析

抓包:

image.png

可以理解为总共是六个包,包的交互过程如下图所示。

image.png

当一方主动发起连接时,操作系统会自动分配一个临时端口号给连接主动发起方。如果刚好分配的临时端口是 50000 端口,过程如下。

  1. 第一个包是发送 SYN 包给 50000 端口
  2. 对于发送方而已,它收到了这个 SYN 包,以为对方是想同时打开,会回复 SYN+ACK
  3. 回复 SYN+ACK 以后,它自己就会收到这个 SYN+ACK,以为是对方回的,对它而已握手成功,进入 ESTABLISHED 状态

自连接的危害

  • 自连接的进程占用了端口,导致真正需要监听端口的服务进程无法监听成功
  • 自连接的进程看起来 connect 成功,实际上服务是不正常的,无法正常进行数据通信

解决自连接

自连接比较罕见

  • 让服务监听的端口与客户端随机分配的端口不可能相同即可. 监听小于32768的端口
  • 出现自连接的时候,主动关掉连接. 判断方法是根据源/目的 ip 和端口号