TCP 连接状态:LISTEN、ESTABLISHED 与 TIME_WAIT

阿远
2026-10-29 / 0 评论 / 0 阅读 / 正在检测是否收录...

端口是入口,连接还有自己的状态。看到 TIME_WAIT 并不意味着必须立即调整内核参数,应先理解连接建立与关闭过程。

学习整理:2026-10-29。以下命令、地址和账号均为课程实验示例,按实际环境替换;涉及安装、覆盖配置或服务启停的操作先在隔离环境练习,不代表本站已经实施。

一、TCP和UDP

TCP特点:

  • 面向连接。
  • 有序、可靠传输。
  • 有重传、流量控制和拥塞控制。
  • HTTP、HTTPS、SSH、MySQL常使用TCP。

UDP特点:

  • 无连接。
  • 不保证到达和顺序。
  • 开销较小。
  • DNS查询、音视频和部分监控协议常使用UDP。

二、TCP连接过程

建立连接常概括为三次握手:

客户端 SYN
服务端 SYN+ACK
客户端 ACK

关闭通常是双方各自关闭发送方向,因此常称四次挥手。

不必死记标志位,要能理解:

  • Connection refused:目标可达,但端口通常没有服务监听或被明确拒绝。
  • Connection timed out:数据包可能被防火墙丢弃、路由不通或目标无响应。

三、端口

端口用于区分同一主机上的不同网络服务。

端口协议/服务
22SSH
53DNS
80HTTP
443HTTPS
3306MySQL
6379Redis
9090Prometheus
3000Grafana

端口只是默认约定,实际配置可以修改。

四、查看连接

ss -lntp
ss -lnup
ss -ant
ss -s
lsof -iTCP:80 -sTCP:LISTEN

状态:

  • LISTEN:等待连接。
  • ESTAB:连接已建立。
  • TIME-WAIT:主动关闭方短期保留状态。
  • SYN-SENT:已经发送SYN,等待响应。
  • CLOSE-WAIT:对端已关闭,本地程序尚未关闭。

大量CLOSE-WAIT通常提示应用没有正确关闭连接;大量TIME-WAIT要结合连接速率和业务判断,不能看到就调内核参数。

五、测试端口

curl -v http://192.168.56.12:8080/
nc -vz 192.168.56.12 8080
timeout 3 bash -c '</dev/tcp/192.168.56.12/8080'

Telnet可以用于简单TCP测试,但不要把“TCP能连接”误认为应用协议一定正常。

六、端口不通排查

  1. 服务进程是否运行。
  2. 服务是否监听预期端口。
  3. 监听地址是127.0.0.1还是0.0.0.0。
  4. 本机curl是否成功。
  5. 防火墙是否放行。
  6. 云安全组是否放行。
  7. 路由是否正确。
  8. SELinux是否阻止服务。
  9. 应用日志是否报错。

隔离环境练习计划

使用Python临时监听:

python3 -m http.server 8080 --bind 127.0.0.1
ss -lntp | grep 8080

从其他主机访问并观察失败。改为:

python3 -m http.server 8080 --bind 0.0.0.0

再次验证,理解监听地址的意义。

我的验收重点

先说清每个组件和参数解决的问题,再在实验环境记录正常结果、错误现象与恢复步骤。配置能通过语法检查只是起点,还应验证实际功能。本文保留为学习笔记,不把计划中的多机部署或演练写成本站完成记录。

实验的可达性前提

从回环监听改为 0.0.0.0 之前先停止上一条临时服务,确认端口释放,否则第二次启动会报占用。绑定所有地址并不保证远端可达,防火墙、云规则与路由仍需满足。Python 临时 HTTP 服务只能提供无敏感内容的专用测试目录,结束用 Ctrl+C。CLOSE-WAIT 值应结合持续时间与进程确认,瞬时出现并不必然是泄漏。

内容复核与修订:2026-10-29。实验示例与本站运行记录分别说明;原始归档日期保留。
0

评论 (0)

取消