TCP 是什么
TCP 是互联网上最常用的传输层协议:它在不可靠的网络层之上提供面向连接、可靠有序的字节流,内置流量控制与拥塞控制。绝大多数应用协议都跑在它上面——网页访问、远程登录、数据库连接、消息队列。理解它的关键是记住两点:它保证的是字节流可靠有序,但不保留消息边界;它的可靠性来自确认、重传与序号机制,而不是来自网络本身。
基本信息
| 定位 | 传输层,承载绝大多数应用协议 |
|---|---|
| 核心特性 | 面向连接、可靠有序、字节流、全双工 |
| 控制机制 | 流量控制(接收窗口)与拥塞控制(拥塞窗口) |
| 报文头 | 固定 20 字节,最多再加 40 字节选项 |
| 连接标识 | 由双方地址与端口组成的四元组唯一确定 |
典型使用场景
- 网页与接口访问:需要可靠有序传输的业务数据
- 文件传输与远程登录:不允许丢字节的场景
- 数据库与中间件连接:长连接承载大量小请求
- 服务之间的调用:多数内部通信框架建立在它之上
- 需要精细排查网络问题时的抓包分析对象
看本机连接情况
看本机连接情况
ss -s # 全局统计,各状态连接数量一目了然
ss -tnp | head -20 # 当前连接与所属进程
ss -lntp # 只看监听端口,确认服务是否在听
cat /proc/net/sockstat # 内核视角的套接字统计,适合写监控采集关键机制速览
| 机制 | 作用 | 出问题时表现 |
|---|---|---|
| 序号与确认 | 保证数据不丢不乱 | 重传增多,延迟上升 |
| 接收窗口 | 防止发送方压垮接收方 | 接收缓冲不足时发送方降速 |
| 拥塞窗口 | 防止压垮中间网络 | 丢包后降速,吞吐出现锯齿 |
| 超时重传 | 兜底恢复丢失的数据 | 退化重传会显著拖慢传输 |
调优与排查要点
- 先看连接状态分布,再谈参数调整:大量等待关闭的连接通常与应用行为有关
- 抓包要同时看双方,单向抓包很容易得出错误结论
- 关注重传率而不是只看吞吐:重传高说明链路质量或缓冲配置有问题
- 长连接能显著降低建立开销,但需要配套心跳与空闲回收策略
「可靠」不等于「一定送达」:连接中断、对端进程退出都会表现为超时或复位,应用层必须自己处理超时、重试与幂等,传输层不会替你做业务级别的保证。
TCP 保证字节流可靠有序,但不保留消息边界:一次接收可能拿到半个消息或两个半消息,应用层协议必须自己定义长度前缀或分隔符来定帧,否则会出现难以复现的解析错乱。
与数据报协议的区别
| 对比项 | 面向连接协议 | 数据报协议 |
|---|---|---|
| 连接 | 需要先建立 | 无连接,直接发送 |
| 可靠性 | 确认重传保证可靠 | 不保证,由应用兜底 |
| 消息边界 | 不保留,需要应用定帧 | 保留,一次对应一个报文 |
| 头部开销 | 较大 | 很小 |
| 适用 | 需要可靠的业务数据 | 实时音视频、短查询、可重试场景 |
部署与运维要点
- 服务端监听端口要允许地址复用,减少重启时的端口占用报错
- 长连接配心跳与空闲回收,避免中间设备静默断开后连接假死
- 关注重传率与建连失败率,比只看吞吐更能提前发现链路劣化
- 连接数与文件描述符上限要一起评估,描述符先满时新连接直接失败