Chrome M75から chrome://webrtc-internals が新しくなります

# おさらい chrome://webrtc-internals って何？

Chromeのアドレスバーで `chrome://webrtc-internals` と入力すると利用できる、WebRTCのデバッグツールです。

WebRTCを触ったことがある人であれば、誰もが一度はお世話になったことがあるあれです。
<img width="1355" alt="スクリーンショット 2019-05-29 15.38.17.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/6651/93b41264-9848-7edf-1150-7e51530e9aa6.png">

# 現在の chrome://webrtc-internals

## どんな情報が見られるの？

webrtc-internalsはコールバックベースのgetStats API(WebRTCの統計情報収集用のAPI)で情報を収集して、ビジュアル表示してくれます。

getStats APIはもともと各ブラウザベンダが独自に実装していましたが、現在はW3CによってプロミスベースのAPIの標準化がすすめられています。

- [Identifiers for WebRTC's Statistics API](https://www.w3.org/TR/webrtc-stats/#maintenance-procedures-for-stats-object-types
)
    - 2018.07.03: Candidate Recommendation（勧告候補）
    - 2019 Q4: Recommendation(W3C勧告) 予定

現行のwebrtc-internalsについては、改めて解説しません。
興味ある方は以下の記事をご覧頂ければと思います。
参考: [WebRTCデバッグ入門](https://qiita.com/yusuke84/items/8d232c8d24156f16e8ba)

# 新しい chrome://webrtc-internals

2019.06.04に安定版に降りてくるChrome M75からchrome://webrtc-internalsが新しくなります。

現行のコールバックベースの独自APIを利用したものから、プロミスベースの標準APIを利用したものに変わります。
参考: [PSA: WebRTC M75 Release Notes](https://groups.google.com/d/msg/discuss-webrtc/_jlUbYjv-hQ/mCtjlVyjAgAJ)

新しいchrome://webrtc-internalsは[Chrome ベータ版](https://www.google.com/intl/ja/chrome/beta/)で試すことが出来ます。
新しい方のUIは以下のとおりです。特徴としては、最初にどちらのgetStats APIのデータを閲覧するか、選択できるようになっていることです。デフォルトは標準APIの方です。
<img width="1338" alt="スクリーンショット 2019-05-29 16.57.12.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/6651/b5fe2085-1a6e-0296-ccd3-11e99a0a018c.png">

切り替えるシーンがあるんだっけ？と思われるかもしれませんが、個人的に思いつくのは、ダンプファイルとして出力して解析するシーンです。

webrtc-internalsの情報はダンプファイルとして出力できます。そのダンプファイルをfippo氏が作成されている[webrtc-dump-importer(github)](https://github.com/fippo/webrtc-dump-importer/)に読み込ませて解析することは良くやると思いますが、このimporterは独自APIを前提としているため、読み込ませる場合は切り替えた上でダンプファイルを出力する必要があります。
参考: [webrtc-dump-importer(tool)](https://fippo.github.io/webrtc-dump-importer/)

# 新しい chrome://webrtc-internals を読み解く

ここから新しいchrome://webrtc-internalsの中身をざっくり解説していきます。結論から先に言うと、表示される情報自体はほとんど変更はありませんが、表示方法はかなり変わっています。

## RTCPeerConnection生成時のオプション

<img width="1246" alt="スクリーンショット 2019-05-29 16.19.05.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/6651/c3589a2c-9b14-3895-0490-e741ede4c059.png">

iceServersで指定しているサーバのURI、ポート番号、トランスポート、各種ポリシー、sdpの解釈などが指定されています。ここは旧ツールと変更ありません。

```json
{ iceServers: [stun:stun.webrtc.ecl.ntt.com:3478, turn:turn.webrtc.ecl.ntt.com:443?transport=tcp, turn:turn.webrtc.ecl.ntt.com:443?transport=udp, turns:turn.webrtc.ecl.ntt.com:443?transport=tcp], iceTransportPolicy: all, bundlePolicy: balanced, rtcpMuxPolicy: require, iceCandidatePoolSize: 0, sdpSemantics: "plan-b" }
```

## イベントタイムライン

<img width="285" alt="スクリーンショット 2019-05-29 16.12.57.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/6651/071de8e8-b130-6bbd-de26-46835de1559a.png">

メディアの追加と削除、SDPの生成と交換、ICE処理、ICEステータスの状況等、WebRTCセッションを確立し継続するために裏側で発生している一連のイベントをタイムラインで表示可能です。ここも旧ツールと変更ありません。

## DTLSセッションに関する情報

WebRTCではDTLSというプロトコルを利用して暗号化通信を行います。厳密には、DataConnectionはデータ自体をDTLSで暗号化し、MediaConnectionはSRTPの鍵交換にDTLSを利用します。

そのDTLSセッションは公開鍵暗号化方式のため、互いの公開鍵（証明書）が正当なものかを判別する必要がありますが、WebRTCではシグナリングでやり取りするSDPの中に、fingerprintを含めて、そのフィンガープリントで実際にやり取りされる公開鍵の正当性を判断します。

ここには、そのフィンガープリントが記載されています。ここも基本的には変更なしです。
<img width="814" alt="スクリーンショット 2019-05-29 16.39.21.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/6651/43800179-40b8-18e3-73a3-9d4d3217073b.png">

## 各種統計情報

WebRTCのAPIは2018年ごろから、ORTCの思想を取り入れてAPI自体が変わってきています（参考: [WebRTC Update 2018 spring - レガシーAPIからモダンAPIへ](https://qiita.com/yusuke84/items/33fbafc68f998210f148#%E3%83%AC%E3%82%AC%E3%82%B7%E3%83%BCapi%E3%81%8B%E3%82%89%E3%83%A2%E3%83%80%E3%83%B3api%E3%81%B8)）。メディアの操作単位もMediaStreamからMediaStreamTrackに変わっています。

新しいAPIの考え方、実装に合わせて統計情報の収集方法も変わってきているため、このセクションはかなり変更されています。旧ツールに慣れている方は、該当する情報を探すのが大変かもしれません。
<img width="617" alt="スクリーンショット 2019-05-29 17.07.20.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/6651/e8444468-d432-48de-7a50-24c7004662ac.png">

次からこちらのセクションでよく利用しそうな項目を紹介します。

## IceCandidatePair

WebRTCの通信経路はICEという仕組みを利用して確立します。ここでは、経路確立に利用したCandidate情報、その通信経路で流れているデータ量、RTT等がリアルタイムで表示されます。
<img width="524" alt="スクリーンショット 2019-05-29 17.17.44.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/6651/8a082aec-004a-22c3-f68b-c087e003cda5.png">

Candidate情報はIDとなっているため、該当のセクションを別途確認する必要があります。今回は以下のCandidateが利用されています。
<img width="423" alt="スクリーンショット 2019-05-29 17.20.33.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/6651/b11d90dd-2969-4d25-33b3-2260d3974552.png">

ローカルPC上で複数のタブを開いてWebRTCセッションを確立しているため、IPアドレスは同一で、candidateTypeは両方hostになっていますが、別々の場所にクライアントがいる場合は、互いのIPアドレスや、candidateType（STUNを利用したP2P通信なのか、TURNを利用したリレー通信なのか 等）がわかります。また、local candidateについては、networkTypeも表示されるようになっていますね。

## MediaStream

次はWebRTCでやり取りしているMediaStreamの情報です。Audio/Videoそれぞれについて、受信パケット数、受信バイト数、パケットロス等の情報が表示されています。trackId、transporrIdはそれぞれ該当のセクションを確認しましょう。inbound-RTPは受信しているMediaStream、outbound-RTPは送信しているMediaStreamを指します。
<img width="484" alt="スクリーンショット 2019-05-29 17.24.16.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/6651/71eba3c9-c026-5bd2-b2d8-cadc342795d1.png">

codecIdについては、参照先の該当セクションがないため、イベントタイムラインからSDPの情報を確認しましょう。
`RTCCodec_video_Inbound_96` であれば、 `a=rtpmap:96 VP8/90000` が該当します。

コーデックに関しては、旧ツールではコーデック名が直接記載されていたため、正直見にくくなりました。

## MediaStreamTrack

次は先程のMediaStreamに含まれるTrack情報です。ビデオの場合は解像度やフレームレートも表示されています。MediaStreamの中に複数のTrackがあれば複数表示されます（はずです）。
<img width="536" alt="スクリーンショット 2019-05-29 18.01.15.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/6651/295ee88d-ab02-21f3-12a2-64e5fb8fd923.png">

## DataConnection

DataChannelのオープン数、クローズ数が表示される模様です。未確認です。
<img width="392" alt="スクリーンショット 2019-05-29 17.26.21.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/6651/836bf142-a38e-099e-d6b2-20d4508d03d9.png">

## グラフ

ここからは、今まで説明した情報をグラフ表示してくれます。詳細は割愛します。
<img width="709" alt="スクリーンショット 2019-05-29 17.27.07.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/6651/c5dfe096-0d43-e491-ea20-aecd471af442.png">

グラフの最後に「RTCTransport_audio_1」という項目があります。こちらは、WebRTCの通信経路全体の統計情報です。MediaStreamの情報からリンクされていたtransportIdの情報となります。
<img width="1304" alt="スクリー![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/6651/2e4ac846-38d1-3b7b-ad96-21811e887501.png)
ンショット 2019-05-29 17.27.18.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/6651/09de5742-c3b5-7e15-27d9-c0b3678c4ecb.png">

Transportの概念は以下の通りです。iceTransportがここでいうTransportとなります。つまり、送受信しているMediaStream全体のビットレートや転送量がわかります。
![image](https://qiita-image-store.s3.amazonaws.com/0/6651/9e52a445-4c38-22b4-f779-9a3577d6b265.png)

# 最後に

簡単ですが、新しいchrome://webrtc-internlsについて見てきました。
WebRTCの実装やAPIはかなり早いスピードで変わります。検索して出てきたQiitaの記事の情報が古いこともザラにあります（すみません、私の記事もいくつかは古いです…）。アンテナを高くして最新の情報をキャッチアップするようにしましょう。