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

『UDP 连接』是不是堪比『TCP 粘包』?

  •  
  •   2i2Re2PLMaDnghL · 2021-08-26 18:39:38 +08:00 · 3314 次点击
    这是一个创建于 945 天前的主题,其中的信息可能已经有所发展或是发生改变。
    16 条回复    2021-08-27 10:18:40 +08:00
    dqzcwxb
        1
    dqzcwxb  
       2021-08-26 18:45:17 +08:00
    连接可以是动词
    yidinghe
        2
    yidinghe  
       2021-08-26 18:50:21 +08:00 via Android
    看不懂,UDP 不需要连接。
    ihipop
        3
    ihipop  
       2021-08-26 19:45:23 +08:00 via Android
    马上有人给你带 “连接👮”的帽子
    lysS
        4
    lysS  
       2021-08-26 19:53:25 +08:00
    哪有相似之处?
    tinybaby365
        5
    tinybaby365  
       2021-08-26 20:20:44 +08:00
    楼主说的是使用 udp 的 socket 进行 connect 调用吧?和 TCP 不一样,不会进行握手。Linux 的内核会在 connect 后,记录下目标的 ip 和端口,并且可以多次 connect 。
    tinybaby365
        6
    tinybaby365  
       2021-08-26 20:23:03 +08:00
    @tinybaby365 还是按照 UDP 原来的样子进行传输。不存在所谓的粘包。本来粘包也是一个错误的概念,send 只是把要发送的内容丢进 socket buffer 。
    dallaslu
        7
    dallaslu  
       2021-08-26 20:30:46 +08:00
    @ihipop 帽子要用「戴」。——中文错别字👮
    namelosw
        8
    namelosw  
       2021-08-26 22:09:45 +08:00
    这俩隶属不同的分局,辖区不一样。
    Mohanson
        9
    Mohanson  
       2021-08-26 22:19:56 +08:00
    问一个刁钻的问题:

    现有一台客户端和一台服务器, 客户端主动建立了到服务端的一个 TCP 连接和一个 UDP "连接", 之后, 拔出客户端的网线, 10 秒后再插回网线.

    请问:

    此时客户端能否通过 TCP 和 UDP "连接" 向服务端 send 数据, 服务端是否能收到?
    Mohanson
        10
    Mohanson  
       2021-08-26 22:22:22 +08:00
    扩展题:

    1) 如果拔的是服务端的网线?

    2) 如果拔网线后间隔 2 小时再插回去, 现象如何?
    Mutoo
        11
    Mutoo  
       2021-08-26 23:20:13 +08:00 via iPhone
    英文都帮你找好了,叫 tcp over udp
    weakish
        12
    weakish  
       2021-08-26 23:52:17 +08:00
    可以把第一次发送 datagram (对于另一方来说是第一次接收)视作双方建立了「连接」,一方不再和另一方通讯视作「连接」断开。这样强行定义的连接的好处是很多时候我们关心的是双方之间的通讯,至于这个通讯是 TCP 还是 UDP 其实是实现细节,UDP 也定义连接就可以和 TCP 用差不多的方式处理,某些时候这样比较方便。

    拿 Go 来说,UDP 也可以 Dial,也会返回 Conn,这个 Conn 同样也需要 close

    > func Dial(network, address string) (Conn, error)

    > Dial connects to the address on the named network.

    > Known networks are "tcp", "tcp4" (IPv4-only), "tcp6" (IPv6-only), "udp", "udp4" (IPv4-only), "udp6" (IPv6-only), "ip", "ip4" (IPv4-only), "ip6" (IPv6-only), "unix", "unixgram" and "unixpacket".

    https://pkg.go.dev/net#Dial
    jedihy
        13
    jedihy  
       2021-08-27 06:12:49 +08:00
    这叫 connected UDP sockets,性能比 unconnected 要快一点根据不同 OS 实现。
    codehz
        14
    codehz  
       2021-08-27 07:25:58 +08:00 via Android
    这事吧,还是有一点区别的,除了实现上确实可以 connected 之外,还有就是现实中网络设备也会对时间上和双方地址相近的 udp 包做特殊处理(也就是 NAT )。
    试想,如果真的把 udp 做为无状态协议看待,NAT 打洞又该如何实现?
    ysc3839
        15
    ysc3839  
       2021-08-27 08:13:45 +08:00 via Android
    @Mohanson 如果操作系统能观察到网线连接状态的话,拔掉网线一般会导致这一端的 TCP 连接断开,UDP 则不会。
    fgwmlhdkkkw
        16
    fgwmlhdkkkw  
       2021-08-27 10:18:40 +08:00
    已举报。
    关于   ·   帮助文档   ·   博客   ·   API   ·   FAQ   ·   我们的愿景   ·   实用小工具   ·   3724 人在线   最高记录 6543   ·     Select Language
    创意工作者们的社区
    World is powered by solitude
    VERSION: 3.9.8.5 · 25ms · UTC 05:04 · PVG 13:04 · LAX 22:04 · JFK 01:04
    Developed with CodeLauncher
    ♥ Do have faith in what you're doing.