WebRTC usa SCTP?
Utilizzando i canali di dati WebRTC
Riepilogo
In questa guida, esamineremo come aggiungere un canale di dati a una connessione peer, che può quindi essere utilizzata per scambiare i dati arbitrari in modo sicuro. Esamineremo come creare un canale di dati e discuteremo le opzioni per la negoziazione automatica e manuale.
Punti chiave
1. Il trasporto SCTP viene utilizzato per la trasmissione e la ricezione di dati per rtcdatachannels sulla connessione peer.
2. L’interfaccia RTCPeerConnection ha una proprietà di sola lettura chiamata SCTP, che restituisce un oggetto RTCSCTPTransport che descrive il trasporto SCTP utilizzato.
3. Il metodo creatotachannel () sull’interfaccia RTCPeerConnection viene utilizzato per creare un nuovo canale di dati.
4. La negoziazione automatica consente a RTCPeerConnection di gestire la negoziazione e la creazione del canale di dati.
5. La negoziazione manuale prevede la creazione di un oggetto rtcdatachannel con la proprietà negoziata impostata su True, e quindi negoziare la connessione fuori banda.
6. La dimensione massima del messaggio che può essere inviata sul canale di dati può essere determinata utilizzando la proprietà MaxMessageSize dell’oggetto RTCSCTPTransport.
7. I componenti WebRTC usano la crittografia per proteggere i dati trasmessi su rtcdatachannel.
8. Le specifiche per i canali di dati WebRTC sono disponibili in WebRTC: comunicazione in tempo reale nelle specifiche dei browser.
9. La compatibilità dei canali di dati WebRTC varia tra i browser.
10. Risorse e opzioni aggiuntive per la modifica o i problemi di reporting con la pagina sono disponibili nella sezione “vedi anche”.
Domande e risposte
- Qual è lo scopo dei blocchi ACK nei canali di dati WebRTC?
I blocchi ACK vengono utilizzati per informare il mittente che alcuni pacchetti non devono essere risentiti, anche se c’è un divario nei pacchetti consegnati. Ad esempio, se vengono consegnati blocchi di dati con TSNS 100, 102, 103 e 104, ma il TSN ACK cumulativo è 100, i blocchi ACK possono essere usati per indicare che i TSN 102, 103 e 104 non devono essere risentiti. - Cosa restituisce la proprietà SCTP dell’interfaccia RTCPeerConnection?
La proprietà SCTP restituisce un oggetto RTCSCTPTRANSPORT che descrive il trasporto SCTP utilizzato per la trasmissione e la ricezione di dati per RTCDataChannels sulla connessione peer. Se SCTP non è stato negoziato, il valore è nullo. - Come si può creare un canale di dati in WebRTC?
Un canale di dati può essere creato utilizzando il metodo creatotachannel () sull’interfaccia RTCPeerConnection. Questo metodo restituisce un oggetto RTCDataChannel che rappresenta il canale di dati appena creato. - Qual è la differenza tra negoziazione automatica e negoziazione manuale?
Nella negoziazione automatica, RTCPeerConnection gestisce la negoziazione e la creazione del canale di dati. Il metodo creatotachannel () viene chiamato senza specificare un valore per la proprietà negoziata o con un valore di falso. Nella negoziazione manuale, il canale di dati viene creato con la proprietà negoziata impostata su TRUE e la negoziazione viene eseguita fuori banda utilizzando un server Web o altri mezzi. - Come si può determinare la dimensione massima del messaggio che può essere inviata su un canale di dati?
La dimensione massima del messaggio può essere determinata accedendo alla proprietà MaxMessagesize dell’oggetto RTCSCTPTransport, che rappresenta il trasporto SCTP utilizzato da RTCPeerConnection. - I dati sono trasmessi su un rtcdatachann automaticamente protetto?
Sì, tutti i dati trasmessi su un RTCDataChannel vengono automaticamente protetti utilizzando la sicurezza del livello di trasporto Datagram (DTLS). I componenti WebRTC sono tenuti a utilizzare la crittografia per garantire la sicurezza dei dati. - Dove si possono trovare le specifiche per i canali di dati WebRTC?
Le specifiche per i canali di dati WEBRTC sono disponibili in WebRTC: comunicazione in tempo reale nelle specifiche dei browser, in particolare la sezione DOM-RTCPeerConnection-SCTP. - Qual è la compatibilità dei canali di dati WebRTC tra i browser?
La compatibilità dei canali di dati WebRTC può variare tra i diversi browser. È importante testare e garantire la compatibilità per i browser e le versioni target. - Quali sono alcune risorse aggiuntive relative ai canali di dati WebRTC?
È possibile modificare la pagina su GitHub, segnalare i problemi dei contenuti o visualizzare il codice sorgente su GitHub. Queste opzioni sono disponibili nella sezione “vedi anche” di seguito.Utilizzando i canali di dati WebRTC
ACK blocca i TSN che sono stati ricevuti dopo il cumulativo TSN ACK . Questo viene utilizzato se c’è un divario nei pacchetti consegnati. Permettere’S dicono che i blocchi dei dati con TSNS 100, 102, 103 e 104 vengono consegnati. Il cumulativo TSN Ack sarebbe 100, ma i blocchi ACK potrebbero essere usati per dire al mittente che lo fa’T deve ricredere 102, 103 o 104 .
RTCPeerConnection: proprietà SCTP
Il sola lettura sctp Proprietà sull’interfaccia RTCPeerConnection restituisce un RTCSCTPTransport che descrive il trasporto SCTP su cui vengono inviati e ricevuti i dati SCTP. Se SCTP non è stato negoziato, questo valore è nullo .
Il trasporto SCTP viene utilizzato per la trasmissione e la ricezione di dati per tutti i RTCDATACHANNEL S sulla connessione peer.
Valore
Un oggetto RTCSCTPTRANSPORT che descrive il trasporto SCTP utilizzato da RTCPeerConnection per la trasmissione e la ricezione sui suoi canali di dati o null se la negoziazione SCTP non è avvenuta.
Esempio
const Peerconnection = nuovo RTCPeerConnection(); const canale = Peerconnection.creatotachannel("I miei dati"); canale.onopen = (evento) => canale.Inviare("Invio di un messaggio"); >; canale.onmessage = (evento) => console.tronco d'albero(evento.dati); >; // Determina la dimensione del messaggio più grande che può essere inviata const sctp = Peerconnection.sctp; const maxMessagesize = sctp.maxMessagesize;
Specifiche
Specifiche WebRTC: comunicazione in tempo reale nei browser
# DOM-RTCPEERCONNEZIONE-SCTPCompatibilità del browser
Le tabelle BCD caricano solo nel browser
Guarda anche
Ho trovato un problema di contenuto con questa pagina?
- Modifica la pagina su github.
- Segnala il problema dei contenuti.
- Visualizza la fonte su GitHub.
Questa pagina è stata modificata l’ultima volta il 25 aprile 2023 dai collaboratori di MDN.
Il tuo progetto per un Internet migliore.
Utilizzando i canali di dati WebRTC
In questa guida, esamineremo come aggiungere un canale di dati a una connessione peer, che può quindi essere utilizzata per scambiare dati arbitrari in modo sicuro; Cioè, qualsiasi tipo di dati che desideriamo, in qualsiasi formato che scegliamo.
Nota: Poiché tutti i componenti WebRTC sono tenuti a utilizzare la crittografia, qualsiasi dati trasmessa su un RTCDataChannel viene automaticamente protetto utilizzando la sicurezza del livello di trasporto Datagram (Dtls). Vedi la sicurezza di seguito per ulteriori informazioni.
Creazione di un canale di dati
Il trasporto di dati sottostante utilizzato da RTCDataChannel può essere creato in due modi:
- Lascia che WebRTC crei il trasporto e annuncialo al peer remoto per te (facendolo ricevere un evento di datacann)). Questo è il modo più semplice e funziona per un’ampia varietà di casi d’uso, ma potrebbe non essere abbastanza flessibile per le tue esigenze.
- Scrivi il tuo codice per negoziare il trasporto dei dati e scrivere il tuo codice per segnalare all’altro peer che deve connettersi al nuovo canale.
Diamo un’occhiata a ciascuno di questi casi, a partire dal primo, che è il più comune.
Negoziazione automatica
Spesso, puoi consentire alla connessione peer per gestire la negoziazione della connessione RTCDataChannel per te. Per fare questo, chiama
creatotachannel () senza specificare un valore per la proprietà negoziata o specificare la proprietà con un valore di falso . Ciò attiverà automaticamente la configurazione RTCPeer per gestire i negoziati per te, facendo sì che il peer remoto crei un canale di dati e collega i due insieme attraverso la rete.
L’oggetto rtcdatachannel viene restituito immediatamente da creatotachannel (); Puoi dire quando la connessione è stata stabilita con successo osservando l’evento aperto da inviare al rtcdatachannel .
permettere Datachannel = PC.creatotachannel("MyApp Channel"); Datachannel.addEventlistener("aprire", (evento) => BeginTransmission(Datachannel); >);
Negoziazione manuale
Per negoziare manualmente la connessione del canale dati, è necessario prima creare un nuovo oggetto RTCDataChannel utilizzando il metodo creatotachannel () sul RTCPeerConnection, specificando nelle opzioni una proprietà negoziata impostata su True . Questo segnala alla connessione tra pari per non tentare di negoziare il canale per tuo conto.
Quindi negoziare la connessione fuori banda, utilizzando un server Web o altri mezzi. Questo processo dovrebbe segnalare al peer remoto che dovrebbe creare un proprio rtcdatachann con la proprietà negoziata impostata anche su true, usando lo stesso ID . Ciò collegherà i due oggetti attraverso la RTCPeerConnection .
permettere Datachannel = PC.creatotachannel("MyApp Channel", negoziato: VERO, >); Datachannel.addEventlistener("aprire", (evento) => BeginTransmission(Datachannel); >); requestRemoteChannel(Datachannel.id);
In questo frammento di codice, il canale viene creato con SEMPH SETTUTTO su TRUE, quindi una funzione chiamata requemRemoteChannel () viene utilizzata per attivare la negoziazione, per creare un canale remoto con lo stesso ID del canale locale.
In questo modo ti consente di creare canali di dati con ciascun peer utilizzando proprietà diverse e per creare canali dichiaratamente utilizzando lo stesso valore per ID .
Buffering
I canali di dati WebRTC supportano il buffering dei dati in uscita. Questo viene gestito automaticamente. Sebbene non sia possibile controllare le dimensioni del buffer, puoi imparare quanti dati sono attualmente bufferiti e puoi scegliere di essere avvisato da un evento quando il buffer inizia a correre a basso contenuto di dati in coda. Ciò semplifica la scrittura di routine efficienti che assicurano che ci siano sempre dati pronti da inviare senza una memoria eccessiva o inondano completamente il canale.
Comprendere i limiti della dimensione del messaggio
Per tutti i dati trasmessi su una rete, ci sono restrizioni alle dimensioni. A livello fondamentale, i singoli pacchetti di rete non possono essere maggiori di un certo valore (il numero esatto dipende dalla rete e dal livello di trasporto utilizzato). A livello di applicazione, ovvero all’interno dell’implementazione dell’agente utente di WebRTC su cui è in esecuzione il codice – l’implementazione WebRTC implementa le funzionalità per supportare i messaggi più grandi della dimensione massima del pacchetto sul livello di trasporto della rete.
Questo può complicare le cose, dal momento che non sai necessariamente quali siano i limiti di dimensioni per vari agenti utente e come rispondono quando viene inviato o ricevuto un messaggio più grande. Anche quando gli agenti utente condividono la stessa libreria sottostante per la gestione dei dati del protocollo di trasmissione del controllo del flusso. Ad esempio, sia Firefox che Google Chrome utilizzano la libreria USRSCTP per implementare SCTP, ma ci sono ancora situazioni in cui il trasferimento di dati su un RTCDataChannel può non riuscire a causa delle differenze nel modo in cui chiamano la libreria e reagiscono agli errori che restituisce.
Quando due utenti che eseguono Firefox comunicano su un canale di dati, il limite della dimensione del messaggio è molto più grande di quando Firefox e Chrome stanno comunicando perché Firefox implementa una tecnica ora deprecata per l’invio di messaggi di grandi dimensioni in più messaggi SCTP, che Chrome non fa. Chrome vedrà invece una serie di messaggi che ritiene siano completi e li consegnerà al ricevente rtcdatachann come più messaggi.
Messaggi inferiori a 16 KIB possono essere inviati senza preoccupazione, poiché tutti gli agenti utente principali li gestiscono allo stesso modo. Oltre a ciò, le cose diventano più complicate.
Preoccupazioni con messaggi di grandi dimensioni
Attualmente, non è pratico utilizzare rtcdatachannel per messaggi più grandi di 64 kib (16 kib se si desidera supportare lo scambio di dati tra browser). Il problema deriva dal fatto che SCTP – il protocollo utilizzato per l’invio e la ricezione di dati su un RTCDataChannel – era originariamente progettato per l’uso come protocollo di segnalazione. Ci si aspettava che i messaggi fossero relativamente piccoli. Il supporto per messaggi più grandi dell’MTU del livello di rete è stato aggiunto quasi come ripensamento, nel caso in cui i messaggi di segnalazione dovessero essere più grandi dell’MTU. Questa funzione richiede che ogni pezzo del messaggio abbia numeri di sequenza consecutivi, quindi devono essere trasmessi uno dopo l’altro, senza altri dati interlacciati tra di loro.
Questo alla fine è diventato un problema. Nel tempo, varie applicazioni (comprese quelle che implementano WebRTC) hanno iniziato a utilizzare SCTP per trasmettere messaggi sempre più grandi. Alla fine si è reso conto che quando i messaggi diventano troppo grandi, è possibile che la trasmissione di un messaggio di grandi dimensioni blocchi tutti gli altri trasferimenti di dati su quel canale di dati, incluso i messaggi di segnalazione critica.
Questo diventerà un problema quando i browser supportano correttamente l’attuale standard per supportare messaggi più grandi: il flag di fine registrazione (EOR) che indica quando un messaggio è l’ultimo di una serie che dovrebbe essere trattato come un singolo payload. Questo è implementato in Firefox 57, ma non è ancora implementato in Chrome (vedi Chromium Bug 7774). Con il supporto EOR in atto, i payload RTCDataChannel possono essere molto più grandi (ufficialmente fino a 256 kib, ma l’implementazione di Firefox li limita a un enorme Gib). Anche a 256 kib, è abbastanza grande da causare notevoli ritardi nella gestione del traffico urgente. Se vai ancora più grandi, i ritardi possono diventare insostenibili a meno che tu non sia certo delle tue condizioni operative.
Per risolvere questo problema, un nuovo sistema di Scheduler di streaming (di solito indicato come “SCTP NData Specification”) è stato progettato per consentire di interfigurare i messaggi inviati su flussi diversi, inclusi i flussi utilizzati per implementare i canali di dati WebRTC. Questa proposta è ancora in forma di bozza IETF, ma una volta implementata, consentirà di inviare messaggi senza limiti di dimensioni, poiché il livello SCTP interviene automaticamente i sotto-messe sottostanti per garantire che i dati di ogni canale abbiano l’opportunità di superare.
Il supporto Firefox per NData è in procinto di essere implementato; Vedi Firefox Bug 1381145 per rintracciarlo diventando disponibile per uso generale. Il team di Chrome sta monitorando la propria implementazione del supporto NData in Chrome Bug 5696.
Nota: Gran parte delle informazioni in questa sezione si basano in parte sul post sul blog Demystificante Limitazioni del messaggio del canale di dati di WebRTC, scritte da Lennart Grahl. Entra un po ‘più in dettaglio lì, ma poiché i browser sono stati aggiornati da allora in parte potrebbe essere obsoleto. Inoltre, col passare del tempo, diventerà di più, soprattutto una volta che il supporto EOR e NData è completamente integrato nei principali browser.
Sicurezza
Tutti i dati trasferiti utilizzando WebRTC sono crittografati. Nel caso di RTCDataChannel, la crittografia utilizzata è Datagram Transport Layer Security (DTLS), che si basa sulla sicurezza del livello di trasporto (TLS). Poiché TLS viene utilizzato per proteggere ogni connessione HTTPS, tutti i dati inviati su un canale di dati sono sicuri come qualsiasi altro dato inviato o ricevuto dal browser dell’utente.
Più fondamentalmente, poiché WebRTC è una connessione peer-to-peer tra due agenti utente, i dati non passano mai tramite il server Web o le applicazioni. Ciò riduce le opportunità di intercettare i dati.
Ho trovato un problema di contenuto con questa pagina?
- Modifica la pagina su github.
- Segnala il problema dei contenuti.
- Visualizza la fonte su GitHub.
Questa pagina è stata modificata l’ultima volta il 25 aprile 2023 dai collaboratori di MDN.
WebRTC usa SCTP?
Об этой сттце
Ыы зарегистрировали подозритеstituire. С помощю ээй ст р ы ыы сможем о imperceде quello. Почему ээо мо л поззти?
Эта страница отображается в тех с лччч, когда автоматическиtal систе quisi которые наршают условия иполззования. Страница перестан scegliere. До этого момента для иполззования сжж google необходимо пхоходить поверку по по по по по.
” ылку запросов. Если ы и ипоеете общий доступ в интернет, проmma. Обратитесь к с ое системому администратору. Подробнеi.
Проверка по слову может также появляться, если вы вводите сложные запросы, обычно распространяемые автоматизированными системами, или же вводите запросы очень часто.
Comunicazione dei dati #
Cosa ottengo da WebRTC’S COMUNICAZIONE DATI? #
WebRTC fornisce canali di dati per la comunicazione dei dati. Tra due peer è possibile aprire 65.534 canali di dati. Un canale di dati è basato su Datagram e ognuno ha le sue impostazioni di durata. Per impostazione predefinita, ogni canale di dati ha garantito consegna ordinata. Se ti stai avvicinando a WebRTC da canali di dati di fondo dei media potrebbe sembrare dispendioso. Perché ho bisogno di questo intero sottosistema quando potrei semplicemente usare HTTP o WebSockets? La vera potenza con i canali di dati è che puoi configurarli per comportarsi come UDP con consegna non ordinata/perdita. Ciò è necessario per le situazioni a bassa latenza e ad alte prestazioni. Puoi misurare la contropressione e assicurarti di inviare solo quanto la tua rete supporta.
Come funziona? #
WebRTC utilizza il protocollo di trasmissione di controllo del flusso (SCTP), definito in RFC 4960. SCTP è un protocollo di livello di trasporto inteso come alternativa a TCP o UDP. Per WebRTC lo utilizziamo come protocollo di livello dell’applicazione che funziona sulla nostra connessione DTLS. SCTP ti dà flussi e ogni flusso può essere configurato in modo indipendente. I canali di dati WebRTC sono solo sottili astrazioni intorno a loro. Le impostazioni attorno alla durata e all’ordinamento vengono appena passate all’agente SCTP. I canali di dati hanno alcune funzionalità che SCTP può’T Express, come le etichette dei canali. Per risolvere il fatto che WebRTC utilizza il protocollo (DCEP) di Istablishment Data Channel, definito in RFC 8832. DCEP definisce un messaggio per comunicare l’etichetta e il protocollo del canale.
Dcep #
DCEP ha solo due messaggi data_channel_open e data_channel_ack . Per ogni canale di dati aperto, il telecomando deve rispondere con un ACK.
Data_channel_open #
Questo messaggio viene inviato dall’agente WebRTC che desidera aprire un canale.
Formato pacchetto #
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+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-| Tipo di messaggio | Tipo di canale | Priorità | +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+| Parametro di affidabilità | +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+| Lunghezza dell'etichetta | Lunghezza del protocollo | +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+ \ \ / Label / \ \ +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+ \ \ / Protocol / \ \ +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
Tipo di messaggio #
Il tipo di messaggio è un valore statico di 0x03 .
Tipo di canale #
- Data_channel_reliable (0x00) – Nessun messaggio viene perso e arriverà in ordine
- Data_channel_relible_unordered (0x80) – Nessun messaggio viene perso, ma possono arrivare fuori servizio.
- Data_Channel_Partial_Reliable_rexmit (0x01) – I messaggi possono essere persi dopo aver provato la quantità richiesta di volte, ma arriveranno in ordine.
- Data_Channel_Partial_Reliable_Rexmit_Unordered (0x81) – I messaggi possono essere persi dopo aver provato le quantità richieste di volte e possono arrivare fuori servizio.
- Data_Channel_Partial_Reliable_timed (0x02) – I messaggi possono essere persi se DON’t Arrivare nel tempo richiesto, ma arriveranno in ordine.
- Data_Channel_Partial_Reliable_timed_Unorded (0x82) – I messaggi possono essere persi se non’t Arrivare nel tempo richiesto e può arrivare fuori servizio.
Priorità #
La priorità del canale di dati. I canali di dati che hanno una priorità più elevata saranno programmati prima. I messaggi utente di grandi priorità di grandi dimensioni non ritardano l’invio di messaggi utente a priorità superiore.
Parametro di affidabilità #
Se il tipo di canale di dati è data_channel_partial_relible, i suffissi configurano il comportamento:
- Rexmit – Definisce quante volte il mittente ripristinerà il messaggio prima di arrendersi.
- Timed – Definisce per quanto tempo (in MS) il mittente revierà nuovamente il messaggio prima di arrendersi.
Etichetta #
Una stringa con codifica UTF-8 contenente il nome del canale dati. Questa stringa potrebbe essere vuota.
Protocollo #
Se questa è una stringa vuota, il protocollo non è specificato. Se si tratta di una stringa non vuota, dovrebbe specificare un protocollo registrato in “WebSocket subprotocol Name Registry”, definito in RFC 6455.
Data_channel_ack #
Questo messaggio viene inviato dall’agente WebRTC per riconoscere che questo canale di dati è stato aperto.
Formato pacchetto #
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+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-| Tipo di messaggio | +-+-+-+-+-+-+-+-+
Protocollo di trasmissione di controllo del flusso #
SCTP è la vera potenza dietro i canali di dati WebRTC. Fornisce tutte queste funzionalità del canale di dati:
- Multiplexing
- Consegna affidabile utilizzando un meccanismo di ritrasmissione simile a TCP
- Opzioni di affidabilità parziale
- Evitamento della congestione
- Controllo del flusso
Per capire SCTP lo esploreremo in tre parti. L’obiettivo è che conoscerai abbastanza per debug e apprendere i dettagli profondi di SCTP da solo dopo questo capitolo.
Concetti #
SCTP è un protocollo ricco di funzionalità. Questa sezione coprirà solo le parti di SCTP utilizzate da WebRTC. Le caratteristiche in SCTP che non sono utilizzate da WebRTC includono la selezione del multi-homing e del percorso.
Con oltre venti anni di sviluppo SCTP può essere difficile da capire completamente.
Associazione #
L’associazione è il termine utilizzato per una sessione SCTP. È lo stato che è condiviso tra due agenti SCTP mentre comunicano.
Flussi #
Un flusso è una sequenza bidirezionale di dati utente. Quando crei un canale di dati, stai effettivamente creando un flusso SCTP. Ogni associazione SCTP contiene un elenco di flussi. Ogni flusso può essere configurato con diversi tipi di affidabilità.
WebRTC ti consente di configurare solo sulla creazione del flusso, ma SCTP in realtà consente di modificare la configurazione in qualsiasi momento.
Datagram basato #
SCTP inquadra i dati come datagrammi e non come flusso di byte. L’invio e la ricezione di dati sembra utilizzare UDP anziché TCP. Don’t È necessario aggiungere qualsiasi codice aggiuntivo per trasferire più file su un flusso.
Messaggi SCTP Don’T ha limiti di dimensioni come UDP. Un singolo messaggio SCTP può avere più gigabyte di dimensioni.
Blocchi #
Il protocollo SCTP è composto da blocchi. Esistono molti tipi diversi di pezzi. Questi blocchi sono usati per tutte le comunicazioni. I dati dell’utente, l’inizializzazione della connessione, il controllo della congestione e altro sono tutti eseguiti tramite blocchi.
Ogni pacchetto SCTP contiene un elenco di blocchi. Quindi in un pacchetto UDP puoi avere più blocchi che trasportano messaggi da flussi diversi.
Numero di sequenza di trasmissione #
Il numero di sequenza di trasmissione (TSN) è un identificatore univoco globale per i blocchi dei dati. Un blocco dei dati è ciò che trasporta tutti i messaggi che un utente desidera inviare. Il TSN è importante perché aiuta un ricevitore a determinare se i pacchetti sono persi o fuori servizio.
Se il ricevitore nota un TSN mancante, lo fa’t dare i dati all’utente fino a quando non è soddisfatto.
Stream Identifier #
Ogni flusso ha un identificatore univoco. Quando si crea un canale di dati con un ID esplicito, in realtà viene appena passato direttamente a SCTP come identificatore del flusso. Se indossi’t Passare un ID L’identificatore del flusso è scelto per te.
Identificatore del protocollo payload #
Ogni chunk di dati ha anche un identificatore del protocollo di payload (PPID). Questo viene utilizzato per identificare in modo univoco il tipo di dati. SCTP ha molti PPID, ma WebRTC sta usando solo i seguenti cinque:
- WEBRTC DCEP (50) – Messaggi DCE.
- WebRTC String (51) – Messaggi String DataChannel.
- WEBRTC BINARY (53) – Messaggi binari DataChannel.
- WebRTC String Empty (56) – Messaggi di stringa DataChannel con 0 lunghezza.
- WEBRTC BINARY EVUP (57) – Messaggi binari DataChannel con 0 lunghezza.
Protocollo #
Di seguito sono riportati alcuni dei blocchi utilizzati dal protocollo SCTP. Questa non è una dimostrazione esaustiva. Ciò fornisce strutture sufficienti per la macchina a stato per avere senso.
Ogni pezzo inizia con un campo di tipo. Prima di un elenco di blocchi, avrai anche un’intestazione.
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+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-| Tipo = 0 | Riservato | u | b | e | Lunghezza | +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+| Tsn | +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+| Identificatore di streaming | Numero di sequenza di flusso | +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+| Identificatore del protocollo payload | +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+\ \ / Dati utente / \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
Il blocco dei dati è come vengono scambiati tutti i dati dell’utente. Quando invii qualcosa sul canale di dati, è così che viene scambiato.
U bit è impostato se questo è un pacchetto non ordinato. Possiamo ignorare il numero di sequenza del flusso.
B ed e sono i pezzi di inizio e fine. Se si desidera inviare un messaggio troppo grande per un blocco di dati, deve essere frammentato in più blocchi di dati inviati in pacchetti separati. Con i numeri B ed E Bit e Sequence è in grado di esprimerlo.
- B = 1, E = 0 – Primo pezzo di un messaggio utente frammentato.
- B = 0, e = 0 – pezzo centrale di un messaggio utente frammentato.
- B = 0, E = 1 – Ultimo pezzo di un messaggio utente frammentato.
- B = 1, e = 1 – messaggio non frammentato.
TSN è il numero di sequenza di trasmissione. È l’identificatore univoco globale per questo pezzo di dati. Dopo 4.294.967.295 blocchi questo si avvolgerà a 0. Il TSN è incrementato per ogni pezzo in un messaggio utente frammentato in modo che il ricevitore sappia come ordinare i blocchi ricevuti per ricostruire il messaggio originale.
L’identificatore del flusso è l’identificatore univoco per il flusso a cui appartengono i dati.
Il numero di sequenza di flusso è un numero di 16 bit incrementato ogni messaggio utente e incluso nell’intestazione del blocco del messaggio di dati. Dopo 65535 messaggi questo si avvolgerà a 0. Questo numero viene utilizzato per decidere l’ordine di consegna del messaggio al ricevitore se U è impostato su 0. Simile al TSN, tranne il numero di sequenza del flusso è incrementato solo per ciascun messaggio nel suo insieme e non ogni singolo pezzo di dati.
L’identificatore del protocollo di payload è il tipo di dati che scorre attraverso questo flusso. Per WebRTC, sarà DCEP, String o Binary.
I dati dell’utente sono ciò che stai inviando. Tutti i dati inviati tramite un canale dati WebRTC vengono trasmessi tramite un blocco dei dati.
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+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-| Tipo = 1 | Bandiere di chunk | Lunghezza del pezzo | +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+| Inizia tag | +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+| Credito di finestre del ricevitore pubblicizzato (a_rwnd) | +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+| Numero di flussi in uscita | Numero di flussi in entrata | +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+| TSN iniziale | +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+ \ \ / Optional/Variable-Length Parameters / \ \ +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
Il blocco init inizia il processo di creazione di un’associazione.
Il tag iniziale viene utilizzato per la generazione di cookie. I cookie vengono utilizzati per la protezione del servizio man-in-the-middle e negazione. Sono descritti in modo più dettagliato nella sezione della macchina a stato.
Il credito della finestra del ricevitore pubblicizzato viene utilizzato per SCTP’Controllo della congestione. Questo comunica quanto grande di un buffer il ricevitore abbia stanziato per questa associazione.
Il numero di flussi in uscita/in entrata notifica il telecomando di quanti flussi supporta questo agente.
TSN iniziale è un UINT32 casuale per iniziare il TSN locale a.
I parametri opzionali consentono a SCTP di introdurre nuove funzionalità al protocollo.
Sack 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+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-| Tipo = 3 | FLAG CHUNK | Lunghezza del pezzo | +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+| Cumulative Tsn Ack | +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+| Credito di finestre del ricevitore pubblicizzato (a_rwnd) | +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+| Numero di blocchi di gap Ack = N | Numero di TSN duplicati = x | +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+| Gap Ack Block #1 Avvio | Gap Ack Block #1 End | +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+ / / \ . \ / /+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+| Gap Ack Block #n Start | Gap Ack Block #n End | +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+| Duplicato TSN 1 | +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+ / / \ . \ / /+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+| Duplicato TSN X | +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
Il sacco (riconoscimento selettivo) è come un ricevitore notifica un mittente che ha ottenuto un pacchetto. Fino a quando un mittente non riceve un sacco per un TSN, revierà nuovamente il blocco dei dati in questione. Un sacco fa molto più che aggiornare il TSN.
Cumulativo TSN ACK Il TSN più alto che è stato ricevuto.
Dimensione del buffer del destinatario del destinatario del ricevitore pubblicizzato. Il ricevitore può modificarlo durante la sessione se diventa disponibile più memoria.
ACK blocca i TSN che sono stati ricevuti dopo il cumulativo TSN ACK . Questo viene utilizzato se c’è un divario nei pacchetti consegnati. Permettere’S dicono che i blocchi dei dati con TSNS 100, 102, 103 e 104 vengono consegnati. Il cumulativo TSN Ack sarebbe 100, ma i blocchi ACK potrebbero essere usati per dire al mittente che lo fa’T deve ricredere 102, 103 o 104 .
TSN duplicato informa il mittente che ha ricevuto i seguenti blocchi di dati più di una volta.
CHUNK BEACHEAT #
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+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-| Tipo = 4 | Bandiere di chunk | Lunghezza del battito cardiaco | +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+ \ \ / Heartbeat Information TLV (Variable-Length) / \ \ +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
Il battitore del battito cardiaco viene utilizzato per affermare che il telecomando sta ancora rispondendo. Utile se non si è’t Invio di eventuali blocchi di dati e deve tenere aperta una mappatura 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+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-| Tipo = 6 | Riservato | T | Lunghezza | +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+ / / \ Zero o più cause di errore \ / / +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
Un pezzo di aborte bruscamente chiude l’associazione. Usato quando una parte entra in uno stato di errore. La fine della connessione utilizza il blocco di spegnimento.
Chiudo 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+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-| Tipo = 7 | Bandiere di chunk | Lunghezza = 8 | +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+| Cumulative Tsn Ack | +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
The Shutdown Chunk avvia un grazioso arresto dell’associazione SCTP. Ogni agente informa il telecomando dell’ultimo TSN inviato. Questo garantisce che non si perdano pacchetti. WebRTC non lo fa’t fare un grazioso arresto dell’associazione SCTP. Devi abbattere ogni canale di dati per gestirlo con grazia.
Cumulativo TSN Ack è l’ultimo TSN che è stato inviato. Ogni parte sa non terminare fino a quando non hanno ricevuto il blocco dei dati con questo TSN.
Errore 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+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-| Tipo = 9 | Bandiere di chunk | Lunghezza | +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+ \ \ / One or more Error Causes / \ \ +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
Viene utilizzato un blocco di errore per avvisare l’agente SCTP remoto che si è verificato un errore non fatale.
Forward 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+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-| Tipo = 192 | Flags = 0x00 | Lunghezza = variabile | +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+| Nuovo TSN cumulativo | +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+| Stream-1 | Stream Sequence-1 | +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+ \ / / \ +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+ | Stream-n | Stream Sequence-N | +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
Il blocco TSN in avanti sposta il TSN globale in avanti. SCTP lo fa, quindi puoi saltare alcuni pacchetti che non’tieni più di più. Permettere’s dici che mandi 10 11 12 13 14 15 e questi pacchetti sono validi solo se arrivano tutti. Questi dati sono anche sensibili al tempo in tempo reale, quindi se arriva in ritardo non è’t utile.
Se perdi 12 e 13 non c’è motivo di inviare 14 e 15 ! SCTP usa il blocco TSN in avanti per raggiungerlo. Dice al ricevitore che 14 e 15 non’Sarò più consegnato.
Nuovo TSN cumulativo Questo è il nuovo TSN della connessione. Tutti i pacchetti prima di questo TSN non verranno mantenuti.
La sequenza di flusso e flusso viene utilizzata per saltare il numero di sequenza del flusso in anticipo. Fare riferimento al blocco dei dati per il significato di questo campo.
Macchina a stato #
Queste sono alcune parti interessanti della macchina dello stato SCTP. WebRTC non lo fa’t Utilizzare tutte le caratteristiche della macchina dello stato SCTP, quindi abbiamo escluso quelle parti. Abbiamo anche semplificato alcuni componenti per renderli comprensibili da soli.
Flusso di stabilimento di connessione #
I blocchi INIT e INIT ACK vengono utilizzati per scambiare le capacità e le configurazioni di ciascun peer. SCTP usa un biscotto durante la stretta di mano per convalidare il peer con cui sta comunicando. Questo per garantire che la stretta di mano non sia intercettata e per prevenire gli attacchi DOS.
Il blocco Init Ack contiene il biscotto. Il cookie viene quindi restituito al suo creatore usando il cookie eco . Se la verifica dei cookie ha successo, viene inviato il cookie ACK e i blocchi dei dati sono pronti per essere scambiati.
Flusso di smuco di connessione #
SCTP utilizza il blocco di spegnimento. Quando un agente riceve un blocco di spegnimento, aspetterà fino a quando non riceverà il TSN ACK cumulativo richiesto . Ciò consente a un utente di garantire che tutti i dati vengano consegnati anche se la connessione è perdita.
Meccanismo #
SCTP usa la richiesta del battito cardiaco e i pezzi di battito cardiaco per mantenere viva la connessione. Questi vengono inviati su un intervallo configurabile. SCTP esegue anche un backoff esponenziale se il pacchetto ha’T è arrivato.
Il battitore del battito cardiaco contiene anche un valore temporale. Ciò consente a due associazioni di calcolare il tempo di viaggio tra due agenti.