我来自 C 背景,根据我的理解,UDP 是一种无连接协议,我认为这意味着在没有先建立连接的情况下无法发送数据包。然而,当我开始使用 Go 并开始编写网络代码时。我意识到 Go 的 UDP 编写器在向主机发送数据包之前先拨号。这是为什么?
UDP是无连接的,至少在原则上是这样(实现方式各不相同)。但是还有一个实现细节需要担心:从“我”(我的 IP 主机和端口地址)向“你”(你的 IP 主机和端口地址)发送一个 UDP 数据包(数据报),我至少必须,指定您的 IP 和端口。如果您想向我发送数据报,则相反。
根据底层操作系统,您或我可以通过sendto系统调用来做到这一点。也就是说,我们从一个socket系统调用开始,然后使用一个sendto系统调用来触发即忘:数据报会消失,或者不会,我们从不费心去看接下来会发生什么。该sendto调用采用目标地址,对于 TCP 或 UDP,该地址提供 IP 地址和端口。
或者,我们可以使用一个socket系统调用,然后是一个可选的bind系统调用,然后是一个connect系统调用。1 的bind,如果我们做到这一点,我们建立了本地端口(可能的IP地址,如果我们有一个以上的),并且connect建立了我们的目的地IP地址和端口。现在我们可以发送带有write或send系统调用的数据包。
(一些系统添加了sendmsg和其他这样的调用,它们通常是上述所有调用的超集,因此可以在没有初步的情况下使用connect。但是所有支持 TCP 的系统都有创建网络连接和绑定和或连接的概念- ing,然后写入数据。)
一种非常有用的最小公分母设置是假设您将在要创建网络连接时指定远程对等地址。要在 Go 中做到这一点,请使用Dial. 即使您的底层系统只有原始 IP 套接字,该库也可以在这些套接字之上构建 UDP 并提供Dial接口,然后在 Go 中仍然可以工作。
1在理想情况下,这可能应该是一个“建立对信息”的系统调用,提供两个本地和远程地址信息,以及任何可选的标志。省略远程说明符意味着“侦听来自每个人的所有传入连接”。这将消除对SO_REUSEADDR标志的需要,标志的存在只是因为否则无法区分 abind之前的 aconnect或 abind之前的 a listen。但是现在修复4.2BSD有点晚了。
| 归档时间: |
|
| 查看次数: |
138 次 |
| 最近记录: |