TCP 如何保证可靠性

发布于:2025-08-08 ⋅ 阅读:(13) ⋅ 点赞:(0)

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 网络上传输的每一字节都准确无误。这也是它在需要可靠传输的场景中被广泛使用的原因。


网站公告

今日签到

点亮在社区的每一天
去签到