【问题标题】:Multiple clients from same IP [closed]来自同一 IP 的多个客户端 [关闭]
【发布时间】:2013-08-25 13:05:20
【问题描述】:

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

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

【问题讨论】:

  • 您不能在同一个 IP 地址上拥有多台计算机,除非您指的是前面有 NAT 设备的专用网络。

标签: python sockets networking socketserver


【解决方案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 可能是您最好的选择。

【讨论】:

    【解决方案2】:

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

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

    【讨论】:

    • 不,实际上我的意思是这个。一所房子从他们的 ISP 获得 1 个 IP 地址,但是有两台计算机想要使用相同的互联网服务。他们的请求将来自同一个 ip。服务应该如何分别回复每个用户?
    • 如果一户人家有路由器,每台电脑都会得到不同的IP地址
    • 在某种程度上你们都是对的。今天,在多台计算机之间共享一个 IP 地址非常普遍,尽管它不是在原始 IP 模型中。使这种共享成为可能的设备称为“NAT”(网络地址转换)。每个家庭“路由器”和许多其他设备都执行此 NAT 功能。 NAT 可能会造成混淆,因为它破坏了地址和端口号的“端到端”透明度。从服务器的角度来看,这两个客户端来自同一个 IP 地址(尽管它们获得了不同的“本地”地址)。但是可以通过源端口来区分!
    猜你喜欢
    • 1970-01-01
    • 2018-06-20
    • 1970-01-01
    • 2012-05-10
    • 1970-01-01
    • 2015-02-19
    • 2015-10-13
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多