TCP(Transmission Control Protocol,传输控制协议)是互联网中最核心的传输层协议之一。网页浏览、文件传输、邮件收发等绝大多数应用都依赖 TCP 提供可靠、有序的数据传输。本文将从 TCP 的基本概念出发,讲解其连接管理、可靠传输、流量控制与拥塞控制等核心原理,帮助读者建立对 TCP 的完整认识。
一、TCP 协议概述
TCP 位于 OSI 模型的传输层,工作在 IP 协议之上。与 UDP 的"尽力而为"不同,TCP 为应用层提供面向连接的、可靠的字节流服务。其核心特性包括:
- 面向连接:传输数据前必须先建立连接,结束后释放连接。
- 可靠传输:通过确认、重传、序号等机制保证数据不丢失、不重复、按序到达。
- 流量控制:根据接收方的处理能力动态调整发送速率,避免缓冲区溢出。
- 拥塞控制:感知网络拥塞状态,主动降低发送速率,避免网络过载。
- 全双工通信:连接双方可以同时发送和接收数据。

二、TCP 报文段结构
TCP 数据被封装为报文段(Segment)进行传输。一个 TCP 报文段由首部和数据两部分组成,其中首部至少包含 20 字节的固定部分。关键字段如下:
| 字段 | 长度 | 作用 |
|---|---|---|
| 源端口 / 目的端口 | 各 16 位 | 标识发送方和接收方的应用进程 |
| 序号(Sequence Number) | 32 位 | 本报文段数据第一个字节的序号,用于数据排序 |
| 确认号(Acknowledgment Number) | 32 位 | 期望收到对方下一个字节的序号,用于确认 |
| 数据偏移 | 4 位 | 首部长度,以 4 字节为单位 |
| 标志位 | 9 位 | 包含 SYN、ACK、FIN、RST 等控制标志 |
| 窗口大小 | 16 位 | 接收方当前可接收的字节数,用于流量控制 |
| 校验和 | 16 位 | 校验首部和数据的完整性 |
其中,标志位是理解 TCP 状态转换的关键。SYN 用于建立连接,ACK 用于确认数据,FIN 用于释放连接,RST 用于异常重置连接。
三、建立连接
TCP 使用三次握手(Three-Way Handshake)建立可靠连接,目的是让通信双方确认彼此的收发能力,并同步初始序号。整个过程如下:
- 第一次握手:客户端向服务器发送 SYN 报文段,SYN 标志位置 1,携带初始序号 x。客户端进入 SYN_SENT 状态。
- 第二次握手:服务器收到 SYN 后,回复 SYN + ACK 报文段,确认号设为 x + 1,同时携带自己的初始序号 y。服务器进入 SYN_RCVD 状态。
- 第三次握手:客户端收到 SYN + ACK 后,再发送 ACK 报文段,确认号设为 y + 1。双方进入 ESTABLISHED 状态,连接建立成功。
为什么需要三次而不是两次?核心原因在于:第二次握手同时完成了"确认对方"和"告知对方自己的序号"两个任务,第三次握手则让服务器确认客户端已经收到自己的 SYN + ACK。如果只有两次握手,服务器无法确认客户端是否真的收到了自己的初始序号,可能导致已失效的连接请求突然到达服务器,造成资源浪费和错误连接。
四、释放连接
当数据传输完毕,TCP 通过四次挥手(Four-Way Handshake)释放连接。由于 TCP 连接是全双工的,两个方向需要分别关闭,因此需要四次交互:
- 第一次挥手:主动关闭方发送 FIN 报文段,表示自己不再发送数据,进入 FIN_WAIT_1 状态。
- 第二次挥手:被动关闭方收到 FIN 后,回复 ACK 确认,进入 CLOSE_WAIT 状态。主动关闭方进入 FIN_WAIT_2 状态。
- 第三次挥手:被动关闭方在完成剩余数据发送后,发送 FIN 报文段,进入 LAST_ACK 状态。
- 第四次挥手:主动关闭方收到 FIN 后,回复 ACK 确认,进入 TIME_WAIT 状态,等待 2MSL(最大报文段生存时间)后连接彻底关闭。
TIME_WAIT 状态有两个重要作用:一是确保最后一个 ACK 能够到达对方,防止对方因未收到 ACK 而重发 FIN;二是让旧连接中的延迟报文段在网络中自然消失,避免影响新连接。
五、可靠传输机制
TCP 的可靠性建立在序号、确认和重传三大机制之上。
1 序号与确认
每个字节在 TCP 连接中都有一个唯一的序号。发送方按序发送数据,接收方收到后返回确认号,表示期望收到的下一个字节序号。通过序号,接收方可以检测丢失、重复和乱序的数据包。
2 超时重传
发送方为每个报文段设置一个重传计时器。如果在规定时间内未收到确认,发送方就重传该报文段。重传超时时间(RTO)会根据网络往返时间(RTT)动态调整,以适应网络状况的变化。
3 快速重传
当接收方收到乱序报文段时,会立即重复发送对最后一个按序到达字节的确认(重复 ACK)。发送方连续收到 3 个重复 ACK 后,立即重传丢失的报文段,而不必等待超时,从而加快恢复速度。
六、TCP 与 UDP 的对比
在实际开发中,选择 TCP 还是 UDP 取决于应用场景。两者的核心差异如下:
| 特性 | TCP | UDP |
|---|---|---|
| 连接方式 | 面向连接 | 无连接 |
| 可靠性 | 可靠,有确认和重传 | 不可靠,尽力而为 |
| 传输顺序 | 按序到达 | 可能乱序 |
| 传输效率 | 较低,有握手和确认开销 | 较高,无额外开销 |
| 适用场景 | 网页、文件传输、邮件 | 直播、语音、游戏 |
对于需要高可靠性的应用,如 HTTP、HTTPS、FTP、SMTP,TCP 是必然选择;而对于实时性要求高、允许少量丢包的应用,如视频会议、在线游戏,UDP 往往更合适。

总结
TCP 协议通过三次握手建立连接、四次挥手释放连接,并借助序号、确认、重传、滑动窗口和拥塞控制等机制,为应用层提供了可靠、有序、全双工的字节流传输服务。理解 TCP 的核心原理,不仅有助于排查网络故障、优化应用性能,也是深入理解 HTTP、HTTPS 等上层协议的基础。希望本文能帮助读者建立起对 TCP 的系统性认识,并在实际开发中灵活运用。