如果说 IP 协议(层级 3)解决了数据包“去哪里”的问题,那么 TCP(传输控制协议,Transmission Control Protocol) 则在层级 4(传输层)解决了“怎么稳妥到达”的问题。在不可靠的 IP 网络之上,TCP 构建了一个可靠的、面向连接的字节流服务。
本篇文章将深入探讨 TCP 的核心机制,揭示它如何通过复杂的逻辑保证数据的绝对可靠。
传输控制协议(Transmission Control Protocol,TCP)是TCP/IP协议族中传输层的核心协议,由RFC 793(1981年)定义,后续通过多个RFC(如RFC 1122、1323、5681等)不断演进。它提供面向连接的、可靠的、字节流导向的全双工通信,是互联网上绝大多数应用(如HTTP/HTTPS、SMTP、SSH)的传输基础。TCP的设计目标是在不可靠的IP层之上构建可靠传输,处理丢包、乱序、重复和网络拥塞等问题。
当前TCP仍是主导传输协议,尽管QUIC(基于UDP)在网页传输中逐渐崛起,但TCP在可靠性要求高的场景中不可替代。
要理解 TCP 的行为,首先要看它的头部结构。每个TCP数据段都携带一个报头(Header),最小20字节,可扩展选项。每一个 TCP 报文段都包含了一组关键的控制信息:
三次握手的核心目的不仅是确认对方存在,更重要的是同步双方的初始序列号。
SYN_SENT 状态。SYN_RCVD。ESTABLISHED。深度思考:为什么不是两次?
为了防止已失效的连接请求报文突然又传到了服务端。如果只有两次握手,服务端在发出确认后就会打开连接,而此时客户端可能早已关闭,导致服务端资源浪费。
TCP 是全双工的,这意味着每个方向的连接必须单独关闭。具体过程如下:
主动方发送FIN,进入FIN_WAIT_1。
被动方ACK,进入CLOSE_WAIT;主动方进入FIN_WAIT_2。
被动方发送FIN,进入LAST_ACK。
主动方ACK,进入TIME_WAIT(等待2MSL防延迟包),后CLOSED。
TIME_WAIT状态是TCP健壮性的关键,避免旧连接残留包干扰新连接。
TCP 为发送的每个报文段启动定时器。如果没有在 RTT(往返时间) 内收到 ACK,就会触发重传。现代 TCP 使用自适应算法动态计算 $RTT$,以适应波动的网络环境。
为了防止发送方发送太快导致接收方缓冲区溢出,TCP 使用了“滑动窗口”。
流量控制是点对点的,而拥塞控制是全局性的。它防止过多的数据注入网络,导致路由器崩溃。主要算法包括:
| 特性 | TCP | UDP |
|---|---|---|
| 是否连接 | 是 | 否 |
| 可靠性 | 高 | 低 |
| 顺序保证 | 有 | 无 |
| 延迟 | 相对较高 | 低 |
| 典型应用 | HTTP、SSH | DNS、视频、游戏 |
尽管 TCP 近乎完美,但它也有与生俱来的缺陷:
演进方向:
TCP 协议是计算机科学史上的杰作。它将复杂的错误处理、流量调节和拥塞管理封装在传输层,让上层应用(如 Web 浏览器)可以假设网络是一个“可靠的管道”。理解 TCP,就理解了现代互联网一半的运行逻辑。