udp 协议比 tcp 更稳定吗

2023-03-24 11:58:55 +08:00
 EmperorXI

通话一般都是 udp 协议,代理服务器对 udp 支持不好,tcp 反而稳定。表现:通话经常中断,卡住,游戏延迟大。有办法解决吗?

6170 次点击
所在节点    程序员
41 条回复
FozillaMox
2023-03-24 12:31:41 +08:00
好硬的用户名
yueji
2023-03-24 12:44:31 +08:00
TCP 是稳定协议.是可靠协议.但是要三次握手.在同 1 个 socket 里 发送和接收数据
类似打语音电话.建立一个通话管道.一问一答


UDP 是不可靠协议.不需要三次握手确认,就是直接丢个包过去.慢慢等着收.
类似微信,短信,我发过去就行了.不管你有没有收到.不管你要不要回
你回了我就收到.
yueji
2023-03-24 12:47:15 +08:00
所以 UDP 更快.但是不可靠.所以,就会出现各种 UDP 框架.就是为了把 UDP 变得可靠.
那些稳定可靠的 UDP 通讯框架有些卖得还挺贵的
cairnechen
2023-03-24 12:51:38 +08:00
@yueji 如果 UDP 变得稳定可靠的代价比 TCP 小,那还要 TCP 干嘛?
yueji
2023-03-24 12:52:15 +08:00
但是你问了这个问题,明显是不太深入了解.个人建议你还是乖乖用 TCP 吧.
UDP 没有一定的基础到时候你会发现有很多很多的坑等着你.
yueji
2023-03-24 12:53:05 +08:00
@cairnechen 是啊.就是要时间或者金钱的代价让 UDP 变可靠.
tramm
2023-03-24 12:55:35 +08:00
UDP 只是快, 不如 TCP 稳定.
当然了, 靠上层协议的控制实现能让基于 UDP 的上层协议比基于 TCP 的上层协议又快又稳.
KKKg
2023-03-24 12:57:08 +08:00
用 UDP 的代价就是要在应用层自己再手搓一个类似 TCP 的系统,除非你发送的数据流可以容错
zjsxwc
2023-03-24 12:58:42 +08:00
所以有 https over udp 吗?
happinessnch
2023-03-24 13:01:42 +08:00
看一下 KCP ??
hhjswf
2023-03-24 13:02:47 +08:00
udp 允许丢包啊
sofukwird
2023-03-24 13:03:00 +08:00
@zjsxwc http3
Jammar
2023-03-24 13:16:28 +08:00
tcp 的主要问题是跟着操作系统内核走的,所以你永远不知道对面的 tcp 协议有多老.而 udp 的握手超时拥塞等等是应用层实现的,可以及时的更新优化
tool2d
2023-03-24 13:36:23 +08:00
@cairnechen TCP 太君子协议了,遇到堵车或者红灯就傻等。

UDP 则不一样,多包同时向前挤,总有一个包能挤过去的。
msg7086
2023-03-24 13:38:30 +08:00
@cairnechen #4 要 TCP 去兼容旧的设备、旧的应用、旧的生态。
生态环境兼容性也是一种依赖,而且是一种很强的依赖。

TCP 原本就是一个实现于古代的可靠协议。现在重新发明可靠协议,当然会比 TCP 做得更好,毕竟是根据现在的需求和环境定制出来的协议,优化的是 100Mbps 下的传输,而不是 14.4Kbps 下的。

不说 UDP/TCP 的问题,光是网络本身就有太多古代的东西在里面,比如 MTU 至今还是 1500 ,酱爆帧还没大规模普及。
hankai17
2023-03-24 13:41:52 +08:00
可以看一下 KCP
之前试过 UDP 可靠传输 https://github.com/hankai17/quic-fiber
wzw369
2023-03-24 13:43:49 +08:00
我记得好像有一个 kcp 协议,你可以去看看
kaddusabagei38
2023-03-24 14:00:59 +08:00
开个玩笑,一看就是没经过面试毒打的年轻人(
kaddusabagei38
2023-03-24 14:03:31 +08:00
代理的话,socks5 其实我没记错应该是能走 UDP 的,v2ray 有个选项能开启 UDP 支持,但是应该也同时需要服务器端支持。

https://www.rfc-editor.org/rfc/rfc1928
vitoaaazzz
2023-03-24 14:04:00 +08:00
udp 更简单,灵活,相比 tcp ,udp 只是报文传输,丢包、应答什么都要人工处理,更加“原始”。
tcp 相比就复杂多了,隐藏了关于应答、窗口、拥塞算法的很多细节,灵活型稍差,但是底层保证消息传输的可靠性。
更多的是根据需求选择,通常用 tcp 、如果不考虑消息顺序可以用 udp+自己实现应答+重发,这样响应效率更高。
话说 tcp 的历史遗留问题太多了,已经很难再提升传输效率了吧,才会有基于 udp 设计的 QUIC 这类协议。

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

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

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

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

© 2021 V2EX