UDP 和 TCP 始终为一个客户端使用相同的 IP?
UDP and TCP always use same IP for one client?
我为我的在线游戏制作了一个服务器(python,扭曲)。从 TCP 开始,然后添加了 UDP 的持续更新(速度有了很大的提高)。但是现在,我需要将每个 UDP 套接字客户端与每个 TCP 客户端连接起来。
我通过让每个客户端首先连接到 TCP 服务器,并获得一个唯一的 ID 来实现这一点。然后客户端将此 ID 发送到 UDP 服务器,同时连接它。然后我有一个 TCP 客户端的主列表(按唯一 ID 排序)。
我的目标是能够通过 TCP 和 UDP 向同一个客户端发送消息。
link 到同一个客户端的 UDP 和 TCP 套接字的最佳方法是什么?
我可以只获取新 TCP 客户端的 IP 地址,然后通过 UDP 将数据发送到该 IP 吗?或者客户端是否需要连接两次,一次用于 TCP,一次用于 UDP(通过发送 'connect' 消息)?
最后,如果任何了解 TCP/UDP 的人可以告诉我(我是新手!),在通过 UDP 与 TCP 连接时,同一个客户端是否具有相同的 IP 地址(来自同一台机器)?(我需要知道这一点,以保护我的服务器,但我不想不小心阻止一些公平用户)
回答你最后一个问题:没有。因为:
- 如果客户端在NAT之后,并且网关(带NAT)有多个IP,那么每一个连接都可以被你看作来自不同IP的连接。
- 另一个问题是,当同一 NAT 后面的几个不同客户端连接到您的服务器时,您将拥有不止一对 TCP-UDP 客户端。并且不可能加入正确的对。
你的方法似乎是解决问题的好方法。
1- 我可以获取新 TCP 客户端的 IP 地址,然后通过 UDP 将数据发送到该 IP 吗? 一般情况下不能,但是...
2- 客户端是否需要连接两次,一次用于 TCP,一次用于 UDP? 否,明确地
3- 通过 UDP 和 TCP(来自同一台机器)连接时,同一个客户端是否会有相同的 IP 地址? 是,特殊情况除外
您确实需要一些 TCP、UDP 和 IP 协议的基本知识才能更进一步,最好是在 OSI 模型上。
基础知识(但你应该阅读维基百科上的文章以获得更深入的理解):
- TCP 和 UDP 是基于 IP 的两种协议
- IP 是可路由协议:它可以通过路由器
- TCP 是一种连接协议:它可以通过网关或代理(防火墙和 NAT)
- 未连接协议中的 UDP:它无法通过网关
- 一台机器可能有多个网络接口(硬件插槽):每个都有不同的IP地址
- 一个接口可能有多个IP地址
- 在一般情况下,客户端计算机只有一个网络接口和一个 IP 地址 - 无论如何,您可以要求客户端在连接到您的服务器时向 TCP 和 UDP 提供相同的地址
- 网络地址转换是指在本地网络和野外互联网之间存在网关,该网关始终提供自己的 IP 地址并跟踪 TCP 连接以将数据包发送回正确的客户端
实际上最严重的问题是客户端和服务器之间是否存在网关。虽然客户端和服务器是两台(虚拟)机器,您可以直接通过键盘访问,这没问题,但企业网络通常受到充当 NAT 的防火墙的保护,许多国内 ADSL 路由器也包括防火墙和 NAT。在那种情况下,只需忘记 UDP。可以指示国内路由器将所有 UDP 流量传递到单个本地 IP,但这不一定是一件容易的事。此外,这意味着如果您的用户在家中拥有多台机器,他一次只能使用一台,并且必须重新配置他的路由器才能切换到另一台!
首先,当您使用 TCP 或 UDP 发送数据时,您必须提供端口。
如果您的客户端使用 TCP 连接,并且在您的服务器使用 UDP 发送响应后,该数据包将被客户端拒绝。
为什么?因为你必须注册一个连接端口,你不能确定端口在客户端是否正确打开。
因此,当您在 TCP 中开始连接时,客户端会打开一个端口来发送数据并接收响应。你必须对 UDP 做同样的事情。当客户端开始与服务器进行所有通信时,您可以确定所有必要的端口都已打开。
不要忘记在连接打开的端口上发送数据。
Can I just take the IP address of a new TCP client, and send them data over UDP to that IP? Or is it necessary for the client to connect twice, once for TCP and once for UDP (by sending a 'connect' message)?
为什么您不想创建 2 个连接?
例如,您必须使用 UDP 进行移动。因为如果你创建一个 FPS,你可以每 50 毫秒发送一次玩家的位置,所以使用 UDP 非常重要。
这不仅仅是更好连接的问题。如果你想在客户端和服务器之间建立良好的连接,你需要使用异步连接并使用 STREAM。但是如果你使用流,你的 TCP 套接字不会发出套接字结束的信号,但你有更好的传输。所以你必须写一些东西来显示数据包结束(例如<EOF>
)。
但是你对此有疑问。您收到的每个套接字都必须分析数据并拆分 <EOF>
。它可能需要很多处理器。
对于 UDP,数据包总是有一个结束信号。但您需要实施安全检查。
我为我的在线游戏制作了一个服务器(python,扭曲)。从 TCP 开始,然后添加了 UDP 的持续更新(速度有了很大的提高)。但是现在,我需要将每个 UDP 套接字客户端与每个 TCP 客户端连接起来。
我通过让每个客户端首先连接到 TCP 服务器,并获得一个唯一的 ID 来实现这一点。然后客户端将此 ID 发送到 UDP 服务器,同时连接它。然后我有一个 TCP 客户端的主列表(按唯一 ID 排序)。
我的目标是能够通过 TCP 和 UDP 向同一个客户端发送消息。
link 到同一个客户端的 UDP 和 TCP 套接字的最佳方法是什么?
我可以只获取新 TCP 客户端的 IP 地址,然后通过 UDP 将数据发送到该 IP 吗?或者客户端是否需要连接两次,一次用于 TCP,一次用于 UDP(通过发送 'connect' 消息)?
最后,如果任何了解 TCP/UDP 的人可以告诉我(我是新手!),在通过 UDP 与 TCP 连接时,同一个客户端是否具有相同的 IP 地址(来自同一台机器)?(我需要知道这一点,以保护我的服务器,但我不想不小心阻止一些公平用户)
回答你最后一个问题:没有。因为:
- 如果客户端在NAT之后,并且网关(带NAT)有多个IP,那么每一个连接都可以被你看作来自不同IP的连接。
- 另一个问题是,当同一 NAT 后面的几个不同客户端连接到您的服务器时,您将拥有不止一对 TCP-UDP 客户端。并且不可能加入正确的对。
你的方法似乎是解决问题的好方法。
1- 我可以获取新 TCP 客户端的 IP 地址,然后通过 UDP 将数据发送到该 IP 吗? 一般情况下不能,但是...
2- 客户端是否需要连接两次,一次用于 TCP,一次用于 UDP? 否,明确地
3- 通过 UDP 和 TCP(来自同一台机器)连接时,同一个客户端是否会有相同的 IP 地址? 是,特殊情况除外
您确实需要一些 TCP、UDP 和 IP 协议的基本知识才能更进一步,最好是在 OSI 模型上。
基础知识(但你应该阅读维基百科上的文章以获得更深入的理解):
- TCP 和 UDP 是基于 IP 的两种协议
- IP 是可路由协议:它可以通过路由器
- TCP 是一种连接协议:它可以通过网关或代理(防火墙和 NAT)
- 未连接协议中的 UDP:它无法通过网关
- 一台机器可能有多个网络接口(硬件插槽):每个都有不同的IP地址
- 一个接口可能有多个IP地址
- 在一般情况下,客户端计算机只有一个网络接口和一个 IP 地址 - 无论如何,您可以要求客户端在连接到您的服务器时向 TCP 和 UDP 提供相同的地址
- 网络地址转换是指在本地网络和野外互联网之间存在网关,该网关始终提供自己的 IP 地址并跟踪 TCP 连接以将数据包发送回正确的客户端
实际上最严重的问题是客户端和服务器之间是否存在网关。虽然客户端和服务器是两台(虚拟)机器,您可以直接通过键盘访问,这没问题,但企业网络通常受到充当 NAT 的防火墙的保护,许多国内 ADSL 路由器也包括防火墙和 NAT。在那种情况下,只需忘记 UDP。可以指示国内路由器将所有 UDP 流量传递到单个本地 IP,但这不一定是一件容易的事。此外,这意味着如果您的用户在家中拥有多台机器,他一次只能使用一台,并且必须重新配置他的路由器才能切换到另一台!
首先,当您使用 TCP 或 UDP 发送数据时,您必须提供端口。
如果您的客户端使用 TCP 连接,并且在您的服务器使用 UDP 发送响应后,该数据包将被客户端拒绝。
为什么?因为你必须注册一个连接端口,你不能确定端口在客户端是否正确打开。
因此,当您在 TCP 中开始连接时,客户端会打开一个端口来发送数据并接收响应。你必须对 UDP 做同样的事情。当客户端开始与服务器进行所有通信时,您可以确定所有必要的端口都已打开。
不要忘记在连接打开的端口上发送数据。
Can I just take the IP address of a new TCP client, and send them data over UDP to that IP? Or is it necessary for the client to connect twice, once for TCP and once for UDP (by sending a 'connect' message)?
为什么您不想创建 2 个连接? 例如,您必须使用 UDP 进行移动。因为如果你创建一个 FPS,你可以每 50 毫秒发送一次玩家的位置,所以使用 UDP 非常重要。
这不仅仅是更好连接的问题。如果你想在客户端和服务器之间建立良好的连接,你需要使用异步连接并使用 STREAM。但是如果你使用流,你的 TCP 套接字不会发出套接字结束的信号,但你有更好的传输。所以你必须写一些东西来显示数据包结束(例如<EOF>
)。
但是你对此有疑问。您收到的每个套接字都必须分析数据并拆分 <EOF>
。它可能需要很多处理器。
对于 UDP,数据包总是有一个结束信号。但您需要实施安全检查。