【问题标题】:Push notification from server to client using UDP使用 UDP 将通知从服务器推送到客户端
【发布时间】:2015-09-11 16:07:15
【问题描述】:

我们想要构建一个简单的数据共享应用程序,其中 2 台 Android 手机(或计算机)连接到任何互联网(wifi/网络)上,通过 HTTPS 将其数据上传和下载到服务器。

例如A 想向 B 发送数据,A 会触发类似 HTTPS API 的“put”,并将数据上传到 B 的 bucket。B 会调用类似 HTTPS API 的“get”并下载其内容。

现在的问题是 A 和 B 之间的通信是基于需求的。它可能在几分钟、几小时或几天后发生。如果我们使用 HTTPS 方式,那么我们将不得不让 B 长时间轮询服务器,这会在没有消息的情况下耗尽资源数天。如果我们每 1 分钟或 2 分钟轮询一次,那么通信将不会近乎实时地发生。

为了解决这个问题,我们提出了以下想法:

  1. 每当手机注册到互联网时,它都会创建一个 UDP 端口并 绑定到它
  2. 它与服务器建立 1 次 HTTPS 连接并发送其 IP 地址和端口
  3. 服务器和客户端之间可以有可选的虚拟数据交换 使用 UDP(往返)
  4. 在此客户端没有任何活动连接并保持 在同一个互联网上;它在 UDP 上持续等待
    接收数据的端口;如果互联网再次发生变化 从第 1 步开始重复
  5. 当接收到给定客户端的数据时,服务器发送 一些预定义的虚拟 UDP 数据作为唤醒呼叫发送给客户端。这 数据持续发送,直到通过 HTTPS 读取客户端存储桶
  6. 识别在 UDP 上接收到的数据后,客户端会进行 HTTPS 连接到服务器并从其存储桶中读取其预期数据,并 关闭;服务器识别到这一点并停止 UDP

理论上这个解决方案看起来不错。但是从互联网上我遇到了以下问题,我需要回答:

  • 应该从什么样的IP地址和端口发送到服务器 客户?是 ISP/网络提供的 IP 还是其他什么?
  • 服务器如何识别确切的客户端来发送一些 UDP 数据? 例如如果同一互联网上的 2 部手机具有相同的 IP 和端口
  • 在C socket库中,UDP连接有2种方式:(1) connect() 然后send()/recv() (2) 直接 sendto()/recvfrom() 使用 IP 地址。应该用在哪个 这种情况?

除上述问题外,欢迎对上述“推送通知”的实际方式进行任何改进。

【问题讨论】:

  • 由于客户端可能没有公共 IP,恐怕您不能使用这种解决方案。
  • @Qiau,这是否意味着服务器到客户端的 UDP 数据是不可能的?在这种情况下(从服务器到客户端),流媒体/VoIP 应用程序如何工作?

标签: android networking https push-notification udp


【解决方案1】:

您需要照顾 NAT 后面的客户端,为此您可以使用UDP Hole Punching

假设 A 和 B 是两台主机,各自在自己的专用网络中;北美和 NB 是两个具有全球可访问 IP 地址的 NAT 设备 EIPA 和EIPB; S是全球知名的公共服务器 可访问的 IP 地址。

  1. A 和 B 各自开始与 S 的 UDP 会话; NAT 设备 NA 和 NB 创建 UDP 转换状态并分配 临时外部端口号 EPA 和 EPB
  2. S 检查 UDP 数据包 获取 NA 和 NB 使用的源端口(外部 NAT 端口 EPA 和环保局)
  3. S 将 EIPA:EPA 传递给 B,将 EIPB:EPB 传递给 A
  4. A 发送一个数据包到 EIPB:EPB。
  5. NA 检查 A 的数据包并在 其翻译表:{Source-IP-A, EPA, EIPB, EPB}
  6. B 发送一个数据包 至 EIPA:EPA
  7. NB 检查 B 的数据包并在 其翻译表:{Source-IP-B, EPB, EIPA, EPA}
  8. 取决于 当 B 的第一个数据包到达时 NA 的转换表的状态(即 元组 {Source-IP-A, EPA, EIPB, EPB} 是否已由 B的第一个数据包到达的时间),B的第一个数据包被丢弃 (翻译表中没有条目)或通过(翻译表中的条目 已制作)。
  9. 取决于 NB 的转换表的状态,当 A 的第一个数据包到达(即元组 {Source-IP-B, EPB, EIPA, EPA} 已在 A 的第一个到达时创建 数据包),A的第一个数据包被丢弃(转换表中没有条目) 或通过(已在翻译表中输入)。
  10. 在最坏的情况下, 来自 A 的第二个数据包到达 B;最坏的情况是来自 B 的第二个数据包 到达 A. 在 NAT 中已“打孔”,两台主机都可以 交流。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2016-01-10
    • 1970-01-01
    • 2012-09-10
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多