您将 TCP 连接与套接字混淆了。套接字不是网络级别的概念。是一个操作系统概念。TCP 连接作为 (source-ip, source-port, dest-ip, dest-port) 的唯一组合存在于网络上。套接字是打开端口或打开连接的句柄(此语句略微简化)。当我开始时,我还认为这很令人困惑,并且是一个操作系统设计错误(但它就是这样,我们被困住了)。设计错误是每个不同套接字的允许操作非常不同。这些用例应该是两个独立的概念,具有不同的名称和不同的 API。
如您所见,套接字和连接之间没有 1:1 的关系。
有人可以用逐步算法彻底描述这个吗
服务器打开一个套接字让操作系统知道它想要监听或连接。然后,每个接受的连接都会产生一个新的、独立的套接字。但是,每个新连接都在相同的服务器 IP 和服务器端口上。只是客户端 IP 和/或客户端端口不同。服务器读取和写入每个连接的套接字。开放端口套接字仅用于接受新连接。
服务器在概念上是这样的:
var openPortSocket = Open(80); //HTTP port
while(true) {
var connectionSocket = openPortSocket.Accept();
ServeConnectionOnNewThread(connectionSocket);
}
这是一个逻辑模型。实际的 API 调用是不同的。例如,大多数服务器使用异步 IO。不过,这与您的问题无关。
客户端必须为每个连接使用不同的客户端端口。这正是您的浏览器所做的。