Upgrade to Pro
— share decks privately, control downloads, hide ads and more …
Speaker Deck
Features
Speaker Deck
PRO
Sign in
Sign up for free
Search
Search
P2P通信の標準化 WebRTCを知ろう
Search
Sponsored
·
Ship Features Fearlessly
Turn features on and off without deploys. Used by thousands of Ruby developers.
→
Akira Takahashi
July 18, 2025
Technology
3.2k
6
Share
Embed
Copy iframe code
Copy JS code
Copy link
Start on current slide
P2P通信の標準化 WebRTCを知ろう
Akira Takahashi
July 18, 2025
More Decks by Akira Takahashi
See All by Akira Takahashi
C++20 射影変換
faithandbrave
0
880
C++26アップデート 2025-03
faithandbrave
0
2.2k
C++26 エラー性動作
faithandbrave
2
1.3k
C++20の整数
faithandbrave
0
300
コンテナと文字列の中間インタフェースspanとstring_view
faithandbrave
1
670
C++23 スタックトレースライブラリ
faithandbrave
0
640
if constexpr文はテンプレート世界のラムダ式である
faithandbrave
3
1.6k
使いたい標準C++機能がない環境でいかに実装・設計するか
faithandbrave
2
1.3k
C++20からC++23までの変化
faithandbrave
9
12k
Other Decks in Technology
See All in Technology
[RSJ26] Building a VLA Model Based on Self-Distilled Classification
keio_smilab
PRO
0
190
リージョンの壁を越える、 ちょっと変わったAWSサービスの話
falken
PRO
0
240
はじめてのDatabricks:技術者向けワークショップ / beginner-workshop
databricksjapan
PRO
0
150
Nav2、Nav3 ... はたまた自作?〜 作って理解する Nav3 の設計意図 〜 / Nav2, Nav3 ... or Build Your Own? — Understanding Nav3's design intent by building it from scratch
yanzm
0
230
[DroidKaigi 2026] Making UI specifications visible: Android UI development in the AI agent era supported by Compose Screenshot Testing and galleries
syarihu
0
570
Webとヘルスデータ
yukukotani
0
180
Amazon S3 Tablesに全部任せてみた結果——コンパクション/スナップショット管理は本当に手放せるか
shigeruoda
0
380
Bet AI Day 2026丨AIを「使う」から、AIが「働く」へ ― LayerXが進める「組織AI」の社会実装
layerx
PRO
3
2.2k
現場に行くだけでは足りない——プロダクトエンジニアが業務の流れを捉える観点と、その鍛え方
takumiengineering
0
280
V8コントリビュート超入門
riyaamemiya
0
140
Autonomous AI Databaseサービス・アップデート(FY27)/ adb-service-update-jp-fy27
oracle4engineer
PRO
0
110
20260906 「AWS運用入門」著者が教える、運用業務への生成AI活用入門
masaruogura
0
230
Featured
See All Featured
A brief & incomplete history of UX Design for the World Wide Web: 1989–2019
jct
2
500
How to Talk to Developers About Accessibility
jct
2
540
New Earth Scene 8
popppiees
3
2.5k
AI: The stuff that nobody shows you
jnunemaker
PRO
9
970
Collaborative Software Design: How to facilitate domain modelling decisions
baasie
1
310
Leveraging Curiosity to Care for An Aging Population
cassininazir
1
490
Rails Girls Zürich Keynote
gr2m
96
14k
Designing for Timeless Needs
cassininazir
1
470
Building a A Zero-Code AI SEO Workflow
portentint
PRO
0
710
More Than Pixels: Becoming A User Experience Designer
marktimemedia
3
510
Building Adaptive Systems
keathley
44
3.2k
Groundhog Day: Seeking Process in Gaming for Health
codingconduct
0
330
Transcript
P2P通信の標準化 WebRTCを知ろう 高橋 晶 (Akira Takahashi)
[email protected]
Preferred Networks, Inc.
2025/07/18 (金) C++ MIX #15
WebRTC (Web Real-Time communication) とは • P2P通信の規格・技術・ライブラリ • W3CとIETFで標準化されている •
サーバー経由でクライアント同士の通信をするのではなく、クライアント同士 で直接接続する • サーバー経由で通信すると、遅い、サーバー負荷が高いという問題がある • 基本的にUDPで通信する • ビデオ、オーディオ、データ (テキスト、バイナリ) などを 高速に送受信できる • 昔ながらのP2Pは、Bluetoothやローカルネットワーク内のWi-Fi接続が使われ ていたが、インターネットを介したデバイス間通信が広まっている
WebRTCを使っている主要サービス ビデオ会議・音声チャットの開発に向いている • Google Meet • Zoom • Slack •
Discord • Facebook Messenger • Microsoft Teams • Steamリモートプレイ • DJIドローン (遠くまで飛ばすのでBluetoothではないらしい)
P2P通信の一番の課題 • P2Pで一番むずかしいのは「接続 (NAT越え)」 • 異なるプライベートネットワークの人同士を接続する際には、 ルーターやファイアウォールを突破しないといけない • WebRTCでは、相手と接続するために、2種類のサーバーを使用する •
STUNサーバー • TURNサーバー
STUNサーバー • UDPで接続して、P2P接続できそうな自分の グローバルIP・ポート番号のリストを返してくれる • クライアント同士は、offer側とanswer側に分かれ、 STUNサーバーからもらった接続できそうなIP・ポートリストを、 接続できそうな順に接続を試みていく • Googleが無料のSTUNサーバーを公開してくれている
TURNサーバー • P2P接続がむずかしい場合 (NAT越えできない場合) に使われるサーバー • 使わないという選択もできる • すべての通信をTURNサーバー経由で相手に送る •
すべての通信を中継するので負荷がとても高い • 無料のTURNサーバーはないので、自分でTURNプロトコルをサポートするサーバーを 立てる必要がある • coTurnなど、オープンソースになっているTURNサーバーを実行する • WebRTCの設定で、複数のTURNサーバーを指定できて自動で分散してくれる • 異なるTURNサーバーを使っている同士でも通信できる • TURNサーバー経由でも接続できない場合はある
NAT越えができないケース • 対称NAT (Symmetric NAT) が使われている • 宛先ごとに外部ポート番号が割り当てられる • 多段NAT
• 家庭用ルーター -> 上位ルーターのように複数段になっている場合 • 最も外側のアドレスしかわからないので無理 • UDP通信がブロックされている • プロキシ経由の通信 • 環境としては、 • 職場、学校、寮、ホテル、公共Wi-FiなどでNAT越えできないことが多い
使用するポートの共通化 • 使用するポート数が多いとそれだけ接続がむずかしくなる • WebRTCではポート番号をひとつだけ使い、 複数ストリームでの通信でもポートを共有する
通信データ • 基本的にUDPで通信するので、パケットロスが起こる可能性がある • TCP • 順序保証あり • 自動再送信する (パケットロスなし)
• UDP • 順序保証なし • 自動再送信しない (パケットロスする) • WebRTCでは、UDP通信でもTCPと同等の保証をオプションでつけられ る • データごとにいつでも切り替えられる • ゲーム用途だと消えてもいいデータ、消えると困るデータ両方があるので便利
WebRTCの実装 • Googleがオープンソースで、C++実装とJavaScript実装 (ブラウザ用) を公開している • ゲーム用途ならUnity社がcom.unity.webrtcというC#ラッパーを公開し ている • 非同期をawaitで書けるようにしたくらいのラップ
WebRTC (C++) の例 – Offer側 auto pc = CreatePeerConnection(factory, config);
pc->CreateOffer(CreateSessionDescObserver::Create([pc](auto* desc){ pc->SetLocalDescription(SetDescObserver::Create(), desc); std::string sdp; desc->ToString(&sdp); // sdpを相手に送る }), PeerConnectionInterface::RTCOfferAnswerOptions()); • WebRTCでの接続は、Offer側とAnswer側に分かれる • Offer側で作られたSDPという形式の文字列を、サーバーなどを介して Answer側に伝え、それをアドレス代わりにして接続する
WebRTC (C++) の例 – Answer側 auto pc = CreatePeerConnection(factory, config);
// offer側が作ったsdp文字列を受け取る auto desc = CreateSessionDescription("offer", sdp); pc->SetRemoteDescription(SetDescObserver::Create(), desc); pc->CreateAnswer(CreateSessionDescObserver::Create([pc](auto* desc){ pc->SetLocalDescription(SetDescObserver::Create(), desc); }), PeerConnectionInterface::RTCOfferAnswerOptions()); • このあとにIce Candidateと呼ばれるプロトコル・IPアドレス・ポート 番号の組み合わせの交換が行われ、接続できそうな組み合わせが順に 試行されて、接続される
Google独自のビルドシステム • WebRTC (C++) を自分でビルドするのはわりとたいへん • 独自のビルドスクリプトGN (Generate Ninja) •
CMakeは未サポート • GNは.ninjaファイルを生成してくれる手続き型っぽい言語 • 独自のパッケージマネージャDepot Tools (gclient) • 時雨堂が各PC・スマートフォンプラットフォーム向けに ビルドバイナリを提供してくれている • https://github.com/shiguredo-webrtc-build/webrtc-build • それ以外の環境向けにはビルドをがんばらないといけない (一部の機能を無効にしたりとかも)
じつは昔からWebRTCっぽいP2P通信は行われていた • WebRTCではないが、STUN / TURNサーバーというアイディアは 以前から使われていた • 「モンスターストライクのリアルタイム通信を支える技術 - logmi」
• https://logmi.jp/main/technology/321751 • Skype • 独自プロトコルのSTUNサーバーっぽいものを使っていた • WebRTCライブラリを使わずに、STUNサーバーだけを使うこともでき る (UDPでSTUNプロトコルに従って通信すればよい) • WebRTC / STUN / TURN規格ができたことで、P2P接続を独自で がんばらなくてもよくなった
まとめ • WebRTCは、P2P通信の規格・技術・ライブラリです • P2P通信で一番むずかしい接続の部分をがんばってくれます • これまで独自でがんばっていた部分が標準化されました • P2P接続できない場合のフォールバックとしてサーバー経由の通信も用意されています •
動画やその他データ配信の便利・安全な機能がついています • QUICベースの新しい規格の策定も進められています • WebTransport、Media over QUIC Transport (MOQT) • 時雨堂が入門資料を書いてくれてたりするので、 よりくわしい情報はそちらを見てください • 時雨堂 WebRTC 入門 (講師資料) v2024-02 • https://gist.github.com/voluntas/b67af408b8950b568e750918920016d8 • WebRTC Meetupというイベントも東京 (品川) で開催されています