WEBRTC 데이터 채널 사용
요약
이 안내서에서는 피어 연결에 데이터 채널을 추가하는 방법을 살펴보고 임의의 데이터를 안전하게 교환하는 데 사용할 수 있습니다. 데이터 채널을 작성하고 자동 및 수동 협상 옵션을 논의하는 방법을 살펴 보겠습니다.
키 포인트
1. SCTP 전송은 피어 연결에서 RTCDATACHANNEL에 대한 데이터를 전송 및 수신하는 데 사용됩니다.
2. RTCPeerConnection 인터페이스에는 SCTP라는 읽기 전용 속성이 있으며, 이는 사용중인 SCTP 전송을 설명하는 RTCSCTPTRANSPORT 객체를 반환합니다.
삼. rtcpeerconnection 인터페이스의 createAChannel () 메소드는 새 데이터 채널을 만드는 데 사용됩니다.
4. 자동 협상은 RTCPeerConnection이 데이터 채널의 협상 및 생성을 처리 할 수 있도록합니다.
5. 수동 협상은 협상 된 속성으로 설정된 rtcdatachannel 객체를 작성한 다음 대역 밖에서 연결을 협상하는 것과 관련이 있습니다.
6. 데이터 채널을 통해 보낼 수있는 최대 메시지 크기는 RTCSCTPTRANSPORT 객체의 MAXMESSASSIZE 속성을 사용하여 결정할 수 있습니다.
7. webrtc 구성 요소 암호화를 사용하여 RTCDATACHANNAN을 통해 전송 된 데이터를 보호합니다.
8. WEBRTC 데이터 채널에 대한 사양은 WebRTC : Browsers 사양의 실시간 통신에서 찾을 수 있습니다.
9. WEBRTC 데이터 채널의 호환성은 브라우저에 따라 다릅니다.
10. 페이지의 편집 또는보고 문제를위한 추가 리소스 및 옵션은 “참조”섹션에서 찾을 수 있습니다.
질문과 답변
- WEBRTC 데이터 채널에서 ACK 블록의 목적은 무엇입니까??
ACK 블록은 전달 된 패킷에 간격이 있어도 특정 패킷을 분개 할 필요가 없음을 발신자에게 알리는 데 사용됩니다. 예를 들어, TSN 100, 102, 103 및 104가있는 데이터 청크가 전달되면 누적 TSN ACK가 100이면 ACK 블록을 사용하여 TSNS 102, 103 및 104를 드러내지 않아도됩니다. - RTCPeerConnection 인터페이스의 SCTP 속성은 무엇입니까??
SCTP 속성은 피어 연결에서 RTCDATACHANNEL에 대한 데이터를 전송하고 수신하는 데 사용되는 SCTP 전송을 설명하는 RTCSCTPTRANSPORT 객체를 반환합니다. SCTP가 협상되지 않으면 값은 null입니다. - WebRTC에서 데이터 채널을 어떻게 만들 수 있습니까??
rtcpeerconnection 인터페이스의 createAconnection () 메소드를 사용하여 데이터 채널을 만들 수 있습니다. 이 메소드는 새로 생성 된 데이터 채널을 나타내는 rtcdatachannel 객체를 반환합니다. - 자동 협상 및 수동 협상의 차이점은 무엇입니까??
자동 협상에서 RTCPeerConnection은 데이터 채널의 협상 및 생성을 처리합니다. CreateACHANNE () 메소드는 협상 된 속성의 값을 지정하지 않고 또는 거짓 값을 가진지로 호출됩니다. 수동 협상에서 데이터 채널은 협상 된 속성을 True로 설정하여 작성되며 협상은 웹 서버 또는 기타 수단을 사용하여 대역 밖으로 수행됩니다. - 데이터 채널을 통해 보낼 수있는 최대 메시지 크기를 결정하는 방법?
최대 메시지 크기는 RTCSCTPTRANSPORT 객체의 MAXMESSAGESIZE 속성에 액세스하여 결정할 수 있으며 RTCPeerConnection에서 사용하는 SCTP 전송을 나타냅니다. - RTCDATACHANNAL에서 전송 된 데이터가 자동으로 고정되어 있습니까??
예, RTCDatachannel에서 전송 된 모든 데이터는 Datagram Transport Layer Security (DTLS)를 사용하여 자동으로 보호됩니다. WEBRTC 구성 요소는 데이터의 보안을 보장하기 위해 암호화를 사용해야합니다. - WEBRTC 데이터 채널 사양을 어디서 찾을 수 있습니까??
WEBRTC 데이터 채널에 대한 사양은 WebRTC : Browsers 사양의 실시간 통신, 특히 DOM-RTCPEERCONNECTION-SCTP 섹션에서 찾을 수 있습니다. - 브라우저에서 WebRTC 데이터 채널의 호환성은 무엇입니까??
WEBRTC 데이터 채널의 호환성은 브라우저에 따라 다를 수 있습니다. 대상 브라우저 및 버전에 대한 호환성을 테스트하고 보장하는 것이 중요합니다. - WEBRTC 데이터 채널과 관련된 몇 가지 추가 리소스는 무엇입니까??
GitHub에서 페이지를 편집하거나 콘텐츠 문제를보고하거나 GitHub에서 소스 코드를 볼 수 있습니다. 이 옵션은 아래의 “참조”섹션에서 찾을 수 있습니다.WEBRTC 데이터 채널 사용
ACK는 누적 TSN ACK 이후에 접수 된 TSN을 차단합니다 . 패킷이 전달되는 틈이있는 경우 사용됩니다. 허락하다’s는 TSN 100, 102, 103 및 104를 통한 데이터 청크가 전달됩니다. 누적 TSN ACK는 100이지만 ACK 블록은 발신자에게 알려줄 수 있습니다’t 102, 103 또는 104를 재현해야합니다 .
rtcpeerconnection : SCTP 속성
읽기 전용 SCTP RTCPeerConnection 인터페이스의 속성은 SCTP 데이터가 전송 및 수신되는 SCTP 전송을 설명하는 RTCSCTPTRANSPORT를 반환합니다. SCTP가 협상되지 않으면이 값은 null입니다 .
SCTP 전송은 피어 연결의 모든 rtcdatachannel s에 대한 데이터를 전송 및 수신하는 데 사용됩니다.
값
데이터 채널을 전송 및 수신하기 위해 RTCPeerConnection에서 사용하는 SCTP 전송을 설명하는 RTCSCTPTRANSPORT 객체 또는 SCTP 협상이 발생하지 않은 경우 NULL.
예
Const Peerconnection = 새로운 rtcpeerconnection()); Const 채널 = Peerconnection.생성된다 채널("mydata")); 채널.Onopen = (이벤트)) => 채널.보내다("메시지 보내기")); >; 채널.onmessage = (이벤트)) => 콘솔.통나무(이벤트.데이터)); >; // 전송할 수있는 가장 큰 메시지 크기 결정 Const SCTP = Peerconnection.SCTP; Const maxmessagesize = SCTP.maxmessagesize;
명세서
사양 WEBRTC : 브라우저에서 실시간 통신
# dom-rtcpeerconnection-sctp브라우저 호환성
BCD 테이블은 브라우저에만로드됩니다
또한보십시오
이 페이지에서 콘텐츠 문제를 찾았습니다?
- Github의 페이지를 편집하십시오.
- 내용 문제를보고하십시오.
- Github에서 소스를 봅니다.
이 페이지는 2023 년 4 월 25 일에 MDN 기고자에 의해 마지막으로 수정되었습니다.
더 나은 인터넷을위한 청사진.
WEBRTC 데이터 채널 사용
이 안내서에서는 피어 연결에 데이터 채널을 추가하는 방법을 조사한 다음 임의의 데이터를 안전하게 교환하는 데 사용할 수 있습니다. 즉, 우리가 원하는 모든 종류의 데이터, 우리가 선택한 모든 형식으로.
메모: 모든 WEBRTC 구성 요소는 암호화를 사용해야하므로 RTCDatachannel에서 전송 된 모든 데이터는 데이터 그램 전송 계층 보안을 사용하여 자동으로 고정됩니다 (DTLS)). 자세한 내용은 아래 보안을 참조하십시오.
데이터 채널 생성
RTCDatachannel에서 사용하는 기본 데이터 전송은 두 가지 방법 중 하나로 만들 수 있습니다
- WebRTC가 운송을 만들어 원격 피어에게 알리도록하십시오 (Datachannel 이벤트를 받게함으로써). 이것은 쉬운 방법이며 다양한 사용 사례에서 작동하지만 필요에 따라 충분히 유연하지 않을 수 있습니다.
- 데이터 전송을 협상하기 위해 자신의 코드를 작성하고 다른 피어에게 새 채널에 연결해야한다는 신호를 보내도록 자신의 코드를 작성하십시오.
첫 번째 사례를 살펴 보겠습니다. 첫 번째 사례를 살펴 보겠습니다.
자동 협상
종종 피어 연결이 RTCDatachannel 연결 협상을 처리 할 수 있습니다. 이렇게하려면 전화하십시오
협상 된 속성에 대한 값을 지정하지 않고 creadAchannel () () . 이렇게하면 RTCPeerConnection이 자동으로 트리거되어 귀하의 협상을 처리하여 원격 피어가 데이터 채널을 생성하고 네트워크 전체에 두 가지를 연결하게됩니다.
rtcdatachannel 객체는 createAtachannel ()에 의해 즉시 반환됩니다. 열린 이벤트가 rtcdatachannel로 전송되는 것을 보면서 연결이 성공적으로 이루어 졌는지 알 수 있습니다 .
허락하다 datachannel = PC.생성된다 채널("MyApp 채널")); datachannel.addeventListener("열려 있는", (이벤트)) => 시작 전송(datachannel)); >));
수동 협상
데이터 채널 연결을 수동으로 협상하려면 먼저 RTCPeerConnection에서 CreateAChannel () 메소드를 사용하여 새로운 RTCDATACHANNAN 객체를 작성해야합니다 . 이 신호는 귀하를 대신하여 채널을 협상하지 않기 위해 피어 연결에 대한 신호입니다.
그런 다음 웹 서버 또는 기타 수단을 사용하여 대역 밖 연결을 협상하십시오. 이 프로세스는 원격 피어에게 동일한 ID를 사용하여 협상 된 속성으로 설정된 자체 rtcdatachannel을 생성해야한다는 신호를 보내야합니다 . 이것은 RTCPeerConnection의 두 객체를 연결합니다 .
허락하다 datachannel = PC.생성된다 채널("MyApp 채널", 협상: 진실, >)); datachannel.addeventListener("열려 있는", (이벤트)) => 시작 전송(datachannel)); >)); Requestremotechannel(datachannel.ID));
이 코드 스 니펫에서 채널은 협상 된 설정으로 작성된 다음 RequestremoTechannel ()이라는 함수가 협상을 트리거하는 데 사용되어 로컬 채널과 동일한 ID와 동일한 ID를 가진 원격 채널을 만듭니다.
이렇게하면 다른 속성을 사용하여 각 피어와 함께 데이터 채널을 만들고 ID와 동일한 값을 사용하여 선언적으로 채널을 만들 수 있습니다 .
버퍼링
WEBRTC 데이터 채널은 아웃 바운드 데이터의 버퍼링을 지원합니다. 이것은 자동으로 처리됩니다. 버퍼의 크기를 제어 할 수있는 방법은 없지만 현재 버퍼가 얼마나 많은 데이터 양을 알 수 있으며, 버퍼가 대기열 데이터에서 낮게 실행되기 시작할 때 이벤트로 알림을 선택할 수 있습니다. 이를 통해 메모리를 지나치게 사용하거나 채널을 완전히 늪지대없이 항상 보낼 준비가되도록 효율적인 루틴을 쉽게 작성할 수 있습니다.
메시지 크기 제한 이해
네트워크를 통해 전송되는 데이터의 경우 크기 제한이 있습니다. 기본 수준에서 개별 네트워크 패킷은 특정 값보다 클 수 없습니다 (정확한 숫자는 네트워크와 사용중인 전송 계층에 따라 다릅니다). 응용 프로그램 수준 (즉, 사용자 에이전트의 코드가 실행중인 WebRTC 구현 내에서 WebRTC 구현은 네트워크 전송 계층의 최대 패킷 크기보다 큰 메시지를 지원하는 기능을 구현합니다.
다양한 사용자 에이전트의 크기 제한이 무엇인지 알지 못하고 더 큰 메시지가 보내거나받을 때 어떻게 응답하는지 알지 못하기 때문에 문제를 복잡하게 할 수 있습니다. 사용자 에이전트가 스트림 제어 전송 프로토콜 (SCTP) 데이터를 처리하기 위해 동일한 기본 라이브러리를 공유하는 경우에도 라이브러리 사용 방법으로 인해 여전히 변형이있을 수 있습니다. 예를 들어, Firefox와 Google Chrome은 모두 USRSCTP 라이브러리를 사용하여 SCTP를 구현하지만 RTCDatachannel의 데이터 전송이 라이브러리를 호출하는 방식의 차이로 인해 실패 할 수있는 상황이 여전히 남아 있습니다.
Firefox를 실행하는 두 명의 사용자가 데이터 채널에서 통신하는 경우 Firefox가 여러 SCTP 메시지에서 큰 메시지를 보내기위한 현재 더 이상 사용되지 않는 기술을 구현하기 때문에 Firefox 및 Chrome이 통신 할 때보 다 메시지 크기 제한이 훨씬 큽니다. Chrome은 그렇지 않습니다. Chrome은 대신에 완료되었다고 생각되는 일련의 메시지를보고 여러 메시지로 수신 rtcdatachannel에 전달할 것입니다.
16 개 미만의 메시지는 모든 주요 사용자 에이전트가 동일한 방식으로 처리하므로 걱정없이 보낼 수 있습니다. 그 외에도 상황이 더 복잡해집니다.
큰 메시지에 대한 우려
현재 64 KIB보다 큰 메시지에 RTCDATACHANNAL을 사용하는 것은 실용적이지 않습니다 (16 KIB 크로스 브라우저 데이터 교환을 지원하려면 16 KIB). 문제는 RTCDatachannel에서 데이터를 보내고 수신하는 데 사용되는 프로토콜 인 SCTP가 원래 신호 프로토콜로 사용하도록 설계되었다는 사실에서 비롯됩니다. 메시지는 비교적 작을 것으로 예상되었습니다. 네트워크 계층의 MTU보다 큰 메시지에 대한 지원은 MTU보다 더 큰 신호를 보내야하는 경우 거의 사후 생각으로 추가되었습니다. 이 기능은 각 메시지에 연속 시퀀스 번호가 있어야하므로 다른 데이터가 연속적으로 표시되어야하므로 다른 데이터가 연속적으로 전송되어야합니다.
이것은 결국 문제가되었습니다. 시간이 지남에 따라 다양한 응용 프로그램 (WEBRTC 구현 응용 프로그램 포함)이 SCTP를 사용하여 더 큰 메시지를 전송하기 시작했습니다. 결국 메시지가 너무 커지면 큰 메시지가 해당 데이터 채널에서 다른 모든 데이터 전송을 차단하여 중요한 신호 메시지를 포함하는 것이 가능하다는 것을 깨달았습니다.
브라우저가 더 큰 메시지를 지원하기위한 현재 표준을 올바르게 지원할 때 문제가됩니다. 이것은 Firefox 57에서 구현되었지만 아직 크롬에서 구현되지 않았습니다 (Chromium Bug 7774 참조). EOR 지원을 제공함으로써 RTCDatachannel 페이로드는 훨씬 더 클 수 있습니다 (공식적으로 최대 256 KIB, Firefox의 구현은 무려 1 gib에서 캡을 캡처합니다). 256 kib에서도 긴급 트래픽을 처리하는 데 눈에 띄는 지연이 발생할만큼 충분히 큽니다. 더 커지면 운영 조건이 확실하지 않으면 지연이 발생할 수 없습니다.
이 문제를 해결하기 위해 새로운 시스템 스트림 스케줄러 (일반적으로 “SCTP NDATA 사양”이라고 함)는 WEBRTC 데이터 채널을 구현하는 데 사용되는 스트림을 포함하여 다른 스트림에서 전송 된 메시지를 인터 리브 할 수 있도록 설계되었습니다. 이 제안은 여전히 IETF 드래프트 형식이지만 일단 구현되면 SCTP 계층이 기본 하위 메시지를 자동으로 인터 리브하여 모든 채널의 데이터를 통과 할 수있는 기회가 있는지 확인하기 때문에 본질적으로 크기 제한이없는 메시지를 보낼 수 있습니다.
NData에 대한 Firefox 지원은 구현 중입니다. 일반적인 사용에 사용할 수있게되는 Firefox Bug 1381145를 참조하십시오. Chrome 팀은 Chrome Bug 5696에서 NData 지원 구현을 추적하고 있습니다.
메모: 이 섹션의 대부분의 정보는 Lennart Grahl이 작성한 WebRTC의 데이터 채널 메시지 크기 제한을 블로그 게시물에 부분적으로 기반으로합니다. 그는 조금 더 자세히 설명하지만 브라우저가 업데이트됨에 따라 일부는 그 이후로 기반이 될 수 있습니다. 또한 시간이 지남에 따라 특히 EOR 및 NDATA 지원이 주요 브라우저에 완전히 통합되면 더욱 커질 것입니다.
보안
WEBRTC를 사용하여 전송 된 모든 데이터는 암호화됩니다. RTCDATACHANNE의 경우, 사용 된 암호화는 DTLS (Datagram Transport Layer Security)이며, 이는 TLS (Transport Layer Security)를 기반으로합니다. TLS는 모든 HTTPS 연결을 보호하는 데 사용되므로 데이터 채널에서 보내는 데이터는 사용자의 브라우저에서 보내거나받은 다른 데이터만큼 안전합니다.
보다 근본적으로, WebRTC는 두 사용자 에이전트 간의 피어 투 피어 연결이므로 데이터는 웹 또는 응용 프로그램 서버를 통과하지 않습니다. 이것은 데이터를 가로 채울 수있는 기회를 줄입니다.
이 페이지에서 콘텐츠 문제를 찾았습니다?
- Github의 페이지를 편집하십시오.
- 내용 문제를보고하십시오.
- Github에서 소스를 봅니다.
이 페이지는 2023 년 4 월 25 일에 MDN 기고자에 의해 마지막으로 수정되었습니다.
WEBRTC는 SCTP를 사용합니까??
об йтоэ странице
м е р р регистрировали подо 착취 ay rzа ф징퍼, исход 넘추 타 ay сети. с пом거나 ю это인지 страницы м주는 сможем определить, что з просы отправляете именно, а не робот. почему это могло произойти?
эта страница отобр은 Âется в тех Â сл 나아가 · 추, ∈огда автомати인지 скими системи Google регтрирр곽막우 ся 테 추 법구추 추 님. котор ое нарушают условия использования. странира перестанет отобр은 жаться после того, как эти запросы прекратся. до отого момента для использования слу 갑기 Google необ 영향.
источником запросов может служить вредоносное по, подключаемые модули браузера или скрипт, насое 밑 밑 밑보관 сзлку ыапросов. если вл используете общий доступ в интернет, проблема 갑새 갑새 딘 악 с сомпером с с с с с саким 테 IP-адесом → Â 궤. обратитесь к своему системному администратору. подроб 변태.
проверка по слову может татак뿐 아니라 자기 появляться, если вы В 갑 갑격적 В Â водите слож ные запросы, об협 ораспронон혁 ™ rапротототототототото술도 있습니다. емами, или вводите запросы очень часто.
데이터 통신 #
Webrtc에서 무엇을 얻습니까?’S 데이터 통신? 틀
WEBRTC는 데이터 통신을위한 데이터 채널을 제공합니다. 두 피어 사이에서 65,534 개의 데이터 채널을 열 수 있습니다. 데이터 채널은 데이터 그램 기반이며 각각 고유 한 내구성 설정이 있습니다. 기본적으로 각 데이터 채널은 주문 배송을 보장했습니다. 미디어 배경 데이터 채널에서 WEBRTC에 접근하는 경우 낭비되는 것처럼 보일 수 있습니다. http 또는 websockets 만 사용할 수있을 때이 전체 서브 시스템이 필요한 이유는 무엇입니까?? 데이터 채널의 진정한 힘은 대표되지 않은/손실 전달로 UDP와 같이 작동하도록 구성 할 수 있다는 것입니다. 이는 낮은 대기 시간 및 고성능 상황에 필요합니다. 배압을 측정하고 네트워크 지원만큼만 보내도록 할 수 있습니다.
어떻게 작동합니까?? 틀
WebRTC는 RFC 4960에 정의 된 스트림 제어 전송 프로토콜 (SCTP)을 사용합니다. SCTP는 TCP 또는 UDP의 대안으로 의도 된 전송 계층 프로토콜입니다. WEBRTC의 경우 DTLS 연결을 통해 실행되는 응용 프로그램 계층 프로토콜로 사용합니다. SCTP는 스트림을 제공하며 각 스트림은 독립적으로 구성 할 수 있습니다. WEBRTC 데이터 채널은 그 주위의 얇은 추상화 일뿐입니다. 내구성과 주문에 관한 설정은 SCTP 에이전트로 바로 전달됩니다. 데이터 채널에는 SCTP가 할 수있는 몇 가지 기능이 있습니다’채널 레이블처럼 t Express. WEBRTC가 RFC 8832에 정의 된 데이터 채널 설정 프로토콜 (DCEP)을 사용하는 것을 해결합니다. DCEN은 채널 레이블과 프로토콜을 통신하기위한 메시지를 정의합니다.
dcep #
DCEP에는 Data_Channel_open과 Data_Channel_ack 두 가지 메시지 만 있습니다 . 오픈 한 각 데이터 채널에 대해 리모콘은 ACK로 응답해야합니다.
data_channel_open #
이 메시지는 채널을 열고 자하는 WEBRTC 에이전트가 전송합니다.
패킷 형식 #
0 1 2 3 1 2 3 4 5 6 7 8 9 0 1 2 3 4 5 6 7 8 9 0 1 2 3 4 5 6 7 8 9 0 1+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-| 메시지 유형 | 채널 유형 | 우선 순위 | +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-| 신뢰성 매개 변수 | +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-| 레이블 길이 | 프로토콜 길이 | +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+ \ \ / Label / \ \ +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+ \ \ / Protocol / \ \ +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
메시지 유형 #
메시지 유형은 정적 값이 0x03입니다 .
채널 유형 #
- data_channel_reliable (0x00) – 메시지가 없어져서 순서대로 도착합니다
- data_channel_reliable_unordered (0x80) – 메시지가 손실되지 않지만 주문이 없을 수 있습니다.
- data_channel_partial_reliable_rexmit (0x01) – 요청 된 시간을 시도한 후 메시지가 손실 될 수 있지만 순서대로 도착합니다.
- data_channel_partial_reliable_rexmit_unordered (0x81) – 요청 된 시간을 시도한 후에 메시지가 손실 될 수 있으며 순서가 떨어질 수 있습니다.
- data_channel_partial_reliable_timed (0x02) – 메시지가 없으면 메시지가 손실 될 수 있습니다’t 요청 된 시간에 도착하지만 순서대로 도착합니다.
- data_channel_partial_reliable_timed_unordered (0x82) – 메시지가 없으면 메시지가 손실 될 수 있습니다’t 요청 된 시간에 도착하여 순서대로 도착할 수 있습니다.
우선 사항 #
데이터 채널의 우선 순위. 우선 순위가 높은 데이터 채널이 먼저 예정됩니다. 우선 순위가 낮은 사용자 메시지는 우선 순위가 높은 사용자 메시지를 보내는 것을 지연시키지 않습니다.
신뢰성 매개 변수 #
데이터 채널 유형이 data_channel_partial_reliable 인 경우 접미사는 동작을 구성합니다
- Rexmit- 포기하기 전에 발신자가 메시지를 다시 세우는 횟수를 정의합니다.
- 시간 – 시간을 정의합니다.
라벨 #
데이터 채널의 이름을 포함하는 UTF-8에 인코딩 된 문자열. 이 문자열은 비어있을 수 있습니다.
규약 #
이것이 빈 문자열 인 경우 프로토콜은 지정되지 않습니다. 비어 있지 않은 문자열 인 경우에 등록 된 프로토콜을 지정해야합니다 “WebSocket 서브 프로토콜 이름 레지스트리”, RFC 6455에서 정의되었습니다.
data_channel_ack #
이 메시지는 WEBRTC 에이전트가 전송 하여이 데이터 채널이 열렸다는 것을 인정합니다.
패킷 형식 #
0 1 2 3 1 2 3 4 5 6 7 8 9 0 1 2 3 4 5 6 7 8 9 0 1 2 3 4 5 6 7 8 9 0 1+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-| 메시지 유형 | +-+-+-+-+-+-+-+-+
스트림 제어 전송 프로토콜 #
SCTP는 WEBRTC 데이터 채널의 진정한 힘입니다. 데이터 채널의 이러한 모든 기능을 제공합니다
- 멀티플렉싱
- TCP와 같은 재전송 메커니즘을 사용한 신뢰할 수있는 전달
- 부분적 신뢰 옵션
- 혼잡 회피
- 흐름 제어
SCTP를 이해하려면 세 부분으로 탐색 할 것입니다. 목표는이 장 후에 스스로 SCTP의 깊은 세부 사항을 디버그하고 배울만큼 충분히 알게 될 것입니다.
개념 #
SCTP는 기능이 풍부한 프로토콜입니다. 이 섹션은 WebRTC에서 사용하는 SCTP의 일부만 포함합니다. WEBRTC에서 사용하지 않는 SCTP의 기능에는 멀티 호밍 및 경로 선택이 포함됩니다.
20 년이 넘는 개발로 SCTP는 완전히 파악하기가 어려울 수 있습니다.
협회 #
협회는 SCTP 세션에 사용되는 용어입니다. 의사 소통하는 동안 두 SCTP 에이전트간에 공유되는 상태입니다.
스트림 #
스트림은 하나의 양방향 사용자 데이터입니다. 데이터 채널을 만들 때 실제로 SCTP 스트림 만 생성하는 것입니다. 각 SCTP 협회에는 스트림 목록이 포함되어 있습니다. 각 스트림은 다른 신뢰성 유형으로 구성 할 수 있습니다.
WebRTC는 스트림 생성에 대해서만 구성 할 수 있지만 SCTP는 실제로 언제든지 구성을 변경할 수 있습니다.
데이터 그램 기반 #
SCTP 프레임 데이터 데이터는 바이트 스트림이 아닌 데이터 그램으로 데이터로 구성됩니다. 데이터를 보내고받는 것은 TCP 대신 UDP를 사용하는 것과 같은 느낌이 듭니다. 당신은 돈입니다’t 한 스트림에서 여러 파일을 전송하려면 추가 코드를 추가해야합니다.
SCTP 메시지는 돈입니다’t는 UDP와 같은 크기 제한을 가지고 있습니다. 단일 SCTP 메시지의 크기는 여러 기가 바이트 일 수 있습니다.
청크 #
SCTP 프로토콜은 청크로 구성됩니다. 덩어리에는 여러 가지 유형이 있습니다. 이 청크는 모든 커뮤니케이션에 사용됩니다. 사용자 데이터, 연결 초기화, 혼잡 제어 등은 모두 청크를 통해 수행됩니다.
각 SCTP 패킷에는 청크 목록이 포함되어 있습니다. 따라서 하나의 UDP 패킷에서 다른 스트림에서 메시지를 전달하는 여러 청크를 가질 수 있습니다.
전송 시퀀스 번호 #
전송 시퀀스 번호 (TSN)는 데이터 청크의 글로벌 고유 식별자입니다. 데이터 청크는 사용자가 보내고 자하는 모든 메시지를 전달하는 것입니다. TSN은 수신기가 패킷이 손실되었는지 또는 순서대로 확인하는 데 도움이되기 때문에 중요합니다.
수신기가 누락 된 TSN을 발견하면’t 데이터를 충족 할 때까지 사용자에게 제공합니다.
스트림 식별자 #
각 스트림에는 고유 식별자가 있습니다. 명시 적 ID로 데이터 채널을 만들 때 실제로 스트림 식별자로 SCTP로 바로 전달됩니다. 당신이하지 않으면’t id를 통과하여 스트림 식별자가 귀하를 위해 선택됩니다.
페이로드 프로토콜 식별자 #
각 데이터 청크에는 페이로드 프로토콜 식별자 (PPID)에도 있습니다. 이것은 어떤 유형의 데이터를 교환하고 있는지 고유하게 식별하는 데 사용됩니다. SCTP에는 많은 PPID가 있지만 WebRTC에는 다음 5 개만 사용합니다
- Webrtc dcep (50) – dcep 메시지.
- WebRTC String (51) – Datachannel 문자열 메시지.
- Webrtc Binary (53) – Datachannel 이진 메시지.
- WebRTC String 빈 (56) – 길이가 0 인 datachannel 문자열 메시지.
- Webrtc 이진 빈 (57) – 길이가 0 인 Datachannel 이진 메시지.
규약 #
다음은 SCTP 프로토콜에서 사용하는 청크 중 일부입니다. 이것은 철저한 데모가 아닙니다. 이것은 상태 기계가 이해하기에 충분한 구조를 제공합니다.
각 청크는 유형 필드로 시작합니다. 청크 목록 전에 헤더도 있습니다.
데이터 청크 #
0 1 2 3 1 2 3 4 5 6 7 8 9 0 1 2 3 4 5 6 7 8 9 0 1 2 3 4 5 6 7 8 9 0 1+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-| 타입 = 0 | 예약 | u | b | e | 길이 | +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-| tsn | +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-| 스트림 식별자 | 스트림 시퀀스 번호 | +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-| 페이로드 프로토콜 식별자 | +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+ \ \ / User Data / \ \ +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
데이터 청크는 모든 사용자 데이터 교환 방법입니다. 데이터 채널을 통해 무엇이든 보낼 때 이것이 교환되는 방법입니다.
U 비트가 정렬되지 않은 패킷이면 설정됩니다. 스트림 시퀀스 번호를 무시할 수 있습니다.
B와 E는 시작 및 끝 비트입니다. 하나의 데이터 청크에 비해 너무 큰 메시지를 보내려면 별도의 패킷으로 전송 된 여러 데이터 청크에 조각화해야합니다. B와 E 비트 및 시퀀스 번호로 SCTP는이를 표현할 수 있습니다.
- b = 1, e = 0- 조각화 된 사용자 메시지의 첫 번째 조각.
- b = 0, e = 0- 조각화 된 사용자 메시지의 중간 조각.
- b = 0, e = 1- 조각화 된 사용자 메시지의 마지막 부분.
- b = 1, e = 1- 실패하지 않은 메시지.
TSN은 전송 시퀀스 번호입니다. 이 데이터 청크의 글로벌 고유 식별자입니다. 4,294,967,295 덩어리 후에는 0으로 감싸게됩니다. TSN은 조각난 사용자 메시지의 모든 청크에 대해 증가하여 수신자가 원래 메시지를 재구성하기 위해 수신 된 청크를 주문하는 방법을 알 수 있도록합니다.
스트림 식별자는이 데이터가 속한 스트림의 고유 식별자입니다.
스트림 시퀀스 번호는 모든 사용자 메시지가 증가한 16 비트 번호이며 데이터 메시지 청크 헤더에 포함됩니다. 65535 메시지 후에 이것은 0으로 감싸게됩니다. 이 번호는 u가 0으로 설정된 경우 수신기로의 전달 순서를 결정하는 데 사용됩니다. 스트림 시퀀스 번호는 각 메시지에 대해 전체적으로 만 증가하는 것을 제외하고는 TSN과 유사하며 각각의 개별 데이터 청크가 아닙니다.
페이로드 프로토콜 식별자는이 스트림을 통해 흐르는 데이터 유형입니다. WebRTC의 경우 DCEP, String 또는 Binary가 될 것입니다.
사용자 데이터는 귀하가 보내는 것입니다. WEBRTC 데이터 채널을 통해 보내는 모든 데이터는 데이터 청크를 통해 전송됩니다.
init chunk #
0 1 2 3 1 2 3 4 5 6 7 8 9 0 1 2 3 4 5 6 7 8 9 0 1 2 3 4 5 6 7 8 9 0 1+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-| 타입 = 1 | 청크 플래그 | 청크 길이 | +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-| 태그 시작 | +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-| 광고 수신기 창 크레디 (A_RWND) | +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-| 아웃 바운드 스트림의 수 | 인바운드 스트림의 수 | +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-| 초기 TSN | +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-\ \ / 옵션 / 가변 길이 매개 변수 / \ \ +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
Init Chunk는 협회 생성 과정을 시작합니다.
시작 태그는 쿠키 생성에 사용됩니다. 쿠키는 중간의 사람과 서비스 거부에 사용됩니다. 그들은 주 머신 섹션에서 더 자세히 설명합니다.
광고 된 수신기 창 크레딧은 SCTP에 사용됩니다’S 정체 제어. 이것은 수신기 가이 협회에 할당 한 버퍼의 큰 규모를 전달합니다.
아웃 바운드/인바운드 스트림 수는이 에이전트가 지원하는 스트림 수를 원격으로 알립니다.
초기 TSN은 로컬 TSN을 시작하는 임의의 UINT32입니다.
선택적 매개 변수는 SCTP가 프로토콜에 새로운 기능을 도입 할 수 있도록합니다.
자루 청크 #
0 1 2 3 1 2 3 4 5 6 7 8 9 0 1 2 3 4 5 6 7 8 9 0 1 2 3 4 5 6 7 8 9 0 1+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-| 타입 = 3 | 청크 플래그 | 청크 길이 | +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-| 누적 TSN ACK | +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-| 광고 수신기 창 크레디 (A_RWND) | +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-| 갭 ACK 블록의 수 = n | 중복 tsns의 수 = x | +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-| 갭 ACK 블록 #1 시작 | 갭 ACK 블록 #1 끝 | +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-\ \ . \ / / /+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+| 갭 ACK 블록 #N 시작 | 갭 ACK 블록 #N 엔드 | +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-| 중복 TSN 1 | +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-\ \ . \ / / /+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+| 중복 tsn x | +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
자루 (선택적 승인) 청크는 수신기가 발신자에게 패킷을 얻은 방법입니다. 발신자가 TSN에 대한 자루를 얻을 때까지 해당 데이터 청크를 다시 제출합니다. 자루는 단순히 TSN을 업데이트하는 것 이상을 수행합니다.
누적 TSN ACK받은 최고 TSN.
광고 된 수신기 창 신용 수신기 버퍼 크기. 더 많은 메모리를 사용할 수있게되면 수신기가 세션 중에이 점을 변경할 수 있습니다.
ACK는 누적 TSN ACK 이후에 접수 된 TSN을 차단합니다 . 패킷이 전달되는 틈이있는 경우 사용됩니다. 허락하다’s는 TSN 100, 102, 103 및 104를 통한 데이터 청크가 전달됩니다. 누적 TSN ACK는 100이지만 ACK 블록은 발신자에게 알려줄 수 있습니다’t 102, 103 또는 104를 재현해야합니다 .
TSN은 발신자에게 다음 데이터 청크를 두 번 이상 수신했다고 알려줍니다.
하트 비트 청크 #
0 1 2 3 1 2 3 4 5 6 7 8 9 0 1 2 3 4 5 6 7 8 9 0 1 2 3 4 5 6 7 8 9 0 1+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-| 타입 = 4 | 청크 플래그 | 심장 박동 길이 | +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+\ \ / 하트 비트 정보 tlv (가변 길이) / \ \ +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
하트 비트 청크는 리모컨이 여전히 응답하고 있다고 주장하는 데 사용됩니다. 당신이 참여한다면 유용합니다’t 데이터 청크를 보내고 NAT 매핑을 계속 열어야합니다.
중단 청크 #
0 1 2 3 1 2 3 4 5 6 7 8 9 0 1 2 3 4 5 6 7 8 9 0 1 2 3 4 5 6 7 8 9 0 1+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-| 타입 = 6 | 예약 | t | 길이 | +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-\ \ 0 또는 더 많은 오류 원인 \ / / / / +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
중단 된 청크는 갑자기 협회를 폐쇄합니다. 한쪽이 오류 상태에 들어갈 때 사용됩니다. 우아하게 연결을 끝내면 종료 청크가 사용됩니다.
종료 청크 #
0 1 2 3 1 2 3 4 5 6 7 8 9 0 1 2 3 4 5 6 7 8 9 0 1 2 3 4 5 6 7 8 9 0 1+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-| 유형 = 7 | 청크 플래그 | 길이 = 8 | +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-| 누적 TSN ACK | +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
종료 청크는 SCTP 협회의 우아한 종료를 시작합니다. 각 에이전트는 마지막 TSN의 리모컨을 전송합니다. 이것은 패킷이 손실되지 않도록합니다. webrtc는하지 않습니다’t SCTP 협회의 우아한 폐쇄를 수행하십시오. 우아하게 처리하려면 각 데이터 채널을 직접 찢어 야합니다.
누적 TSN ACK는 전송 된 마지막 TSN입니다. 각면은이 TSN으로 데이터 청크를받을 때까지 종료되지 않는다는 것을 알고 있습니다.
오류 청크 #
0 1 2 3 1 2 3 4 5 6 7 8 9 0 1 2 3 4 5 6 7 8 9 0 1 2 3 4 5 6 7 8 9 0 1+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-| 유형 = 9 | 청크 플래그 | 길이 | +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+\ \ / 더 많은 오류 원인 / \ \ +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
오류 청크는 원격 SCTP 에이전트에게 치명적이지 않은 오류가 발생했음을 알리는 데 사용됩니다.
전달 TSN 청크 #
0 1 2 3 1 2 3 4 5 6 7 8 9 0 1 2 3 4 5 6 7 8 9 0 1 2 3 4 5 6 7 8 9 0 1+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-| 타입 = 192 | 플래그 = 0x00 | 길이 = 변수 | +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-| 새로운 누적 tsn | +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-| 스트림 -1 | 스트림 시퀀스 -1 | +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+ \ / / \ +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+ | stream-n | 스트림 시퀀스 -N | +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
전진 TSN 청크는 글로벌 TSN을 앞으로 이동시킵니다. SCTP는이 작업을 수행하므로 돈을 건너 뛸 수 있습니다’더 이상 관심이 있습니다. 허락하다’s 당신은 당신이 10 11 12 13 14 15 15를 보내고 있다고 말하면이 패킷은 모두 도착하는 경우에만 유효합니다. 이 데이터는 실시간 민감성이므로 늦게 도착하면’t 유용합니다.
12와 13을 잃으면 14와 15를 보내야 할 이유가 없습니다 ! SCTP는 전방 TSN 청크를 사용하여이를 달성합니다. 수신기에게 14와 15가 아프다는 것을 알려줍니다’더 이상 배달 될 것입니다.
새로운 누적 TSN 연결의 새로운 TSN입니다. 이 TSN 이전의 모든 패킷은 유지되지 않습니다.
스트림 및 스트림 시퀀스는 스트림 시퀀스 번호 번호를 앞서 점프하는 데 사용됩니다. 이 필드의 중요성에 대해서는 데이터 청크를 다시 참조하십시오.
상태 머신 #
이것들은 SCTP 상태 머신의 흥미로운 부분입니다. webrtc는하지 않습니다’t SCTP 상태 머신의 모든 기능을 사용하므로 해당 부품을 제외했습니다. 우리는 또한 스스로 이해할 수 있도록 일부 구성 요소를 단순화했습니다.
연결 설정 흐름 #
Init 및 Init ACK 청크는 각 피어의 기능과 구성을 교환하는 데 사용됩니다. SCTP. 이것은 악수가 차단되지 않도록하고 DOS 공격을 방지하기위한 것입니다.
Init Ack 청크에는 쿠키가 들어 있습니다. 쿠키는 쿠키 에코를 사용하여 제작자에게 반환됩니다 . 쿠키 검증이 성공하면 쿠키 ACK가 전송되고 데이터 청크가 교환 될 준비가되었습니다.
연결 파열 흐름 #
SCTP는 종료 청크를 사용합니다. 에이전트가 종료 청크를 받으면 요청 된 누적 TSN ACK를받을 때까지 기다립니다 . 이를 통해 사용자는 연결이 손실 된 경우에도 모든 데이터가 전달되도록 할 수 있습니다.
유지 메커니즘 #
SCTP. 이들은 구성 가능한 간격으로 전송됩니다. SCTP는 패킷이 HASN 인 경우 지수 백 오프를 수행합니다’t 도착.
심장 박동 덩어리에는 시간 값도 포함되어 있습니다. 이를 통해 두 개의 연관성이 두 에이전트 간의 여행 시간을 계산할 수 있습니다.