WebRTC DataChannelのストリーム数上限 (1)

2026/03/27

R.Suzuki

WebRTC実験ノート

WebRTC DataChannelで何本のストリームが確立できるのかChromeで実験します。


はじめに

こんにちは。鈴木です。

リアルタイムコミュニケーション(RTC)仕様の標準化と,キャリア網機能を提供するAPIの標準化を担当し,技術調査・仕様提案を行っています。

本記事では,WebRTC関連実験のひとつとして,Chromeにおいて WebRTC DataChannelで何本のストリームが確立できるのかを調査します。

2026-09-09追記:
ChromeのWebRTC DataChannelのストリーム数上限が緩和されたため,補足記事 をご参照ください。

実験条件

環境

環境 version
Windows 11 25H2 (26200.7623)
Chrome 145.0.7632.117

利用するAPI

本実験では,1つのブラウザタブ内で2つのRTCPeerConnectionを作成し,ローカルでSDP交換を行うことでWebRTCセッションを確立します。確立したセッション上でDataChannelを順次作成し,エラーが発生するまでの本数を計測します。

実験モデル(単一ブラウザ内実行)
実験モデル(単一ブラウザ内実行)

DataChannelの作成にはRTCPeerConnection.createDataChannel()を使用します。テストではnegotiated: trueを指定し,明示的に引数でストリームIDを指定するモードで実験しました。

// negotiated モードでのDataChannel作成
const dc = pc.createDataChannel("test", { negotiated: true, id: streamId });

また,SCTP層がネゴシエーションした最大チャネル数はRTCSctpTransport.maxChannelsプロパティから取得できます。このプロパティはSCTPトランスポートが"connected"状態になった後に値を返します。

// SCTPトランスポートの情報取得
console.log(pc.sctp.maxChannels);   // ネゴシエーション済みの最大チャネル数
console.log(pc.sctp.maxMessageSize); // 最大メッセージサイズ

WebRTC DataChannelは,DTLS上のSCTP (Stream Control Transmission Protocol) を利用して実現されています(RFC 8831)。各DataChannelはSCTPの「ストリーム」に1対1で対応し,SCTPストリームIDがそのままDataChannelのIDとなります(RFC 8832)。SCTPストリームIDは16ビットで表現され,プロトコル仕様上は最大で65535本(IDは0~65534)のDataChannelを確立できることになります。

実験結果

Chromeでnegotiated: trueモードを使い,ストリームIDを0から順に増やしながらDataChannelを作成した結果を以下に示します。

成功した最大ID 作成できた本数 maxChannels 発生したエラー
1023 1024 1024 OperationError

ストリームID値 0~1023の1024本のDataChannelを作成できました。ID値 1024を指定した時点でOperationErrorが発生します。

またストリームIDを900から順に増やした場合は,ID値 900~1023の124本のDataChannelを作成できました。1本ずつDataChannelの作成・切断を繰り返す場合も,ID値1023までは問題なく作成可能で,IDに1024以上を指定するとエラーとなります。

以上から指定できるストリームIDに上限(1023)があることが確認されました。

実装における制限

なぜ65535本ではないのか

ChromiumがバンドルするWebRTCライブラリのlibwebrtcでは,SCTPトランスポートの実装において最大ストリーム数を定義する定数kMaxSctpStreamsが1024と設定されています。

ソースコード上の該当箇所は以下のファイルです。

  • api/sctp_transport_interface.h — kMaxSctpStreams = 1024 の定義

ChromiumのSCTP実装(dcSCTP)のライブラリ自体はデフォルトで65535本のストリームをサポートしていますが,Chromiumはこの値を1024に上書きしています。この値がSCTPのINITチャンクで相手側に通知され,接続確立後にRTCSctpTransport.maxChannelsとして1024が返されます。

従来のSCTP実装(usrsctp)ではストリームごとに管理用のデータ構造を事前に確保する設計であり,64ビット環境ではストリームペアあたり約100バイトのメモリを消費したとされています。65535本分すべて確保すると1接続あたり約6MBとなり,多数のPeerConnectionを扱うアプリケーションでは無視できないコストとなるため,このような制限が設けられているものと想定されます。

まとめ

本記事では,ChromeにおけるWebRTC DataChannelの作成上限の調査に関してご紹介しました。

項目 値
作成可能なDataChannel数 1024
使用可能な最大ストリームID 1023
上限超過時のエラー OperationError

プロトコル上は16ビットのストリームIDにより65535本程度が上限ですが,Chromiumの実装では1024本に制限されています。DataChannelを多数使用するアプリケーションを設計する際は,この実装上の制限に注意が必要です。

2026-09-09追記:
ChromeのWebRTC DataChannelのストリーム数上限が緩和されたため,補足記事 をご参照ください。

チーム紹介

本記事は,NTTネットワークサービスシステム研究所 ネットワーク基盤技術研究プロジェクト ノード処理基盤研究グループの RTC (Real-Time Commmunication) チームが執筆しています。 当チームでは,商用サービス開発とは独立した立場から,将来のRTCサービスを支える基盤技術の創出を目的としたコア研究として,RTC関連技術の研究開発および3GPPやCAMARA等における標準化活動に取り組んでいます。

本記事に関するお問い合わせは,下記アドレスまでご連絡ください。

お問い合わせ先メールアドレス