구글은 블랙 사회를위한 인종 평등을 증진하기 위해 최선을 다하고 있습니다. 방법을 참조하십시오.
이 페이지는 Cloud Translation API를 통해 번역되었습니다.
Switch to English

피어 연결 시작하기

피어 연결은 서로 다른 컴퓨터에 두 개의 응용 프로그램을 연결와 거래 피어 - 투 - 피어 프로토콜을 사용하여 통신 할 수있는 한 WebRTC 사양의 일부입니다. 피어 사이의 통신은 (지지 클라이언트에 대한 비디오, 오디오 또는 임의의 이진 데이터 일 수 RTCDataChannel API를). 두 동료 연결하는 방법을 발견하기 위해, 두 클라이언트는 ICE 서버 설정을 제공 할 필요가있다. 이것은 STUN 또는 TURN 서버 중 하나이며, 그들의 역할은 다음 원격 피어에 전송되는 각 클라이언트에 ICE 후보를 제공하는 것입니다. ICE 후보의 전송이 일반적으로 신호라고합니다.

신호

한 WebRTC 명세는 ICE (인터넷 접속 수립) 서버와 통신하기위한 API를 포함하지만, 상기 시그널링 컴포넌트는 그것의 일부가 아니다. 그들이 연결하는 방법 신호는 주에 두 동료 위해서는 필요합니다. 보통이 정규 HTTP 기반 웹 API를 통해 해결된다 (즉, REST 서비스 나 다른 RPC 메커니즘) 웹 응용 프로그램이 피어 연결하기 전에 필요한 정보를 전달할 수 있습니다 시작됩니다.

추적 코드는이 fictious 신호 서비스를 전송하는 데 사용 및 비동기 적으로 메시지를받을 수있는 방법을 보여줍니다 니펫을. 이것은 필요한 곳이 가이드 나머지 실시 예에서 사용될 것이다.

 // Set up an asynchronous communication channel that will be
// used during the peer connection setup
const signalingChannel = new SignalingChannel(remoteClientId);
signalingChannel.addEventListener('message', message => {
    // New message from remote client received
});

// Send an asynchronous message to the remote client
signalingChannel.send('Hello!');
 

시그널링은 여러 가지 방법으로 구현 될 수 있으며, 한 WebRTC 사양은 특정 솔루션을 선호하지 않습니다.

피어 연결을 초기화

각 피어 연결은에 의해 처리됩니다 RTCPeerConnection 객체입니다. 이 클래스의 생성자는 하나의 소요 RTCConfiguration 그것의 매개 변수로 개체를. 이 개체는 피어 연결이 설정 및 사용에 대한 ICE 서버에 대한 정보를 포함하는 방법을 정의합니다.

한 번 RTCPeerConnection 생성됩니다 우리는 우리가 피어 전화 또는 피어를 수신하는 경우에 따라 한 SDP의 서비스 또는 답을 작성해야합니다. SDP를 제공하거나 대답이 작성되면 다른 채널을 통해 원격 피어에 송신해야합니다. SDP를 전달하는 신호라고 원격 동료에 객체와의 WebRTC 사양이 적용되지 않습니다.

호출 측에서 피어 연결 설정을 시작하려면, 우리는 만들 RTCPeerConnection 객체를 다음 호출 createOffer() 만들 RTCSessionDescription 개체를. 이 세션 정보를 사용하여 로컬 설명으로 설정 setLocalDescription() 한 후, 수신 측에 대한 우리의 시그널링 채널을 통해 전송된다. 우리는 또한 우리의 제안 세션 설명에 대한 답변이 수신 측에서 수신 될 때 우리의 신호 채널에 수신기를 설정합니다.

 async function makeCall() {
    const configuration = {'iceServers': [{'urls': 'stun:stun.l.google.com:19302'}]}
    const peerConnection = new RTCPeerConnection(configuration);
    signalingChannel.addEventListener('message', async message => {
        if (message.answer) {
            const remoteDesc = new RTCSessionDescription(message.answer);
            await peerConnection.setRemoteDescription(remoteDesc);
        }
    });
    const offer = await peerConnection.createOffer();
    await peerConnection.setLocalDescription(offer);
    signalingChannel.send({'offer': offer});
}
 

우리가 만들기 전에 수신 측면에서, 우리는 들어오는 제공을 기다리는 RTCPeerConnection 인스턴스를. 이 작업이 완료되면 우리가 사용하는 수신 서비스를 설정 setRemoteDescription() . 다음으로, 우리는 전화 createAnswer() 수신 제공에 대한 답변을 만들 수 있습니다. 이 대답을 이용한 국부 설명으로 설정 setLocalDescription() 우리 시그널링 서버를 통해 상기 발신 측으로 송신 후와.

 const peerConnection = new RTCPeerConnection(configuration);
signalingChannel.addEventListener('message', async message => {
    if (message.offer) {
        peerConnection.setRemoteDescription(new RTCSessionDescription(message.offer));
        const answer = await peerConnection.createAnswer();
        await peerConnection.setLocalDescription(answer);
        signalingChannel.send({'answer': answer});
    }
});
 

두 동료가 로컬 및 원격 세션 설명을 모두 설정 한 후에 그들은 원격 피어의 기능을 알고있다. 이 피어 사이의 연결이 준비가되어 있음을 의미하지 않는다. 이 작업을 위해 우리는 다른 피어 (시그널링 채널을 통해) 각 피어 및 전송의 ICE 후보를 수집해야합니다.

ICE 후보

두 동료의 WebRTC를 사용하여 communitcate하기 전에, 그들은 교환 연결 정보가 필요합니다. 네트워크 상태 요인에 dependning 달라질 수 있기 때문에, 외부 서비스는 일반적으로, 피어에 연결 가능한 후보들을 발견하기 위해 사용된다. 이 서비스는 ICE라고하고, STUN 또는 TURN 서버를 사용한다. STUN은 NAT를위한 세션 순회 유틸리티를 의미, 일반적으로 대부분의 WebRTC 응용 프로그램에서 간접적으로 사용된다.

TURN은 (순회 릴레이 NAT 사용) STUN 프로토콜과 대부분의 상용의 WebRTC 기반 서비스가 동료 사이의 연결을 설정하기위한 TURN 서버를 사용하여 통합 더 진보 된 솔루션입니다. 한 WebRTC API는 모두 STUN을 지원하고 직접 TURN, 그것은 더 완전한 용어는 인터넷 연결 구축에서 수집됩니다. 의 WebRTC 연결을 만들 때, 우리는 보통의 구성에서 하나 개 또는 여러 ICE 서버를 제공 RTCPeerConnection 객체입니다.

트리클의 ICE

한번 RTCPeerConnection 객체가 생성되고, 기본 프레임 워크는 연결 설립 (ICE 후보)의 후보를 수집 ICE 제공 서버를 사용한다. 이벤트 icegatheringstatechangeRTCPeerConnection 얼음 수집 상태 인 것에 신호 ( new , gathering 또는 complete ).

피어는 ICE 수집이 완료 될 때까지 기다려야하는 것이 가능하지만, 그것은 "물방울 얼음"기술을 사용하고 발견됩니다으로 원격 피어 각 ICE 후보를 전송하는 것이 훨씬 더 효율적입니다. 이로 인해 피어 연결을 위해 설치 시간을 줄이고 화상 통화가 적은 지연을 시작 할 수 있습니다.

ICE 후보를 수집하려면, 단순히 청취자를 추가 icecandidate 이벤트입니다. RTCPeerConnectionIceEvent 포함 된 것이다 리스너에 방출 candidate 원격 피어 (참조 신호)로 전송해야 새로운 후보를 나타내는 속성을.

 // Listen for local ICE candidates on the local RTCPeerConnection
peerConnection.addEventListener('icecandidate', event => {
    if (event.candidate) {
        signalingChannel.send({'new-ice-candidate': event.candidate});
    }
});

// Listen for remote ICE candidates and add them to the local RTCPeerConnection
signalingChannel.addEventListener('message', async message => {
    if (message.iceCandidate) {
        try {
            await peerConnection.addIceCandidate(message.iceCandidate);
        } catch (e) {
            console.error('Error adding received ice candidate', e);
        }
    }
});
 

연결 설립

ICE 후보가 수신되면, 우리는 우리의 피어 연결에 대한 상태는 결국 연결된 상태로 변경됩니다 기대한다. 이를 감지하기 위해, 우리는 우리에 리스너를 추가 RTCPeerConnection 우리가 듣고 connectionstatechange 이벤트.

 // Listen for connectionstatechange on the local RTCPeerConnection
peerConnection.addEventListener('connectionstatechange', event => {
    if (peerConnection.connectionState === 'connected') {
        // Peers connected!
    }
});
 

RTCPeerConnection API 문서