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

时间:2015-06-16 18:15:00

标签: python sockets networking tcp udp

我为我的在线游戏制作了一个服务器(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地址? / strong>(我需要知道这一点,以保护我的服务器,但我不想意外阻止一些公平的用户)

3 个答案:

答案 0 :(得分:1)

回答你的上一个问题:没有。这是因为:

  1. 如果客户端位于NAT后面,并且网关(使用NAT)具有多个IP,则您可以将每个连接视为来自不同IP的连接。
  2. 另一个问题是,当同一NAT后面的几个不同客户端将与您的服务器连接时,您将拥有多对TCP-UDP客户端。加入正确的对是不可能的。
  3. 您的方法似乎是解决问题的好方法。

答案 1 :(得分:1)

1-我可以只获取新TCP客户端的IP地址,并通过UDP将数据发送到该IP吗?一般情况下为NO,但是......

2-客户端是否需要连接两次,一次连接TCP,一次连接UDP? NO,最后

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

你真的需要一些TCP,UDP和IP协议的基本知识,以进一步,并且理想地,在OSI模型上。

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

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

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

答案 2 :(得分:1)

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

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

为什么呢?因为您必须注册连接端口,并且无法确定端口是否在客户端上正确打开。

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

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

  

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

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

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

使用UDP,数据包始终具有结束信号。但是你需要实施安全检查。