WebTransport是一种新的规范,提供了WebSockets的替代方案。对于需要低延迟、事件驱动的端点间通信的应用,WebSockets一直是首选,但WebTransport可能会改变这种情况。
WebSockets是一种技术,能够在客户端和服务器之间通过持久的单套接字连接进行双向、全双工通信。这允许低延迟、实时更新,以及创建更丰富的通信和游戏应用。以前,网络依赖于请求和响应,这对这些类型的应用程序来说不够动态。
较新的WebTransport提供安全、多路复用的实时传输,并且已经有了可靠和不可靠地发送数据的API。在可靠的数据传输中,发送者会被通知数据传输的成功或失败,失败的传输通常会被重新发送,直到成功为止,之后再发送下一个数据包。在不可靠的传输中,没有对传输成功的确认,没有收到的数据包根本不会被传递。不可靠的传输通常用于流媒体视频等,在这种情况下,速度是一个问题,而轻微的数据损失,如几帧视频,是可以接受的。因为WebTransport同时使用这两种方法,所以它有很多用例,如多人游戏的双向数据流、互动直播流以及传感器和物联网设备的数据传输:

WebTransport在单个连接中发送多个数据流
虽然WebSockets为每个连接创建一个流,但WebTransport允许您在一个连接上创建多个流。它避免了WebSockets所遭受的线头阻塞延迟,并且在创建连接时资源消耗较少。虽然WebSockets是作为HTTP/1.1协议开始的,但WebTransport在几个不同的协议之上工作,包括一些WebSockets不支持的协议。
它与HTTP/3一起工作,这是万维网使用的传输协议的即将到来的版本。HTTP/3使用QUIC协议进行传输层数据交换,这有几个优点。QUIC可以防止线头阻塞延迟,在许多情况下改善网络性能。这也是WebSockets的一个限制。
通过WebTransport,编码人员还可以使用承诺和等待关键字等功能来实现异步函数。该API也可以在Web Workers中运行,实现多线程。
下面是WebTransport工作组文档中的一个异步函数的例子:
async function sendData(url, data) {
const wt = new WebTransport(url);
const writable = await wt.createUnidirectionalStream();
const writer = writable.getWriter();
await writer.write(data);
await writer.close();
}
WebTransport工作组仍在敲定规范的细节,因此可能会有更多的特性和功能。在这篇文章中,你将了解WebTransport提供了什么,以及它与WebSockets有什么不同。你还将了解何时以及是否应该进行转换。
一些WebTransport用例
WebTransport有许多潜在的用例。让我们来看看它的四个闪光点。
加密的流媒体
WebTransport的流API允许您创建用于发送有序数据的连接。由于WebTransport使用QUIC协议,这些连接在打开和关闭时的资源消耗比TCP少。
您还可以做一些事情,如更安全地提供流媒体。WebTransport有若干安全措施,例如要求使用Origin头,以及通过传输参数进行特定选择。
通信
WebTransport可以在同一个连接上发送多种类型的数据。这意味着您可以不可靠地发送和接收视频信息,同时可靠地发送文本或文件数据。
这一功能使您可以在每个连接上做更多的事情,从而在更多的同时进行的用户之间进行更丰富的通信。这意味着你可以在不同的通道上发送不同类型的内容,所以像大型图片可以在不同的连接上发送,而不是其他数据,这意味着图片不能阻止聊天通信。
你还可以创建双向流,允许服务器或客户端启动通信,所以如果你正在实施一个消息传递系统,数据交换可以快速发生。
多人游戏玩法
WebTransport与HTTP/2、HTTP/3和QUIC协议一起工作。它可以通过HTTP不按顺序接收数据,并且可以自己请求数据或监听服务器推送的数据。它既能可靠地也能不可靠地做到这一点。
有了WebTransport的双向流,服务器推送的数据具有非常低的延迟,这对游戏开发是一个很大的优势。这意味着用户输入和响应之间的延迟更少,这在射击、驾驶或格斗等动作游戏中可能是至关重要的。
它还可以改善云游戏服务的响应时间,服务器处理渲染和游戏,并将视频流传给瘦客户机,后者将用户输入传回服务器。
传感器数据
许多物联网(IOT)设备记录了需要传输到服务器的数据,WebTransport的一个潜在用途是有一个低延迟的方法来传输这些数据。物联网设备经常定期发送少量数据。消耗较少的资源对设备的电池寿命和网络拥堵都有好处。
随着物联网的发展,使用中的大量设备消耗越来越多的连接可能成为一个问题,所以这些设备越轻巧越好。
你能使用WebTransport吗?
现在让我们来看看WebTransport提供了哪些具体的特性和功能。该规范仍处于公开草案阶段,但已完全可用。
除了QUIC协议外,还有一个API,可以让浏览器控制流和数据报。该API仅适用于HTTPS,强制执行安全。
QUIC
QUIC是一个传输协议,旨在取代TCP并提高网络性能。它使用UDP,而HTTP/3被设计为利用它的优势。当在QUIC上使用HTTP/3时,建立连接的速度更快,并且有拥堵控制反馈来帮助避免问题。如前所述,QUIC还可以防止线头阻塞。
它不需要那么多的头信息,这允许轻量级的通信--没有HTTP的开销。它也是独立于硬件的,只需要在应用层面提供支持。
QUIC已经在浏览器和应用程序中得到广泛支持。目前有7.4%的网站使用它,但这个数字正在稳步增加。
如果你想在Chrome和其他许多基于Chromium的浏览器中尝试使用QUIC,你可以在设置中激活它。
在URL栏中输入chrome://flags ,然后找到实验性QUIC协议设置并启用它,如下图所示。(对于基于Chromium的浏览器,只需将chrome://flags 替换为[browser name]://flags )。

显示QUIC已启用的Chrome设置
其他协议
WebTransport也可以在没有QUIC的情况下在HTTP/2或HTTP/3之上运行。它还可以使用HTTP/2作为后备,使你能够利用WebTransport的优势,而不受网络的影响。
HTTP/2的兼容性有可能让你在不支持HTTP/3的旧设置上运行它,并让你利用资源优先权等功能。
数据报
WebTransport主要使用数据报和数据流。数据报*是一个独立的数据包,可以按任何特定顺序到达。数据包的发送是不可靠的。不可靠的数据可以高速发送,如果一些数据被丢弃,连接可以应付。WebTransport规范允许你使用`maxDatagramSize`属性来限制数据报的大小。
WebTransport对象有一个数据报对象,可以通过其可读和可写属性访问。数据报可以被排队,你也可以创建承诺来等待数据报传输。
WebTransport对象还包括状态数据,表明它们是否正在连接、连接、关闭或失败。它们还包括表明对象是否准备好或关闭的承诺。
流
流允许你发送有序、可靠的数据。你可以建立一个流,让服务器把这个内容推送给客户端。它允许低延迟的实时通信。
在API中,WebTransport对象有代表不同类型流的进一步对象的插槽。这些对象包括SendStream、ReceiveStream和Bidirectional Stream对象,都是在规范的工作草案中定义的。
WebTransport还允许以部分可靠的方式发送多流数据。像这样发送,不保证数据在整体上以正确的顺序到达,而是根据其他相关流的状态排序。这在发送视频帧时效果很好。
通过流,你也可以将收到的数据输送到一个处理程序中,比如一个TextDecoderStream,它可以将数据转换为你的应用程序容易使用的格式。
发送流
SendStream对象是一种用于发送数据的WritableStream。它们存储流对象,但SendStream对象也包含一个承诺,它定义了它将采取的行动,比如关闭或中止。
SendStream对象还包括一个槽,以将其连接到HTTP/3传输层。
接收流(ReceiveStream
ReceiveStream对象是ReadableStream的一种,它处理传入的数据。
ReceiveStream对象的结构与SendStream对象类似,有一个流槽和传输槽。然而,它不包括承诺。
双向流
双向流将发送流和接收流合并到一个对象中,这允许你在一个地方管理双向通信。对象有一个可读和可写属性,对应于上面讨论的ReceiveStream和SendStream对象。
这些属性让它们能够处理以任何方向发送的数据。你读取传入的流并写入传出的流。
单向流
你也可以创建单向的流。IncomingUnidirectionalStreams是由多个ReceiveStreams组成的ReadableStreams。你可以调用createUnidirectionalStream() ,以创建一个出站的等价物。
WebTransport能否取代WebSockets?
WebTransport规范仍在变化之中,但它的未来看起来很光明。随着它的不断成型,我们肯定会看到更多的开发者采用它并利用它带来的新功能。
早期采用者将获得巨大的回报,但也承担最大的风险,因为目前还不清楚该规范将如何完全实现其承诺。我们不知道浏览器对它的支持有多好,开发人员采用它的可能性有多大,或者它将如何发展。WebTransport工作组在2022年3月还有一个里程碑,值得密切关注。
WebTransport在一些用例中具有优势,比如低延迟场景和为多种目的重复使用连接。不过,它并不是银弹,在有些情况下,WebSockets仍然是最好的选择--或者至少是一个完美的选择。
作为一个新的规范,WebTransport仍然是新生事物,所以在其他工具更新到可以使用它之前,它将更难发挥作用。就目前而言,这意味着要保持眼睛和头脑的开放,并准备好适应。
WebSockets仍然提供了大量的功能,并且作为一个成熟的标准,被所有现代浏览器完全支持。WebTransport应提供适度的性能改进和增量收益,但也可能会产生新的工程挑战,必须加以解决以建立可用于生产的系统。
总结
WebTransport已经是WebSockets的一个可行的替代品,它有几个优点。不存在线头阻塞,延迟略低,以及多协议方法的多功能性,在许多情况下都有好处。
由于该技术还没有完全定义,工具也不太发达,而且还将持续一段时间。另一方面,API是可用的,并且有机会使受益于其优势的产品最快进入市场。
现在预测WebTransport的用途还为时过早,但第一批使用它的团队完全有机会建立一些开创性的东西。
虽然没有迫切的需求,但开发者应该在未来的项目中关注它,如果它是最合适的,就准备好使用它。
WebTransport与WebSockets和Ably的比较
Ably正在密切关注WebTransport,但在WebTransport的未来更加确定之前,我们将专注于WebSockets。我们功能丰富的消息传递平台使您能够通过可靠的产品轻松接触您的客户,并随着您的成长而扩展。
试一试吧,看看我们的API是多么容易使用。