Korzystanie z kanałów danych WebRTC
Streszczenie
W tym przewodniku zbadamy, jak dodać kanał danych do połączenia rówieśniczego, które następnie można wykorzystać do bezpiecznej wymiany arbitralnych danych. Przyjrzymy się, jak utworzyć kanał danych i omówić opcje negocjacji automatycznych i ręcznych.
Kluczowe punkty
1. Transport SCTP służy do przesyłania i odbierania danych dla RTCDataChannels w połączeniu rówieśniczym.
2. Interfejs RTCPeerConnection ma właściwość tylko do odczytu o nazwie SCTP, która zwraca obiekt RTCSCTPTRANSPORT opisujący używany transport SCTP.
3. Metoda CreatedATAChannel () na interfejsie RTCPeerConnection jest używana do utworzenia nowego kanału danych.
4. Automatyczne negocjacje umożliwia RTCPeerConnection na obsługę negocjacji i tworzenia kanału danych.
5. Ręczne negocjacje obejmują utworzenie obiektu RTCDatachannel z wynegocjowaną nieruchomością ustawioną na true, a następnie negocjowanie połączenia poza pasmem.
6. Maksymalny rozmiar wiadomości, który można wysłać przez kanał danych, można określić za pomocą właściwości MaxMessagesize obiektu RTCSCTPtransport.
7. Komponenty WebRTC wykorzystują szyfrowanie do zabezpieczenia danych przesyłanych przez RTCDATACHANNEL.
8. Specyfikacje dla kanałów danych WebRTC można znaleźć w specyfikacji WEBRTC: Komunikacja w czasie rzeczywistym w przeglądarkach.
9. Kompatybilność kanałów danych WebRTC różni się w zależności od przeglądarków.
10. Dodatkowe zasoby i opcje edytowania lub raportowania problemów ze stroną można znaleźć w sekcji „patrz także”.
Pytania i odpowiedzi
- Jaki jest cel bloków ACK w kanałach danych WebRTC?
Bloki ACK służą do poinformowania nadawcy, że niektóre pakiety nie muszą być urażone, nawet jeśli istnieje luka w dostarczanych pakietach. Na przykład, jeśli dostarczone są kawałki danych z TSN 100, 102, 103 i 104, ale skumulowana ACK TSN wynosi 100, bloki ACK można użyć do wskazania, że TSNS 102, 103 i 104 nie muszą być urażone. - Co zwraca właściwość SCTP interfejsu RTCPeerConnection?
Właściwość SCTP zwraca obiekt RTCSCTPtransport, który opisuje transport SCTP wykorzystywany do przesyłania i odbierania danych dla RTCDataChannels w połączeniu rówieśniczym. Jeśli SCTP nie został negocjowany, wartość jest null. - Jak można utworzyć kanał danych w WebRTC?
Kanał danych można utworzyć za pomocą metody CreatleatAChannel () na interfejsie RTCPeerConnection. Ta metoda zwraca obiekt RTCDataChannel reprezentujący nowo utworzony kanał danych. - Jaka jest różnica między automatyczną negocjacją a negocjacjami ręcznymi?
W automatycznych negocjacjach RTCPeerConnection obsługuje negocjacje i tworzenie kanału danych. Metoda CreatedAtAChannel () jest wywoływana bez określenia wartości dla negocjowanej właściwości lub z wartością fałszu. W ręcznych negocjacjach kanał danych jest tworzony z wynegocjowaną właściwością ustawioną na true, a negocjacje odbywają się poza pasmem za pomocą serwera internetowego lub innych środków. - Jak można określić maksymalny rozmiar wiadomości, który można wysłać przez kanał danych?
Maksymalny rozmiar wiadomości można ustalić, uzyskując dostęp do właściwości MaxmessageSize obiektu RTCSCTPTRANSPORT, który reprezentuje transport SCTP używany przez RTCPeerConnection. - Czy dane przesyłane na RTCDATACHANNEL AUTOMATYCZNE?
Tak, wszystkie dane przesyłane na RTCDATAChannel są automatycznie zabezpieczone za pomocą bezpieczeństwa warstwy transportowej Datagram (DTLS). Komponenty WebRTC są zobowiązane do użycia szyfrowania, aby zapewnić bezpieczeństwo danych. - Gdzie można znaleźć specyfikacje dla kanałów danych WebRTC?
Specyfikacje dla kanałów danych WebRTC można znaleźć w WEBRTC: Komunikacja w czasie rzeczywistym w specyfikacji przeglądarków, w szczególności sekcja DOM-RTCPEERCNECTIONS-SCTP. - Jaka jest kompatybilność kanałów danych WebRTC w przeglądarkach?
Kompatybilność kanałów danych WebRTC może się różnić w różnych przeglądarkach. Ważne jest, aby przetestować i zapewnić kompatybilność dla docelowych przeglądarek i wersji. - Jakie są dodatkowe zasoby związane z kanałami danych WebRTC?
Możesz edytować stronę w GitHub, zgłaszać problemy z treścią lub wyświetlić kod źródłowy na GitHub. Te opcje można znaleźć w sekcji „patrz także” poniżej.Korzystanie z kanałów danych WebRTC
ACK blokuje TSN, które zostały otrzymane po skumulowanym ACK TSN . Jest to używane, jeśli istnieje luka w dostarczanych paczkach. Pozwalać’S powiedz, że dostarczane są fragmenty danych z TSNS 100, 102, 103 i 104. Skumulowany ACK TSN wynosiłby 100, ale bloki ACK można użyć do powiedzenia nadawcy, że to nie’T muszę ponownie wyśledzić 102, 103 lub 104 .
RTCPeerConnection: właściwość SCTP
Tylko do odczytu SCTP Właściwość na interfejsie RTCPeerConnection zwraca RTCSCTPTRANSPORT opisujący transport SCTP, w którym dane SCTP są wysyłane i odbierane. Jeśli SCTP nie zostało negocjowane, ta wartość jest null .
Transport SCTP służy do przesyłania i odbierania danych dla dowolnego i wszystkich RTCDatachannel na połączeniu rówieśniczym.
Wartość
Obiekt RTCSCTPTRANSPORT opisujący transport SCTP wykorzystywany przez RTCPeerConnection do przesyłania i odbierania na kanałach danych lub null, jeśli nie nastąpi negocjacje SCTP.
Przykład
const Peerconnection = nowy RtcpeerConnection(); const kanał = Peerconnection.CreatedAtachannel("Moje dane"); kanał.Onopen = (wydarzenie) => kanał.wysłać(„Wysłanie wiadomości”); >; kanał.Onmessage = (wydarzenie) => konsola.dziennik(wydarzenie.dane); >; // Określ największy rozmiar wiadomości, jaki można wysłać const SCTP = Peerconnection.SCTP; const Maxmessagesize = SCTP.Maxmessagesize;
Specyfikacje
Specyfikacja WEBRTC: Komunikacja w czasie rzeczywistym w przeglądarkach
# DOM-RTCPEerConnection-SCTPKompatybilność przeglądarki
Tabele BCD ładują tylko w przeglądarce
Zobacz też
Znalazłem problem z treścią z tą stroną?
- Edytuj stronę na Github.
- Zgłoś problem z treścią.
- Zobacz źródło na github.
Ta strona została ostatnio zmodyfikowana 25 kwietnia 2023 r. Przez współpracowników MDN.
Twój plan dla lepszego Internetu.
Korzystanie z kanałów danych WebRTC
W tym przewodniku zbadamy, jak dodać kanał danych do połączenia rówieśniczego, które można następnie wykorzystać do bezpiecznej wymiany arbitralnych danych; to znaczy wszelkiego rodzaju dane, które życzymy, w dowolnym wybranym formacie.
Notatka: Ponieważ wszystkie komponenty WebRTC są zobowiązane do korzystania z szyfrowania, wszelkie dane przesyłane na RTCDataChannel są automatycznie zabezpieczone za pomocą bezpieczeństwa warstwy transportu Datagram (DTLS). Więcej informacji można znaleźć poniżej bezpieczeństwa.
Tworzenie kanału danych
Podstawowy transport danych wykorzystywany przez RTCDatachannel można utworzyć na jeden z dwóch sposobów:
- Niech WebRTC utworzy transport i ogłosić go do zdalnego rówieśnika (powodując, że otrzymuje zdarzenie Datachannel). Jest to łatwy sposób i działa na wiele różnych przypadków użycia, ale może nie być wystarczająco elastyczne dla twoich potrzeb.
- Napisz własny kod, aby negocjować transport danych i napisać własny kod, aby zasygnalizować drugiemu rówieśnikowi, którego musi połączyć się z nowym kanałem.
Spójrzmy na każdy z tych przypadków, zaczynając od pierwszego, co jest najczęstsze.
Automatyczne negocjacje
Często możesz zezwolić na połączenie rówieśnicze do obsługi negocjowania połączenia RTCDATACHANNEL. Aby to zrobić, zadzwoń
CreatleatAcannel () bez określenia wartości dla negocjowanej właściwości lub określenia właściwości o wartości fałszu . To automatycznie uruchomi RTCPeerConnection w celu obsługi negocjacji dla Ciebie, powodując, że zdalny rówieśnik utworzy kanał danych i łączy te dwa razem w sieci.
Obiekt RTCDATACHANNEL jest zwracany natychmiast przez CreatedAtAChannel (); Możesz stwierdzić, kiedy połączenie zostało pomyślnie nawiązane, obserwując, jak otwarte wydarzenie zostanie wysłane do RTCDatachannel .
pozwalać DataChannel = PC.CreatedAtachannel(„MyApp Channel”); DataChannel.addEventListener("otwarty", (wydarzenie) => początkowa transmisja(DataChannel); >);
Ręczne negocjacje
Aby ręcznie negocjować połączenie kanału danych, musisz najpierw utworzyć nowy obiekt RTCDATACHANNEL za pomocą metody CreatleatAcannel () w RTCPeerConnection, określając w opcjach negocjowaną właściwość na true true . To sygnalizuje połączenie rówieśnicze, aby nie próbować negocjować kanału w Twoim imieniu.
Następnie negocjuj połączenie poza pasmem za pomocą serwera internetowego lub innych środków. Proces ten powinien zasygnalizować zdalnej rówieśnicy, że powinien stworzyć własny RTCDATACHANNEL z negocjowaną właściwością również ustawioną na true, przy użyciu tego samego identyfikatora . To połączy dwa obiekty przez RTCPeerConnection .
pozwalać DataChannel = PC.CreatedAtachannel(„MyApp Channel”, negocjowane: PRAWDA, >); DataChannel.addEventListener("otwarty", (wydarzenie) => początkowa transmisja(DataChannel); >); Requestremotechannel(DataChannel.ID);
W tym fragmencie kodu kanał jest tworzony z negocjowanym zestawem do true, a następnie funkcja o nazwie RepreSremotechannel () jest używana do utworzenia negocjacji, do utworzenia zdalnego kanału z tym samym identyfikatorem co kanał lokalny.
Dzięki temu umożliwia tworzenie kanałów danych z każdym równorzędnym za pomocą różnych właściwości i tworzenie kanałów deklaratywnie przy użyciu tej samej wartości dla identyfikatora .
Buforowanie
Kanały danych WebRTC obsługują buforowanie danych wychodzących. Jest to obsługiwane automatycznie. Chociaż nie ma możliwości kontrolowania rozmiaru bufora, możesz dowiedzieć się, ile danych jest obecnie buforowane, i możesz zostać powiadomiony przez zdarzenie, gdy bufor zaczyna działać nisko na danych w kolejce. Ułatwia to pisanie wydajnych procedur, które upewniają się, że zawsze są gotowe do wysyłania danych bez nadmiernego użycia pamięci lub całkowitego opasowania kanału.
Zrozumienie limitów wielkości wiadomości
W przypadku danych przesyłanych przez sieć istnieją ograniczenia rozmiaru. Na podstawowym poziomie poszczególne pakiety sieciowe nie mogą być większe niż określona wartość (dokładna liczba zależy od używanej sieci i warstwy transportowej). Na poziomie aplikacji – to znaczy, w ramach implementacji WEBRTC przez agenta użytkownika, na którym działa Twój kod – WEBRTC implementacja implementuje funkcje obsługi komunikatów większych niż maksymalny rozmiar pakietu w warstwie transportowej sieci.
Może to komplikować rzeczy, ponieważ niekoniecznie wiesz, jakie są limity rozmiaru dla różnych agentów użytkowników i jak reagują, gdy większa wiadomość jest wysyłana lub odbierana. Nawet gdy agenci użytkowników dzielą te same podstawowe dane biblioteki do obsługi protokołu transmisji sterowania strumieniem (SCTP), nadal mogą istnieć warianty ze względu na sposób używanego biblioteki. Na przykład zarówno Firefox, jak i Google Chrome używają biblioteki USRSCTP do zaimplementowania SCTP, ale nadal istnieją sytuacje, w których przesyłanie danych na RTCDATACHANNEL może zawieść ze względu na różnice w tym, jak wywołują bibliotekę i reagują na błędy, które zwraca.
Gdy dwóch użytkowników z Firefoxem komunikuje się na kanale danych, limit wielkości wiadomości jest znacznie większy niż wtedy, gdy Firefox i Chrome komunikują się, ponieważ Firefox implementuje teraz przestarzałą technikę wysyłania dużych wiadomości w wielu wiadomościach SCTP, których Chrome nie ma. Chrome zamiast tego zobaczy serię wiadomości, które jego zdaniem są kompletne, i dostarczy je do odbierania RTCDatachannel jako wiele wiadomości.
Wiadomości mniejsze niż 16 KIB można wysłać bez troski, ponieważ wszyscy główni agenci użytkowników obsługują je w ten sam sposób. Poza tym sprawy stają się bardziej skomplikowane.
Obawy związane z dużymi wiadomościami
Obecnie używanie RTCDATAChannel nie jest praktyczne dla wiadomości większych niż 64 kib (16 kib, jeśli chcesz obsługiwać wymianę danych przeglądarki). Problem wynika z faktu, że SCTP – protokół wykorzystywany do wysyłania i odbierania danych na RTCDATACHANNEL – był pierwotnie zaprojektowany do użytku jako protokół sygnalizacyjny. Oczekiwano, że wiadomości będą stosunkowo małe. Obsługa wiadomości większych niż MTU warstwy sieciowej została dodana prawie jako refleksja, w przypadku, gdy komunikaty sygnalizacyjne muszą być większe niż MTU. Ta funkcja wymaga, aby każdy element wiadomości miał kolejne numery sekwencji, więc muszą być przesyłane jeden po drugiej, bez żadnych innych danych przeplatanych między nimi.
To ostatecznie stało się problemem. Z czasem różne aplikacje (w tym wdrażające WebRTC) zaczęły używać SCTP do przesyłania większych i większych wiadomości. Ostatecznie uświadomiono, że kiedy wiadomości stają się zbyt duże, możliwe jest, aby transmisja dużego komunikatu blokuje wszystkie inne transfery danych na tym kanale danych – w tym krytyczne komunikaty sygnalizacyjne.
Stanie się to problemem, gdy przeglądarki prawidłowo obsługują bieżący standard obsługi większych wiadomości-flaga zakończenia rekordów (EOR), która wskazuje, kiedy wiadomość jest ostatnia z serii, którą należy traktować jako pojedynczy ładunek. Jest to zaimplementowane w Firefox 57, ale nie jest jeszcze zaimplementowane w Chrome (patrz Chromium Bug 7774). Dzięki wsparciu EOR ładowanie RTCDATACHANNEL mogą być znacznie większe (oficjalnie do 256 kib, ale wdrożenie Firefoxa ogranicza je przy aż 1 gib). Nawet przy 256 kib jest wystarczająco duży, aby spowodować zauważalne opóźnienia w obsłudze pilnego ruchu. Jeśli pójdziesz jeszcze większe, opóźnienia mogą stać się nie do utrzymania, chyba że jesteś pewien swoich warunków operacyjnych.
Aby rozwiązać ten problem, nowy system STREAM STRAKTURES (Zwykle określane jako „SCTP NDATA”) został zaprojektowany w celu umożliwienia przeplatania wiadomości wysyłanych w różnych strumieniach, w tym strumieni używanych do wdrażania kanałów danych WebRTC. Ta propozycja jest nadal w formularzu IETF, ale po wdrożeniu umożliwi wysyłanie wiadomości bez ograniczeń rozmiaru, ponieważ warstwa SCTP automatycznie przeplata podstawowe podtasy, aby upewnić się, że dane każdego kanału mają możliwość przejścia przez.
Wsparcie Firefox dla NDATA jest w trakcie wdrażania; Zobacz Firefox Bug 1381145, aby śledzić go, stając się dostępnym do ogólnego użytku. Zespół Chrome śledzi swoją implementację obsługi NDATA w Chrome Bug 5696.
Notatka: Wiele informacji w tym rozdziale opiera się częściowo na blogu postu Demistyfigując ograniczenia wielkości kanału danych WebRTC, napisane przez Lennart Grahl. Wchodzi tam trochę bardziej szczegółowo, ale ponieważ przeglądarki zostały zaktualizowane od tego czasu, niektóre z nich mogą być nieaktualne. Ponadto, w miarę upływu czasu, stanie się bardziej, szczególnie gdy wsparcie EOR i NDATA będą w pełni zintegrowane z głównymi przeglądarkami.
Bezpieczeństwo
Wszystkie dane przesyłane za pomocą WebRTC są szyfrowane. W przypadku RTCDataChannel używanym szyfrowaniem jest DataGram Transport Warstwa Security (DTLS), który jest oparty na bezpieczeństwie warstwy transportowej (TLS). Ponieważ TLS służy do zabezpieczenia każdego połączenia HTTPS, wszelkie dane wysyłane na kanale danych są tak bezpieczne, jak każde inne dane wysyłane lub otrzymane przez przeglądarkę użytkownika.
Bardziej zasadniczo, ponieważ WebRTC jest połączeniem peer-to-peer między dwoma agentami użytkownika, dane nigdy nie przechodzą przez serwer sieci lub aplikacji. Zmniejsza to możliwości przechwytywania danych.
Znalazłem problem z treścią z tą stroną?
- Edytuj stronę na Github.
- Zgłoś problem z treścią.
- Zobacz źródło na github.
Ta strona została ostatnio zmodyfikowana 25 kwietnia 2023 r. Przez współpracowników MDN.
Czy WebRTC używa SCTP?
Оjed
Ыы зарегистрир John. С помощю этой страницы ыы сожем оRipееделить, что запросы оRтравляете имено ыы, а не роvert. Почем это могло пRроизойиS?
Эта страница отображается тех слччаях, когда автоматическими системамgz которые наршают усовия исполззования. Страница перестанеura. До этого момента для исползования слжжж Google неоtoś.
Источником запросов может слжить ведоносное по, подкbarów. ыылку заRzy. Еarag ы исползеете общий доступ и интернет, проблема может ыть с компюююеyn с таким жж жж жесом, кк у комszczeюююе000. Обратитеunks к соем системном адинистратору. Подроlit.
Проверка по слову может также появаятьenia, еaсли ы водите сложные ззапры, оind обычно enia оиизи инenia оtoś еами, или же водите заlektora.
Komunikacja danych #
Co mam od WebRTC’S Komunikacja danych? #
WEBRTC zapewnia kanały danych do komunikacji danych. Między dwoma rówieśnikami możesz otworzyć 65 534 kanałów danych. Kanał danych jest oparty na datagramie, a każdy ma swoje własne ustawienia trwałości. Domyślnie każdy kanał danych ma gwarantowane zamówienie dostawy. Jeśli zbliżasz się do WebRTC z multimediów, może wydawać się marnotrawstwo. Dlaczego potrzebuję tego całego podsystemu, kiedy mogłem po prostu użyć HTTP lub WebSockets? Prawdziwą moc z kanałami danych jest to, że możesz je skonfigurować tak, aby zachowały się jak UDP z nieuzasadnioną/stratną dostawą. Jest to konieczne w sytuacjach o niskim opóźnieniu i wysokiej wydajności. Możesz zmierzyć ciśnienie wsteczne i upewnić się, że wysyłasz tylko tyle samo, co obsługuje sieć.
Jak to działa? #
WebRTC używa protokołu transmisji strumieniowej (SCTP), zdefiniowanej w RFC 4960. SCTP to protokół warstwy transportowej, który miał być alternatywą dla TCP lub UDP. W przypadku WebRTC używamy go jako protokołu warstwy aplikacji, który działa przez nasze połączenie DTLS. SCTP zapewnia strumienie i każdy strumień można konfigurować niezależnie. Kanały danych WebRTC to po prostu cienkie abstrakcje wokół nich. Ustawienia wokół trwałości i zamawiania są właśnie przekazywane bezpośrednio do agenta SCTP. Kanały danych mają pewne funkcje, które SCTP może’t Express, jak etykiety kanałów. Aby rozwiązać, że WebRTC korzysta z protokołu ustalania kanału danych (DCEP), który jest zdefiniowany w RFC 8832. DCEP definiuje wiadomość do przekazania etykiety kanału i protokołu.
DCEP #
DCEP ma tylko dwie komunikaty data_channel_open i data_channel_ack . Dla każdego kanału danych, który jest otwarty, pilot musi odpowiedzieć ACK.
Data_channel_open #
Ta wiadomość jest wysyłana przez agenta WebRTC, który chce otworzyć kanał.
Format pakietu #
0 1 2 3 0 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+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+| Typ wiadomości | Typ kanału | Priorytet | +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+| Parametr niezawodności | +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+| Długość etykiety | Długość protokołu | +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+ \ \ / Label / \ \ +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+ \ \ / Protocol / \ \ +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
Typ wiadomości #
Typ wiadomości to wartość statyczna 0x03 .
Typ kanału #
- Data_channel_relible (0x00) – Żadne wiadomości nie są utracone i przybędą w porządku
- Data_channel_relible_unordered (0x80) – Żadne wiadomości nie są utracone, ale mogą one dotrzeć do zamówienia.
- Data_channel_partial_relible_rexmit (0x01) – Wiadomości mogą zostać utracone po wypróbowaniu żądanej ilości razy, ale przybywają w kolejności.
- Data_channel_partial_relible_rexmit_unordered (0x81) – Wiadomości mogą zostać utracone po wypróbowaniu żądanej ilości razy i mogą nadejść nie do zamówienia.
- Data_channel_partial_relible_timed (0x02) – Wiadomości mogą zostać utracone, jeśli nie mają’przyjeżdża na żądaną ilość czasu, ale przybywają w porządku.
- Data_channel_partial_relible_timed_unordered (0x82) – Wiadomości mogą zostać utracone, jeśli nie będą’przyjeżdża na żądaną ilość czasu i może przybyć poza zamówieniem.
Priorytet #
Priorytet kanału danych. Kanały danych o wyższym priorytecie zostaną zaplanowane jako pierwsze. Duże wiadomości użytkowników o niższym priorytecie nie opóźnią wysyłania wiadomości użytkowników o wyższym priorytecie.
Parametr niezawodności #
Jeśli typem kanału danych jest data_channel_partial_relible, sufiksów konfiguruje zachowanie:
- Rexmit – określa, ile razy nadawca ponownie wyznaczy wiadomość przed rezygnacją.
- Czas – określa, jak długo (w MS) nadawca ponownie sformułuje wiadomość przed rezygnacją.
Etykieta #
Łańcuch kodowany przez UTF-8 zawierający nazwę kanału danych. Ten ciąg może być pusty.
Protokół #
Jeśli jest to pusty ciąg, protokół jest nieokreślony. Jeśli jest to ciąg bez pustego, powinien określić protokół zarejestrowany w “Rejestr nazwy SubRetocol WebSocke”, zdefiniowane w RFC 6455.
Data_channel_ack #
Ta wiadomość jest wysyłana przez agenta WebRTC w celu potwierdzenia, że ten kanał danych został otwarty.
Format pakietu #
0 1 2 3 0 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+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+| Typ wiadomości | +-+-+-+-+-+-+-+-+
Protokół transmisji sterowania strumieniem # #
SCTP to prawdziwa moc za kanałami danych WebRTC. Zapewnia wszystkie te funkcje kanału danych:
- Multipleksowanie
- Niezawodna dostawa za pomocą mechanizmu retransmisji podobnego do TCP
- Opcje związane z częściową
- Unikanie zatorów
- Kontrola przepływu
Aby zrozumieć SCTP, zbadamy go w trzech częściach. Celem jest to, że po tym rozdziale będziesz wiedział wystarczająco dużo, aby debugować i poznać głębokie szczegóły SCTP.
Pojęcia #
SCTP to protokół bogaty w funkcje. Ta sekcja obejmie tylko części SCTP używane przez WebRTC. Funkcje w SCTP, które nie są używane przez WebRTC, obejmują wiele homingów i wyboru ścieżki.
Z ponad dwudziestoma latami rozwoju SCTP może być trudne do pełnego zrozumienia.
Stowarzyszenie #
Stowarzyszenie jest terminem używanym do sesji SCTP. Jest to państwo dzielone między dwoma agentami SCTP podczas komunikacji.
Streams #
Strumień to jedna dwukierunkowa sekwencja danych użytkownika. Podczas tworzenia kanału danych w rzeczywistości tworzysz tylko strumień SCTP. Każde stowarzyszenie SCTP zawiera listę strumieni. Każdy strumień można skonfigurować z różnymi typami niezawodności.
WebRTC pozwala tylko konfigurować tworzenie strumienia, ale SCTP faktycznie umożliwia zmianę konfiguracji w dowolnym momencie.
# #
SCTP przekazuje dane jako datagramy, a nie jako strumień bajtów. Wysyłanie i odbieranie danych wydaje się używać UDP zamiast TCP. Jesteś skończony’T musi dodać dowolny dodatkowy kod, aby przesyłać wiele plików na jednym strumieniu.
Wiadomości SCTP Don’t mają limity rozmiaru, takie jak UDP. Pojedynczy komunikat SCTP może być wieloma gigabajtami.
Fragmenty #
Protokół SCTP składa się z kawałków. Istnieje wiele różnych rodzajów fragmentów. Te fragmenty są używane do całej komunikacji. Dane użytkownika, inicjalizacja połączenia, kontrola zatorów i inne są wykonywane za pośrednictwem fragmentów.
Każdy pakiet SCTP zawiera listę fragmentów. Więc w jednym pakiecie UDP możesz mieć wiele fragmentów przewożących wiadomości z różnych strumieni.
Numer sekwencji transmisji # #
Numer sekwencji transmisji (TSN) to globalny unikalny identyfikator dla kawałków danych. Pres danych jest tym, co nosi wszystkie wiadomości, które użytkownik chce wysłać. TSN jest ważny, ponieważ pomaga odbiornikowi ustalić, czy pakiety są utracone, czy nie są w porządku.
Jeśli odbiornik zauważa brakujące TSN, nie’t Podaj dane użytkownikowi, dopóki nie zostaną spełnione.
Identyfikator strumieniowy #
Każdy strumień ma unikalny identyfikator. Kiedy tworzysz kanał danych z wyraźnym identyfikatorem, jest on po prostu przekazywany bezpośrednio do SCTP jako identyfikator strumienia. Jeśli nie masz’t Pass i id Identyfikator strumienia jest wybierany dla Ciebie.
Identyfikator protokołu ładowania #
Każda część danych ma również identyfikator protokołu ładunku (PPID). Służy to do jednoznacznego określenia, jaki rodzaj danych jest wymieniany. SCTP ma wiele PPID, ale WebRTC używa tylko następujących pięciu:
- WEBRTC DCEP (50) – wiadomości DCEP.
- WEBRTC String (51) – DataChannel Komunikaty stringowe.
- WEBRTC Binary (53) – Wiadomości binarne DataChannel.
- WEBRTC String pusty (56) – DataChannel Wiadomości o długości 0.
- WEBRTC Binary Binary Puste (57) – DataChannel Binary Chomess z 0 długości.
Protokół #
Poniżej znajdują się niektóre fragmenty używane przez protokół SCTP. To nie jest wyczerpująca demonstracja. Zapewnia to wystarczającą struktury, aby maszyna stanowa mogła mieć sens.
Każda porcja zaczyna się od pola typu. Przed listą fragmentów będziesz mieć również nagłówek.
Data Chunk #
0 1 2 3 0 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+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+| Typ = 0 | Zarezerwowany | u | b | e | Długość | +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+| Tsn | +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+| Identyfikator strumienia | Numer sekwencji strumienia | +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+| Identyfikator protokołu ładowania | +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+\ \ \ / Dane użytkownika / \ \ +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
Pres danych to sposób wymiany wszystkich danych użytkownika. Kiedy wysyłasz cokolwiek przez kanał danych, w ten sposób jest wymieniany.
U bit jest ustawiony, jeśli jest to pakiet nieuporządkowany. Możemy zignorować numer sekwencji strumienia.
B i E są początkowymi i końcowymi bitami. Jeśli chcesz wysłać wiadomość, która jest zbyt duża dla jednego fragmentu danych, należy go podzielić na wiele fragmentów danych wysyłanych w osobnych pakietach. Z liczbami bitów B i E i sekwencji SCTP jest w stanie to wyrazić.
- B = 1, E = 0 – Pierwszy kawałek rozdrobnionego komunikatu użytkownika.
- B = 0, e = 0 – środkowy kawałek fragmentarycznego komunikatu użytkownika.
- B = 0, e = 1 – Ostatni kawałek fragmentarycznego komunikatu użytkownika.
- B = 1, e = 1 – Niezniszczona wiadomość.
TSN to numer sekwencji transmisji. Jest to globalny unikalny identyfikator tego kawałka danych. Po 4 294 967 295 fragmentów obejmie się to 0. TSN jest zwiększany dla każdej części w rozdrobnionej wiadomości użytkownika, aby odbiornik wiedział, jak zamówić odebrane fragmenty do odtworzenia oryginalnej wiadomości.
Identyfikator strumienia jest unikalnym identyfikatorem strumienia, do którego należy dane.
Numer sekwencji strumienia to 16-bitowy numer zwiększony każdy komunikat użytkownika i zawarty w nagłówku fragmentu komunikatu danych. Po 65535 wiadomościach zawiną się do 0. Ten numer służy do decydowania o zamówieniu dostawy do odbiornika, jeśli U jest ustawiony na 0. Podobne do TSN, z wyjątkiem numeru sekwencji strumienia jest zwiększane tylko dla każdego komunikatu jako całości, a nie każdy kawałek danych.
Identyfikator protokołu ładowania to rodzaj danych przepływających przez ten strumień. W przypadku WebRTC będzie to DCEP, ciąg lub binarny.
Dane użytkownika są tym, co wysyłasz. Wszystkie dane wysyłane przez kanał danych WebRTC są przesyłane za pośrednictwem fragmentu danych.
Init Chunk #
0 1 2 3 0 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+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+| Typ = 1 | Flagi flag | Długość kawałka | +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+| Zainicjuj tag | +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+| Reklamowany kredyt okna odbiornika (A_RWND) | +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+| Liczba strumieni wychodzących | Liczba strumieni przychodzących | +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+| Początkowy tsn | +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+\ \ \ / opcjonalna / parametry o zmiennej długości / \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
Porada init rozpoczyna proces tworzenia stowarzyszenia.
Inicjatywny tag jest używany do generowania plików cookie. Pliki cookie są wykorzystywane do ochrony man-the-The-Middle i odmowy usługi. Są one bardziej szczegółowo opisane w sekcji maszyny stanu.
Zgłoszony do SCTP używany jest reklamowany okno odbiornika’S Kontrola przeciążenia. To przekazuje, jak duży bufor odbiornik przydzielił dla tego stowarzyszenia.
Liczba strumieni wychodzących/przychodzących powiadamia pilota o tym, ile strumieni obsługuje ten agent.
Początkowy TSN jest losowym UINT32, aby uruchomić lokalny TSN o.
Opcjonalne parametry pozwala SCTP wprowadzić nowe funkcje do protokołu.
Worka #
0 1 2 3 0 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+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+| Typ = 3 | Flagi kawałków | Długość kawałka | +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+| Skumulowany TSN Ack | +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+| Reklamowany kredyt okna odbiornika (A_RWND) | +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+| Liczba bloków szczelinowych = N | Liczba duplikatów tsns = x | +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+| Gap Ack Block #1 Start | Gap Ack Block #1 End | +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+ / / \ . \ / /+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+| Gap Ack Block #N Start | Gap Ack Block #N End | +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+| Duplikat TSN 1 | +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+ / / \ . \ / /+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+| Duplikat TSN X | +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
Pragnienie worka (Selektywne potwierdzenie) to sposób, w jaki odbiornik powiadamia nadawcę, który dostał pakiet. Dopóki nadawca nie dostanie worka dla TSN. Worek robi coś więcej niż tylko aktualizowanie TSN.
Skumulowany tsn ACK najwyższy otrzymany TSN.
Reklamowany odbiornik rozmiar bufora odbiornika kredytowego. Odbiornik może to zmienić podczas sesji, jeśli będzie dostępna więcej pamięci.
ACK blokuje TSN, które zostały otrzymane po skumulowanym ACK TSN . Jest to używane, jeśli istnieje luka w dostarczanych paczkach. Pozwalać’S powiedz, że dostarczane są fragmenty danych z TSNS 100, 102, 103 i 104. Skumulowany ACK TSN wynosiłby 100, ale bloki ACK można użyć do powiedzenia nadawcy, że to nie’T muszę ponownie wyśledzić 102, 103 lub 104 .
Duplikat TSN informuje nadawcę, że otrzymał następujące fragmenty danych więcej niż raz.
Chunk serca #
0 1 2 3 0 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+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+| Typ = 4 | Flagi flag | Długość bicia serca | +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-) +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
Porada bicia serca służy do potwierdzenia, że pilot nadal reaguje. Przydatne, jeśli tak’t Wysyłanie dowolnych kawałków danych i trzeba otworzyć mapowanie NAT.
Abort Chunk #
0 1 2 3 0 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+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+| Typ = 6 | Zarezerwowany | T | Długość | +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+ / / \ zero lub więcej błędów przyczynowo \ / / / / / / +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
Aborty fragment nagle zamyka stowarzyszenie. Używane, gdy jedna strona wchodzi w stan błędu. Wdzięczne zakończenie połączenia używa kawałka wyłączania.
Zamknij Chunk #
0 1 2 3 0 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+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+| Typ = 7 | Flagi flag | Długość = 8 | +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+| Skumulowany TSN Ack | +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
Chunk zamykający rozpoczyna wdzięczne zamknięcie stowarzyszenia SCTP. Każdy agent informuje pilota o ostatnim wysłanym TSN. Zapewnia to, że żadne pakiety nie zostaną utracone. WEBRTC nie’T wykonaj wdzięczne zamknięcie stowarzyszenia SCTP. Musisz samodzielnie zburzyć każdy kanał danych, aby poradzić sobie z tym wdzięcznie.
Skumulowany TSN ACK to ostatni TSN, który został wysłany. Każda strona wie, że nie kończy się, dopóki nie otrzymają kawałka danych z tym TSN.
Błąd # #
0 1 2 3 0 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+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+| Typ = 9 | Flagi flag | Długość | +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-) +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
Poród błędu służy do powiadomienia zdalnego środka SCTP, że wystąpił błąd nieczużowy.
Do przodu TSN Chunk #
0 1 2 3 0 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+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+| Typ = 192 | Flagi = 0x00 | Długość = zmienna | +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+| Nowy skumulowany TSN | +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+| Stream-1 | Sekwencja strumieniowa-1 | +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+ \ / / \ +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+ | Stream-n | STREAM SEKENCJA-N | +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
Porada do przodu TSN porusza globalną TSN do przodu. SCTP to robi, więc możesz pominąć niektóre paczki’Nie przejmuje się już. Pozwalać’s, powiedz, że wysyłasz 10 11 12 13 14 15, a te pakiety są ważne tylko wtedy, gdy wszystkie przybywają. Te dane są również wrażliwe w czasie rzeczywistym, więc jeśli dojdzie do późna’T przydatne.
Jeśli stracisz 12 i 13, nie ma powodu, aby wysyłać 14 i 15 ! SCTP używa przedniej części TSN, aby to osiągnąć. Mówi odbiornikowi, że 14 i 15’nie będzie już dostarczany.
Nowy kumulatywny TSN To jest nowy TSN połączenia. Wszelkie pakiety przed tym TSN nie zostaną zachowane.
Sekwencja strumienia i strumienia służą do przeskoczenia numeru sekwencji strumienia. Odniesie się do fragmentu danych, aby uzyskać znaczenie tego pola.
Maszyna stanu #
To są interesujące części maszyny stanu SCTP. WEBRTC nie’t Użyj wszystkich funkcji maszyny stanu SCTP, więc wykluczyliśmy te części. Uprościliśmy również niektóre komponenty, aby same były zrozumiałe.
PRZEPŁYWA PRZEWODNIKI # #
Krobki init i init ACK są używane do wymiany możliwości i konfiguracji każdego rówieśnika. SCTP używa pliku cookie podczas uścisku dłoni, aby potwierdzić rówieśnika, z którym się komunikuje. Ma to na celu zapewnienie, że uścisk dłoni nie jest przechwycony i zapobiec atakom DOS.
Protokół inicjów zawiera ciasteczko. Plik cookie jest następnie zwracany do swojego twórcy za pomocą echo cookie . Jeśli weryfikacja plików cookie zakończy się powodzeniem, wysyłane jest ackie, a fragmenty danych są gotowe do wymiany.
Połączenie # #
SCTP korzysta z części zamknięcia. Gdy agent otrzyma kawałek zamykania, będzie czekać, aż otrzyma żądany skumulowany tsn ACK . Pozwala to użytkownikowi upewnić się, że wszystkie dane są dostarczane, nawet jeśli połączenie jest stratne.
Mechanizm utrzymujący # #
SCTP używa żądania bicia serca i fragmentów ACK, aby utrzymać połączenie przy życiu. Są one wysyłane w konfigurowalnym przedziale. SCTP wykonuje również wykładnicze wycofanie, jeśli pakiet ma’T przybył.
Porada bicia serca zawiera również wartość czasu. Pozwala to dwóm powiązaniom obliczyć czas podróży między dwoma agentami.