WebRTCの定義を今更確認する

# 留意事項
筆者はWebRTCについてすごい技術程度の認識で何も知りません。業務で使ったことすらありません。
修正事項は指摘をいただければ修正できるときにします。

# 概要
本記事では、WebRTCを以下のものに基づいて確認していく。
1. W3Cの勧告 [https://www.w3.org/TR/2023/REC-webrtc-20230306/]
1. MDNの記述 [ttps://developer.mozilla.org/ja/docs/Web/API/WebRTC_API/Protocols]
1. RFC
    1. RFC7478 [https://www.rfc-editor.org/rfc/rfc7478.html]
    1. RFC8825 [https://www.rfc-editor.org/rfc/rfc8825.html]
1. webrtc.org/ [https://webrtc.org/getting-started/overview?hl=ja]

# 本記事でやらないこと / 出てこない用語
* 具体的なプロトコルの内容
    * WHIP
    * TCP
    * UDP
* 通信方法
    * Signaling Server
    * Data Channel
    * Media Transport

# 定義
## WebRTCとは何なのか
まず、WebRTCとは何なのか（具体的な実装ではない）というのを明確にする。

### W3C [WebRTC: Real-Time Communication in Browsers]
まず、APIを定義しているW3Cの「WebRTC: Real-Time Communication in Browsers」では以下のように述べてられている。
> This document defines the APIs used for these features. This specification is being developed in conjunction with a protocol specification developed by the IETF RTCWEB group and an API specification to get access to local media devices [GETUSERMEDIA] developed by the WebRTC Working Group. An overview of the system can be found in [RFC8825] and [RFC8826].

### RFC8825 (WebRTCに準拠するための仕様)
https://www.rfc-editor.org/rfc/rfc8825

まずタイトルが「Overview: Real-Time Protocols for Browser-Based Applications」であるので、ブラウザベースというのは間違いない。
さらに、以下のように述べられており、プロトコルを定義しないが、WebRTCに準拠するための仕様を示しているようだ。
> This document is an applicability statement -- it does not itself specify any protocol, but it specifies which other specifications implementations are supposed to follow to be compliant with Web Real-Time Communication (WebRTC).

そして、ブラウザのJavaScript APIでアクセスおよび制御可能であり、かつインターネットで音声と映像を相互にやりとり可能な機能を提供するとのことだ[^1]。
> This memo describes a set of building blocks that (1) can be made accessible and controllable through a JavaScript API in a browser and (2) together form a sufficient set of functions to allow the use of interactive audio and video in applications that communicate directly between browsers across the Internet.

これの結果、RFC7484のユースケースを実現するとのことだ。
> The resulting protocol suite is intended to enable all the applications that are described as required scenarios in the WebRTC "use cases" document [RFC7478].

しかし、一方で以下のようにも記載されており、全部のAPIを実装すると想定ではないし、通信相手がブラウザかプロトコル仕様が実装されている他のデバイスであるかは限定していない。
> The protocol specification does not assume that all implementations implement this API; it is not intended to be necessary for interoperation to know whether the entity one is communicating with is a browser or another device implementing the protocol specification.

具体的なプロトコルスタックの内容に関しては本記事では割愛する[^2]。

### RFC8826 (WebRTCのセキュリティに関する考慮事項)
https://www.rfc-editor.org/rfc/rfc8826
RFC8826では、セキュリティに関する事項が記載されている。
一番簡潔なWebRTCの説明がここに記されていた。
> WebRTC is a protocol suite for use with real-time applications that can be deployed in browsers -- "real-time communication on the Web". 

内容についてはセキュリティ脅威についての事項で問題ないと考えられる。
> This document defines the WebRTC threat model and analyzes the security threats of WebRTC in that model.


### RFC7478（WebRTCのユースケース）
以下の記述がある。この文書のユースケースや要件がWebRTCの要件を満たすというもので問題はなさそうだ。
>   This document also lists requirements related to the API to be used
   by web applications as an appendix.  The reason is that the W3C
   WebRTC WG has decided to not develop its own use-case or requirement
   document, but instead will use this document.  These requirements are
   named "An", where n is an integer, and are described in Appendix A.

Introductionでは以下のように記述されている。ブラウザでのリアルタイムコミュニケーションについて紹介すると記載されている。ただし、ここに明記されている通り、ユースケースにはエンドユーザのクライアントがブラウザでなくてもよいと明記されている (section-2.3.10.1がその一例である)。
>   This document presents a few use cases of web applications that are
   executed in a browser and use real-time communication capabilities.
   In most of the use cases, all end-user clients are web applications,
   but there are some use cases where at least one of the end-user
   clients is of another type (e.g., a mobile phone or a SIP User Agent
   (UA)).

RTC自体の定義に関してはW3Cの文書 [https://www.w3.org/TR/raur/] を参照のこと。

さて、ブラウザに求められる要件 (Requirements) なのだが、Section 3が適切なのだろう。ただ、項目が36個あり全てをまとめるのは手間なので、重要と思った項目について触れる。
F23-24に相互にストリームをリアルタイムにやり取りするというのが要求事項として含まれている (ついでにストリームの生成もF36で要件に入っている)。
したがって、この記述がP2P通信を行う、ということに対応する記述と考えてよさそうである。
| REQ-ID | DESCRIPTION |
| ---- | ---- |
| F23 | The browser must be able to transmit streams and data to several peers concurrently. |
| F24 | The browser must be able to receive streams and data from multiple peers concurrently. |
| F34 |The browser must be able to send short latency unreliable datagram traffic to a peer browser [RFC5405].|
| F35 | The browser must be able to send reliable data traffic to a peer browser. |
| F36 | The browser must be able to generate streams using the entire user display, a specific area of the user display or the information being displayed by a specific application. |

ネットワークでやり取りする上でのNAT越えの記述はF18-21に存在している。

| REQ-ID | DESCRIPTION |
| ---- | ---- |
| F18 | The browser must be able to send streams and data to a peer in the presence of NATs and firewalls that block UDP traffic. |
| F19 | The browser must be able to use several STUN and TURN servers. |
| F20 | he browser must support the use of STUN and TURN servers that are supplied by entities other than the web application (i.e., the network provider). |
| F21 | The browser must be able to send streams and data to a peer in the presence of firewalls that only allow traffic via an HTTP Proxy, when firewall policy allows WebRTC traffic. |

NATについては解説してくださっている記事が別途あるので参照されたし [https://qiita.com/okyk/items/a405f827e23cb9ef3bde]。

### WebRTC: Real-Time Communication in Browsersを改めて確認する
W3C Recommendation [https://www.w3.org/TR/2023/REC-webrtc-20230306/] を改めて確認していくこととする。
Introductionでは、以下のように記載されており、

『There are a number of facets to peer-to-peer communications and video-conferencing in HTML covered by this specification:
* Connecting to remote peers using NAT-traversal technologies such as ICE, STUN, and TURN.
* Sending the locally-produced tracks to remote peers and receiving tracks from remote peers.
* Sending arbitrary data directly to remote peers.』

P2P通信とビデオ会議というユースケースを達成するための機能を実現するためのAPIを定義しているという記載がある。

### MDN
https://developer.mozilla.org/en-US/docs/Web/API/WebRTC_API

音声や映像をブラウザ間でやり取りすると記載されている。
> WebRTC (Web Real-Time Communication) is a technology that enables Web applications and sites to capture and optionally stream audio and/or video media, as well as to exchange arbitrary data between browsers without requiring an intermediary.

複数のAPIとプロトコルで構成されていると記載されており、プロトコルスイートであるということに合致する。
> WebRTC consists of several interrelated APIs and protocols which work together to achieve this. 

## 総括
WebRTCとは、以下の特徴を持つ**プロトコルスイート**である。
1. ブラウザのJavaScript APIでアクセスと制御できる [RFC8825]
1. ブラウザで展開可能な、"real-time communication on the Web"向け [rfc8826]
1. P2P通信の機能を持つ [WebRTC: Real-Time Communication in Browsers]
1. 通信相手はブラウザでなくても問題ない [RFC8825 / RFC7478]
 

# 参考
https://qiita.com/yusukem99/items/c61a62e75db79c0eb8fe

[^1]: もしbuilding blocksにかかるのであれば、and thatになると思う。前が単数なので、form日本語版[https://tex2e.github.io/rfc-translater/html/rfc8825.html] の訳はどう見ても間違っている。ネイティブの意見が知りたい。DeepLでは『このメモでは、(1)ブラウザのJavaScript APIを通じてアクセスし、制御できるようにすることができ、(2)インターネット上でブラウザ間で直接通信するアプリケーションでインタラクティブなオーディオとビデオを使用できるようにするのに十分な機能のセットを形成するビルディングブロックのセットについて説明する。』となる。
[^2]: 定義に絞るのでデータのやり取り方法は割愛する