据称 UDP "connection"
Purported UDP "connection"
我的理解是 UDP 不形成连接;它只是盲目地发送数据包。然而,当我 运行
nc -u -l 10002
和
nc -u 127.0.0.1 10002
同时(因此可以在终端之间来回发送消息),lsof
报告两个打开的 UDP 连接:
nc ... UDP localhost:10002->localhost:35311
nc ... UDP localhost:35311->localhost:10002
如果我打开第三个终端并再次执行 nc -u 127.0.0.1 10002
以向原始侦听器发送另一条消息,则侦听器不会收到(或至少确认)该消息,这表明它确实与一个特定的连接。
如果我在 Java 中像 this 一样实现 UDP 回显服务器并做同样的事情(在 10001 上),我得到
java ... UDP *:10001
nc ... UDP localhost:52295->localhost:10001
aka,Java 正在侦听 10001,但 nc 已建立连接。
根据我对 UDP 的理解,我希望双方的行为都像 Java 版本。这是怎么回事?我可以让 Java 版本做任何 nc 正在做的事情吗?这样做有好处吗?
我正在使用 Ubuntu 20.04.3 LTS。
UDP 套接字可以连接(在调用 connect
之后),也可以断开连接。在第一种情况下,套接字只能与连接的对等方交换数据,而在第二种情况下,它可以与任意对等方交换数据。您在 lsof 中看到的是套接字是否已连接。
My understanding was that UDP doesn't form connections; it just blindly sends packets.
这里的 连接 一词有不同的含义。 TCP 有 always“真实”连接,即两个端点之间的关联具有明确的开始(基于 SYN 的握手)和结束(基于 FIN 的拆卸)。因此,用于数据交换的 TCP 套接字始终处于连接状态。
UDP 可以在两个端点之间也有关联,即它可以有连接的套接字。但是,没有明确设置和拆除此类连接。而且不需要连接 UDP 套接字。因此,通过查看流量无法确定连接的 UDP 套接字是在使用中还是未连接。
Can I make the Java version do whatever nc is doing?
是的,请参阅 Java 的 UDP DatagramSocket.connect() 有什么作用?
.
Is there a benefit to doing so?
未连接的 UDP 套接字将从任何对等点接收数据,应用程序必须检查每个接收到的数据报的来源以及是否应接受这些数据报。已连接的 UDP 套接字将仅从已连接的对等方接收数据,即不需要在应用程序中进行检查来检查此数据。
除此之外,如果使用不同的套接字与不同的对等点进行通信,它可能会更好地扩展。但是如果与每个对等点只交换很少的数据包 and/or 如果需要同时与许多对等点通信,那么使用多个连接的套接字而不是单个未连接的套接字可能意味着太多的开销。
我的理解是 UDP 不形成连接;它只是盲目地发送数据包。然而,当我 运行
nc -u -l 10002
和
nc -u 127.0.0.1 10002
同时(因此可以在终端之间来回发送消息),lsof
报告两个打开的 UDP 连接:
nc ... UDP localhost:10002->localhost:35311
nc ... UDP localhost:35311->localhost:10002
如果我打开第三个终端并再次执行 nc -u 127.0.0.1 10002
以向原始侦听器发送另一条消息,则侦听器不会收到(或至少确认)该消息,这表明它确实与一个特定的连接。
如果我在 Java 中像 this 一样实现 UDP 回显服务器并做同样的事情(在 10001 上),我得到
java ... UDP *:10001
nc ... UDP localhost:52295->localhost:10001
aka,Java 正在侦听 10001,但 nc 已建立连接。
根据我对 UDP 的理解,我希望双方的行为都像 Java 版本。这是怎么回事?我可以让 Java 版本做任何 nc 正在做的事情吗?这样做有好处吗?
我正在使用 Ubuntu 20.04.3 LTS。
UDP 套接字可以连接(在调用 connect
之后),也可以断开连接。在第一种情况下,套接字只能与连接的对等方交换数据,而在第二种情况下,它可以与任意对等方交换数据。您在 lsof 中看到的是套接字是否已连接。
My understanding was that UDP doesn't form connections; it just blindly sends packets.
这里的 连接 一词有不同的含义。 TCP 有 always“真实”连接,即两个端点之间的关联具有明确的开始(基于 SYN 的握手)和结束(基于 FIN 的拆卸)。因此,用于数据交换的 TCP 套接字始终处于连接状态。
UDP 可以在两个端点之间也有关联,即它可以有连接的套接字。但是,没有明确设置和拆除此类连接。而且不需要连接 UDP 套接字。因此,通过查看流量无法确定连接的 UDP 套接字是在使用中还是未连接。
Can I make the Java version do whatever nc is doing?
是的,请参阅 Java 的 UDP DatagramSocket.connect() 有什么作用? .
Is there a benefit to doing so?
未连接的 UDP 套接字将从任何对等点接收数据,应用程序必须检查每个接收到的数据报的来源以及是否应接受这些数据报。已连接的 UDP 套接字将仅从已连接的对等方接收数据,即不需要在应用程序中进行检查来检查此数据。
除此之外,如果使用不同的套接字与不同的对等点进行通信,它可能会更好地扩展。但是如果与每个对等点只交换很少的数据包 and/or 如果需要同时与许多对等点通信,那么使用多个连接的套接字而不是单个未连接的套接字可能意味着太多的开销。