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リポジトリであることを忘れていたので、自前で何かを作ってみるのも悪くないことしか言えませんでした(何のための記事だったのか)。要するに、普段ライブラリなどで脳死で使っているものを理解するのは、思いの外学びがあったという話でした。(´・_・`)