2014-05-17 2 views
12

webrtc에 대한 STUN 서버에 대한 나의 이해는 클라이언트가 NAT 뒤에있는 경우 (대부분이 아닌 모든 경우) STUN 서버는 webrtc 클라이언트가 자신의 주소와 포트를 식별하는 것을 도와줍니다. 또한 webrtc 클라이언트에 신호 서버가 필요하다는 일부 문서를 읽었습니다. 시그널링 서버는 웹 서버, socket.io이거나 URL을 전자 메일로 보낼 수도 있습니다. 내 첫 질문은 : STUN 서버가 신호 서버입니까? socket.io 기반 시그널링 서버를 사용하는 경우 webrtc에 STUN 서버가 절대적으로 필요합니까?

사실 지금은 다른 모든 클라이언트에 클라이언트의 세션 설명을 방송하는 매우 간단한 socket.io 기반 서비스를 구축. 그래서 socket.io 기반 서버는 클라이언트의 주소와 포트 정보에 대한 충분한 지식을 가지고 있어야한다고 생각합니다. 이 경우 다른 STUN 서버를 가지고 왜 귀찮게합니까?

답변

21

스턴 서버가 NOT 시그널링 서버 입니다.

시그널링 서버의 목적은 세션의 최대 시작에 피어간에 정보를 전달하는 것입니다 (그들이에 보낼 사람 모르게 제안을 보낼 수있는 방법?). 이 정보에는 제안 및 답변에 작성된 SDP와 각 당사자가 만든 모든 Ice Candidate가 포함됩니다.

STUN 서버가있는 이유는 두 피어가 서로 미디어를 보낼 수 있기 때문입니다. 미디어 스트림은 신호 서버에 도달하지 않고 상대방 (피어 - 투 - 피어 연결의 정의)으로 곧바로 연결됩니다. 예외적으로 TURN 서버가 사용되는 경우는 예외입니다. 두 당사자가 서로에 직접 액세스 (가 동일한 LAN에 있다면 그들은 것 등)이 없기 때문에

미디어 마술 NAT 또는 방화벽을 통과 할 수 없다. 짧은 STUN 서버에서

는 (피어 - 투 - 피어 미디어 스트리밍을위한 유효한 연결 후보를 얻기 위해) 두 당사자가 동일한 네트워크에없는 시간의 대다수를 필요로하고, 신호 서버는 항상필요 (다른 네트워크에 있든 없든) 협상 및 연결 구축이 이루어질 수 있습니다. Good explanation of the connection and streaming process

+0

매우 명확하고 유익한 답변 덕분에 @bwtrent에게 감사드립니다. STUN 서버는 언제 재생됩니까? 피어 연결이 시작될 때 또는 연결 중에 항상 있어야합니까? 응답이 연결의 시작 부분에만있는 경우? 시그널링 서버가 STUN 서버가 무엇을 하든지간에 무엇이든할까요? 신호 서버는 각 피어와 대화하기 위해 피어의 NAT 정보에 대해 충분히 알고 있어야한다고 생각하기 때문입니다. STUN 서버의 복잡성을 과소 평가 했나요? –

+1

@ElgsQianChen STUN 서버 여야합니다. 신호 서버와 STUN 서버는 동일한 물리적 위치/동일한 물리적 상자/FQDN에있을 수 있지만 NAT 협상은 STUN (또는 대칭 NAT가 작동 중일 때 켜짐)으로 수행되어야합니다. 이것은 WebRTC spec/movement/그것이 현재 호출되고있는 것과 일치합니다. –

+0

@BenjaminTrent가 언급했듯이, STUN과 시그널링 서버는 동일한 물리적 인 기계 IFF 둘 모두에 존재할 수 있습니다. 신호 서버 부분은 정보를 교환하기 위해 두 피어가 연결하기 바로 전에 작동합니다. 반면 STUN (또는 TURN)의 역할은 이전에 왔으며 각 피어에게 어떻게 도달 할 수 있는지 알려주거나 업데이트하는 것입니다. 이 정보는 시그널링 단계에서 연결을 설정하는 데 사용됩니다. 이것이 STUN이 두 동료에게 공개되어야하는 이유입니다. – karimyafi

6

STUN는 두 클라이언트 사이에 작동하는 네트워크 경로를 찾을하려고 ICE 프로토콜을 구현하는 데 사용됩니다. ICE는 또한 NAT/방화벽 제한으로 인해 두 클라이언트가 직접 피어 - 투 - 피어 연결을 할 수없는 경우 TURN 릴레이 서버 (RTCPeerConnection에서 구성된 경우)를 사용합니다.

STUN 서버는 인터넷에서 컴퓨터가 사용하는 외부 주소 (NAT 외부 주소)를 식별하고 피어에서 사용할 수있는 포트 매핑을 설정하기 위해 사용됩니다 (NAT가 " 대칭 ") - STUN 서버에 접속하면 ICE에서 사용하려고하는 외부 IP와 포트를 알려줍니다. 이들은 SDP 또는 속임수 - ICE 메시지에 포함 된 ICE 후보입니다. (UDP 훨씬 선호하지만, 바람직하게는 UDP 및 TCP TURN 지원)

거의 보장 연결성, 서버는 TURN 서버를 가져야한다. STUN과 달리 TURN은 상당한 대역폭을 사용할 수 있으므로 호스트 비용이들 수 있습니다. 다행히도 대부분의 연결은 TURN 서버를 사용할 필요없이 성공합니다 (즉, 피어 투 피어를 실행합니다).

+0

감사합니다. @jesup. 기술적으로 시그널링 서버를 사용하여 STUN 서버가해야하는 일을 할 수 있습니까? STUN 서버의 유일한 임무는 NAT 뒤에있는 클라이언트에게 그들이 가지고있는 공용 IP와 포트를 알려주는 것입니다. 왜 신호 서버가 그렇게하지 못하게할까요? 알다시피, 내 socket.io 기반 시그널링 서버로 할 수 있다면 STUN 서버를 의존성으로 피하는 것이 가장 좋습니다. –

+2

동일한 서버 (FQDN/IP)는 STUN 서버와 신호 서버가 될 수 있지만 서로 다른 기능을합니다. ICE는 제공된 STUN/TURN 서버 목록을 처리합니다. RTP/RTCP/datachannel에 사용되는 각 채널은 다른 포트 매핑을 얻습니다 (rtcp-mux는 RTP 및 RTCP 포트를 결합하지만 BUNDLE은 구현시 모든 스트림을 하나의 포트로 멀티플렉싱합니다). 그러나 여전히 동일하지는 않습니다 포트는 시그널링에 사용됩니다 (시그널링은 대개 UDP가 아니라 TCP입니다. UDP ala SIP 일 수 있지만 일반적으로 브라우저에서는 랜덤 UDP 포트 액세스가 허용되지 않습니다). – jesup

1

LAN에서만 유효한 "사설 IP"를 "공용"으로 변환하는 데 NAT (Network Address Transformation) IP "가 유효합니다. 문제는"공용 IP "가 외부에서만 볼 수 있으므로 STUN 또는 TURN 서버가"공용 IP "를 다시 보내야한다는 것입니다. 이 프로세스를 통해 WebRTC 피어는 공개적으로 액세스 할 수있는 주소를 가져 와서 신호 메커니즘을 통해 다른 피어로 전달할 수 있습니다.

STUN 서버는 외부 네트워크 주소를 가져 오는 데 사용됩니다. TURN 서버는 직접 (피어 투 피어) 연결에 실패 할 경우 트래픽을 릴레이하는 데 사용됩니다. 에 대한 자세한 내용은 아래 링크에서 참조 할 수도 있습니다. https://www.html5rocks.com/en/tutorials/webrtc/infrastructure/#what-is-signaling

관련 문제