[ WebRTC 」の基礎

#WebRTCとは?
「__WebRTC__ =  __<font color="red">Web</font>__ __<font color="red">R</font>__eal-__<font color="red">T</font>__ime __<font color="red">C</font>__ommunication 」の略称です。
[W3C](https://ja.wikipedia.org/wiki/World_Wide_Web_Consortium)  ( World Wide Web Consortium ) が提唱するリアルタイムコミュニケーション用のAPIの定義で、
プラグイン無しで、ウェブブラウザ間のボイスチャット、ビデオチャット、ファイル共有をすることが可能です。

>__[ [W3C (World Wide Web Consortium)](https://ja.wikipedia.org/wiki/World_Wide_Web_Consortium) とは？]__
_1994年10月1日、World Wide Web(WWW)を考案した[ティム・バーナーズ=リー](https://ja.wikipedia.org/wiki/%E3%83%86%E3%82%A3%E3%83%A0%E3%83%BB%E3%83%90%E3%83%BC%E3%83%8A%E3%83%BC%E3%82%BA%EF%BC%9D%E3%83%AA%E3%83%BC)が、
World Wide Web(WWW)で使用される各種技術の標準化を推進する為に設立した標準化団体・非営利団体。_




語弊があることを承知で、初めてWebRTCという言葉を聞く人のために、

凄くかみ砕いて説明すると、

__WebRTC__ = <font color="red">__「ブラウザ間でリアルタイムなコミュニケーションを可能にする技術」</font>__

です。

#WebRTCでググってみると、、。

__「WebRTC」__ でGoogle検索をかけると、
上記抜粋のように__P2P (Peer-to-Peer)__と出てきますが、
厳密には、<font color="red">__P (Peer)__ と __P (Peer)__ を中継する__シグナリングサーバー(WebRTCサーバー)__が必要</font>です。

と、文章だけで記載しても、__初めての方はイメージしにくい__と思うので、
図と組み合わせながら説明していきたいと思います。

#上記内容を図式化してみると、、

![WebRTC仕組み.png](https://qiita-image-store.s3.amazonaws.com/0/180432/f1d2158a-a9c1-a78e-bc4e-6fbfa745639a.png)

__[図1] WebRTC通信(概要)__

__WebRTC__では、```映像```/```音声```/```アプリケーションデータ```などをリアルタイムにブラウザ間で送受信することができますが、
__<font color='skyblue'>②実際にブラウザ間で、P2P [Peer-to-Peer] 通信を始める</font>__前に、
__<font color="orange">①お互いの情報を交換するための「シグナリング」と呼ばれる処理を行う</font>__必要があります。

#WebRTCの通信は、大まかに2つに分かれています。

ほんとうに、ざっくりと説明すると、、。
_(もし認識が違っているようでしたら、ご指摘いただけますと幸いです。)_

__1. P2P通信を確立するまで__
__2. P2P通信を確立した後__

さきほどの図を見ていただくと分かると思いますが、
__P2P[Peer-to-Peer]でやり取りを行うまで__に、__<font color="red">通信する端末同士で
接続を行うための情報(相手のIPアドレス、UDPのポート番号)交換__をする必要があります。

_本日は、WebRTCを2つのパートに分けて、ご説明させていただきたいと思います。_

#P2P通信を確立するまで (PART1)
__ブラウザ間でP2P通信を行う際__には、<font color="red">__1.通信相手のIPアドレス__</font>や、
<font color="red">__2.動的に割り当てられるUDPのポート番号__</font>を把握する必要があります。
また、P2P通信でやり取りできるデータの種類等についても、通信端末間で合意しておく必要があります。

WebRTCでは、上記のようにP2P通信が確立するまでの間、いくつかの情報をやり取りします。

##1. Session Description Protocol(SDP)
一つ目は、__「Session Description Protocolo」(SDP)__と呼ばれるもので、
P2Pの通信条件等のやり取りを通信する端末同士で行います。

>__WebRTCのようなリアルタイム通信__を始めるためには、
メディアデータを含んだ__<font color="red">パケットの符号化方式</font>__や__<font color="red">パケットの宛先のアドレス</font>__などについて
端末間でやり取りを行う必要があります。このやり取りに必要となるのが、
__SDP(Session Description Protocol)と呼ばれる記述言語__です。
[SIPとリアルタイム通信より抜粋](http://www.ric.co.jp/book/pdfs/2-1.pdf)

__[特徴]__
__各ブラウザの情報__を示し、__文字列で表現__されます。例えば、下記のような情報を含んでいます。

- セッションが含むメディアの種類(音声、映像)、メディアの形式(コーデック)
- IPアドレス、ポート番号
- P2Pのデータ転送用プロトコル(※WebRTCの場合は、Secure RTP)
- P2P通信で使用する帯域

##2. Interactive Connectivity Establishment(ICE)
二つ目は、__Interactive Connectivity Establishment (ICE)__ と呼ばれるものです。

こちらの__ICE__では、__<font color="red">通信経路の決定</font>__を行います。

>P2P通信を行う際にどのような通信経路が使用できるかは、お互いのネットワーク環境に依存します。
この通信経路を定めるための仕組みが「Interactive Connectivity Establishment(ICE)」と呼ばれるもので、
__<font color="red">通信経路候補のこと</font>を<font color="red">「ICE Candidate」</font>__と呼びます。

_P2Pの通信を始める前に、通信経路になりうる経路候補がリストアップされます。_

- P2Pによる直接通信経路
- NATを通過するためのSTUNサーバーから取得したポートマッピング → 最終的にはP2P通信になる
- Firewallを超えるための、TURNによるリレーサーバーを介した中継通信

__<font color="red">通信経路候補(ICE Candidate)</font>が見つかれば、順次通信を試み、<font color="red">一番最初につながった経路が採用</font>__されます。

##P2P通信確立後の処理フローについて、、。

__P2P通信確立後(PART2)__に関しては、私自身まだまだ知識が不足しておりますので、
後日あらためて記載することにいたします。申し訳ございません。

#おわりに
最後までお読みいただき、ありがとうございました。
私自身も調べながら、気になる情報をまとめて記事にしておりますので、
記事内に不適当な箇所があるかもしれません。

何かお気づきの点ございましたら、ご指摘いただけますと幸いです。


#参考文献
[WebRTC入門2016](https://html5experts.jp/series/webrtc2016/)

[^1]: P2Pとは、Peer to Peerの略称。複数端末間での通信を行う際のアーキテクチャ[^3]の一つ。対等のもの(Peer,ピア)同士が通信をすることを特徴とする通信方式、通信モデル、あるいは、通信技術の一分野を指す。

[^2]: シグナリングサーバーとは、ここでは、PeerとPeerを仲介するサーバーのこと。

[^3]: アーキテクチャ(Architecture)とは、コンピュータにおける基本設計や設計思想などを意味する。