0

如果您有使用特定端口的服务,并且在同一个 IP 地址上有多台计算机,如何处理?服务是否应指定应将信息发送到 IP 地址上的哪台计算机?如果同一 ip 上的两台计算机使用相同的服务,但请求不同的信息怎么办?

此外,如果客户端在动态 ip 上,服务应该如何检测到 ip 已更改,但客户端(和会话)是相同的?客户端是否应该为每个请求标识自己(很像 http 上的 cookie)?

4

2 回答 2

1

你有很多问题,我会尽量一一回复。

如果您有使用特定端口的服务,并且在同一个 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 可能是您最好的选择。

于 2013-08-25T19:03:51.603 回答
0

我不认为我完全理解你所说的。多台计算机不可能在同一个 IP 上,这不是互联网的工作方式。有一些协议可以处理这些事情。

您的意思是您是服务器并且多台计算机尝试连接到您吗?如果是这样,你监听一个端口,当你得到一个连接时,你为该计算机的服务打开一个新线程,主循环仍在监听

于 2013-08-25T13:34:24.403 回答