1
dqzcwxb 2021-08-26 18:45:17 +08:00
连接可以是动词
|
2
yidinghe 2021-08-26 18:50:21 +08:00 via Android
看不懂,UDP 不需要连接。
|
3
ihipop 2021-08-26 19:45:23 +08:00 via Android
马上有人给你带 “连接👮”的帽子
|
4
lysS 2021-08-26 19:53:25 +08:00
哪有相似之处?
|
5
tinybaby365 2021-08-26 20:20:44 +08:00
楼主说的是使用 udp 的 socket 进行 connect 调用吧?和 TCP 不一样,不会进行握手。Linux 的内核会在 connect 后,记录下目标的 ip 和端口,并且可以多次 connect 。
|
6
tinybaby365 2021-08-26 20:23:03 +08:00
@tinybaby365 还是按照 UDP 原来的样子进行传输。不存在所谓的粘包。本来粘包也是一个错误的概念,send 只是把要发送的内容丢进 socket buffer 。
|
8
namelosw 2021-08-26 22:09:45 +08:00
这俩隶属不同的分局,辖区不一样。
|
9
Mohanson 2021-08-26 22:19:56 +08:00
问一个刁钻的问题:
现有一台客户端和一台服务器, 客户端主动建立了到服务端的一个 TCP 连接和一个 UDP "连接", 之后, 拔出客户端的网线, 10 秒后再插回网线. 请问: 此时客户端能否通过 TCP 和 UDP "连接" 向服务端 send 数据, 服务端是否能收到? |
10
Mohanson 2021-08-26 22:22:22 +08:00
扩展题:
1) 如果拔的是服务端的网线? 2) 如果拔网线后间隔 2 小时再插回去, 现象如何? |
11
Mutoo 2021-08-26 23:20:13 +08:00 via iPhone
英文都帮你找好了,叫 tcp over udp
|
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 |
13
jedihy 2021-08-27 06:12:49 +08:00
这叫 connected UDP sockets,性能比 unconnected 要快一点根据不同 OS 实现。
|
14
codehz 2021-08-27 07:25:58 +08:00 via Android
这事吧,还是有一点区别的,除了实现上确实可以 connected 之外,还有就是现实中网络设备也会对时间上和双方地址相近的 udp 包做特殊处理(也就是 NAT )。
试想,如果真的把 udp 做为无状态协议看待,NAT 打洞又该如何实现? |
15
ysc3839 2021-08-27 08:13:45 +08:00 via Android
@Mohanson 如果操作系统能观察到网线连接状态的话,拔掉网线一般会导致这一端的 TCP 连接断开,UDP 则不会。
|
16
fgwmlhdkkkw 2021-08-27 10:18:40 +08:00
已举报。
|