TCP 如何保证可靠性
TCP(Transmission Control Protocol)是一种面向连接、可靠、基于字节流的传输层协议。它在不可靠的 IP 网络之上,通过一系列机制来保证数据能够可靠、按序、不重复地传输给对方。
一、TCP 可靠性的定义
可靠性是指:
数据从发送端传输到接收端时,确保数据不丢失、不重复、不乱序。
TCP 相比 UDP 正是通过引入连接管理、数据确认机制、重传机制等手段来实现这一点。
二、TCP 如何保证可靠性(核心机制)
三次握手建立连接
- 通过三次握手确保:
- 通信双方都有接收和发送能力。
- 序列号初始值(ISN)协商完毕。
- 防止历史连接请求被误当作当前连接。
Client --> [SYN] --> Server
Client <-- [SYN+ACK] <-- Server
Client --> [ACK] --> Server
序列号和确认号机制(按序传输)
- 序列号(SEQ):标识每个字节在数据流中的位置。
- 确认号(ACK):接收方告知发送方下一个期望的字节序号。
例:
Client 发送 SEQ=1, LEN=100
Server 回复 ACK=101 表示已收到前100字节
保证了数据的顺序性和完整性。
校验和(Checksum)
- 每个 TCP 报文段都带有一个 校验和字段。
- 用于检测数据在传输过程中是否被篡改或损坏。
如果校验失败,数据包会被丢弃,等待重传。
确认应答机制(ACK)
- 每接收一个数据段,接收方就会发送一个 ACK 报文作为确认。
- 支持累计确认(确认到某个序号,表示之前的数据都收到了)。
实现了“发—收—确认”的可靠传输流程。
超时重传机制(RTO)
- 发送方发送数据后若在超时时间内未收到 ACK,则自动重发该数据。
- 重传时间基于动态估算的 RTT(往返时间)。
保证即使 ACK 丢失,数据也不会丢失。
快速重传(Fast Retransmit)
- 如果接收方连续收到 3 个相同的 ACK(称为 冗余 ACK),
- 说明某个数据段可能丢失了,立即重传,不等待超时。
提升了网络性能和响应速度。
滑动窗口机制(流量控制)
- 接收方通过
Window Size
告诉发送方自己还有多少接收缓冲区。 - 发送方根据窗口限制控制发送速率,避免接收方被淹没。
保证接收方不会因处理不过来而丢包。
拥塞控制机制(网络拥堵控制)
TCP 提供如下拥塞控制算法:
- 慢启动(Slow Start)
- 拥塞避免(Congestion Avoidance)
- 快速重传(Fast Retransmit)
- 快速恢复(Fast Recovery)
避免因网络过载而导致大量丢包,从而保证传输的稳定性和可靠性。
三、TCP 可靠传输的核心流程图
连接建立(三次握手)↓
数据发送(序列号 + 校验和)↓
接收确认(ACK)↓
丢包重传(RTO / 快速重传)↓
流控 + 拥控(窗口机制)↓
连接断开(四次挥手)
四、TCP vs UDP 对比(可靠性)
特性 | TCP | UDP |
---|---|---|
是否连接 | 是(需三次握手) | 否(无连接) |
是否可靠传输 | 是,重传 + 校验 + 顺序 | 否,尽力而为 |
是否保证顺序 | 是(按序传输) | 否(可能乱序) |
传输效率 | 相对低 | 相对高 |
场景 | 文件传输、HTTP、IM | 视频、语音、游戏等 |
五、面试总结
面试问题 | 建议回答 |
---|---|
TCP 如何保证数据可靠性? | 从三次握手、确认机制、重传机制、滑动窗口、拥塞控制等方面回答 |
如果 ACK 丢失怎么办? | 发送方会在超时后重传数据 |
TCP 如何处理乱序数据? | 接收方根据序列号排序,丢弃重复数据 |
TCP 校验和检测什么? | 校验 IP 头、TCP 头和数据部分是否损坏 |
六、结语
TCP 通过一整套机制(序列号、确认、重传、窗口、握手等)来确保不可靠的 IP 网络上传输的每一字节都准确无误。这也是它在需要可靠传输的场景中被广泛使用的原因。