kenimo49 Tech Notes

WebRTC・リアルタイム通信を使っているエンジニアです。業務で得た知見をメモしています。

getUserMediaの音声制約、undefinedで動いてるから大丈夫?:echoCancellation / autoGainControl / noiseSuppressionの挙動を整理する

導入

WebRTCの通話機能を実装していたとき、音声制約をどう設定するか迷いました。

const stream = await navigator.mediaDevices.getUserMedia({ audio: true });

これで動きます。通話もできます。じゃあ echoCancellation とか noiseSuppression は明示しなくていいのか? undefined のままで本当に大丈夫なのか? trueundefined は同じなのか、違うのか?

調べ始めたら、想像以上に奥が深かったです。true を指定しても実際には適用されないケースがある。処理の順番が音質に影響する。ブラウザごとにデフォルト値が違う。

この記事では、echoCancellationautoGainControlnoiseSuppression の「音声処理3兄弟」について、実装時に判断できるレベルまで整理します。

3つの制約の役割

echoCancellation(エコーキャンセル)

スピーカーから出た音がマイクに回り込む「エコー」を除去します。スピーカー出力音をリファレンスとして、マイク入力から差し引く処理です。ビデオ会議で相手の声が自分に返ってくる現象を防ぎます。

OFFにすると、スピーカー使用時にハウリング(キーンという音)が発生します。Web会議で「自分の声が3秒後に返ってくる」あの恐怖を体験したことがある方なら、ECのありがたみがわかるはずです。

autoGainControl(自動ゲイン制御)

マイク入力の音量を自動で調整します。小さい声は増幅し、大きい声は抑制して、一定の音量レベルに揃えてくれます。

便利な機能ですが、音楽や効果音を扱う場合はダイナミクス(音量の強弱)を潰してしまいます。ピアノのフォルテッシモが勝手にメゾピアノにされる、みたいな話です。

noiseSuppression(ノイズ抑制)

背景のノイズ(エアコン、ファンの音、環境音)を検知して除去します。

人の声の周波数帯以外を抑制する仕組みなので、ONにすると音声以外の音(楽器の音など)も容赦なく削られます。ギターのアルペジオが「なんか薄い」と感じたら、犯人はだいたいNSです。

undefined vs true vs false -- 何が違うのか

ここが一番誤解されやすいポイントです。「trueって書いたから有効でしょ?」......そう思いますよね。実はそんなに単純じゃないんです。

設定値 意味 挙動
undefined(未指定) ブラウザのデフォルトに従う Chrome/Firefox: 3つとも ON。ただしハードウェアNSはそのまま動作する可能性あり
true 有効化を希望 ベストエフォートで適用。満たせなくてもエラーにならない。ChromeではハードウェアNSを自動OFFにする(後述)
false 無効化を希望 ベストエフォートで適用。満たせなくてもエラーにならない
{ exact: true } 有効化を必須 満たせない場合は getUserMediaエラー
{ exact: false } 無効化を必須 満たせない場合はエラー
{ ideal: true } true と同等 ベストエフォート

注意: undefinedtrue はどちらもECがONになりますが、ブラウザの内部処理が異なります。 詳細は次のセクションで解説します。

重要なのは、audio: trueaudio: { echoCancellation: true } は結果が違うということです。どちらもECがONになる点は同じですが、ブラウザの内部処理が異なります。

Chromeの場合、echoCancellation: true明示的に指定すると、ハードウェアレベルのノイズサプレッション(マイクドライバ等)を自動でOFFにします。ソフトウェアのエコーキャンセラーが最適な信号を受け取れるようにするためです(Chrome公式ブログ)。

一方、audio: true(undefined)ではECがデフォルトでONになりますが、制約として明示指定されていないため、ハードウェアNSがそのまま動作する可能性があります。結果として、ハードウェアNSとソフトウェアAECの二重処理で音質が劣化するケースがあります。

つまり、「明示的にtrueを書く」ことには意味があるんです。

// undefinedとtrueの違い
{ audio: true }                              // デフォルト適用。ハードウェアNSが残る可能性
{ audio: { echoCancellation: true } }        // 明示指定。ChromeはハードウェアNSを自動OFF
{ audio: { echoCancellation: { exact: true } } } // EC必須、不可ならエラー

また、「指定した」と「適用された」は別物です。ブラウザはベストエフォートで処理するため、true を指定しても実際にはONにならないケースがあります。後述する getSettings() で事後確認が必要です。

処理パイプラインの順序 -- なぜ順番が重要なのか

WebRTCの内部では、音声処理は以下の順序で直列に実行されます(libwebrtcの実装、時雨堂ドキュメント参照)。

WebRTC音声処理パイプライン

直列パイプラインなので、前段の処理が後段に影響します。料理で言えば、下ごしらえ(NS)を省略して味付け(AEC)しても美味しくならないのと同じです。

  • NSをOFFにすると → AECに渡される信号にノイズが混在 → AECの精度が低下する可能性があります
  • AECをOFFにすると → AGCがエコーを含んだ信号を増幅 → ハウリングが悪化します
  • AGCは最後に適用されるため、EC/NSの結果を増幅します

つまり「NSだけOFFにすれば音質が良くなる」という単純な話ではなく、パイプライン全体への影響を考慮する必要があります。

ハマりポイント3選

1. EC:false + AGC:true → ハウリング → 会話不能

エコーキャンセルをOFFにしてAGCだけONにすると、スピーカーからのエコーをAGCが「音声入力」と判断して増幅します。増幅されたエコーがさらにスピーカーから出て......というフィードバックループでハウリングが始まります。

AGCはハウリングを検知すると入力ゲインを自動で下げますが、結果として通常の会話音声も聞こえないレベルまで音量が低下します。「相手の声が消えた!」という問い合わせの裏に、このコンボが隠れていることがあります。

対策: ECをOFFにするなら、AGCもOFFにしましょう。セットで考える必要があります。

2. ハードウェアNS × ソフトウェアAEC の干渉

一部のマイクはドライバレベルでノイズサプレッションを実行しています。このハードウェアNSが、WebRTCのソフトウェアAECより先に音声を加工してしまうため、AECが期待する「クリーンな信号」が得られず精度が低下します。

Chromeはこの問題に対応済みで、echoCancellation が有効な場合、ハードウェアNSを自動でOFFにしてくれます(Chrome公式ブログ)。

ただし、Chrome以外のブラウザではこの対策がない可能性があります。「Chromeでは問題ないのにFirefox/Safariでエコーが酷い」という報告の原因がここにあるケースがあります。

3. EC:true + channelCount:2 → 正常に動作しない

Chromeのエコーキャンセラーはモノラル前提の実装です。そもそもChromeは channelCount: 2 を指定してもステレオ録音をサポートしておらず(2026年現在)、エコーキャンセルと併用すると正常に動作しない制限があります。

これはバグというよりChromeの実装上の制限です。Firefoxではステレオ録音に対応しています。

対策: ステレオが必要な場合は echoCancellation: false を明示してください。

// ステレオ録音する場合
const stream = await navigator.mediaDevices.getUserMedia({
  audio: {
    channelCount: 2,
    echoCancellation: false, // 必須
    noiseSuppression: false,
    autoGainControl: false,
  }
});

ユースケース別おすすめ設定

通話(スピーカー使用)

{
  audio: {
    echoCancellation: true,
    noiseSuppression: true,
    autoGainControl: true,
  }
}

デフォルトと同じですが、明示的に書くことで意図が伝わります。スピーカー使用時はEC必須です。

通話(ヘッドセット使用)

{
  audio: {
    echoCancellation: false,
    noiseSuppression: true,
    autoGainControl: true,
  }
}

ヘッドセットならエコーの回り込みが少ないため、ECをOFFにすると音質が向上します。NSとAGCは通話品質のために残しておきましょう。

録音・ポッドキャスト

{
  audio: {
    echoCancellation: false,
    noiseSuppression: false,
    autoGainControl: false,
    channelCount: 2,
    sampleRate: 48000,
  }
}

音声処理を全てOFFにして、生の入力を取得します。後処理で音質を調整する前提です。channelCount: 2 はFirefoxでのみ有効で、Chromeではモノラルのまま無視されます(前述の制限)。

音楽セッション・配信

{
  audio: {
    echoCancellation: false,
    noiseSuppression: false,
    autoGainControl: false,
    latency: 0.01,
  }
}

音楽ではダイナミクス(音量の強弱)が重要なのでAGCは厳禁です。NSも楽器の音を削るためOFFにします。低レイテンシの明示指定も忘れずに。

getSettings()で実際の設定を確認する

制約を指定した ≠ 実際に適用された。これがWebRTC音声制約の最大の罠です。「言ったよね?」「聞いてません」みたいなコミュニケーション事故が、ブラウザとの間でも起きます。

getSettings() で、ブラウザが実際に適用した設定を事後確認する習慣をつけましょう。

const stream = await navigator.mediaDevices.getUserMedia({
  audio: {
    echoCancellation: false,
    noiseSuppression: false,
    autoGainControl: false,
  }
});

const track = stream.getAudioTracks()[0];
const settings = track.getSettings();

console.log('EC:', settings.echoCancellation);  // 本当にfalseですか?
console.log('NS:', settings.noiseSuppression);  // 本当にfalseですか?
console.log('AGC:', settings.autoGainControl);   // 本当にfalseですか?

特にモバイルブラウザでは、false を指定しても無視されるケースがあります。getSettings() の結果が true なら、制約が効いていません。

ブラウザ差異まとめ

制約 Chrome Firefox Safari
echoCancellation ON by default, 制御可 ON by default, 制御可 ON by default, 制御可
noiseSuppression ON by default, 制約が効かない場合あり ON by default, 制御可 非対応
autoGainControl ON by default, 制約が効かない場合あり OFF by default, 制御可 非対応

Firefoxは autoGainControl のデフォルトが OFF である点に注意です。Chrome前提で開発して「完璧!」と思ったら、Firefoxユーザーから「声が小さいんですけど」という問い合わせが来ます。WebRTCあるあるです。

補足: goog系プレフィックス

Chrome固有の非標準制約として goog プレフィックスが存在します。

{
  audio: {
    // 標準制約
    echoCancellation: true,
    noiseSuppression: true,
    autoGainControl: true,
    // Chrome固有(非標準)
    googHighpassFilter: true,       // 低周波ノイズ除去(エアコン音等)
    googTypingNoiseDetection: true,  // タイピング音検知・除去
    googExperimentalNoiseSuppression: true,
  }
}

非標準なので将来削除される可能性がありますが、googHighpassFilter はエアコンやファンの低周波ノイズに効果的です。「なんか『ブーン』って鳴ってるんだけど」にはまずこれを試す価値があります。Chrome限定で問題ない環境向けです。

まとめ

  • audio: true で動きますが、それは「デフォルトで良い」という意味ではありません
  • undefined / true / false はベストエフォートです。{ exact: true/false } が必須指定です
  • 処理パイプラインは直列(HPF → NS → AEC → AGC)。前段が後段に影響します
  • EC:false + AGC:true は危険です。EC:true + channelCount:2 はChromeで正常に動作しません
  • getSettings() で事後確認する習慣をつけましょう
  • ユースケースに応じて設定を変えてください。「全部true」が正解ではありません

「動いてるから大丈夫」は、借金を「返済日はまだ先だから大丈夫」と言っているのと同じです。問題が起きる前に理解しておくと、起きたときの対応力が段違いになります。

参考

WebRTCをエンプラに導入するとき必ず問題になる"プロキシ"を整理した

WebRTCをエンプラに導入するとき必ず問題になる”プロキシ”を整理した

「プロキシを通してください」で話が噛み合わない問題

エンタープライズ環境にWebRTCを導入しようとすると、情シス部門から「プロキシ経由にしてください」と言われることがあります。

この一言、実はかなり厄介です。

「プロキシ」が指すものが人によって違うからです。Forward Proxy のことなのか、Reverse Proxy なのか、SSL インスペクション装置なのか、API Gateway なのか、透過プロキシなのか。全部「プロキシ」と呼ばれるので、会議室の全員が同じ単語を使いながら違うものを想像しているという状況が普通に起きます。

空港にたとえると、出国審査も手荷物検査も案内カウンターも全部「セキュリティ」と呼んでいるようなものです。そりゃ話が噛み合わない。

自分自身、何度かこの認識ズレでハマった経験があるので、WebRTC の文脈で登場する「プロキシ」を5種類に整理してみました。それぞれ 何のためにあるかWebRTC にどう影響するか をセットで書いています。

プロキシの5分類

1. Forward Proxy(通信制御)

役割: クライアントとインターネットの間に挟まり、通信を制御する

空港でいう 出国審査 です。「パスポート(HTTP/HTTPS)を持っていれば通す。それ以外はお引き取りください」という門番。企業のWebフィルタリングやアクセス制限を担うプロキシです。Squid、Blue Coat(Symantec)、Zscaler などが代表例です。社員の端末からの通信はすべてこのプロキシを経由し、許可されたHTTP/HTTPS通信だけを外に出します。

WebRTCへの影響

Forward Proxy は基本的にHTTP/HTTPSしか通しません。WebRTCのメディア通信(SRTP over UDP)はパスポートを持っていない旅行者のようなもので、門前払いを食らいます。

ICE の候補収集では Host候補 と Server Reflexive候補(STUNで取得)しか得られず、相手との直接通信が成立しません。結果として TURN サーバーへのフォールバックが必要になりますが、TURN over UDP も通らないケースが大半です。

対策は TURN over TCP (443) または TURN over TLS (443) です。HTTPS と同じポート・プロトコルに見せることで、Forward Proxy を通過させます。

2. Reverse Proxy(負荷分散・保護)

役割: サーバー側に配置し、バックエンドを保護する

空港でいう 到着ロビーの案内カウンター です。お客さん(リクエスト)を適切なゲート(バックエンドサーバー)に振り分ける役割。SSL終端、負荷分散、DDoS軽減、キャッシュなどを担います。Nginx、Cloudflare、AWS ALB が代表例です。

WebRTCへの影響

WebRTCのシグナリングサーバー(WebSocket)を Reverse Proxy の背後に置く構成はよくあります。この場合、注意点が2つあります。

1つ目は WebSocket の Upgrade サポート です。Nginx であれば proxy_http_version 1.1proxy_set_header Upgrade $http_upgrade の設定が必要です。ALB を使う場合はリスナーの設定を確認してください。

2つ目は タイムアウト設定 です。WebSocket は長時間接続を前提とするため、デフォルトのタイムアウト(Nginx の proxy_read_timeout はデフォルト60秒)では切断されます。用途に応じて適切な値に伸ばす必要があります。

メディア通信(SRTP/UDP)自体は Reverse Proxy を経由しないため、シグナリング部分の設定さえ正しければ問題になりにくいです。

3. Intercepting Proxy(SSL インスペクション)

役割: HTTP/HTTPS通信を傍受して中身を確認・改変する

空港でいう 手荷物全開封検査 です。鍵のかかったスーツケースを一度こじ開けて、中身を全部確認して、別の鍵で閉め直して返す。企業のSSLインスペクション装置や、開発時のデバッグツール(mitmproxy、Charles Proxy、Fiddler、Burp Suite)がこのカテゴリに入ります。HTTPS通信を中間者として復号し、内容を検査してから再暗号化してサーバーに送ります。

WebRTCへの影響

WebRTC にとって 最も厄介なプロキシ です。5種類の中でこいつだけ別格です。

SSLインスペクションはTLS通信の証明書を差し替えて中間者として動作します。WebRTCのメディア通信はDTLS(Datagram Transport Layer Security)で暗号化されていますが、DTLSハンドシェイクでは通信相手の証明書フィンガープリントをSDP(シグナリング)で交換済みの値と照合します。

SSLインスペクション装置が証明書を差し替えると、このフィンガープリントが一致しなくなり、DTLSハンドシェイクが失敗します。結果として音声・映像が一切通らなくなります。スーツケースの鍵を勝手に変えられたせいで、受取人が「これ自分の荷物じゃない」と拒否するわけです。

対策としては、WebRTC関連の通信先(TURNサーバー、メディアサーバー等)をSSLインスペクションの 除外リスト に入れてもらうよう情シスに依頼するか、TURN over TLS (443) でTURNサーバー経由の通信に集約する方法があります。

4. API Gateway / BFF(APIキー保護)

役割: フロントエンドから直接外部APIを呼ばず、自前サーバーを経由させてAPIキーを保護する

空港でいう パスポート発行カウンター です。本人確認が済んだら通行証を発行してくれるけど、発行の仕組みは窓口の裏側に隠されています。Kong、AWS API Gateway、あるいは自前のBFF(Backend for Frontend)サーバーがこのカテゴリです。クライアントにAPIキーやシークレットを渡さない設計を実現します。

WebRTCへの影響

メディア通信には直接影響しませんが、WebRTCの 周辺API で頻繁に登場します。最近はSaaSに組み込まれたLLM機能(議事録自動生成、リアルタイム翻訳など)がAPIキーで外部のAIサービスを呼び出すケースも増えており、BFFパターンの出番はさらに広がっています。

典型的なのは TURNサーバーの認証情報取得 です。TURNサーバーは通常、時間制限付きのクレデンシャル(username/password)で認証します。このクレデンシャルをフロントエンドで生成するにはシークレットキーが必要ですが、それをクライアントに埋め込むわけにはいきません。

そのため、BFF経由でTURN認証トークンを取得するパターンが実務では頻出します。

Client → BFF (認証済み) → TURN credential生成 → Client → TURN Server

Room管理API(ルーム作成、参加者管理等)のキー保護も同様です。

5. Transparent Proxy(透過プロキシ)

役割: クライアントが意識しないまま通信を傍受する

空港でいう 見えないセンサーゲート です。通路を普通に歩いているだけなのに、実は裏側でスキャンされている。ISPのキャッシュプロキシや、企業のコンテンツフィルタが該当します。クライアント側にプロキシ設定は不要で、ネットワーク機器レベルで透過的に通信を中継します。

WebRTCへの影響

透過プロキシの厄介さは 存在に気づけない ことです。見えないセンサーなので、引っかかって初めて「ここに何かあったのか」と気づきます。

UDPを透過しない透過プロキシが入っている場合、STUN/TURNの通信が阻害されます。「社内ネットワークでだけWebRTCが繋がらない」「自宅からは問題ないのにオフィスだとダメ」という症状が出たとき、原因が透過プロキシだったというケースがあります。

実務では、お客さん自身が透過プロキシの存在を把握していないケースが珍しくありません。「ネットワーク構成図にはプロキシは載っていない」と言われたのに、実際には透過プロキシが入っていて、数秒単位のjitterを引き起こしていたことがあります。リアルタイム通信で数秒のjitterは致命的です。

ブラウザのプロキシ設定を見ても何も設定されていないため、chrome://webrtc-internals や Wireshark でパケットレベルの調査が必要になることもあります。

エンプラ環境でWebRTCを通すための実践パターン

5種類を整理したところで、実際にエンプラ環境でWebRTCを通すためのパターンをまとめます。

TURN over TCP (443)

Forward Proxy 環境での定番です。TURNサーバーをTCPの443番ポートでリッスンさせ、HTTPS通信と同じポートを使うことで Forward Proxy を通過させます。coturn であれば以下のような設定です。

listening-port=443
alt-listening-port=443
no-udp

TURN over TLS (443)

SSLインスペクションが入っている環境では、TURN over TCP でも通信内容を検査しようとして失敗するケースがあります。TURN over TLS (443) にすることで、TLS通信として正しくハンドシェイクが完了し、SSLインスペクション装置も正常に処理できます。

これが 最終手段 です。HTTPSに偽装した正規のTLS通信なので、出国審査も手荷物検査も正面から通過できます。大抵のエンプラ環境はこれで突破できます。

WebSocket シグナリングの Reverse Proxy 設定例(Nginx)

location /ws {
    proxy_pass http://signaling-server:8080;
    proxy_http_version 1.1;
    proxy_set_header Upgrade $http_upgrade;
    proxy_set_header Connection "upgrade";
    proxy_set_header Host $host;
    proxy_read_timeout 86400s;
    proxy_send_timeout 86400s;
}

proxy_read_timeout を長めに設定するのがポイントです。

BFF パターンでの TURN 認証トークン取得

// BFF側(Express例)
app.get('/api/turn-credentials', authenticate, (req, res) => {
  const ttl = 86400; // 24時間
  const timestamp = Math.floor(Date.now() / 1000) + ttl;
  const username = `${timestamp}:${req.user.id}`;
  const hmac = crypto.createHmac('sha1', TURN_SECRET);
  hmac.update(username);
  const password = hmac.digest('base64');

  res.json({
    urls: ['turns:turn.example.com:443?transport=tcp'],
    username,
    credential: password,
  });
});

情シスとの会話で使える「プロキシ種類の確認チェックリスト」

情シス部門と会話するとき、以下を確認すると認識のズレを防げます。

  • Forward Proxy の有無: 社内からのHTTPS通信はプロキシ経由か? プロキシのFQDN/IPは?
  • 許可プロトコル: TCP 443 は通るか? UDP は許可されているか?
  • SSL インスペクション: HTTPS通信の中身を検査しているか? 除外リストに追加可能か?
  • 透過プロキシ: ネットワーク機器レベルで透過プロキシは入っているか?
  • WebSocket: WebSocket(wss://)の長時間接続は許可されているか? タイムアウトは何秒か?

この5点を最初に確認しておくと、後から「実はSSLインスペクションが入っていた」という手戻りを防げます。

まとめ

「プロキシ」という単語は、少なくとも以下の5種類の意味で使われています。

種類 主な目的 WebRTCへの影響度
Forward Proxy 通信制御 - UDP遮断
Reverse Proxy 負荷分散・保護 中 - WS設定が必要
Intercepting Proxy SSL検査 - DTLS破壊
API Gateway / BFF APIキー保護 低 - 設計の話
Transparent Proxy 透過的フィルタ 中 - 発見が困難

WebRTCで最も問題になるのは Forward ProxyIntercepting Proxy(SSLインスペクション) です。

結論として、最低限 TURN over TLS (443) を用意しておけば、大抵のエンタープライズ環境は突破できます。

情シスとの会話では「どの種類のプロキシが入っているか」を最初に確認することで、手戻りのない設計ができます。「プロキシがあるんですが」と言われたら、まず「どのプロキシですか?」と聞き返す。それだけで設計のやり直しが1回減ります。

IPv4アドレスは枯渇した。でもIPv6への移行は甘くない

サムネイル

IPv4は「在庫切れ」になった

IPv4アドレスは2011年に枯渇しました。世界のIPアドレスを管理する組織が「もう新しいIPv4アドレスの在庫はありません」と宣言したのです。

43億個あったはずのアドレスが、インターネットの爆発的な普及で使い切られました。そこで登場したのがIPv6。アドレス数は340澗(3.4×10³⁸)— 地球上のすべての砂粒に1つずつIPアドレスを振っても、まだ数百万倍余る数です。宇宙が終わるまでに使い切る方が難しいでしょう。

項目 IPv4 IPv6
アドレス長 32ビット 128ビット
アドレス数 約43億 約340澗
表記例 192.168.1.1 2001:0db8::1
NAT 必須 不要
セキュリティ IPsecオプション IPsec標準搭載
自動設定 DHCP(サーバーが配布) SLAAC(ルータ広告で端末が自動取得)
ヘッダ 可変長(毎回サイズ判定が必要) 固定40byte(処理が速い)

「じゃあIPv6に移行すればいいじゃないか」

話はそう簡単ではありません。

移行が15年経っても終わらない現実

IPv4が枯渇してから15年。2025年時点のIPv6普及率は 約43% です。フランス80%、ドイツ75%と進んでいる国がある一方、グローバルではまだ半分にも達していません。日本は約50%で、NTTのフレッツ光を中心に対応が進んでいます。

なぜ移行が進まないのか。理由は大きく3つあります。

理由1: NATで「なんとかなっている」

NAT(Network Address Translation)は、1つのグローバルIPアドレスを複数の端末で共有する仕組みです。家庭のルータはほぼすべてこの方式で動いています。

IPv4が枯渇しても、NATがあれば見かけ上は困りません。「困ってないのに、なぜ変える必要があるの?」というのが、多くの現場の本音です。

しかしNATは問題を 隠しているだけ です。

  • P2P通信が困難: NATの内側同士は直接通信できない。WebRTCでビデオ通話する場合、NATを越えるための仕組み(STUN/TURN)が必要で、これが 接続失敗や遅延の原因 になる
  • ポート枯渇: NATは1つのIPに対してポート番号(最大65,535)で端末を識別する。大規模ネットワークではポートが足りなくなる
  • IoT時代の限界: 照明、エアコン、カメラ、スピーカー。1家庭のデバイス数が増え続ける中、NATの多段化は管理コストを増大させる

理由2: 移行方法が3つもあって、どれを選ぶか迷う

IPv6への移行は一夜にして完了するものではありません。主に3つの方式があり、それぞれ一長一短です。

IPv6移行の3つの戦略

① デュアルスタック(主流)

IPv4とIPv6を同時に動かします。

端末 → [IPv4 + IPv6] → ルータ → [IPv4 + IPv6] → インターネット

最も柔軟ですが、 2つのプロトコルを同時に管理する 必要があり、運用コストが単純に2倍になります。ファイアウォールもルーティングもDNSも、全部2系統。

ブラウザ側では「Happy Eyeballs」という仕組みがあり、IPv6で接続を試みて、ダメならIPv4に自動切替します。ユーザーは意識しなくて済みますが、 裏側の管理者は2倍大変 です。

② トンネリング

IPv4ネットワークの中にIPv6パケットを包んで通す方式です。

[IPv6パケット] → [IPv4ヘッダでラップ] → IPv4網 → [アンラップ] → [IPv6パケット]

既存インフラを活かせますが、カプセル化のオーバーヘッドが発生します。

③ トランスレーション(NAT64/DNS64/464XLAT)

IPv4とIPv6を途中で相互変換する方式です。モバイルネットワークでは464XLATが広く使われています。Ciscoはデュアルスタック完了後にNAT64/DNS64で段階的にIPv4を退役させるフローを推奨しています。

どの方式も 「完璧な移行方法」ではない というのが実情です。

理由3: セキュリティが2倍大変になる

ここが最も深刻な問題です。

攻撃面が2倍になる

デュアルスタック環境では、IPv4 IPv6の両方にファイアウォールルールが必要です。IPv4だけ設定して、IPv6が フルオープンのまま放置 されているケースが実際に報告されています。

NATという「壁」がなくなる

IPv4ではNATが偶発的なファイアウォールとして機能していました。外部からNAT内部の端末に直接アクセスすることは基本的にできません。

IPv6ではすべての端末がグローバルIPアドレスを持ちます。つまり インターネットから直接見える 状態です。ファイアウォールを明示的に設定しなければ、端末が丸裸でインターネットに晒されます。

IPv6固有の攻撃も存在する

米国のNSAとCISAは共同で「IPv6 Security Guidance」を発行し、以下を警告しています。

  • IPv6のセキュリティ設定をIPv4と同等以上にすること
  • 不要なセグメントではIPv6を明示的に無効化すること
  • Router Advertisement攻撃やNDP Spoofingなど、 IPv6にしか存在しない攻撃 への防御策を実装すること

「IPv6にすれば安全」ではなく、 「IPv6にすると守るべき面が増える」 が正確な表現です。

それでもIPv6に移行すべき理由

ここまで読むと「IPv6って面倒なだけでは?」と思うかもしれません。しかし、IPv4のNAT延命にも限界があります。

WebRTCの実務から見た現実

WebRTCでリアルタイム通信を開発していると、ICE候補にIPv6アドレスが含まれるケースが増えてきています。IPv6ではNATがないため、端末同士が直接接続できます。NATトラバーサルの失敗がなくなる分、 WebRTCの接続信頼性はIPv6環境の方が高い のです。

NATで延命を続けることは、P2P通信の品質を犠牲にし続けることでもあります。

日本のIPv6事情 — 意外と進んでいる

日本のIPv6環境は、世界的に見ても進んでいる方です。

NTTのフレッツ光では、IPv6 IPoE(ネイティブ方式)が利用できます。従来のPPPoE方式では、プロバイダとの接続ポイント(網終端装置)がボトルネックになり、夜間など混雑する時間帯に速度が落ちるという問題がありました。IPoEではこのボトルネックを迂回するため、混雑の影響を受けにくくなります。 「IPv6にしたら夜でも速い」という体験の正体がこれです。

  • v6プラス: JPNE提供。IPv6 IPoE + IPv4 over IPv6(MAP-E)
  • transix: インターネットマルチフィード提供。DS-Lite方式
  • OCNバーチャルコネクト: NTTコミュニケーションズ提供

ユーザーにとっては「速くなった」という体感がIPv6移行の最大のモチベーションになっています。一方、サーバー側の対応はまだこれからです。Cloudflareを使っていれば自動でIPv6対応になりますが、自前運用のサーバーでは対応が漏れているケースも多いです。

エンジニアとして今やるべきこと

1. 自分のサービスのIPv6対応を確認する

# IPv6でアクセスできるか確認
curl -6 https://your-domain.com

# AAAAレコードが設定されているか確認
dig AAAA your-domain.com

2. セキュリティ設定の棚卸し

IPv6を有効にしているなら、ファイアウォールルールがIPv6にも適用されているか確認してください。 ip6tables の設定を見落としているケースは珍しくありません。

# IPv6のファイアウォールルールを確認
sudo ip6tables -L -n

3. WebRTC開発者は特に注意

ICE候補にIPv6アドレスが含まれるケースが増えています。IPv6環境でのテストを行っていない場合、特定のネットワークで接続に失敗する可能性があります。

// ICE候補のログでIPv6アドレスを確認
peerConnection.onicecandidate = (event) => {
  if (event.candidate) {
    console.log('ICE candidate:', event.candidate.candidate);
    // IPv6アドレスが含まれているか確認
  }
};

まとめ

  • IPv4は2011年に枯渇した。NATで延命しているだけ
  • IPv6の普及率は43%。15年経っても移行は半分
  • 移行が進まない理由は3つ。NATで困ってない・移行方法が複雑・セキュリティが2倍大変
  • 「IPv6にすれば安全」は誤解。守るべき面が増える。NATという壁がなくなり端末が丸見えになる
  • それでも移行は必要。NATの限界、P2P通信の品質、IoT時代のアドレス需要
  • 日本はIPoEで進んでいる。でもサーバー側対応はまだこれから

IPv6への移行は「いつかやる」ではなく、「もうやっているか、知らないうちに使っている」フェーズに入っています。自分のサービスがどちら側にいるか、一度確認してみてください。

参考資料

WebTransportが変えるリアルタイム通信 — WebSocketの「1車線問題」を解決する新プロトコル

ひとことで言うと

WebSocketは「1車線の道路」。前の車が止まると全車渋滞します。 WebTransportは「多車線の高速道路」。1車線で事故が起きても、他の車線は流れ続けます。

この違いが、リアルタイム通信の未来を変えます。

ちなみに今日、小泉進次郎さんの演説動画がYouTube流れてきたのですが、途中で映像がカクついて音声だけ先に進む瞬間がありました。あれ、まさにHOLブロッキングです。映像のパケットが詰まっても音声は先に届けてほしい。WebTransportならそれができます。


WebSocketの何が問題なのか

WebSocketは10年以上、リアルタイム通信の主役でした。チャット、通知、ライブデータ。ほとんどのプロダクトがWebSocketの上に構築されています。

しかし、1つだけ構造的な問題があります。

1車線しかない。

WebSocketはTCP上で動きます。TCPは「データを順番通りに届ける」ことを保証するプロトコルです。そのため、途中で1つのデータが欠けると、後ろのデータが全部止まります。

WebSocket(TCP = 1車線)

チャット: 「こんにちは」 → 送信中...
ゲーム:  プレイヤー位置 → ⏸ 待ち
通知:   新着メール → ⏸ 待ち  ← 関係ないのに巻き添え

これが HOLブロッキング(Head-of-Line Blocking) です。

ゲームのプレイヤー位置情報は、0.1秒前のデータより今のデータが大事です。でもWebSocketでは、古いデータの再送が完了するまで新しいデータを届けられません。

律儀と言えば律儀ですが、「もういいから次をくれ」と言えないのは困ります。


WebTransportが解決すること

WebTransportは 多車線の高速道路 です。

WebTransport(QUIC = 多車線)

車線1 チャット: 「こんにちは」 → 送信中...
車線2 ゲーム:  プレイヤー位置 → ✅ 通過!
車線3 通知:   新着メール → ✅ 通過!  ← 影響なし

車線1で問題が起きても、車線2と車線3は止まりません。これがQUICの ストリーム多重化 です。


土台を整理する — QUIC → HTTP/3 → WebTransport

WebTransportは3層構造です。下から順に見ていきます。

QUIC — 新しい道路そのもの

従来のTCPが「1車線の一般道」だとすると、QUICは「多車線の高速道路」です。Googleが2012年に開発を始め、2021年に国際標準(RFC 9000)になりました。

TCP(従来) QUIC(新)
例え 1車線の一般道 多車線の高速道路
接続開始 信号3回待ち(2-3往復) 青信号で即発進(0-1往復)
渋滞 1台止まると全車停止 止まった車線だけ影響
暗号化 オプション 最初から組み込み

HTTP/3 — 高速道路の交通ルール

QUICという道路の上で、Webのデータをどうやりとりするかを決めたルールがHTTP/3です。Google、Cloudflare、Fastlyなど大手はすでに本番で使っています。

WebTransport — リアルタイム通信専用レーン

HTTP/3の上に、リアルタイム通信に特化した仕組みを追加したのがWebTransportです。


WebTransportの3つの通信モード

WebTransportがWebSocketと決定的に違うのは、用途に合わせて3つのモードを選べる 点です。

モード 例え 用途
双方向ストリーム 電話(お互い話せる) チャット、API通信
単方向ストリーム ラジオ(一方通行) ログ送信、センサーデータ
データグラム 投げっぱなしのメモ(届かなくてもOK) ゲーム位置情報、ライブ映像

WebSocketは「電話」しかできません。WebTransportは場面に応じて「電話」「ラジオ」「投げっぱなしメモ」を使い分けられます。

万能ナイフと専用工具セットの違い、と言ってもいいかもしれません。WebSocketは万能ナイフ1本で全部やっていた。WebTransportは場面ごとに最適な道具を選べます。


数字で見る差

WebSocket WebTransport
接続開始 2-3往復 0-1往復(再接続時)
1箇所で詰まったとき 全体が止まる その部分だけ止まる
通信モード 1種類 3種類
暗号化 TLS別途 最初から組み込み

実際のテストでは、パケットロスが発生する環境で レイテンシが約35%改善 したという報告もあります。


じゃあ今すぐ使えるの?

まだ早いです。

ブラウザ 対応
Chrome / Edge
Firefox
Safari

ChromeとEdgeでしか動きません。そのため、今の時点では「WebTransportが使える環境ではWebTransport、使えなければWebSocketにフォールバック」という設計が現実的です。

IETF仕様はdraft-15まで進んでおり、土台のQUIC(RFC 9000)とHTTP/3(RFC 9114)はすでに標準化済みです。WebTransportのRFC化もそう遠くないでしょう。


WebRTCとは何が違うの?

WebRTC WebTransport
誰と誰 ブラウザ同士(P2P) ブラウザ ↔ サーバー
得意なこと ビデオ通話 低遅延データ通信
セットアップ 複雑(ICE/STUN/TURN) シンプル

WebRTCはビデオ通話。WebTransportはデータ通信。 競合ではなく、補完関係です。「寿司屋とラーメン屋、どっちが上?」と聞くようなもので、そもそも土俵が違います。


まとめ

  • WebSocketの「1車線問題」(HOLブロッキング)を、QUICの多車線化で根本解決したのがWebTransport
  • 用途に合わせて3つの通信モードを使い分けられる
  • 今日の本番投入は時期尚早(ブラウザ対応がChrome/Edgeのみ)
  • ただし、次にリアルタイム通信の技術選定をするとき、WebTransportを知らないと判断を誤ります

まずはChromeで触ってみてください。WebSocketとは根本的に違うアーキテクチャの感覚がつかめるはずです。

技術選定の場で「WebTransportも検討しましたが、現時点ではブラウザ対応が限定的なのでWebSocketで行きます」と言えるのと、WebTransportの存在すら知らないのでは、エンジニアとしての信頼度が全然違います。知っておいて損はありません。


参考文献

  1. Frindell, A. et al. "WebTransport over HTTP/3", draft-ietf-webtrans-http3-15, IETF, 2026. https://datatracker.ietf.org/doc/draft-ietf-webtrans-http3/
  2. "WebTransport and WebSockets: An Empirical Analysis", IEEE ICCNC 2023. https://ieeexplore.ieee.org/document/10162060/
  3. "An Evaluation of HTTP/3 and WebTransport over QUIC in Live Low Latency Video Streaming", Springer 2025. https://link.springer.com/chapter/10.1007/978-981-96-4288-5_23
  4. Michel, F. et al. "Towards SSH3: how HTTP/3 improves secure shells", arXiv: 2312.08396, 2024. https://arxiv.org/abs/2312.08396
  5. Bondar, O. "Analysis of Next-Generation Internet Transport Protocols", Information Technologies and Systems, 2025. https://nasu-periodicals.org.ua/index.php/its/article/view/20812

Zoom・Meet・Teams・Skype、4大ビデオ会議の通信プロトコルを比較する ― 全部WebRTCだと思っていませんか?

業務でWebRTCを含め、Agora、SkyWay、Amazon Chime SDK等の実装検証をやってきたエンジニアです。

なお、WebRTCは単一技術ではなく仕様群です。本記事では「ブラウザ標準API(RTCPeerConnection)を利用した通信」を"WebRTCを使っている"と定義します。この点は社内でも議論になったため、あらかじめ定義を明確にしています。

同僚と話していて「ビデオ会議って全部WebRTCでしょ?」と言われることが結構あります。実はこれ、半分正解で半分間違いです。4大ビデオ会議サービスの通信プロトコルを調べてみたら、それぞれ全く違うアプローチを取っていて面白かったのでまとめます。

結論から

サービス メディアプロトコル WebRTC利用 アーキテクチャ
Google Meet WebRTC(Webクライアント) Webで最も標準に近い SFU
Microsoft Teams ICE/SRTP(WebRTC構成要素) Web版:使用 / デスクトップ:独自実装 クラウド集中型
Zoom 独自プロトコル → WebRTC移行中 SDK限定(2024/12〜) 独自メディアサーバー
Skype 独自P2P → Azure集中型 未移行のまま終了 (2025/5終了)

「全部WebRTC」ではないどころか、Webクライアントにおいて最も標準WebRTCに近いのはGoogle Meetだけです。

4大ビデオ会議サービスのWebRTC利用度
4大ビデオ会議サービスのWebRTC利用度

Google Meet — WebRTCの「本家」

Google MeetがWebRTCをネイティブに使っているのは当然と言えば当然です。WebRTC自体がGoogleが2011年にオープンソース化した技術だからです。

なお、ここで言う「WebRTCネイティブ」は主にWebクライアントの話です。モバイルネイティブアプリはGoogle独自の最適化を含むメディアスタックを使っており、標準WebRTCそのものとは異なる部分もあります。

技術スタック

  • シグナリング: SDP offer/answer(内部シグナリング基盤経由。Meet Media APIではREST経由でのSDP交換も可能)
  • NAT越え: ICE(STUN/TURN)
  • メディア暗号化: DTLS-SRTP
  • 映像コーデック: VP8/VP9/AV1(AV1は段階的に展開中)
  • 音声コーデック: Opus(WebRTC標準)
  • データチャネル: SCTP(RFC 8831)

アーキテクチャ: SFU

グループ通話ではP2Pではなく、SFU(Selective Forwarding Unit)を使っています。SFUはサーバー側のWebRTCクライアントとして動作し、各参加者のストリームを必要なクライアントに選択的に転送します。

P2Pだと参加者が増えるたびに接続数がN×(N-1)で爆発しますが、SFUなら各参加者はサーバーとの1接続で済みます。100人規模の会議が成立するのはこの仕組みのおかげです。

P2P vs SFU アーキテクチャ比較
P2P vs SFU アーキテクチャ比較

Google公式のMeet Media APIドキュメントを見ると、SDP offer/answer、ICE candidates、DTLSハンドシェイクなど、WebRTCの標準的なフローがそのまま記述されています。

参考: Meet Media API concepts - Google for Developers

余談: Lyra — 3kbpsで通話できるAIコーデック

Google Researchが2021年に発表したAIベースの超低ビットレート音声コーデック「Lyra」にも触れておきます。わずか3kbpsで自然な音声を再現でき、2G回線レベルの帯域でもビデオ会議が成立する技術です。

ただし、現時点ではChromeのlibwebrtc(WebRTCエンジン)にLyraは統合されていません。RTCPeerConnectionのSDP negotiationでOpusやG.711のように自動的にネゴシエーションすることはできず、WebRTC標準コーデック(RFC 7874)にも含まれていません。Google Duoのネイティブアプリでは低帯域環境向けに活用された実績がありますが、ブラウザ版Meetで標準的に使えるわけではないのが現状です。

WebRTCの業務をやっていると、低帯域環境での音声品質は常に課題になります。Opusでも十分優秀ですが、3kbpsで実用レベルの音声が出せるコーデックがブラウザ標準で使えるようになったら、新興国向けサービスや災害時通信など、適用範囲が一気に広がるはずです。libwebrtcへの統合を期待したいところです。

Microsoft Teams — WebRTCの「部品」を使う独自スタック

Teamsは「WebRTCを使っている」とも「使っていない」とも言える、微妙な立ち位置にいます。

WebRTCとの関係

Teamsのメディアスタックは、WebRTCの構成要素であるICE、STUN、TURN、SRTPを使用しています。Microsoft公式ドキュメントにも明記されています。

Teams media flows connectivity is implemented using standard IETF Interactive Connectivity Establishment (ICE) procedures. — Microsoft Teams call flows - Microsoft Learn

技術スタック

  • メディアトランスポート: RTP/SRTP
  • NAT越え: ICE(STUN/TURN、IETF標準準拠)
  • ポート構成: UDP 3478(STUN/TURN)ほか、動的ポートレンジも使用
  • シグナリング: HTTPS REST / SIP(Direct Routing時)
  • トランスポート優先度: UDP → TCP → HTTP(TCPは品質劣化するため非推奨)

「標準WebRTCそのもの」ではない理由

ブラウザ版Teams(teams.microsoft.com)はWebRTCのRTCPeerConnectionを使用しています。一方、デスクトップクライアントは独自のメディアエンジンを持っており、ICEやSRTPといった「WebRTCと同じRFC標準」を独自実装しています。

VDI(Azure Virtual Desktop)環境ではWebRTC Redirector Serviceを介してメディア処理をローカルデバイスにオフロードする仕組みがあり、この場合は720p上限などの制約があります。

Teamsはクラウドネイティブでゼロから設計されたマイクロサービスアーキテクチャですが、通話・VoIP部分の一部にはSkype由来のプロトコルの影響が見られます。Skype for Businessの「後継製品」という位置づけではあるものの、コードベースとしては別物です。WebRTCの標準プロトコルを採用しつつも、独自のメディアパイプラインを維持しています。

参考: Microsoft Teams call flows - Microsoft Learn 参考: Security guide for Microsoft Teams - Microsoft Learn

Zoom — 独自最適化を優先してきた会社

Zoomの技術的選択は、4サービスの中で最も興味深いです。

独自路線の歴史

Zoomのネイティブクライアントは、独自のコーデックと独自のメディアトランスポートで動作しています。WebRTCが業界標準になっていく中で、Zoomは独自最適化を優先する選択をしてきました。

Webクライアントの実装を見ると、そのこだわりがよくわかります。

  1. getUserMediaでカメラ・マイクにアクセス(これだけはWebRTCのAPI)
  2. WebAssemblyでZoomネイティブのC/C++コーデックをブラウザ上で実行
  3. メディアデータをWebSocket等経由でサーバーに送信(時期によりWebTransportやQUICベースの実験も行われている)

つまり、ブラウザ上でもWebRTCの標準的なRTCPeerConnection経路を使わず、独自のコーデックをWASMで動かして独自トランスポートでメディアを転送するという、かなり異例のアプローチです。

webrtcHacksによる詳細な技術分析では、chrome://webrtc-internalsを開いてもRTCPeerConnectionが存在しないことが確認されています。

参考: How Zoom's web client avoids using WebRTC - webrtcHacks

DataChannelへの進化

WebSocket(TCP)でリアルタイムメディアを送ると、パケットロス時にTCPの再送制御が入り、遅延が悪化します。この問題を解決するため、ZoomはWebRTCのDataChannel(SCTP over DTLS)を採用しました。

技術的にはDataChannelはRTCPeerConnectionの一部ですが、Zoomの実装では標準的なWebRTCメディアフロー(RTCPeerConnectionでの映像・音声トラック送受信)は使わず、DataChannel経由で独自エンコードしたメディアデータを転送するという使い方をしています。WebSocketはフォールバックとして維持されています。

2024年12月の転換点

2024年12月31日、ZoomはVideo SDK v2 for webでWebRTCの採用を発表しました。

Zoom's proprietary video stack has historically been distinct from WebRTC, relying on custom implementations of codecs and media transport. [...] With the release of Video SDK v2 for web, Zoom has added WebRTC support to its stack. — WebRTC.ventures

WebRTCのadaptive bitrateやcongestion controlの方が、独自スタックよりもブラウザ上での品質が高いことが認められた形です。

ただし、これはVideo SDKの話であり、Zoomミーティング本体のネイティブクライアントは引き続き独自スタックです。

参考: How Zoom's Video SDK stacks up on web - Zoom公式ブログ

Zoom Webクライアントのメディアスタック変遷
Zoom Webクライアントのメディアスタック変遷

Zoomが独自にこだわった理由

  • コーデック制御: 独自コーデックでCPU負荷・ネットワーク適応を細かく最適化
  • ファイアウォール越え: WebSocket経由なら認証プロキシも通過できる(WebRTC TURNでは長年問題だった)
  • 統一体験: ネイティブとWebで同一コーデックを使用

これらは合理的な判断でした。特にファイアウォール越えは企業環境では切実な問題です。

私自身、複数の企業でWebRTCの導入検証をやってきましたが、毎回頭を悩ませるのがポートの問題です。WebRTCでは公開が必要なポート数が多く、企業のセキュリティポリシーとの調整に時間がかかります。TURN/TLSで443番ポートに集約する方法もありますが、認証プロキシを挟んでいる環境ではそれすら通らないケースがありました。

Zoomが「WebSocketで443番ポート1つだけ」という割り切った設計にしたのは、この現場の痛みをよく理解していたからでしょう。企業向けに強かった理由の一つです。

Skype — 独自技術のまま幕を閉じたサービス

Skypeの技術的変遷は、ビデオ会議の歴史そのものです。

プロトコルの変遷

時期 アーキテクチャ 特徴
2003〜2012年 完全P2P ユーザーPCがスーパーノードとして機能
2012〜2017年 Microsoft管理SuperNode ルーティングのみ集中化、P2P基盤は維持
2017〜2025年 Azure集中型 P2P完全廃止、全トラフィックがクラウド経由
2025年5月5日 サービス終了 Microsoft Teamsに統合

WebRTCとの関係

MicrosoftはORTC(Object RTC)APIをSkype for Business Webクライアントで実装し、WebRTCの代替として推進しました。ORTCは2013年にHookflashが創設したW3C Community Groupで策定されたもので、WebRTCより低レベルなAPIを提供する設計でしたが、広く採用されるには至りませんでした。

WebRTCへの段階的移行(まずコーデックの互換性から)が計画されていましたが、結局はTeamsへの集約が優先され、Skypeは2025年5月5日にサービスを終了しました。

参考: The next chapter: Moving from Skype to Microsoft Teams - Microsoft公式

技術的な比較まとめ

NAT越え

サービス 方式
Google Meet ICE(STUN/TURN) — WebRTC標準
Teams ICE(STUN/TURN) — IETF標準準拠の独自実装
Zoom WebSocket(TCP)→ DataChannel(SCTP)→ WebRTC ICE(SDK)
Skype 独自ホールパンチング → Azure経由

メディア暗号化

サービス 方式
Google Meet DTLS-SRTP(WebRTC必須)
Teams SRTP / DTLS-SRTP(クライアント間構成により異なる)
Zoom TLS + AES-GCM → オプションE2EE対応
Skype 独自(AES-256 + RSA) → Azure TLS

Webクライアントの実装

サービス 方式
Google Meet WebRTC RTCPeerConnection
Teams WebRTC RTCPeerConnection(VDI環境はRedirector Service)
Zoom getUserMedia + WASM + DataChannel
Skype

なぜこんなに違うのか

各サービスが異なるアプローチを取った背景には、それぞれの事情があります。

Google Meet: WebRTCの開発元なので、自社技術をそのまま使うのが合理的。ChromeブラウザとWebRTCの両方を開発しているため、最適化も容易。

Microsoft Teams: ゼロから設計されたクラウドネイティブアーキテクチャで、IETF標準に準拠。企業向けの電話システム(PSTN)との接続にSIPが必要なため、WebRTCだけでは完結しない。ブラウザ版はWebRTC(RTCPeerConnection)を使用し、デスクトップクライアントは独自メディアエンジン。

Zoom: 独自技術で品質と安定性を追求してきたが、ブラウザ対応の市場要求とWebRTCの成熟により方針転換。ただし完全移行はまだ先。

Skype: 20年間のアーキテクチャ変遷の末、独自技術のまま終了。WebRTCが成熟する前に設計された技術的負債を解消できなかった。

まとめ

「ビデオ会議は全部WebRTC」ではありません。

  • Webクライアントで最も標準WebRTCに近い: Google Meet
  • ブラウザ版はWebRTC、デスクトップは独自実装: Microsoft Teams
  • 独自スタックからWebRTCに移行中: Zoom(SDK限定)
  • 独自技術のまま終了: Skype

WebRTCは「ブラウザでリアルタイム通信をするための標準」として確立しましたが、ネイティブクライアントではまだ独自実装が残っています。

ただ、Zoomの2024年末の方針転換が象徴するように、流れは明らかにWebRTCへの収束に向かっています。独自スタックを維持するコストよりも、WebRTCの標準に乗る方が合理的になってきた。Skypeの終了は技術要因だけでなく事業戦略の結果でもありますが、独自プロトコルの技術的負債が移行の足かせになったのは事実です。


参考文献