TCP和UDP端口保留差异和限制

网络工程 通讯协议 UDP
2021-07-19 18:11:58

考虑 TCP:

当我创建服务器套接字时,我从 SO 保留了一个 TCP 端口。当客户端连接到我的服务器时,我的 SO 保留了一个不同的 TCP 端口来交换数据。可以连接到我的服务器的客户端数量是否有限制?

考虑UDP:

当我开始侦听端口时,发送到该端口的所有段是否都是并发的?我的应用程序必须分离源包吗?可以连接到我的服务器的客户端数量是否有限制?

3个回答

在 TCP 级别,由于您在本地和远程主机之间建立了真实连接,因此您的连接由 4 元组(源 IP、源端口、目标 IP、目标端口)唯一标识。因此,无论是在服务器端还是客户端,理论上的限制都非常高,因为即使对于给定的客户端和服务器,以及特定的服务器端口,您仍然可以打开 65536 个具有唯一 4 元组的单独连接。在实践中,正如 Ron Maupin 上面所说的,您首先会遇到其他限制。

在 UDP 级别,由于没有连接,您的套接字仅由其本地 IP 和端口标识,并且通常由您的应用程序来处理分离来自不同主机的数据(查看 .UDPClient.Receive 方法)。例如净)。

服务器可以有尽可能多的客户端连接到单个端口(TCP 或 UDP),与服务器(硬件和软件)可以处理的一样多。

客户端可能对其可以连接的服务器数量有限制,因为出站连接可用的端口数量有限,但在遇到端口号限制之前,它可能会遇到硬件/软件限制。

当我创建服务器套接字时,我从 SO 保留了一个 TCP 端口。当客户端连接到我的服务器时,我的 SO 保留了一个不同的 TCP 端口来交换数据

不,当连接被接受时,服务器操作系统会创建一个新的套接字来表示该连接,但该套接字不使用服务器端的新 TCP 端口。

可以连接到我的服务器的客户端数量是否有限制?

服务器上的端口耗尽不是问题,因为所有连接共享相同的本地端口。

然而,至少在类 Unix 系统上,套接字由文件描述符表示,并且每个进程和系统范围内的套接字数量都有限制。除了内核之外的人为限制还需要为每个连接留出一些内核内存。

当我开始侦听端口时,发送到该端口的所有段是否都是并发的?我的应用程序必须分离源包吗?

对于 UDP,来自所有客户端的数据报在同一个套接字上接收。服务器应用程序必须使用特定的 API 调用来接收和传输元数据。

传统上,这是通过“recvfrom”和“sendto”API 调用完成的。不幸的是,这些调用有一个根本缺陷,它们只提供和接受远程 IP/端口,而不是本地 IP。所以他们可能会在多宿主服务器上行为不端。有更新的 API 可以解决这个问题,但不幸的是,不同操作系统之间的细节有所不同。

可以连接到我的服务器的客户端数量是否有限制?

不是在操作系统级别,如果数据包进入的速度比您的服务器可以处理它们的速度快,那么数据包可能会被丢弃,如果您的服务器需要跟踪客户端,那么它可能会在这样做时耗尽它自己的资源。