TCP 是什么
TCP(Transmission Control Protocol,传输控制协议)是互联网协议栈中最基础的传输层协议之一,与 IP 协议共同构成了通常所说的 TCP/IP 协议族。TCP 的核心设计目标是保证数据可靠、有序地从发送端传输到接收端,即便底层网络存在丢包、乱序、重复等问题,TCP 也能通过自身机制加以纠正,让上层应用感知到的是一条"可靠的数据流"。
TCP 是面向连接的协议,这意味着在正式传输数据之前,通信双方必须先建立连接,传输完成后再明确断开连接,这与不需要建立连接、发了就走的 UDP 形成鲜明对比。
三次握手:连接是如何建立的
TCP 建立连接的过程俗称"三次握手":
- 客户端发送一个 SYN(同步)报文,表示希望建立连接。
- 服务器收到后回应一个 SYN-ACK 报文,既确认收到客户端请求,也向客户端发起自己的同步请求。
- 客户端收到后再发送一个 ACK(确认)报文,确认收到服务器的响应。
至此,双方都确认了彼此具备正常的发送与接收能力,连接正式建立,才会开始传输实际数据。这个过程虽然只有三步,但需要至少一次完整的网络往返(RTT),因此会给连接建立带来一定的初始延迟,如果再叠加TLS加密握手,实际延迟会进一步增加。
可靠传输是如何实现的
TCP 保证可靠性主要依靠以下几种机制:
- 确认应答(ACK):每个数据段发送后,接收方需要回复确认,发送方据此判断数据是否成功送达。
- 超时重传:如果发送方在规定时间内没有收到确认,会认为数据可能丢失并重新发送。
- 序列号与重组:每个数据段都带有序列号,接收方据此将乱序到达的数据重新排列成正确顺序。
- 拥塞控制:TCP 会根据网络的拥塞状况动态调整发送速率,网络状况差时主动降速,避免加剧拥塞,这也是丢包会导致 TCP 传输速度下降的直接原因。
- 流量控制:通过滑动窗口机制协调发送方与接收方的处理速度,防止接收方被过快的数据淹没。
这一整套机制的代价是额外的开销和延迟:握手需要往返、确认应答需要额外报文、丢包重传需要等待超时。但换来的是应用层几乎不需要关心数据丢失或乱序问题,极大简化了上层协议的设计复杂度。
TCP 与 UDP 的核心区别
| 特性 | TCP | UDP |
|---|---|---|
| 连接方式 | 面向连接,需握手 | 无连接,直接发送 |
| 可靠性 | 保证送达、有序 | 不保证送达,不保证顺序 |
| 传输速度 | 相对较慢(有确认与重传开销) | 相对更快,开销小 |
| 典型场景 | 网页、文件传输、邮件 | 实时语音视频、在线游戏、DNS 查询 |
关于 UDP 的详细机制,可参考UDP 是什么;两者的取舍逻辑在很多网络代理协议的设计中都能看到影子,例如新一代协议 Hysteria2 就选择基于 UDP(QUIC)而非 TCP 来降低延迟。
TCP 在日常场景中的应用
绝大多数需要保证数据完整性的场景都基于 TCP:网页浏览的 HTTP/HTTPS 协议、文件传输的 FTP、收发邮件的 SMTP/IMAP,以及大量的代理协议如 Shadowsocks、Trojan、VMess 的默认传输方式,都建立在 TCP 之上。这也是为什么"网页打不开""下载中断"等问题往往表现为连接层面的异常,而不是单纯的数据错误。
理解了 TCP 的握手与可靠传输机制后,可以进一步了解TLS如何在 TCP 连接之上实现加密,以及WebSocket如何基于 TCP 实现持久化双向通信。