http - 多个客户端如何同时连接到服务器上的一个端口,比如 80?

标签 http tcp connection client-server port

<分区>

我了解端口工作原理的基础知识。然而,我不明白的是多个客户端如何同时连接到端口 80。我知道每个客户端都有一个唯一的(对于他们的机器)端口。服务器是否从可用端口回复客户端,并简单地声明回复来自 80?这是如何工作的?

最佳答案

首先,“端口”只是一个数字。所有“到端口的连接”真正代表的是一个数据包,该数据包在其“目标端口” header 字段中指定了该编号。

现在,您的问题有两种答案,一种针对有状态协议(protocol),另一种针对无状态协议(protocol)。

对于无状态协议(protocol)(即 UDP),没有问题,因为“连接”不存在 - 多个人可以向同一个端口发送数据包,并且他们的数据包将以任意顺序到达。没有人处于“连接”状态。

对于有状态协议(protocol)(如 TCP),连接由一个由源和目标端口以及源和目标 IP 地址组成的 4 元组标识。因此,如果两台不同的机器连接到第三台机器上的同一个端口,则有两个不同的连接,因为源 IP 不同。如果同一台机器(或 NAT 后面的两台或共享同一 IP 地址的两台机器)两次连接到一个远程端,则连接由源端口(通常是随机的高编号端口)区分。

简单地说,如果我从客户端连接到同一个 Web 服务器两次,从我的角度来看,这两个连接将具有不同的源端口,而从 Web 服务器的角度来看,这两个连接将具有不同的源端口。因此没有歧义,即使两个连接具有相同的源和目标 IP 地址。

端口是一种多路复用 IP 地址的方法,这样不同的应用程序就可以监听相同的 IP 地址/协议(protocol)对。除非应用程序定义了自己的更高级别的协议(protocol),否则无法复用端口。如果使用相同协议(protocol)的两个连接同时具有相同的源和目标 IP 以及相同的源和目标端口,则它们必须是相同的连接。

关于http - 多个客户端如何同时连接到服务器上的一个端口,比如 80?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/3329641/

相关文章:

c# - TCP 连接到 Azure 失败

javascript - Node.js 服务器限制新连接

connection - phantomjs如何获取建立连接时间

postgresql - c3p0 池无法建立连接。如何调试这个?

c# - 如何启用 CORS 支持和 NTLM 身份验证

C# : System.Net.WebException: 底层连接已关闭

python - 如何通过 python 脚本路由 HTTP 请求?

java - 使用 Java 发送 Tor NEWNYM 请求

mysql - 如何从 MySql 服务器到 Android 应用程序?

ios - GCDWebserver 监听 HTTP POST