V2EX = way to explore
V2EX 是一个关于分享和探索的地方
现在注册
已注册用户请  登录
EmperorXI
V2EX  ›  程序员

udp 协议比 tcp 更稳定吗

  •  
  •   EmperorXI · 2023-03-24 11:58:55 +08:00 via iPad · 6080 次点击
    这是一个创建于 370 天前的主题,其中的信息可能已经有所发展或是发生改变。

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

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


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

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

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

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

    https://www.rfc-editor.org/rfc/rfc1928
    vitoaaazzz
        20
    vitoaaazzz  
       2023-03-24 14:04:00 +08:00
    udp 更简单,灵活,相比 tcp ,udp 只是报文传输,丢包、应答什么都要人工处理,更加“原始”。
    tcp 相比就复杂多了,隐藏了关于应答、窗口、拥塞算法的很多细节,灵活型稍差,但是底层保证消息传输的可靠性。
    更多的是根据需求选择,通常用 tcp 、如果不考虑消息顺序可以用 udp+自己实现应答+重发,这样响应效率更高。
    话说 tcp 的历史遗留问题太多了,已经很难再提升传输效率了吧,才会有基于 udp 设计的 QUIC 这类协议。
    neoblackcap
        21
    neoblackcap  
       2023-03-24 14:20:36 +08:00
    换专线吧,在实现正确的情况下,tcp 跟 udp 的差距没有那么大。
    udp 国内使用主要是你没法控制传输链路上各节点网关设备,不少节点可能对 udp 协议有 QoS 。这个时候你怎么改进应用层都不好使。
    Tompes
        22
    Tompes  
       2023-03-24 14:20:56 +08:00
    我的评价是:入门级八股
    LykorisR
        23
    LykorisR  
       2023-03-24 14:22:11 +08:00
    .......
    基本大二都会教的吧,计网
    UDP 注重速度,TCP 注重可靠性
    deorth
        24
    deorth  
       2023-03-24 14:24:35 +08:00 via Android
    建议用 sctp
    dqzcwxb
        25
    dqzcwxb  
       2023-03-24 14:39:53 +08:00
    @cairnechen #4 http3?
    mejee
        26
    mejee  
       2023-03-24 16:03:25 +08:00
    参考#21 ,实际上不仅要考虑技术,还要考虑运营商对于 UDP 、TCP 的支持程度,有些运营商会限制 UDP 的 qos ,导致基于 UDP 的协议效果不好
    lisxour
        27
    lisxour  
       2023-03-24 16:05:08 +08:00
    @cairnechen 可靠 UDP 是后出的,难不成有了可靠 UDP 就一刀把全世界几百万上亿的 TCP 砍了?
    hackersee
        28
    hackersee  
       2023-03-24 16:08:46 +08:00
    https://www.godjiyi.cn/2020/05/29/quic-explain-build/

    QUIC 协议,现在已经正式发布为 HTTP3
    610915518
        29
    610915518  
       2023-03-24 17:38:52 +08:00
    国内对 UDP 支持不是很重视,类似于国内苹果手机信号不好。有机会的话,可以把 UDP 伪装成 TCP ,传输会好很多。
    wwbfred
        30
    wwbfred  
       2023-03-24 17:53:49 +08:00
    @FozillaMox V 友关注点就是不一样😂
    wwbfred
        31
    wwbfred  
       2023-03-24 17:58:17 +08:00
    没有哪个更稳定一说,因为数据包在绝大多数场景下都是要保证正确有序接收的,关键是那一层来做这个工作的问题。TCP 这方面的工作是内核做的,特点就是稳定,但策略相对保守。UDP 是应用层开发人员写的,质量良莠不齐,但可以弄得很激进很暴力。根据不同的场景和现有条件选择合适的协议才是正确的做法。
    SenseHu
        32
    SenseHu  
       2023-03-24 18:38:05 +08:00
    @610915518 看样子老哥没少干这事 (手动滑稽
    piku
        33
    piku  
       2023-03-24 18:58:15 +08:00 via Android
    说着说着楼就歪了。
    语音视频什么的,对实时要求高,用 udp 丢几个包也就是那一小段信息的丢失,不影响整体。tcp 丢包会触发重传,导致等待而卡住。为了对抗丢包,可能有多倍发包之类的方法。
    所以说二者适用场景不一样。
    zeonll
        34
    zeonll  
       2023-03-24 19:00:30 +08:00
    @yueji 还有卖钱的 udp 框架?能说一个吗 我有点好奇
    EmperorXI
        35
    EmperorXI  
    OP
       2023-03-24 23:46:51 +08:00 via iPhone
    @wwbfred 代理服务似乎不支持 udp 转发
    solitude2
        36
    solitude2  
       2023-03-25 03:24:44 +08:00 via Android
    @yueji 有推荐的使得 udp 可靠性变高的优秀框架吗?
    jinliming2
        37
    jinliming2  
       2023-03-25 04:35:54 +08:00 via iPhone   ❤️ 1
    TCP 和 UDP 都是通过网线来传,面对的问题是一样的,丢包、乱序之类的。
    他俩的不同点在于,UDP 很简单,数据发出去就发出去了,不管有没有丢包,也不管送达顺序。而 TCP 在协议上通过编号、发送确认之类的方法来确保底层网络质量问题不影响应用层的数据,丢包自动重传、乱序自动整理等。
    TCP 设计的时间比较早了,那个时候网络质量差,TCP 的设计是发出去的每个包都要确认送达,不然就当对方没收到,超时会重传。

    谷歌为了提升网站加载的速度,给 TCP 设计了一个 BBR 拥塞控制算法,虽然效果还行,但还有提升空间。然后就搞了 QUIC 协议,基于 UDP ,在上层来实现丢包重传、乱序重排,并且抛弃了 TCP 每个包都要确认送达的方案。
    现在的网络质量已经没有几十年前那么差了,丢包率很低了,所以 UDP 的送达率也比较高了,QUIC 在确保数据完整正确的前提下,不需要每个包都回复送达,速度就快起来了。
    HTTP/3 已经开始使用基于 UDP 的 QUIC 协议来传输了,并且已经在普及了。
    gougou6423
        38
    gougou6423  
       2023-03-25 10:46:53 +08:00
    @solitude2 KCP ,林伟大佬写的,游戏这边相当多的项目在用,包括原神,其他行业不太清楚了。
    flyqie
        39
    flyqie  
       2023-03-25 10:54:09 +08:00 via Android
    那得看你是怎么理解稳定的了。。

    现阶段,tcp 和 udp 都各有劣势,单纯比较没有意义。
    yueji
        40
    yueji  
       364 天前
    @zeonll 比如 收费的 udx.
    (5w 一个平台,只给二进制库,比如 Windows x86,Lib 5w,x64 5w,Linux arm 5w,x86 5w,x64 5w)
    买齐一套还挺贵的.

    免费的 kcp


    @solitude2
    zeonll
        41
    zeonll  
       363 天前
    感谢
    关于   ·   帮助文档   ·   博客   ·   API   ·   FAQ   ·   我们的愿景   ·   实用小工具   ·   1032 人在线   最高记录 6543   ·     Select Language
    创意工作者们的社区
    World is powered by solitude
    VERSION: 3.9.8.5 · 31ms · UTC 22:25 · PVG 06:25 · LAX 15:25 · JFK 18:25
    Developed with CodeLauncher
    ♥ Do have faith in what you're doing.