如果您有使用特定端口的服务,并且在同一个 IP 地址上有多台计算机,如何处理?服务是否应指定应将信息发送到 IP 地址上的哪台计算机?如果同一 ip 上的两台计算机使用相同的服务,但请求不同的信息怎么办?
此外,如果客户端在动态 ip 上,服务应该如何检测到 ip 已更改,但客户端(和会话)是相同的?客户端是否应该为每个请求标识自己(很像 http 上的 cookie)?
如果您有使用特定端口的服务,并且在同一个 IP 地址上有多台计算机,如何处理?服务是否应指定应将信息发送到 IP 地址上的哪台计算机?如果同一 ip 上的两台计算机使用相同的服务,但请求不同的信息怎么办?
此外,如果客户端在动态 ip 上,服务应该如何检测到 ip 已更改,但客户端(和会话)是相同的?客户端是否应该为每个请求标识自己(很像 http 上的 cookie)?
你有很多问题,我会尽量一一回复。
如果您有使用特定端口的服务,并且在同一个 IP 地址上有多台计算机,如何处理?
有人提到多台计算机不能有相同的IP地址。在最初的 IP 模型中,这是正确的,尽管今天这种地址共享(通过 NAT)很常见。但即使在原始模型中,如果您稍微重新制定它,您的问题也是有道理的:
“如果你有一个使用特定端口的服务,并且你有多个客户端在同一个 IP 地址上,这是如何处理的?”
同一台主机上可能有多个客户端进程(因此共享相同的 IP 地址)尝试联系同一台服务器(使用相同的目标地址+端口组合)。这在开发 IP 时很自然,因为大多数功能强大到可以连接到网络的机器都是多用户机器。这就是为什么 TCP(和 UDP)在两端(源和目标,或客户端和服务器)都有端口号的原因。客户端进程在联系服务器时通常不会指定源端口,但主机操作系统会在套接字(连接)的生命周期内为套接字分配一个“临时”源端口。所以这就是服务器区分来自同一地址的客户端的方式:通过它们的源端口。
NAT 将不同的主机(具有不同的“内部”IP 地址)映射到相同的“外部”IP 地址,但它也会为传出数据包分配唯一的源端口。所以服务器看到这就像原来的情况(来自同一个“主机”/IP地址的多个客户端进程)。然后,NAT 将服务器对不同内部主机的响应“解复用”。
服务是否应指定应将信息发送到 IP 地址上的哪台计算机?如果同一 ip 上的两台计算机使用相同的服务,但请求不同的信息怎么办?
服务器通过向不同客户端用作源地址/端口的相同地址+端口组合发送响应来做到这一点。这主要由套接字 API 自动处理。如上所述,两个客户端将获得单独的连接,并且服务器希望将这些作为单独的“会话”处理,并且不会混淆这些会话之间的请求。
此外,如果客户端在动态 ip 上,服务应该如何检测到 ip 已更改,但客户端(和会话)是相同的?客户端是否应该为每个请求标识自己(很像 http 上的 cookie)?
现在,这是一整罐蠕虫。如果服务想要“幸存”客户端 IP 地址更改,则必须使用其他标识符。HTTP(会话)cookie 就是一个很好的例子。TCP 连接因地址更改而中断 - 这是正常的,因为在设计 TCP/IP 时,并未将此类更改视为正常操作的一部分。已经尝试过使 TCP/IP 更加健壮以应对此类变化,例如 Mobile IP、MPTCP 和可能的 SCTP,但这些都还没有真正进入主流。将您的协议基于 HTTP(S) 并使用会话 cookie 可能是您最好的选择。
我不认为我完全理解你所说的。多台计算机不可能在同一个 IP 上,这不是互联网的工作方式。有一些协议可以处理这些事情。
您的意思是您是服务器并且多台计算机尝试连接到您吗?如果是这样,你监听一个端口,当你得到一个连接时,你为该计算机的服务打开一个新线程,主循环仍在监听