Sockets 为什么TCP套接字编程需要两个套接字(一个欢迎套接字和一个连接套接字),而UDP只需要一个?

Sockets 为什么TCP套接字编程需要两个套接字(一个欢迎套接字和一个连接套接字),而UDP只需要一个?,sockets,tcp,Sockets,Tcp,这是因为TCP连接是持久连接,所以服务器需要同时处理许多请求,因此需要不同的连接套接字吗 但是,如果UDP传输完成,下一个连接将启动到同一个服务器套接字,因此UDP只需要一个套接字 这是我的猜测。 这是否正确?UDP是一种特殊协议,允许/接受数据丢失。因此,在UDP场景中,接收方不需要一直向服务器报告它已成功接收数据包等 请告诉我们这是否有用,谢谢原因是TCP有两种不同的状态需要控制,而UDP只有一种 在侦听端口上的TCP连接时,网络堆栈需要跟踪您正在使用该套接字侦听的端口号和接口,以及该套接字

这是因为TCP连接是持久连接,所以服务器需要同时处理许多请求,因此需要不同的连接套接字吗

但是,如果UDP传输完成,下一个连接将启动到同一个服务器套接字,因此UDP只需要一个套接字

这是我的猜测。
这是否正确?

UDP是一种特殊协议,允许/接受数据丢失。因此,在UDP场景中,接收方不需要一直向服务器报告它已成功接收数据包等


请告诉我们这是否有用,谢谢

原因是TCP有两种不同的状态需要控制,而UDP只有一种

在侦听端口上的TCP连接时,网络堆栈需要跟踪您正在使用该套接字侦听的端口号和接口,以及该套接字的传入TCP连接请求的积压列表,它将该状态保存在与传递给listen()/bind()/accept()的套接字关联的内部数据结构中。只要套接字存在,该数据结构就会被更新,并且在关闭()该套接字时将被丢弃

另一方面,接受TCP连接后,accept()返回的新TCP套接字具有自己的特定于连接的状态,需要单独跟踪——该状态包括客户端的IP地址和源端口、TCP数据包ID序列、TCP窗口大小和发送速率,为该TCP连接接收的传入数据、为该TCP连接发送的传出数据(如果数据包丢失,可能需要稍后重新发送)等。所有这些都存储在一个单独的内部数据结构中,该结构专门与该新套接字相关联,它将被更新,直到新套接字关闭()'d,此时它将被丢弃

请注意,这两种状态的生存期彼此非常独立——例如,您可能决定不接受任何更多的传入TCP连接,因此您希望关闭第一个(连接接受)套接字,同时继续使用第二个(特定于TCP连接)用于与已连接的客户端通信的套接字。或者,您可能会做相反的事情,并决定不想继续与该特定客户机的对话,因此关闭第二个套接字,但确实想继续接受更多TCP连接,因此将第一个套接字保持打开状态。如果只有一个套接字来处理所有事情,那么只关闭一个上下文或另一个上下文是不可能的;您唯一的选择是关闭()单个套接字,并随之失去所有状态,甚至是您实际想要保留的部分。那充其量也会很尴尬


另一方面,UDP没有“接受连接”的概念,因此只有一种状态,即缓冲发送和/或接收的数据包集(无论其来源和/或目的地如何)。因此,通常不需要有多个UDP套接字。

TCP是直接连接。某些东西必须与其他东西相连接。因此,客户端->服务器关系。这不是TCP的编程部分所需要的。这就是TCP的设计方式(即使是TCP的替代编程模型,如SVR4的不存在的流,也有类似的东西)。您将套接字、数据包和协议混为一谈。TCP套接字和UDP套接字在大多数情况下都是相同的。TCP和UDP协议不同,因为TCP需要一个特殊的握手来确认连接。TCP协议使用TCP数据包,UDP使用UDP数据包,除了它们的头之外,其他数据包都是类似的。套接字是上述协议的唯一软件API层。在开始这些问题之前,你需要阅读更多关于网络的内容。