可靠传输管什么

可靠传输解决的是:发送方发出的数据,接收方最终能按协议要求正确收到

CRC 能检测误码,但不能修复错误。若接收方发现帧出错,只能丢弃,或者让发送方重传。因此可靠传输必须在差错检测之上增加确认、编号、缓存和重传。

若链路层提供不可靠传输服务,接收方发现出错帧后直接丢弃,其他问题交给上层。有线以太网通常这样做。无线链路误码率较高,数据链路层常需要确认和重传。

可靠传输要处理的情况

可靠传输不是只处理误码。它至少要面对这些情况:

情况 问题 需要的机制
数据正确到达 发送方需要知道可以继续发送 ACK
数据出错 接收方不能交付错误数据 丢弃、NAK 或超时重传
数据丢失 接收方不会返回任何确认 超时重传
ACK 丢失 接收方已收到,发送方不知道 超时重传、编号
ACK 迟到 发送方可能已经重传 编号、重复确认处理
重复数据 接收方可能再次收到旧数据 数据编号、丢弃重复副本

ACK、NAK 和重传

接收方收到数据后先做差错检测。

  • 没有检测出误码:接收方接受数据,并返回 ACK。
  • 检测出误码:接收方丢弃数据,可以返回 NAK。

发送方收到 ACK 后继续发送;收到 NAK 后重传当前数据。

NAK 不是必须的。接收方发现误码后也可以只丢弃,不发 NAK,让发送方等待超时后重传。NAK 的好处是能更早触发重传,适合误码率较高的链路。

超时重传

若数据本身丢失,接收方收不到数据,也不会产生 ACK 或 NAK。发送方不能无限等待,所以每次发送后要启动超时计时器。

若在 RTO 内没有收到对应确认,发送方自动重传缓存中的数据。

RTO 太短,会把正常还没返回的 ACK 误判为丢失;RTO 太长,会让真正丢失后的等待时间过长。点对点链路的 RTT 通常较稳定,RTO 较容易设置。

编号和缓存

ACK 丢失时,接收方已经收到数据,但发送方不知道。发送方超时后会重传同一个数据。接收方必须识别这个数据是旧副本,而不是新的数据。

因此数据要编号。

接收方收到重复编号的数据时:

  • 丢弃重复副本。
  • 重新发送 ACK,避免发送方继续重传。

发送方也必须保留已发送但尚未确认的数据副本。只有收到对应 ACK 后,才能从发送缓存中删除。

停止-等待协议

停止-等待协议把可靠传输机制放在最简单的发送节奏中:发送方每次只发送一个数据,等确认回来后再发送下一个。

停止-等待协议中,同一时刻最多只有一个未确认数据在路上,所以数据编号只需要 1 bit:

$$
0,1,0,1,\dots
$$

这足以区分“当前数据”和“上一次数据的重复副本”。

ACK 丢失和 ACK 迟到

ACK 丢失时,发送方超时重传。接收方靠数据编号识别重复副本,丢弃重复数据,并重新发送 ACK。

ACK 迟到时,发送方可能已经完成超时重传。迟到 ACK 到达后,发送方要判断它是不是重复确认。数据链路层点对点 RTT 通常稳定,ACK 迟到不常见,所以链路层停止-等待协议中 ACK 可以不编号;RTT 不稳定的层次中,ACK 编号更有必要。

详见Sliding-Window