【问题标题】:Realiable UDP - When does the TCP handshake occur?可靠的 UDP - TCP 握手何时发生?
【发布时间】:2021-04-14 03:22:39
【问题描述】:

尝试为我的游戏(在 GameMaker: Studio 中制作)开发一个可靠的 UDP 协议,以连接到 Java 服务器。我需要确保数据包到达并且它们以正确的顺序到达。

我正在尝试模拟 TCP 协议来执行此操作,而让我感到困惑的一件事是 3 次握手:什么时候发生?

第一次连接到某个东西时基本上是握手吗?只做过一次吗? (直到连接断开)

如果是这样,那么我将哪些数据附加到常规数据包中?

假设我有最初的 3 个连接数据包:SYN -> SYN-ACK -> ACK

假设这一切进展顺利,我们已经连接好了。

然后假设我想向服务器发送一条消息:“你好”。我基本上是在为这条消息做SYN -> SYN-ACK -> ACK 吗?我究竟在这个消息包/数据报上附加了什么来确保它按顺序到达?

【问题讨论】:

  • 你为什么要复制 TCP?
  • 我将 GameMaker 用于 P2P 客户端,将 Java 用于匹配服务器。 GameMaker 在两个 GameMaker 客户端之间具有内置的可靠 UDP 协议。但 GameMaker->Java 没有。匹配服务器帮助我连接玩家并允许他们之间的 UDP 打孔。 GameMaker 显然无法获取您打开的 UDP 端口,因此我需要使用 UDP 连接到 Matchmaking 服务器以获取该端口,服务器将依次将我的端口发送给正确的玩家,我们通过发送连接多个数据报对端口进行打孔,因此不需要端口转发。
  • @NomadMaker 因为他需要 TCP 提供的所有功能,但不能使用 TCP,因为它是 NAT 后面的两台机器之间的直接连接。
  • @DavidSchwartz 也许我遗漏了什么,但我已经在 nat 路由器后面的此类网络上建立了 TCP 连接。
  • @NomadMaker NAT 通常只允许出站 TCP 连接。不能从两边出站。

标签: java tcp udp game-maker-studio-2 reliable-message-delivery


【解决方案1】:

根据我的经验,我使用 UDP 发送广播数据包(只是数据包 id 以了解我正在接收的内容)以获取在当前网络中创建的每个服务器。想象一个名为“A”的客户端在网络中寻找可能的匹配项。等待玩家的其他客户端正在广播中发送 UDP 数据报,以便该网络中的每个人都知道它们。客户端“A”连接到匹配后,主机通过 TCP 与“A”链接,以获得稳定的连接。要获取数据包的顺序,请发送一个初始 id 数字,以便客户端收到数据包时知道他收到了什么(例如 id=1 --> ping, id=2 --> player_position, id=3 --> hp_update )。您应该以编程方式获取数据包的顺序。

【讨论】:

    【解决方案2】:

    然后假设我想向服务器发送一条消息:“你好”。我基本上是在为这条消息做 SYN -> SYN-ACK -> ACK 吗?

    没有。数据包的传输没有任何保证。

    我究竟在这个消息包/数据报上附加了什么以确保它按顺序到达并到达?

    您可以在数据包中添加序列号并以编程方式对其重新排序:如果您收到数据包 1、2、3 和 5,则必须等待数据包 4。

    我需要确保数据包到达并且它们以正确的顺序到达。

    如果您需要重传和有序到达(并且可能避免重复),那么很难以编程方式做一些比 TCP 更好的事情!

    【讨论】:

    • 谢谢。好吧,实现可靠的UDP似乎非常复杂。我只需要 UDP,因此我可以将我的 GameMaker P2P 客户端的 UDP 端口发送到 Matchmaking Java 服务器。似乎没有办法在 GameMaker 上打开 UDP 套接字并在不发送数据报的情况下获取 UDP 端口。如果有,我会使用 TCP 将 UDP 端口发送到匹配服务器,然后将 UDP 端口 + IP 发送给其他玩家以尝试 UDP 打孔。 GameMaker 有一个可靠的 UDP 协议,因此它在 2 个客户端之间会很快并且也很可靠。
    猜你喜欢
    • 2011-05-09
    • 2016-09-19
    • 1970-01-01
    • 2019-10-17
    • 2020-09-18
    • 1970-01-01
    • 1970-01-01
    • 2010-12-26
    • 2014-04-27
    相关资源
    最近更新 更多