TCP 如何工作
TCP 位于应用层协议和 IP 之间。IP 负责在地址之间路由数据包,TCP 则为应用程序提供有序的字节流。每条连接都由源 IP 地址、目标 IP 地址以及源端口和目标端口共同标识。
发送应用数据前,两个端点会完成三次握手:
- 客户端发送
SYN。 - 服务器回复
SYN-ACK。 - 客户端返回
ACK。
随后,TCP 将字节拆分成报文段。序列号用于按顺序重组收到的字节,校验和用于检测数据损坏,确认应答则用于确认数据已经到达。丢失的数据会重新传输。流量控制可避免接收端过载,网络过载时,拥塞控制会降低发送速率。
TCP 能处理常规丢包,但不能保证每条连接都能完成。路由故障、服务器不可用或超时仍可能导致连接中断。
一个简单的 TCP 示例
浏览器可能会使用临时客户端端口连接服务器的 HTTPS 端口:
192.0.2.10:53124 → TCP → 203.0.113.20:443
握手完成后,SSL/TLS 会协商加密,浏览器再发送 HTTP 数据。响应数据在网络中传输时,各报文段的大小可能不同,但 TCP 仍会按正确顺序向浏览器提供字节流。连接可通过交换 FIN 来关闭,也可以用 RST 立即重置。
TCP 与 UDP
TCP 和 UDP 都能传输应用数据,但提供的服务不同。
| TCP | UDP | |
|---|---|---|
| 连接建立 | 三次握手 | 无 |
| 数据传输 | 有序字节流,支持重传 | 独立数据报,不恢复 |
| 开销 | 较高 | 较低 |
| 常见用途 | HTTPS、SSH 和电子邮件 | DNS、实时媒体和 QUIC |
应用程序决定使用哪种协议。HTTP/1.1 和 HTTP/2 通常使用 TCP,HTTP/3 则使用基于 UDP 的 QUIC,并自行实现可靠传输。
TCP 与代理的关系
使用代理服务器通常会涉及两段 TCP 连接:一段从客户端到代理,另一段从代理到网站。网站会把代理的出口 IP 视为第二段连接的源 IP。
通过 HTTP 代理访问 HTTPS 时,客户端连接代理后会发送 CONNECT example.com:443。代理随后建立到目标的连接;连接成功后,通过隧道中继加密的 TLS 数据。TCP 分别管理两段连接。
任意一侧都可能发生故障。连接代理时出现连接超时,可能说明主机、端口或防火墙规则有误。隧道建立后才超时,原因可能出在代理的出站连接或目标网站。
常见问题
TCP 和 HTTP 是一回事吗?
不是。TCP 负责传输字节,HTTP 则定义请求和响应。HTTP 通常基于 TCP 运行,但 HTTP/3 基于 QUIC 和 UDP 运行。
TCP 会加密数据吗?
不会。TCP 提供排序、错误检测和重传,但不提供保密性。HTTPS 在 TCP 之上加入 TLS 加密。
TCP 能保证数据送达吗?
只有连接保持可用,TCP 才能保证送达。TCP 会重传丢失的数据并维持正确顺序,但如果网络或端点在传输完成前失效,TCP 会报告错误。