怎样在 UDP 上实现可靠传输?QUIC 改进了 TCP 的哪些设计?
先自己想一想,再看参考要点
参考要点
- 按 TCP 的思路在应用层实现:给每个数据包编号,接收方据此去重和排序
- 接收方回复确认,发送方超时没收到确认就重传,超时时间根据测得的 RTT 计算
- 限制已发送但未确认的数据量,做流量控制和拥塞控制
- 好处是可以按需取舍,只对需要的消息重传,不相关的消息互不阻塞
- QUIC 的包号只增不减,丢失的数据放进新编号的包中重传,能分清确认的是哪一次发送,RTT 测得更准,数据按流组织、每个流单独排序,一个包丢失只暂停带有它数据的流,一个确认帧可以携带很多个已收到的区间
- 选择在 UDP 上实现,是因为 TCP 实现在内核中,改动要等操作系统升级,中间设备还会检查甚至改写 TCP 首部,QUIC 在用户态随应用更新,并加密了大部分首部