
WebRTCを閉域で使うことについて
閉域網でWebRTCを使う
閉域でWebRTC…? NAT越えする必要がないのにWebRTCを使うというのはなんだかムズムズします(´・_・`)
しかし、データと映像を低遅延で送り合いたいというニーズを叶えるには、なんだかんだWebRTCが合理的そうです。例えば文字列データをWebSocketで、動画はRTMPなんかを組み合わせても、同じような事ができるはずです。しかし、別々にストリームを管理しなくてはならないということや、遅延が増えてしまうなど別の問題もありそう。なので、興味本位から他に良い代替案はないものかと天下のChatGPTに聞いてみました。「WebRTCぐらい遅延に気をつけて候補をください」とお願いしてみました。
プロトコル | シグナリング | 低遅延 | 映像 & 音声 | 双方向データ通信 |
---|---|---|---|---|
WebRTC | ❌ 必要 | ✅ 低遅延(最適化済み) | ✅ あり | ✅ データチャネルあり |
SRT | ✅ なし | ✅ 低遅延(RTMPより良い) | ✅ あり | ❌ データ送信なし(別途WebSocketが必要) |
QUIC/WebTransport | ✅ なし | ✅ 低遅延 | ✅ あり | ✅ データ通信可能 |
ZeroMQ + UDP | ✅ なし | ✅ 超低遅延 | ❌ なし(自前実装) | ✅ 可能 |
RTP + WebSocket | ✅ なし | ✅ 低遅延 | ✅ あり | ❌ WebSocketを追加で使う |
意外といろいろな手法があるようです。QUIC/WebTransportは聞いたことがありましたが、まだあまり普及していない印象です。WebRTCのように多くの手順を踏まずに、クライアント・サーバで通信を気軽に実現させるものだと思われます。
また、Secure Reliable Transport (SRT)というのは初めて知りました。その名の通り、セキュアで信頼のある動画送受信を目指したということでした。SRTでは、スポーツ中継など、リアルタイムかつ品質を落としたくないようなシーンで使われることを想定する一方で、WebRTCはテレビ会議やIotなんかのように、遅延を最小にすることに重きをおいているような印象を受けます。
こうしてみると、同じ映像配信のプロトコルではありますが、思想や用途によって随分異なるものになるんだなと興味深いです。
ただその一方で、様々な技術が栄枯盛衰を辿っており、技術の移り変わりが早いなと思います。そういったことも原因か、デファクトスタンダードなライブラリもあまり充実しておらず、興味本位で手を出すにはなかなか大変そうな印象です。その一方で、WebRTCはこれらに対してかなり普及しており(?)、動画送受信やデータのやりとりなど、かなり多くのことが気軽に試せる土壌があります。偉大な先人に感謝ですね。
(´・_・`)
話がそれましたが、WebRTCを使うのであれば、世にあるライブラリなどのサービスを使うのが楽です。自前でやろうとすると、シグナリングサーバ、STUNサーバ、TURNサーバと実装するものが多くなってしまい非常に面倒です。しかし、閉域ネットワークで使う場合、ライブラリに含まれるシグナリングサーバなどは、インターネット上にあることがほとんどであるため、閉域ネットワーク内にシグナリングサーバを自前で作る必要があります(STUNやTURNはNATを越える技術なので、プライベートIPでの通信ができるのであれば不要)。
今回、閉域でWebTRTCを行いたいことから、自前でシグナリングサーバを立ててみました。シグナリングサーバとは言いますが、今回作ったような簡易なケースだと、WebSocketサーバーで、SDPとICEを交換する仕組みがあればよいというものでした。実際に書いてみると、ライブラリで行っている箇所の理解や、細かい設定ができることに気付き、研究でも使えそうなインスピレーションが湧いてきました。ちなみに、コードのGithubリンクを載せようと思いましたが、Privateリポジトリであることを忘れていたので、自前で何かを作ってみるのも悪くないことしか言えませんでした(何のための記事だったのか)。要するに、普段ライブラリなどで脳死で使っているものを理解するのは、思いの外学びがあったという話でした。(´・_・`)