QUIC 协议基于 UDP, UDP 不可靠, QUIC 如何保证可靠性的呢

2021-05-19 10:40:14 +08:00
 lrs
最近写代码练手,写一个网络发送文件的小程序,可选 TCP 或 UDP 为传输方案。写到 UDP 传输方案的时候发现丢包检测重传之类的逻辑越写越乱越写越复杂,于是准备看下 QUIC 怎么实现的。翻了翻 QUIC 的 RFC 文档,看的我头大。
比较好奇的是,既然 UDP 会丢包,包含传输控制信息的包也是会丢的。控制信息要是丢了,岂不就是 hang 在那里了啊。如果采用超时机制来保证控制信息的重传,这效率(传输速度)就没法保证了。
所以,QUIC 是如何做的呢
6107 次点击
所在节点    问与答
31 条回复
jim9606
2021-05-19 17:02:21 +08:00
如果你只是搞上层应用,别自己写,直接搬别人的实现就是了。
( https://github.com/lucas-clemente/quic-go )

真要深入研究这个你得先把 TCP 的设计搞清楚,这玩意往大的说,能写一本厚书了。
wellsc
2021-05-19 18:06:29 +08:00
64 位 id + 重传
tiddarabbit
2021-05-19 20:21:26 +08:00
@chenset "TCP 是网卡硬件实现的,几乎不消耗 CPU" 😵😵😵😵😵
Love4Taylor
2021-05-19 21:00:20 +08:00
@des 他说的应该是 TCP 卸载
msaionyc
2021-05-19 21:10:38 +08:00
@PeakFish UDP 可靠吗
joyqi
2021-05-19 21:12:55 +08:00
质不够量来凑
chenset
2021-05-19 21:42:15 +08:00
#3 严重错误, 请忽略
ysc3839
2021-05-19 23:07:01 +08:00
你是想自己实现一个 UDP 可靠传输协议吗?
还是说只是希望自己写的小程序走 UDP 传输的同时保证可靠?
如果是后者,建议使用 KCP 之类现成的协议。
msg7086
2021-05-20 05:09:04 +08:00
@lrs #12 丢包的本源就是缓冲区满了。(这个在计算机网络课程里应该有讲到。)
#13 的快递比喻基本是正确的,但是丢包一般是因为缓冲区满了。
缓冲区就相当于快递集散点的仓库,短时间内快递多,可以先堆着慢慢送,但是如果遇到过节大甩卖,快递多到仓库都堆不下了,爆仓了,那么对于硬件设备来说就是直接丢弃掉了。
因为丢弃的包不会有回传消息,所以在软件这边看来就是等待直到超时。
因为超时对发送流量的影响更大,所以一般的流控会选择主动减速,空出缓冲区,保证发出去的包都不会因为爆仓而丢弃。但是这个减速的机制则需要微调个几十年。
wanguorui123
2021-05-20 07:29:31 +08:00
纠错算法了解下
lrs
2021-05-20 11:09:09 +08:00
@PeakFish #8 我是在网上看的好多地方描述 UDP 的时候都写 unreliable

@shyling #6
@raaaaaar #11
@v2tudnew #15
@robot1 #19
@jim9606 #21
@wellsc #22
@wanguorui123 #30
好的,多谢指点

@ch2 #13
@sujin190 #18
@msg7086 #29
明白了,感谢解释

@zengming00 #14 一般都是小于 MTU 的吧

@caola #16 嗯,已经找了 quinn 的代码在看

@Tianao #17 哈哈哈,不要这样造句啦

@joyqi #26 嗯,然后凑也是有讲究

@ysc3839 #28 只是写着玩儿,后来发现 UDP 做可靠性挺复杂,自己实现一个感觉不大现实,还没那么强做不到呐。多谢指点,我去找下 KCP 文档看看

这是一个专为移动设备优化的页面(即为了让你能够在 Google 搜索结果里秒开这个页面),如果你希望参与 V2EX 社区的讨论,你可以继续到 V2EX 上打开本讨论主题的完整版本。

https://www.v2ex.com/t/777845

V2EX 是创意工作者们的社区,是一个分享自己正在做的有趣事物、交流想法,可以遇见新朋友甚至新机会的地方。

V2EX is a community of developers, designers and creative people.

© 2021 V2EX