【问题标题】:UDP and TCP always use same IP for one client?UDP 和 TCP 总是为一个客户端使用相同的 IP?
【发布时间】:2015-09-01 17:13:57
【问题描述】:

我为我的在线游戏制作了一个服务器(python,twisted)。从 TCP 开始,然后使用 UDP 添加了不断更新(看到了很大的速度提升)。但是现在,我需要将每个 UDP 套接字客户端与每个 TCP 客户端连接起来。

我通过让每个客户端首先连接到 TCP 服务器并获得一个唯一 ID 来做到这一点。然后客户端将此 ID 发送到 UDP 服务器,同时连接它。然后我有一个 TCP 客户端的主列表(按唯一 ID 排序)。

我的目标是能够通过 TCP 和 UDP 向同一个客户端发送消息。
将 UDP 和 TCP 套接字链接到同一个客户端的最佳方法是什么?

我可以只获取一个新 TCP 客户端的 IP 地址,然后通过 UDP 向该 IP 发送数据吗? 或者客户端是否需要连接两次,一次用于 TCP,一次用于UDP(通过发送“连接”消息)?

最后,如果有了解 TCP/UDP 的人可以告诉我(我是新人!),通过 UDP 与 TCP(来自同一台机器)连接时,同一个客户端是否具有相同的 IP 地址?(我需要知道这一点,以保护我的服务器,但我不想意外阻止一些公平的用户)

【问题讨论】:

    标签: python sockets networking tcp udp


    【解决方案1】:

    回答您的最后一个问题:不。因为:

    1. 如果客户端在 NAT 之后,并且网关(带有 NAT)有多个 IP,您可以将每个连接视为来自不同 IP 的连接。
    2. 另一个问题是,当同一 NAT 后面的少数不同客户端与您的服务器连接时,您将拥有一对以上的 TCP-UDP 客户端。而且不可能加入正确的配对。

    您的方法似乎是解决问题的好方法。

    【讨论】:

    【解决方案2】:

    1- 我可以只获取一个新 TCP 客户端的 IP 地址,然后通过 UDP 向该 IP 发送数据吗? 一般情况下不可以,但是...

    2- 客户端是否需要连接两次,一次用于 TCP,一次用于 UDP ? 不,肯定

    3- 当通过 UDP 和 TCP(来自同一台机器)连接时,同一个客户端是否会具有相同的 IP 地址? 是的,除非在特殊情况下

    您确实需要一些 TCP、UDP 和 IP 协议的基本知识,才能在 OSI 模型上走得更远,最好是。

    基础知识(但您应该阅读维基百科上的文章以获得更深入的了解):

    • TCP 和 UDP 是基于 IP 的 2 个协议
    • IP 是一种可路由协议:它可以通过路由器
    • TCP 是一种连接协议:它可以通过网关或代理(防火墙和 NAT)
    • 未连接协议中的 UDP:它无法通过网关
    • 一台机器可能有多个网络接口(硬件插槽):每个都有不同的 IP 地址
    • 一个接口可能有多个 IP 地址
    • 在一般情况下,客户端计算机只有一个网络接口和一个 IP 地址 - 无论如何,您可以要求客户端在连接到您的服务器时向 TCP 和 UDP 提供相同的地址
    • 网络地址转换是指本地网络和外部 Internet 之间存在网关,该网关始终提供自己的 IP 地址并跟踪 TCP 连接以将数据包发送回正确的客户端

    事实上,最严重的问题是客户端和服务器之间是否存在网关。虽然客户端和服务器是两台(虚拟)机器,您可以直接通过键盘访问,但没有问题,但公司网络通常由充当 NAT 的防火墙保护,并且许多国内 ADSL 路由器还包括防火墙和 NAT。在这种情况下,只需忘记 UDP。可以指示家用路由器将所有 UDP 流量传递到单个本地 IP,但这并不一定是一件容易的事。此外,这意味着如果您的用户家里有多台机器,他一次只能使用一台,并且必须重新配置他的路由器才能切换到另一台!

    【讨论】:

    • 这就是 NAT 还包含 UDP 路由表的原因。只要客户端首先开始通话,UDP 就可以很好地穿越 NAT 和防火墙。他目前的方法会奏效。
    【解决方案3】:

    首先,当您使用 TCP 或 UDP 发送数据时,您必须提供端口。

    如果您的客户端使用 TCP 连接,并且在您的服务器使用 UDP 发送响应后,该数据包将被客户端拒绝。

    为什么?因为你必须注册一个端口进行连接,你不能确定端口在客户端上是否正确打开。

    因此,当您在 TCP 中开始连接时,客户端会打开一个端口来发送数据并接收响应。你必须用 UDP 做同样的事情。当客户端开始与服务器进行所有通信时,您可以确定所有必要的端口都已打开。

    不要忘记在连接打开的端口上发送数据。

    我可以只获取新 TCP 客户端的 IP 地址,然后通过 UDP 将数据发送到该 IP 吗?或者客户端是否需要连接两次,一次用于 TCP,一次用于 UDP(通过发送“连接”消息)?

    为什么您不想创建 2 个连接? 例如,您必须使用 UDP 进行移动。因为如果你创建一个 FPS,你可以每 50 毫秒发送一次玩家的位置,所以使用 UDP 非常重要。

    这不仅仅是更好的连接问题。如果您想在客户端和服务器之间建立良好的连接,则需要使用异步连接并使用 STREAM。但是,如果您使用流,您的 TCP 套接字不会发出套接字结束的信号,但您有更好的传输。所以你必须写一些东西来显示数据包结束(例如<EOF>)。 但是你有这个问题。您收到的每个套接字都必须分析数据并拆分<EOF>。它可能需要很多处理器。

    对于 UDP,数据包总是有一个结束信号。但您需要实施安全检查。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2013-02-22
      • 1970-01-01
      • 2012-01-04
      • 1970-01-01
      • 2013-11-23
      • 1970-01-01
      • 2018-09-19
      相关资源
      最近更新 更多