我一直不太明白这一点:服务器提供的服务可以通过其 IP 地址和端口唯一标识,例如 1.2.3.4:22,但多个客户端可能会同时连接到同一端口。当不同的客户端向服务器发送新数据时,服务器如何区分它们,以便以不同的方式路由数据?
例如,当服务器允许 SSH 连接时,它将默认打开端口 22。多个 SSH 客户端可以连接,这样多个人可以同时使用 SSH,并且他们都将使用端口 22。相信在服务器上,不同的会话通过不同的套接字,每个会话一个,但我可能错了。
但如果是这种情况,当特定用户在其 SSH 会话期间输入新命令时,服务器如何知道将该命令路由到哪个套接字?用户的计算机无法访问套接字描述符,他们只有 IP 地址和端口,因此我不知道他们如何向服务器发送足够的信息以使其区分其会话和另一个会话。服务器是根据客户端的 IP 地址和端口进行区分,还是做其他事情?
答案1
连接的每一端都有自己的 IP 地址和端口。“客户端”(由于 TCP/IP 是点对点的,所以它不是客户端;它是发起者)在自己的系统上有源 IP 和源端口,数据包将发送到这些源 IP 和源端口。连接由源 IP、源端口、目标 IP 和目标端口这四个参数定义,这使得消除连接歧义变得轻而易举。
答案2
阅读 TCP - 它负责创建和跟踪会话。客户端将通过其 IP 和发送端口进行识别,因此这是最低限度。对于某些协议/应用程序,还有进一步的细化,如 cookie、密钥等。
https://en.wikipedia.org/wiki/Transmission_Control_Protocol#Resource_usage
大多数实现都会在表中分配一个条目,将会话映射到正在运行的操作系统进程。由于 TCP 数据包不包含会话标识符,因此两个端点都使用客户端的地址和端口来识别会话。每当收到数据包时,TCP 实现都必须在此表上执行查找以找到目标进程。表中的每个条目称为传输控制块或 TCB。它包含有关端点(IP 和端口)、连接状态、正在交换的数据包的运行数据以及用于发送和接收数据的缓冲区的信息。