TCP 自连接是什么
while true
do
nc 127.0.0.1 50000
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
自连接原因分析
抓包:
可以理解为总共是六个包,包的交互过程如下图所示。
当一方主动发起连接时,操作系统会自动分配一个临时端口号给连接主动发起方。如果刚好分配的临时端口是 50000 端口,过程如下。
- 第一个包是发送 SYN 包给 50000 端口
- 对于发送方而已,它收到了这个 SYN 包,以为对方是想同时打开,会回复 SYN+ACK
- 回复 SYN+ACK 以后,它自己就会收到这个 SYN+ACK,以为是对方回的,对它而已握手成功,进入 ESTABLISHED 状态
自连接的危害
- 自连接的进程占用了端口,导致真正需要监听端口的服务进程无法监听成功
- 自连接的进程看起来 connect 成功,实际上服务是不正常的,无法正常进行数据通信
解决自连接
自连接比较罕见
- 让服务监听的端口与客户端随机分配的端口不可能相同即可. 监听小于32768的端口
- 出现自连接的时候,主动关掉连接. 判断方法是根据源/目的 ip 和端口号