通话一般都是 udp 协议,代理服务器对 udp 支持不好,tcp 反而稳定。表现:通话经常中断,卡住,游戏延迟大。有办法解决吗?
![]() |
1
FozillaMox 191 天前 via iPhone ![]() 好硬的用户名
|
![]() |
2
yueji 191 天前 ![]() TCP 是稳定协议.是可靠协议.但是要三次握手.在同 1 个 socket 里 发送和接收数据
类似打语音电话.建立一个通话管道.一问一答 UDP 是不可靠协议.不需要三次握手确认,就是直接丢个包过去.慢慢等着收. 类似微信,短信,我发过去就行了.不管你有没有收到.不管你要不要回 你回了我就收到. |
![]() |
3
yueji 191 天前
所以 UDP 更快.但是不可靠.所以,就会出现各种 UDP 框架.就是为了把 UDP 变得可靠.
那些稳定可靠的 UDP 通讯框架有些卖得还挺贵的 |
![]() |
4
cairnechen 191 天前 ![]() @yueji 如果 UDP 变得稳定可靠的代价比 TCP 小,那还要 TCP 干嘛?
|
![]() |
5
yueji 191 天前
但是你问了这个问题,明显是不太深入了解.个人建议你还是乖乖用 TCP 吧.
UDP 没有一定的基础到时候你会发现有很多很多的坑等着你. |
![]() |
6
yueji 191 天前
@cairnechen 是啊.就是要时间或者金钱的代价让 UDP 变可靠.
|
![]() |
7
tramm 191 天前
UDP 只是快, 不如 TCP 稳定.
当然了, 靠上层协议的控制实现能让基于 UDP 的上层协议比基于 TCP 的上层协议又快又稳. |
8
KKKg 191 天前
用 UDP 的代价就是要在应用层自己再手搓一个类似 TCP 的系统,除非你发送的数据流可以容错
|
![]() |
9
zjsxwc 191 天前
所以有 https over udp 吗?
|
![]() |
10
happinessnch 191 天前 ![]() 看一下 KCP ??
|
![]() |
11
hhjswf 191 天前
udp 允许丢包啊
|
13
Jammar 191 天前
tcp 的主要问题是跟着操作系统内核走的,所以你永远不知道对面的 tcp 协议有多老.而 udp 的握手超时拥塞等等是应用层实现的,可以及时的更新优化
|
![]() |
14
tool2d 191 天前
|
![]() |
15
msg7086 191 天前
@cairnechen #4 要 TCP 去兼容旧的设备、旧的应用、旧的生态。
生态环境兼容性也是一种依赖,而且是一种很强的依赖。 TCP 原本就是一个实现于古代的可靠协议。现在重新发明可靠协议,当然会比 TCP 做得更好,毕竟是根据现在的需求和环境定制出来的协议,优化的是 100Mbps 下的传输,而不是 14.4Kbps 下的。 不说 UDP/TCP 的问题,光是网络本身就有太多古代的东西在里面,比如 MTU 至今还是 1500 ,酱爆帧还没大规模普及。 |
16
hankai17 191 天前
可以看一下 KCP
之前试过 UDP 可靠传输 https://github.com/hankai17/quic-fiber |
![]() |
17
wzw369 191 天前
我记得好像有一个 kcp 协议,你可以去看看
|
18
kaddusabagei38 191 天前
开个玩笑,一看就是没经过面试毒打的年轻人(
|
19
kaddusabagei38 191 天前
代理的话,socks5 其实我没记错应该是能走 UDP 的,v2ray 有个选项能开启 UDP 支持,但是应该也同时需要服务器端支持。
https://www.rfc-editor.org/rfc/rfc1928 |
![]() |
20
vitoaaazzz 191 天前
udp 更简单,灵活,相比 tcp ,udp 只是报文传输,丢包、应答什么都要人工处理,更加“原始”。
tcp 相比就复杂多了,隐藏了关于应答、窗口、拥塞算法的很多细节,灵活型稍差,但是底层保证消息传输的可靠性。 更多的是根据需求选择,通常用 tcp 、如果不考虑消息顺序可以用 udp+自己实现应答+重发,这样响应效率更高。 话说 tcp 的历史遗留问题太多了,已经很难再提升传输效率了吧,才会有基于 udp 设计的 QUIC 这类协议。 |
21
neoblackcap 191 天前
换专线吧,在实现正确的情况下,tcp 跟 udp 的差距没有那么大。
udp 国内使用主要是你没法控制传输链路上各节点网关设备,不少节点可能对 udp 协议有 QoS 。这个时候你怎么改进应用层都不好使。 |
![]() |
22
Tompes 191 天前
我的评价是:入门级八股
|
![]() |
23
LykorisR 191 天前
.......
基本大二都会教的吧,计网 UDP 注重速度,TCP 注重可靠性 |
24
deorth 191 天前 via Android
建议用 sctp
|
25
dqzcwxb 191 天前
@cairnechen #4 http3?
|
26
mejee 191 天前
参考#21 ,实际上不仅要考虑技术,还要考虑运营商对于 UDP 、TCP 的支持程度,有些运营商会限制 UDP 的 qos ,导致基于 UDP 的协议效果不好
|
![]() |
27
lisxour 191 天前
@cairnechen 可靠 UDP 是后出的,难不成有了可靠 UDP 就一刀把全世界几百万上亿的 TCP 砍了?
|
![]() |
28
hackersee 191 天前
|
![]() |
29
610915518 191 天前
国内对 UDP 支持不是很重视,类似于国内苹果手机信号不好。有机会的话,可以把 UDP 伪装成 TCP ,传输会好很多。
|
![]() |
30
wwbfred 191 天前
@FozillaMox V 友关注点就是不一样😂
|
![]() |
31
wwbfred 191 天前
没有哪个更稳定一说,因为数据包在绝大多数场景下都是要保证正确有序接收的,关键是那一层来做这个工作的问题。TCP 这方面的工作是内核做的,特点就是稳定,但策略相对保守。UDP 是应用层开发人员写的,质量良莠不齐,但可以弄得很激进很暴力。根据不同的场景和现有条件选择合适的协议才是正确的做法。
|
![]() |
33
piku 191 天前 via Android
说着说着楼就歪了。
语音视频什么的,对实时要求高,用 udp 丢几个包也就是那一小段信息的丢失,不影响整体。tcp 丢包会触发重传,导致等待而卡住。为了对抗丢包,可能有多倍发包之类的方法。 所以说二者适用场景不一样。 |
37
jinliming2 190 天前 via iPhone ![]() TCP 和 UDP 都是通过网线来传,面对的问题是一样的,丢包、乱序之类的。
他俩的不同点在于,UDP 很简单,数据发出去就发出去了,不管有没有丢包,也不管送达顺序。而 TCP 在协议上通过编号、发送确认之类的方法来确保底层网络质量问题不影响应用层的数据,丢包自动重传、乱序自动整理等。 TCP 设计的时间比较早了,那个时候网络质量差,TCP 的设计是发出去的每个包都要确认送达,不然就当对方没收到,超时会重传。 谷歌为了提升网站加载的速度,给 TCP 设计了一个 BBR 拥塞控制算法,虽然效果还行,但还有提升空间。然后就搞了 QUIC 协议,基于 UDP ,在上层来实现丢包重传、乱序重排,并且抛弃了 TCP 每个包都要确认送达的方案。 现在的网络质量已经没有几十年前那么差了,丢包率很低了,所以 UDP 的送达率也比较高了,QUIC 在确保数据完整正确的前提下,不需要每个包都回复送达,速度就快起来了。 HTTP/3 已经开始使用基于 UDP 的 QUIC 协议来传输了,并且已经在普及了。 |
38
gougou6423 190 天前
@solitude2 KCP ,林伟大佬写的,游戏这边相当多的项目在用,包括原神,其他行业不太清楚了。
|
![]() |
39
flyqie 190 天前 via Android
那得看你是怎么理解稳定的了。。
现阶段,tcp 和 udp 都各有劣势,单纯比较没有意义。 |
![]() |
40
yueji 185 天前
|
41
zeonll 184 天前
感谢
|