WebSockets UDP(或替代)扩展
该存储库旨在表达公众对一种技术的需求,该技术可以实现服务器-客户端低延迟通信,而无需底层传输协议的强制可靠性和/或有序交付机制。
并根据现有需求和潜在的未来应用来制定要求。为了激励 W3C 成员、IETF 社区和浏览器供应商开始讨论并提出 RFC,以推动解决方案的进一步开发。
欢迎 PR 和问题中的讨论。请转发,欢迎转发。
目录
- 概述
- 问题
- 可能的解决方案
- 1. WebSockets UDP(或替代)扩展
- 2. WebUDP(或替代方案)-新的简单 API
- 3.WebRTC 2.0 - 简化
- 要求
- 安全
- 传输协议
- 公众讨论和需求
- 潜在的第一个适配器
概述
Web 在过去几年中发展迅速,使用以下技术改进了网络功能: WebSockets、WebRTC、HTTP/2、服务器发送事件、QUIC 。
这些技术有自己的应用领域,并使网络平台具有:
- 浏览器之间的语音和视频通信(WebRTC)
- 点对点数据交换 (WebRTC)
- 实时服务器-客户端通信 (WebSockets)
- 更快的网站交付 (HTTP/2)
- 更快的连接和数据传输 (QUIC)
- 高效实时更新网站内容(服务器发送事件)
以及更多丰富而强大的体验
近年来另一种媒介诞生: HTML5游戏。 Adobe Flash 正在消失,HTML5 游戏行业正在稳步增长。
这导致了 IO Games 的诞生——这是最容易上手的多人游戏之一。一些流行的例子:agar.io、slither.io 等等。它们都依赖于当前唯一可行的实时服务器-客户端通信技术 - WebSockets。服务器-客户端的 WebRTC 过于复杂(进一步阅读)。
但这限制了网络功能,因为游戏的 TCP 也有限制。值得一提的是,这不仅与游戏有关,还有大量低延迟、不可靠和无序服务器-客户端通信的用例。
问题
延迟和拥塞。 TCP 具有可靠且有序的数据包传输,并且是基于连接的协议。相对于 TCP 的 UDP(或替代方案)的需求不存在问题,因为许多文章都广泛讨论了 UDP(或替代方案)在不同情况下相对于 TCP 的优势。这里我们只是尝试总结一下。值得一提的是,UDP 是最流行的,但不是唯一的传输协议选项。
可靠性- 应用程序逻辑并不总是需要这一点,过时的信息可能不再相关并且可以被忽略。 TCP 将确保数据包的传送,这会导致拥塞,从而由于需要确认和重新传送数据包而导致延迟峰值。 UDP(或替代方案)不保证开箱即用的可靠性,因此可以避免拥塞问题,这可以用来确保尽快传送最新数据。
有序传送- TCP 使用排序和确认来保证数据包的有序读取和重新传送。这会导致阻塞读取,从而导致延迟峰值,如果网络环境丢包率较高,情况会变得更糟。
可能的解决方案
协议不保证可靠性和开箱即用的有序交付,允许开发人员在需要时在其之上实施任何技术或使用混合方法。这可以在不太完美的网络环境中提供稳定的传输时间和低延迟。通过拥塞控制来缓解互联网基础设施不堪重负的情况,从而解决安全问题。
1. WebSockets UDP(或替代)扩展
解决此问题的选项之一是使用 RFC 6455 中描述的协商机制向现有 WebSockets 协议添加新的扩展。这将实现额外的功能来建立 UDP(或替代)协议通信。这将受益于现有的基于源的 WebSocket 安全模型,并允许开发人员遵循渐进式方法,如果任何一方(服务器或客户端)不支持此类扩展,他们可以回退到 TCP 逻辑。
2. WebUDP(或替代方案)-新的简单 API
另一种方法是开发全新的 API,与 WebSocket 非常相似,它将解决 UDP(或替代)网络逻辑的独特功能,并可能为开发人员提供额外的功能,以及如何发送消息的细粒度选项。
3.WebRTC 2.0 - 简化
WebRTC 的当前状态过于复杂,主要是为点对点通信而设计的。由于这在服务器-客户端通信中没有得到很好的采用,并且需要大量的开发人员资源。简而言之,它不像今天的 WebSocket 那样对单独的 Web 开发友好。扩展规范以模块化和简化要求的潜在选项,允许使用 WebRTC 的某些部分,使其更易于服务器客户端场景使用,并简化 API,使其更易于 Web 开发人员使用。
4. 网络传输
WebTransport API 的草案规范允许 Web 应用程序建立交互式、双向、多路复用的网络连接 - 支持可靠和不可靠的通信。
要求
- 安全
- 基于源的安全模型- 防止 UDP(或替代)探测(端口扫描)并适合服务器-客户端网络模型。
- 服务器-客户端- p2p 已经由 WebRTC 解决,这项工作的目标是为服务器-客户端通信场景找到简单易用的解决方案。
- 使用简单- WebSockets 的成功很大程度上是因为它在服务器端实现起来很简单,并且在浏览器中使用起来也很容易。
- 最小标头开销- 可能需要通过纯 UDP(或替代方案)进行一些额外的数据帧,但必须保持在最低限度。
- 最低意见或技术要求- 当 WebSocket 最小时,WebRTC 会受到复杂性和要求的影响,因为这使得各种平台和 Web 开发人员能够快速适应。
安全
此类 API 和底层协议实现应解决安全问题,使其网络友好:
- DDoS 攻击- 不暴露原始协议功能将利用类似于 WebSocket 的安全实践。
- 端口扫描- 使用基于源的安全模型将需要握手和验证标头,以防止连接到任何 IP 和端口的可能性。
- 加密- 利用 HTTP/HTTPS 的现有加密机制。
- 拥塞控制——为了避免互联网基础设施溢出,底层传输协议必须实施拥塞控制。
API 应该解决这些安全问题,而不会使前端的 API 以及后端的实现过于复杂。这就是为什么 UDPSocket 不是一个选项。
传输协议
可用于实现的潜在底层协议列表:
- DCCP (RFC-4340) - 是基于连接的消息协议,可实现功能协商和拥塞控制。它不实现可靠性或有序交付作为协议的一部分,将其留给应用层。该协议还具有基于 UDP 的 DCCP-UDP (RFC-6773) 实现路径,以便在互联网基础设施原生支持 DCCP 之前利用具有 UDP 功能的现有 NAT。
- QUIC (IETF 草案)- 是 Google 实现的相当新的基于连接的传输层协议,并且已经在 Chrome 中可用。它是在 UDP 之上实现的快速发展和发展的协议。它旨在减少连接和传输延迟以及带宽。尽管它具有内置的可靠性,但这对于当前的工作来说可能是不可取的。
- SCTP (RFC-4960) - 是基于标准化消息的协议,具有可选的可靠性和内置的有序交付以及拥塞控制。它还用于 WebRTC 中的 DataChannel。由于 WebRTC 的采用,它可以为互联网基础设施和操作系统级别的实现提供更好的支持。
- DTLS (RFC-6347) - 是一个可以在传输协议之上实现的层,以提供安全性以满足 Web 要求。 WebRTC 实现也使用它。
公众讨论和需求
- 黑客新闻 - 关于此存储库主题的讨论。
- 为什么我无法从浏览器发送 UDP 数据包? - 详细分析浏览器中使用 UDP 的原因并提出替代解决方案:netcode.io。作者:格伦·费德勒。
- UDP 与 TCP - 哪种协议最适合游戏?格伦·费德勒
- 黑客新闻:WebRTC:网页游戏的未来 (getkey.eu) - 讨论为什么 WebRTC 不是合适的替代方案。
- 全面深入了解客户端-服务器网页游戏的 WebRTC - 从文章中可以明显看出 WebRTC 的复杂性以及实现的难度。由于其复杂性,主要浏览器供应商采用它的速度很慢。但 UDP 相对于 TCP 的网络优势从文章中显而易见。
潜在的第一个适配器
- http://agar.io/
- http://slither.io/
- 实时数据可视化(时间至关重要)
- 各种 HTML5 多人游戏(例如 http://iogames.space/)
- Facebook 即时游戏
- 请公关您的案例