为什么UDP服务器只需要一个套接字?

6

我正在复习考试,发现了这个问题:

一个典型的UDP服务器可以使用一个套接字来实现。请解释一下,对于一个TCP驱动的服务器,为什么会创建两个套接字——一个用于所有客户端连接服务器,另一个用于服务器和每个客户端之间的进一步通信。

这是(在我理解中)由并发问题推动的(不希望在联系点地址上与单个客户端进行过多通信)。我知道UDP是无连接的,但无法在我的脑海中形象地说明它。我看到,如果一个服务器是UDP驱动的,它可以执行单个操作(通过/向套接字/端口重复传输内容),然后可以被多个客户端监听。如果一个服务器可以响应两个任务——获取和放置。客户端如何在不创建连接的情况下发出指令呢?在我的想法中,客户端需要在已知端口上发送获取请求,并在同一端口上收到反馈。这将阻碍服务器同时与多个客户端通信的能力。那么,在服务器和其他客户端之间创建第二个套接字进行通信是否更好呢?(如TCP的情况)

2个回答

12

对于TCP协议,唯一的选择就是将一个TCP连接映射到一个套接字(socket),建立在两个端点之间。

对于UDP协议,套接字API允许一个套接字从多个端点接收数据,并向多个端点发送数据 - 所以很多服务器只使用一个套接字,因为不需要更多的套接字。

在某些情况下,协议是简单的请求和响应。没有必要为此创建另一个套接字 - 只需记住源地址,并将响应发送回到那里 - 这就是一些服务器所做的。

对于其他情况,协议可能需要长时间的数据交换,在这种情况下创建一个新的套接字会更加方便,因此一些服务器会这样做。

这将阻止服务器同时与多个客户端通信。

不一定。如果服务器CPU正忙于执行指令,则无论它是否在同一套接字上处理多个客户端,它都无法为其他人提供服务。如果服务器使用阻塞调用(例如数据库查询),或者您想利用多个核心,则可以在多个线程中处理它,即使只有1个套接字也可以使用线程池模式。服务器只需要跟踪每个数据包的源IP地址和端口,以便知道在哪里发送回复。

但是,如果使用多个套接字更符合特定协议/应用程序的需求,例如每个客户端一个套接字 - 这样做也没有问题,通常的方法是:

  • 客户端在服务器的已知端口上发送一个数据包
  • 服务器记录客户端数据包的源端口
  • 服务器创建一个新的套接字,并在该套接字上发送回复
  • 客户端注意到回复的源端口
  • 客户端将该端口用于与服务器进行进一步的通信,而不是使用其已知的端口。

这个回复的后半部分不就是在描述UDP服务器如何实现TCP吗?如果服务器为每个客户端创建一个新套接字,那不就是一种连接,也就是TCP吗?(显然这不是整个协议,但希望我的问题有意义) - sixty4bit
不只是TCP - 重传、流定向、流量控制等等。 - nos

3
客户端(在我看来)需要在已知端口上发送get请求,并在同一端口上获取反馈。这不会阻止服务器与多个客户端同时通信。
不,这是想象出来的。
那么创建第二个套接字来在双方之间进行通信是否更好,以便不会妨碍服务器和其他客户端之间的潜在通信?(例如TCP)
“服务器和其他客户端之间的潜在通信”无论如何都不会被“妨碍”。
创建第二个套接字没有任何优势,并且API也没有要求。您正确地希望客户端发送到并从相同的远程端口接收,但这与您在服务器上创建第二个套接字的愿望相矛盾。第二个套接字将具有不同的端口。

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接