WebrtcにおけるICEの紹介

3628 ワード

原因:ソースコードに基づいて分析し、webrtcにおけるice接続の流れを記録します.
概要:Agentはまず必要なアドレスを取得し、その後、アドレスを交換し、その後、接続性テストを行い、最終的にデータ伝送のために最も合理的な接続を選択します.
ICE:interactive connectivity establishmentインタラクティブ接続確立.offer/answerモードに基づいてNAT通過を解決するプロトコルのセットである.NAT,NAT(Network Address Translationネットワークアドレス変換)について簡単に説明します.現在、NATタイプは主に完全テーパ型、アドレス制限テーパ型、ポート制限テーパ型、対称型に分けられ、各タイプのデータインタラクションモードも異なり、対称型NATに穴を開ける失敗の問題があることを覚えておく必要がある.ICEには主にSTUN+TURNなどのプロトコルが含まれており,TURNプロトコルの主な役割はNATホール打ちに失敗した後,Relayを利用して転送することである.
次に、ソース分析を行います.
1:まずagentはアドレスを取得し、アドレスはhost address、srvflx address、relay addressの3種類を含む.hostアドレスは私たちのローカルのアドレスで、ローカルエリアネットワーク内のangent間の通信に使用できます.srvflx addressは、NATを介して反射された対応するパブリックネットワークアドレスであり、このアドレスを介してagent間で通信を行う.relay addressはTURNサーバによって割り当てられたエージェントアドレスであり,転送使用に用いられる.ここで使用する優先度はhost>srvflx>relayです.
UDPPortを作成することで、作成中にローカルhost情報の収集を行い、candidateに従って組み合わせます.sigslotによりデータコールバックを行います.
PeerConnection::SetLocalDescription
WebRtcSession::MayStartGathering
P2PTransportChannel::MaybeStartGathering
BasicPortAllocatorSession::DoAllocate
AllocationSequence::OnMessage
AllocationSequence::CreateUDPPorts
UDPPort::OnLocalAddressReady

UDPPortの作成に成功すると、STUNサーバにbindingrequestメッセージを送信し、独自のNATアドレスを取得します.メッセージを送信して返信データを正常に受信すると、candidateグループのマージコールバックのためにデータを返します.
UDPPort::SendStunBindingRequests
StunBindingRequest::OnResponse
UDPPort::OnStunBindingRequestSuccessded

次にrelayアドレスの取得を行い、relayアドレスを取得してcandidateを組み合わせてコールバックする.
AllocationSequence::CreateRelayPorts
TurnAllocateRequest::OnResponse
TurnPort::OnAllocateSuccess

candidateのフォーマットについては、foundation、priority、protocol、type、addressなどが主なパラメータです.foundationはcandiadateが同じかどうかを判断するために使用されます.priorityは優先度を判断するために用いられ、protocolは伝送のためのプロトコルである.typeはアドレスタイプです.addressはアドレスです.foundationの値を決定するbaseAddressの概念があります.foundationが同じかどうかを決定するパラメータは,主に候補アドレスタイプtype,基準アドレスip,伝送プロトコル,候補アドレスである.基準アドレスについては、hostアドレスの基準アドレスがそのものです.srvflxアドレスの基準アドレスはhostアドレスです.relayアドレスの基準アドレスはrelayアドレスです.
a=candidate:1 1 UDP 9654321 212.223.223.223 12345 typ srflx raddr 10.216.33.9 rport 54321
static std::string ComputeFoundation(const std::string& type,
                                     const std::string& protocol,
                                     const std::string& relay_protocol,
                                     const rtc::SocketAddress& base_address)

このときcandidate情報収集が完了すると、上位プロトコルでインタラクティブになり、次にエンドのcandidateデータの設定が受信されます.まず、リモートのcandidateアドレスに基づいて接続を作成し、接続をソートし、最終的に転送接続として最適なものを選択します.
PeerConnection::AddIceCandidate
P2PTransportChannel::AddRemoteCandidate

≪接続の作成|Create Connection|emdw≫:ローカルに保存されているすべてのポートをリモート・アドレスにリンクします.ローカル・ポートの保存はcandidateを取得するたびにデータがコールバックされます.各接続の内部には接続オブジェクトが対応し、各接続オブジェクトの内部にはキュー格納SentPingが維持されます.SentPIngの状態に応じて接続の状態を維持します.ステータスに基づいてソートを実現します.
P2PTransportChannel::CreateConnections

ソート:主に接続状態に基づいてソートされます.原理はwriteableで、recevingはnon-writeable、non-recevingの前に並んでいます.内部もネットワークタイプによって比較されます.
P2PTransportChannel::AddRemoteCandidate
P2PTransportChannel::SortConnectionsAndUpdateState
{
    UpdateConnectionStates();
    CompareConnections();
}

ソートが完了すると、接続状態の判断や、既存の最適との比較など、最適化を選択します.
P2PTransportChannel::MaybeSwitchSelectedConnection

このとき選択が完了するとpingを送信して状態保全を行います.内部原理は、毎回ステータス更新を行い、他のconnectionを選択して接続するかどうかを確認することです.
P2PTransportChannel::MaybeStartPinging
P2PTransportChannel::OnCheckAndPing
P2PTransportChannel::FindNextPingableConnection

以上が連通性接続フローである.