tcp连接 本地端口_【TCP/IP】端口未监听,还能访问成功?

2dd8f6ef5e4202de06128806ae416f97.png

作者:Mr林_月生链接:https://www.jianshu.com/p/3ab10c8685b5

现象

直接上图

73195f13dfb79a18ea6eac55380326a9.png

可以发现,本地没监听50000端口的服务,但是尝试连接本地50000端口时,却能成功建立连接,这种现象叫做「自连接」。

我们再通过netstat命令查看创建的连接是怎样的。

22f6b373b5fdff4f95bddd2ac750276e.png

我们可以注意到,创建的连接的源端口和目的端口都是一样的。

原因分析

我们都知道,一条TCP连接主要是由源端口、源IP、目的端口、目的IP四部分组成的,我们称为「TCP socket四元组」。

当我们尝试对本机的一个端口创建连接时,四元组中的源IP、目的端口和目的IP已经确定了(源IP和目的IP都是本地IP,目的端口即是我们尝试请求的端口),至于源端口,是由系统为该连接分配的一个临时端口。

此时,如果目的端口未被监听,连接会有两种结果:

  • 系统分配的源端口与目的端口不一样,则会报「Connection refused」的错误。

  • 系统分配的源端口与目的端口一样,此时连接能创建成功,这种情况我们称为自连接。

发生自连接时,创建连接时包的交互过程如下。

02e94dd5174c7fdec6efbabfac16a94c.png
  1. 系统分配给连接的源端口为50000,所以,tcp将通过50000端口发送一个SYN包给对端,并将连接状态置为「SYN_SENT」

  2. 由于50000端口同时也是目的端口,所以它会收到SYN报文,这时它会以为是对端同时也想创建连接,所以会回复SYN+ACK报文,并将连接状态置为「SYN_RCVD」

  3. SYN+ACK报文也是会被50000端口自己接收的,它会以为这是对端给它的回复报文,所以认为握手成功,连接状态置为「ESTABLISHED」

自连接发生的条件

  1. 目的端口处于临时端口范围(linux临时端口范围由net.ipv4.ip_local_port_range决定)

  2. 目的端口未被监听

  3. 目的IP是本地IP

自连接的危害

假设有这样一个场景,一个机器上有A和B两个服务,服务A会请求服务B,服务B监听的端口属于临时端口。

有一天,服务B挂了,然后服务A一直在重连服务B,很不幸的发生了自连接。

这时候,服务B想重启时,就会发生端口占用的报错了。

避免自连接的手段

  • 服务监听端口不要使用临时端口

f5594ed68e8a64dbc72c7883ec90874f.png 往期推荐
  • TCP 协议简介

  • TCP网络程序-创建客户端与服务端的连接

  • Java Socket应用 基于TCP的通信 (多线程)

52eec7dea3679c75912c4e0f3244c998.png

如果感觉推送内容不错,不妨右下角点个在看,感谢支持!

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值