通过 WebRTC 数据通道实现 WebService 是否可能且合理?

Is it possible and plausible to implement a WebService over a WebRTC Data Channel?

是否可以通过 WebRTC 数据通道实现 WebService?

想法是:

好处?:

缺点:

想法:

[编辑]

我找到了这个存储库:https://github.com/jsmouret/grpc-over-webrtc 太棒了!

[EDIT2]

稍微调查了一下后,更改了 Orbit-db 的想法并删除了集群 IPFS

[EDIT3]

在为 HTTP/2 搜索 Fetch PROS 后,我发现使用 ReadableStreams 的 Fetch 上传流,我不知道与 运行 GRPC (bidi) 相比有多大区别WebRTC DataChannel 或 HTTP/2 Stream

https://www.chromestatus.com/feature/5274139738767360#:~:text=Fetch%20upload%20streaming%20lets%20web,things%20involved%20with%20network%20requests).

解释该功能的视频非常棒:https://www.youtube.com/watch?v=G9PpImUEeUA

这里有很多不同点,将尝试解决所有问题。

这个想法是 100% 可行的。查看 Pion WebRTC 的 data-channels 示例。建立连接只需要一个 request/response。

性能

如果您从事对延迟敏感的工作,数据通道更适合。

使用数据通道,您可以测量背压。您可以知道有多少数据已交付,有多少已排队。如果队列变满,您就知道发送了太多数据。浏览器中的其他 API 不会给你这个。有一些未来的 API (WebTransport),但它们还不可用。

数据通道允许 unordered/unreliable 传送。使用 TCP,您发送的所有内容都将按顺序交付,这个问题被称为线头阻塞。这意味着如果您丢失了一个数据包,则所有后续数据包都必须延迟。例如,如果您发送 0 1 2 3,如果数据包 1 尚未到达,则 2 和 3 尚无法处理。数据通道可以配置为在数据包到达时立即为您提供数据包。

我无法为您提供有关 运行 宁 DTLS+SCTP 与 TLS+WebSocket 服务器的 CPU/Memory 成本的具体数字。这取决于 hardware/network 你有什么,工作量是多少等...

多路复用

您可以通过单个 WebRTC 连接 (PeerConnection) 提供多个 DataChannel 流。您还可以通过单个端口提供多个 PeerConnections。

网络传输

WebRTC 可以 运行 通过 UDP 或 TCP

负载平衡

这更难(但不是棘手)在服务器之间移动 DTLS 和 SCTP 会话对于现有库来说并不容易。使用 pion/dtls 它支持 export/resume 会话。但是我不知道其他图书馆的支持。

TLS/Websocket更容易负载均衡。

端到端加密

WebRTC 有强制加密。这对 HTTP 1.1 来说很好,如果配置不正确,它可能会意外回退到非 TLS。

如果您想通过服务器路由消息(并且不让服务器看到它),我认为您使用的协议并不重要。

拓扑结构

WebRTC 可以在许多不同的拓扑结构中 运行。您可以进行 P2P 或 Client/Server,以及介于两者之间的许多事情。根据您正在构建的内容,您可以构建 hybrid mesh。您可以创建连接图,并根据需要部署服务器。这种灵活性让您可以做一些有趣的事情。


希望能解决您的所有问题!很高兴在 comments/will 继续编辑问题中进一步讨论。

如果您的主要用例交换小内容,您可以看看 CoAP RFC 7252。尽管请求和响应的交换消息共享相同的格式,但对等点可以轻松实现客户端和服务器这两个角色。

对于 DTLS 1.2 的一些高级用法,DTLS Connection ID 可以为您带来一些神奇效果。

如果你不坚持使用java脚本并且java是一个选项,你可以查看开源项目Eclipse/Californium. That's a CoAP/DTLS implementation, which comes with DTLS Connection ID and some prepared advanced examples as built-in-cid-load-balancer-support or DTLS-graceful-restart

几年前我也想知道这个 HTTP-over-WebRTC DataChannel 的想法。手头的问题是如何安全地从 Web 应用程序连接到位于防火墙后面的物联网设备 (raspberry pi)。

由于没有现成的解决方案,我最终构建了一个原型。它完成了这项工作,并且自 2019 年以来一直处于实时部署状态。

请参阅此技术博客 post,其中更详细地介绍了设计和实现: https://webrtchacks.com/private-home-surveillance-with-the-webrtc-datachannel/

高级架构:

简化序列图:

最近开始将代码提取到独立存储库中。

https://github.com/ambianic/peerfetch