UDP和TCP总是对一个客户端使用相同的IP吗?

2024-04-19 16:50:58 发布

您现在位置:Python中文网/ 问答频道 /正文

我为我的在线游戏制作了一个服务器(python,twisted)。从TCP开始,然后用UDP增加了持续更新(速度有了很大的提高)。但是现在,我需要将每个UDP套接字客户端连接到每个TCP客户端。在

我的方法是让每个客户端首先连接到TCP服务器,并获得一个唯一的ID,然后客户端将此ID发送到UDP服务器,并将其连接起来。然后我有一个TCP客户端的主列表(按惟一ID排序)。在

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

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

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


Tags: 数据方法服务器id游戏消息客户端目标
3条回答

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,你可以每50ms发送一次播放器的位置,所以使用UDP非常重要。在

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

使用UDP时,数据包总是有一个结束信号。但你需要实施安全检查。在

回答你最后一个问题:不,因为:

  1. 如果客户机在NAT之后,并且网关(使用NAT)有多个IP,那么每个连接都可以被看作是来自不同IP的连接。在
  2. 另一个问题是,当位于同一NAT之后的几个不同客户端将连接到您的服务器时,您将拥有多对TCP-UDP客户端。也不可能加入正确的配对。在

你的方法似乎是解决这个问题的好办法。在

相关问题 更多 >