Linux tcp_info:监控TCP连接的秘密武器
深入解析 Linux tcp_info
:TCP 状态的实时监控利器
在开发和运维网络服务时,我们常常遇到这些问题:
- 我的 TCP 连接为什么速度慢?
- 是发生了重传,还是窗口太小?
- 拥塞控制到底有没有生效?
这些问题的答案,其实隐藏在内核的 tcp_info
结构中。
本文将详细介绍:
tcp_info
是什么,怎么用?- 各字段含义和实际用途
- 在调优 TCP 服务中的应用实践
一、什么是 tcp_info
?
tcp_info
是 Linux 内核中定义的结构体,位于头文件 <linux/tcp.h>
中。它提供了当前 TCP 连接的详细状态信息,可通过 getsockopt()
接口获取。
典型用途:
- 网络状态实时观测
- 性能数据收集(配合 Prometheus/Grafana)
- 排查连接卡顿、丢包、慢启动等问题
二、如何使用 tcp_info
在 C/C++ 中获取 tcp_info
数据很简单:
#include <netinet/tcp.h>
#include <sys/socket.h>
#include <stdio.h>struct tcp_info info;
socklen_t len = sizeof(info);
getsockopt(sockfd, IPPROTO_TCP, TCP_INFO, &info, &len);
getsockopt()
会把当前 TCP 连接状态写入 info
,我们就可以读取并打印出相关字段。
在 Go、Python 等语言中也都有封装可用。
三、tcp_info 字段详解
以下是常用字段的解释和典型用途:
字段 | 说明 | 工程应用 |
---|---|---|
tcpi_state | TCP 状态机(ESTABLISHED, TIME_WAIT 等) | 检查连接生命周期 |
tcpi_retransmits | 重传次数 | 排查丢包问题 |
tcpi_rtt | 当前 RTT(微秒) | 网络延迟诊断 |
tcpi_rttvar | RTT 波动 | 抖动分析 |
tcpi_snd_cwnd | 拥塞窗口 | 拥塞控制效果评估 |
tcpi_snd_mss | 最大发送段大小 | 了解 MTU 限制 |
tcpi_total_retrans | 总重传次数 | 连接稳定性指标 |
tcpi_unacked | 未确认的数据包数量 | 判断发送瓶颈 |
tcpi_rcv_space | 接收缓冲区空间 | 判断是否发生流控 |
示例打印:
state: ESTABLISHED
rtt: 12345 us
rttvar: 4000 us
cwnd: 20 segments
retransmits: 2
total_retrans: 4
unacked: 3
四、实际应用场景
1. 网络连接性能监控
通过周期性抓取 tcp_info
数据,可以实现如下监控:
- RTT 抖动图表
- 重传率趋势
- 拥塞窗口动态
适用于高频交易系统、实时游戏、音视频推流等对网络敏感的服务。
2. 连接问题定位
案例:
用户反馈网页加载慢,但服务器响应快。
通过对 tcp_info
分析发现:
tcpi_rtt
稳定- 但
tcpi_unacked
长期维持高值 - 且
tcpi_snd_cwnd
迟迟不增长
结论:链路存在丢包,TCP 卡在拥塞避免阶段。
3. TCP 拥塞控制算法验证
Linux 支持多种 TCP 拥塞控制算法(如 CUBIC、BBR)。tcp_info
可用于对比算法效果:
- BBR 下 cwnd 不受 ACK 驱动,但 RTT 波动更低
- CUBIC RTT 抖动大,重传多但吞吐高
五、在系统中如何部署使用?
方案一:配合 ss
命令分析
ss -ti
输出类似如下内容:
cwnd:10 retrans:2 rtt:12.3/3.2ms
方案二:程序内采集+可视化
- 在服务中嵌入
tcp_info
抓取逻辑(如定期上报给 Prometheus) - 用 Grafana 可视化每条连接的延迟与重传
- 异常自动报警(如 RTT > 100ms)
六、注意事项
tcp_info
是快照而非历史记录- 对于 UDP 无效,仅适用于 TCP socket
getsockopt()
有少许开销,建议低频采样(如每秒)
七、结语
tcp_info
就像是内核提供的一台“网络心电仪”,让我们能实时洞察每条 TCP 连接的内部状态。它不光是诊断工具,更是系统网络优化与架构调整的重要依据。