关于“lsof -i”的输出和 UDP 无连接的问题

网络工程 协议论 UDP 第 4 层 传输协议
2022-02-16 03:18:17

我有一个简单的设置:

服务器 (IP 10.0.0.33) 使用以下命令侦听端口 7770: $ netcat -lup 7770 客户端 (IP 10.0.0.2) 使用以下命令与服务器通信: $ nc -u 10.0.0.33 7770 < message to server> (more text)

在客户端输入命令后,我在客户端的另一个终端中执行此命令: $ lsof -i COMMAND PID USER FD TYPE DEVICE SIZE/OFF NODE NAME nc 7 root 3u IPv4 197517 0t0 UDP 10.0.0.2:59621->10.0.0.33:7770

该命令如何lsof显示 UDP“连接”?UDP不应该是无连接的吗?

1个回答

是的,UDP 是无连接的。它触发它的数据报,然后它忘记了它。

一台主机中的 UDP 未与另一台主机中的 UDP 协商并创建连接。其中一台主机可以简单地离开,而另一台主机永远不会知道,因为没有连接。

应用程序仍然需要告诉 UDP 打开一个 UDP 端口来发送内容,并且它需要告诉 UDP 目标端口。这就是您所看到的,但这实际上并不是一个主机中的 TCP 与不同主机中的 TCP 协商的连接方式。UDP 不协商或维护连接,它只会发送一个数据报。此外,应用程序可以关闭 UDP 套接字,而 UDP 只是忘记了它,它不会协商关闭与其他主机中的 UDP 的连接。

TCP 连接不仅仅只是寻址,即使 TCP 连接是由寻址标识的。RFC 793,传输控制协议解释:

连接:

上述可靠性和流量控制机制要求 TCP 初始化和维护每个数据流的某些状态信息。这些信息(包括套接字、序列号和窗口大小)的组合称为连接。每个连接都由一对标识其两侧的套接字唯一指定。

当两个进程希望进行通信时,它们的 TCP 必须首先建立连接(初始化每一端的状态信息)。当他们的通信完成时,连接将被终止或关闭以释放资源以供其他用途。

由于必须在不可靠的主机之间以及通过不可靠的互联网通信系统建立连接,因此使用基于时钟的序列号的握手机制来避免连接的错误初始化。


主机操作系统在这里实际上是题外话,主机操作系统如何实现像 UDP 之类的东西是题外话,尽管 UDP 的协议理论是题外话。