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

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

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

请问:

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

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

2) 如果拔网线后间隔 2 小时再插回去, 现象如何?
Mutoo
2021-08-26 23:20:13 +08:00
英文都帮你找好了,叫 tcp over udp
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
2021-08-27 06:12:49 +08:00
这叫 connected UDP sockets,性能比 unconnected 要快一点根据不同 OS 实现。
codehz
2021-08-27 07:25:58 +08:00
这事吧,还是有一点区别的,除了实现上确实可以 connected 之外,还有就是现实中网络设备也会对时间上和双方地址相近的 udp 包做特殊处理(也就是 NAT )。
试想,如果真的把 udp 做为无状态协议看待,NAT 打洞又该如何实现?
ysc3839
2021-08-27 08:13:45 +08:00
@Mohanson 如果操作系统能观察到网线连接状态的话,拔掉网线一般会导致这一端的 TCP 连接断开,UDP 则不会。
fgwmlhdkkkw
2021-08-27 10:18:40 +08:00
已举报。

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

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

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

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

© 2021 V2EX