TCP 如何判断丢包
TCP 通过超时重传机制判断丢包,结合流量控制和拥塞控制保证传输可靠性
问题
TCP 是如何判断数据包丢失的?
解答
TCP 保证传输可靠性主要依靠校验和、序列号、确认应答、超时重传、连接管理、流量控制和拥塞控制这几个机制。其中判断丢包主要通过超时重传机制实现。
确认应答与序列号
TCP 传输时会对每个字节的数据进行编号(序列号)。接收方收到数据后会发送 ACK 报文,报文中包含确认序列号,告诉发送方已接收到哪些数据,下次从哪里开始发送。
序列号还能将接收到的数据排序,并去除重复数据。
超时重传
发送方发送数据后,如果在一定时间内没有收到 ACK 报文,就会触发超时重传。没收到 ACK 的原因可能是:
- 发送的数据因网络问题丢失,接收方没收到
- 接收方收到数据,但返回的 ACK 报文因网络问题丢失
超时重传的处理方式:
- 如果是数据丢失,重新发送后接收方正常响应 ACK
- 如果是 ACK 丢失,接收方根据序列号判断是重复数据,直接丢弃并继续返回 ACK
超时等待时间是动态计算的,既要避免等待过长影响效率,也要避免等待过短导致频繁重传。
流量控制
接收端通过 TCP 报头中的 16 位窗口大小字段,告知发送端自己接收缓冲区的剩余空间。发送端根据这个值调整发送速度:
- 窗口大小越大,网络吞吐量越大
- 窗口大小为 0 时,发送方停止发送,并定期发送窗口探测数据段
这样可以防止发送速度过快导致接收端缓冲区溢出,避免丢包。
拥塞控制
TCP 使用慢启动机制避免一开始就发送大量数据造成网络拥堵:
- 初始拥塞窗口设为 1,每收到一个 ACK,拥塞窗口加 1(指数增长)
- 发送数据前,取拥塞窗口和接收端窗口的较小值作为实际发送窗口
- 设置拥塞窗口阈值,超过阈值后改为线性增长
- 发生超时重传时,阈值降为当前拥塞窗口的一半,拥塞窗口重置为 1
关键点
- TCP 通过超时重传机制判断丢包,发送数据后在动态计算的时间内未收到 ACK 就认为丢包
- 序列号机制可以识别重复数据,避免 ACK 丢失时的重复处理
- 流量控制通过窗口大小防止接收端缓冲区溢出导致的丢包
- 拥塞控制使用慢启动和动态调整窗口,避免网络拥堵引发的丢包
- 发生超时重传时,拥塞窗口阈值减半,拥塞窗口重置为 1
目录