目录
- UDP与TCP对比
- 可靠性机制
-
- ACK机制
- 重传机制
- 流控控制
- 序号机制
- 重排机制
- 窗口机制
- UDP可靠性设计
-
- UDP窗口流控
- KCP(出于实时性考虑)
- QUIC
-
- 简述
- 优点
- 缺点
- 报文格式
- 建立低时延
UDP与TCP对比
TCP可能出现粘包分包
UDP不可能,且一帧数据必须一次性读完,否则将丢失未读部分
可靠性机制
ACK机制
也就回应机制,每次收到一个包都回给予一次ack,让发送方知道对方已经接收到
重传机制
ARQ协议的三种模式
(1) 即停等式ARQ : 等待ACK, 规定事件内没有收到对面ACK,则重传该帧
(2) 回退n帧ARQ : 不等待对面ACK,每个包存在生命周期,生命结束之前没有收到ACK,则回退到该该包重新发包(错误帧之后的包已经发送过,任然需要重新发送)
(3) 选择性重传ARQ : 不等待对面ACK,每个包存在生命周期,生命结束之前没有收到ACK,不需要回退到该该包重新发包, 仅需重发该包
流控控制
控制发送方发送速率,以防止收件方读取数据不及时,造成缓存满后丢弃数据包
(1) 收件方告知发送方缓存剩余空间,以便于发件方控制发送速率
(2) 如果发件方因为对方缓存已满而停止发送,则需要收件方适时通知发件方开发送
4. 拥塞控制
(1) 慢启动 :网络拥塞之后,尝试从少数包开始发送,逐渐按指数增长发送包,直到包数恢复到正常数量(因为带宽越来越大,该方案已废弃)
(2) 快恢复 : 网络拥塞之后,尝试从半数的包开始发送,逐次增多
序号机制
重排机制
窗口机制
UDP可靠性设计
UDP窗口流控
KCP(出于实时性考虑)
-
RTO翻倍
TCP超时计算为RTO时间不断翻倍
KCP中超时计算为RTO时间不断乘以1.5(经验值,试验证明该值较好) -
重传机制
TCP使用回退N帧ARQ机制(全部重传)
KCP使用选择性重传ARQ机制 -
快速重传
出现跳包现象(接收方收到的包是不连续的,多个中间包缺失),此时不考虑RTO,优化丢包时候的传输效率 -
ACK延迟
TCP为了更好的利用宽带,延迟发送ACK,如此RRT时间较大
KCP中可以设置是否延迟 -
ACK、UNA
5.1 解释UNA: 比如UNA 3,则表示告知sender,包0、1、2都已经收到,这个时候sender将释放掉包0、1、2,后续如果需要重传,这三个包也不会进入重传队列,
5.2 KCP是ACK+UNA机制
5.3 TCP是二选一 -
非退让流控
TCP使用公平退让法则(发送窗口大小决定因素:发送缓存大小,接收端剩余缓存大小,丢包退让,慢启动),
KCP可以配置跳过丢包退让以及慢启动,使得及时性更加强大 -
代码路径:https://github.com/skywind3000/kcp
上面对于KCP讲解不太清除的可以前往github上学习,再readme中对于优化的性能部分做了很详细的讲解。
8. KCP代码架构
QUIC
简述
- 快速UDP网络连接
- Google提出的实验性网络传输协议
- 位于OSI网络模型传输层
- 用户态基于UDP实现的传输层
- 旨在解决TCP协议的缺陷并最终替代TCP协议,减少数据传输,降低连接建立延迟时间,加快网页传输速度
- 文档连接:https://quicwg.org/base-drafts/rfc9000.html
优点
- 灵活的拥塞控制机制(可自我实现,也可以决定是否使用)
- 无队头阻塞(每个stream分别独立,不互相影响)
- 可轻易实现数据迁移(切换网络环境后,不需要重新连接,继续之前的连接通道继续传输数据)
- 包头需要身份验证,包内数据加密,安全性方面比TLS有过之而无不及
- FEC向前纠错
缺点
- 放入内核影响大,所有系统都要更新
- 路由器、防火墙、还有很多中间设备都需要改
报文格式
其中Connection ID为连接号,可以减少三次握手四次挥手的次数
Frame Type:
- bit01: stream ID长度
- bit234: offset长度
- bit5 : 有无Data Length字段
- bit6: 指示该stream通道上 是否已结束发送数据,是否处于半关闭状态
- bit7: 标识该帧是否为stream帧
Stream ID 一个UDP通道上可以存在多个Stream流, 每个流中的报文的完整性相互独立,以此减少异常时候,回退的帧数