首页 文章

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

提问于
浏览
1

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

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

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

Can I just take the IP address of a new TCP client, and send them data over UDP to that IP? 或者客户端是否需要连接两次,一次连接TCP,一次连接UDP(通过发送'connect'消息)?

最后,如果有TCP / UDP知识的人可以告诉我(我是新的!), will the same client have the same IP address when connecting over UDP vs TCP (from the same machine)? (我需要知道这一点,以保护我的服务器,但我不想意外阻止一些公平的用户)

3 回答

  • 1

    回答你的上一个问题:没有 . 因为:

    • 如果客户端位于NAT后面,并且网关(使用NAT)具有多个IP,则您可以将每个连接视为来自不同IP的连接 .

    • 另一个问题是,当同一NAT后面的几个不同客户端将与您的服务器连接时,您将拥有多对TCP-UDP客户端 . 加入正确的对是不可能的 .

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

  • 1

    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提供相同的地址

    • 网络地址转换是指本地网络和外来互联网之间存在一个网关,它始终显示自己的IP地址并跟踪TCP连接以将数据包发送回正确的客户端

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

  • 1

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

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

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

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

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

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

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

    它's not just a question of better connection. If you want to have a really good connection between client and server you need to use Async connection and use STREAM. But if you use stream you' r TCP套接字不会发出套接字结束信号但你有更好的传输 . 所以你必须写一些东西来显示数据包的结尾(例如 <EOF> ) . 但你有这个问题 . 您收到的每个套接字都必须分析数据并拆分 <EOF> . 它可能需要很多处理器 .

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

相关问题