Usando canais de dados webrtc
Resumo
Neste guia, examinaremos como adicionar um canal de dados a uma conexão de colegas, que pode ser usada para trocar com segurança dados arbitrários. Veremos como criar um canal de dados e discutir as opções de negociação automática e manual.
Pontos chave
1. O transporte SCTP é usado para transmitir e receber dados para rtcdatachannels na conexão de pares.
2. A interface RTCPeerConnection possui uma propriedade somente leitura chamada SCTP, que retorna um objeto RTCSCTPTRANSPORT que descreve o transporte SCTP sendo usado.
3. O método CreatedATACHANNEL () na interface RTCPeerConnection é usado para criar um novo canal de dados.
4. A negociação automática permite que o RTCPeerConnection lide com a negociação e criação do canal de dados.
5. A negociação manual envolve a criação de um objeto rtcdatachannel com a propriedade negociada definida como true e depois negociando a conexão fora da banda.
6. O tamanho máximo da mensagem que pode ser enviado sobre o canal de dados pode ser determinado usando a propriedade MaxMessagesize do objeto RTCSCTPTRANSPORT.
7. Os componentes do WebRTC usam a criptografia para proteger dados transmitidos pelo RTCDATACHANNEL.
8. As especificações para os canais de dados WebRTC podem ser encontradas no WebRTC: Comunicação em tempo real em especificação de navegadores.
9. A compatibilidade dos canais de dados WebRTC varia entre os navegadores.
10. Recursos e opções adicionais para editar ou relatar problemas com a página podem ser encontrados na seção “Veja também”.
Perguntas e respostas
- Qual é o objetivo dos blocos ACK nos canais de dados do WebRTC?
Os blocos ACK são usados para informar o remetente que certos pacotes não precisam se ressentir, mesmo que haja uma lacuna nos pacotes entregues. Por exemplo, se os dados de dados com TSNS 100, 102, 103 e 104 forem entregues, mas o TSN ack cumulativo é 100, os blocos ACK podem ser usados para indicar que o TSNS 102, 103 e 104 não precisa ser ressentido. - O que a propriedade SCTP da interface RTCPeerConnection retorna?
A propriedade SCTP retorna um objeto RTCSCTPTRANSPORT que descreve o transporte SCTP sendo usado para transmitir e receber dados para RTCDATACHANNELS na conexão de pares. Se o SCTP não foi negociado, o valor é nulo. - Como um canal de dados pode ser criado no webrtc?
Um canal de dados pode ser criado usando o método CreateTAChannel () na interface RTCPeerConnection. Este método retorna um objeto rtcdatachannel que representa o canal de dados recém -criado. - Qual é a diferença entre negociação automática e negociação manual?
Na negociação automática, o RTCPeerConnection lida com a negociação e criação do canal de dados. O método criadoTACHANNEL () é chamado sem especificar um valor para a propriedade negociada ou com um valor de falso. Na negociação manual, o canal de dados é criado com a propriedade negociada definida como true, e a negociação é feita fora da banda usando um servidor da web ou outros meios. - Como o tamanho máximo da mensagem que pode ser enviado sobre um canal de dados é determinado?
O tamanho máximo da mensagem pode ser determinado acessando a propriedade MaxMessagesize do objeto RTCSCTPTRANSPORT, que representa o transporte SCTP que está sendo usado pelo RTCPeerConnection. - Os dados são transmitidos em um rtcdatachannel garantido automaticamente?
Sim, todos os dados transmitidos em um RTCDATACHANNEL são automaticamente protegidos usando DTLS (Datagram Transport Cayer Security). Os componentes do WebRTC são obrigados a usar a criptografia para garantir a segurança dos dados. - Onde podem ser encontrados as especificações para os canais de dados webrtc?
As especificações para os canais de dados WebRTC podem ser encontradas na especificação WebRTC: em tempo real na especificação dos navegadores, especificamente a seção Dom-RTCPeerConnection-SCTP. - Qual é a compatibilidade dos canais de dados do WebRTC nos navegadores?
A compatibilidade dos canais de dados WebRTC pode variar em diferentes navegadores. É importante testar e garantir a compatibilidade para os navegadores de destino e versões. - Quais são alguns recursos adicionais relacionados aos canais de dados do WebRTC?
Você pode editar a página no Github, relatar problemas de conteúdo ou visualizar o código -fonte no GitHub. Essas opções podem ser encontradas na seção “Veja também” abaixo.Usando canais de dados webrtc
ACK bloqueia os TSNs que foram recebidos após o TSN acum . Isso é usado se houver uma lacuna em pacotes entregues. Deixar’S dizem que os dados com TSNs 100, 102, 103 e 104 são entregues. O TSN Cumulativo ACK seria 100, mas os blocos ACK poderiam ser usados para dizer ao remetente que não’T necessidade de reenviar 102, 103 ou 104 .
RTCPeerConnection: Propriedade SCTP
O somente leitura SCTP A propriedade na interface RTCPeerConnection retorna um RTCSCTPTRANSPORT descrevendo o transporte SCTP sobre quais dados SCTP estão sendo enviados e recebidos. Se o SCTP não foi negociado, esse valor é nulo .
O transporte SCTP é usado para transmitir e receber dados para todo e qualquer rtcdatachannel s na conexão de pares.
Valor
Um objeto RTCSCTPTransport descrevendo o transporte SCTP que está sendo usado pelo RTCPeerConnection para transmitir e receber em seus canais de dados, ou NULL se a negociação do SCTP não tiver acontecido.
Exemplo
const PeerConnection = novo RtcpeerConnection(); const canal = PeerConnection.CriadoATACHANNEL("Meus dados"); canal.ONOPEN = (evento) => canal.enviar("Enviando uma mensagem"); >; canal.OnMessage = (evento) => console.registro(evento.dados); >; // determinar o maior tamanho de mensagem que pode ser enviado const SCTP = PeerConnection.SCTP; const MaxMessagesize = SCTP.MaxMessagesize;
Especificações
Especificação WebRTC: comunicação em tempo real em navegadores
# dom-rtcpeerConnection-sctpCompatibilidade do navegador
Tabelas BCD apenas carregam no navegador
Veja também
Encontrei um problema de conteúdo com esta página?
- Edite a página no Github.
- Relate o problema de conteúdo.
- Veja a fonte no Github.
Esta página foi modificada pela última vez em 25 de abril de 2023 pelos colaboradores da MDN.
Seu plano para uma internet melhor.
Usando canais de dados webrtc
Neste guia, examinaremos como adicionar um canal de dados a uma conexão de pares, que pode ser usada para trocar com segurança dados arbitrários; isto é, qualquer tipo de dados que desejamos, em qualquer formato que escolhemos.
Observação: Como todos os componentes do WebRTC são obrigados a usar a criptografia, quaisquer dados transmitidos em um rtcdatachannel são automaticamente protegidos usando a segurança da camada de transporte de datagrama (Dtls). Veja a segurança abaixo para obter mais informações.
Criando um canal de dados
O transporte de dados subjacente usado pelo rtcdatachannel pode ser criado de duas maneiras:
- Deixe o WebRTC criar o transporte e anunciá -lo para o ponto remoto para você (fazendo com que ele receba um evento de dados de dados). Esta é a maneira mais fácil e funciona para uma ampla variedade de casos de uso, mas pode não ser flexível o suficiente para suas necessidades.
- Escreva seu próprio código para negociar o transporte de dados e escreva seu próprio código para sinalizar para o outro par de que ele precisa se conectar ao novo canal.
Vejamos cada um desses casos, começando com o primeiro, que é o mais comum.
Negociação automática
Freqüentemente, você pode permitir que a conexão com os colegas lide com a negociação da conexão rtcdatachannel para você. Para fazer isso, ligue
criouTACHANNEL () sem especificar um valor para a propriedade negociada ou especificar a propriedade com um valor de false . Isso acionará automaticamente o RTCPeerConnection para lidar com as negociações para você, fazendo com que o colega remoto crie um canal de dados e ligando os dois em toda a rede.
O objeto rtcdatachannel é retornado imediatamente pelo CreatedATACHANNEL (); Você pode dizer quando a conexão foi feita com sucesso, observando o evento aberto para ser enviado para o rtcdatachannel .
deixar DataChannel = PC.CriadoATACHANNEL("Canal MyApp"); DataChannel.addEventListener("abrir", (evento) => BEGN TRANSMISSÃO(DataChannel); >);
Negociação manual
Para negociar manualmente a conexão do canal de dados, você precisa primeiro criar um novo objeto RTCDATACHANNEL usando o método CreatedAtachannel () no RTCPeerConnection, especificando nas opções que uma propriedade negociada definida para true . Isso sinaliza para a conexão de colegas para não tentar negociar o canal em seu nome.
Em seguida, negocie a conexão fora da banda, usando um servidor da web ou outros meios. Esse processo deve sinalizar para o colega remoto que ele deve criar seu próprio rtcdatachannel com a propriedade negociada também definida como true, usando o mesmo id . Isso vinculará os dois objetos em toda a RTCPeerConnection .
deixar DataChannel = PC.CriadoATACHANNEL("Canal MyApp", negociado: verdadeiro, >); DataChannel.addEventListener("abrir", (evento) => BEGN TRANSMISSÃO(DataChannel); >); RequestRemoteChannel(DataChannel.eu ia);
Neste snippet de código, o canal é criado com o conjunto negociado como true, então uma função chamada requestRemoteChannel () é usada para acionar a negociação, para criar um canal remoto com o mesmo id que o canal local.
Fazer isso permite criar canais de dados com cada par usando propriedades diferentes e criar canais declarativamente usando o mesmo valor para id .
Carregando
Os canais de dados do WebRTC suportam o buffer de dados de saída. Isso é tratado automaticamente. Embora não haja como controlar o tamanho do buffer, você pode aprender quantos dados estão atualmente em buffer e pode optar por ser notificado por um evento quando o buffer começar a ficar baixo em dados na fila. Isso facilita a redação de rotinas eficientes que garantem que sempre haja dados prontos para enviar sem uso excessivo de memória ou inundar completamente o canal.
Compreendendo os limites de tamanho da mensagem
Para quaisquer dados transmitidos por uma rede, existem restrições de tamanho. Em um nível fundamental, os pacotes de rede individuais não podem ser maiores que um determinado valor (o número exato depende da rede e da camada de transporte que está sendo usada). No nível do aplicativo – ou seja, dentro da implementação do WebRTC pelo agente do usuário no qual seu código está em execução – a implementação do WebRTC implementa recursos para suportar mensagens maiores que o tamanho máximo do pacote na camada de transporte da rede.
Isso pode complicar as coisas, já que você não sabe necessariamente quais são os limites de tamanho para vários agentes de usuários e como eles respondem quando uma mensagem maior é enviada ou recebida. Mesmo quando os agentes de usuário compartilham a mesma biblioteca subjacente para lidar com dados de transmissão de controle de fluxo (SCTP), ainda pode haver variações devido à maneira como a biblioteca é usada. Por exemplo, o Firefox e o Google Chrome usam a biblioteca USRSCTP para implementar o SCTP, mas ainda existem situações nas quais a transferência de dados em um rtcdatachannel pode falhar devido a diferenças na maneira como eles chamam a biblioteca e reagem a erros que ele retorna.
Quando dois usuários executando o Firefox estão se comunicando em um canal de dados, o limite de tamanho da mensagem é muito maior do que quando o Firefox e o Chrome estão se comunicando porque o Firefox implementa uma técnica agora depreciada para enviar mensagens grandes em várias mensagens SCTP, que o Chrome não. Em vez disso.
Mensagens menores que 16 kib podem ser enviadas sem preocupação, pois todos os principais agentes de usuários lidam com eles da mesma maneira. Além disso, as coisas ficam mais complicadas.
Preocupações com mensagens grandes
Atualmente, não é prático usar rtcdatachannel para mensagens maiores que 64 kib (16 kib se você deseja oferecer suporte à troca de dados de navegador transversal). O problema surge do fato de que o SCTP – o protocolo usado para enviar e receber dados em um rtcdatachannel – foi originalmente projetado para uso como um protocolo de sinalização. Era esperado que as mensagens fossem relativamente pequenas. O suporte a mensagens maiores que o MTU da camada de rede foi adicionado quase como uma reflexão tardia, caso as mensagens de sinalização precisassem ser maiores que o MTU. Esse recurso exige que cada parte da mensagem tenha números de sequência consecutivos, para que eles tenham que ser transmitidos um após o outro, sem outros dados intercalados entre eles.
Isso acabou se tornando um problema. Com o tempo, vários aplicativos (incluindo os que implementam o WebRTC) começaram a usar o SCTP para transmitir mensagens cada vez maiores. Eventualmente, percebeu -se que, quando as mensagens se tornam muito grandes, é possível a transmissão de uma grande mensagem para bloquear todas as outras transferências de dados nesse canal de dados – incluindo mensagens de sinalização crítica.
Isso se tornará um problema quando os navegadores apoiarem corretamente o padrão atual para apoiar mensagens maiores-a bandeira de fim de gravação (EOR) que indica quando uma mensagem é a última em uma série que deve ser tratada como uma única carga útil. Isso foi implementado no Firefox 57, mas ainda não foi implementado no Chrome (ver Chromium Bug 7774). Com o suporte do EOR, o RTCDATACHANNEL Cargas pode ser muito maior (oficialmente até 256 KIB, mas a implementação do Firefox os limita a um gibão impressionante). Mesmo em 256 kib, isso é grande o suficiente para causar atrasos perceptíveis no lidar com o tráfego urgente. Se você for ainda maior, os atrasos podem se tornar insustentáveis, a menos que você tenha certeza de suas condições operacionais.
Para resolver esse problema, um novo sistema de Agendadores de fluxo (Geralmente chamado de “especificação SCTP ndata”) foi projetado para possibilitar interlamentar mensagens enviadas em diferentes fluxos, incluindo fluxos usados para implementar canais de dados do WebRTC. Esta proposta ainda está no formulário de rascunho da IETF, mas uma vez implementado, tornará possível enviar mensagens com essencialmente não há limitações de tamanho, pois a camada SCTP interlameá automaticamente as sub-mensagens subjacentes para garantir que os dados de todos os canais tenham a oportunidade de superar.
O suporte do Firefox ao NDATA está sendo implementado; Veja o Firefox Bug 1381145 para rastreá -lo ficando disponível para uso geral. A equipe do Chrome está rastreando sua implementação do suporte do NDATA no Chrome Bug 5696.
Observação: Muitas das informações desta seção são baseadas em parte na postagem do blog desmistificando limitações de tamanho de mensagem do canal de dados do WebRTC, escrito por Lennart Grahl. Ele entra em um pouco mais de detalhe lá, mas como os navegadores foram atualizados desde então alguns deles podem estar desatualizados. Além disso, com o passar do tempo, ficará mais ainda, especialmente quando o suporte de EOR e NDATA estiver totalmente integrado nos principais navegadores.
Segurança
Todos os dados transferidos usando WebRTC são criptografados. No caso do RTCDATACHANNEL, a criptografia usada é a segurança da camada de transporte de datagrama (DTLS), que é baseada na segurança da camada de transporte (TLS). Como o TLS é usado para proteger todas as conexões HTTPS, todos os dados enviados em um canal de dados são tão seguros quanto outros dados enviados ou recebidos pelo navegador do usuário.
Mais fundamentalmente, como o WebRTC é uma conexão ponto a ponto entre dois agentes de usuário, os dados nunca passam pela Web ou servidor de aplicativos. Isso reduz as oportunidades de interceptar os dados.
Encontrei um problema de conteúdo com esta página?
- Edite a página no Github.
- Relate o problema de conteúdo.
- Veja a fonte no Github.
Esta página foi modificada pela última vez em 25 de abril de 2023 pelos colaboradores da MDN.
Webrtc usa sctp?
О эээ сйранibus
Ы з ззарегиgléria. С помощью этой страницы мы сможем определить, что запросы отправляете именно вы, а не робот. Почpels эээ моогitu произойth?
Эта страница отображается в тех случаях, когда автоматическими системами Google регистрируются исходящие из вашей сети запросы, которые нарушают Условия использования. Ponto. Ээth момо номттаая и оозз илэз и ээ и эз и эз и з и ззз и зз и ээз и ээз иth ээ эth ээзз эth эзз иthлз ио и зз и иth эз иээ эээо иth эз эээ ээо ээоо иth иэзз эth эзт эth эз ио эээ иth эз иэз иthлзз иоз ил иээ иээо иэээ иээо иth ио иээ эth иэ иээ эth иэ иээ эth ио иэ ээог seguir.
Ит и и и и и и и и и чззжfia м ирржжжfia м иржжжжfia м мжжжжжж<ь м м иржжжfia. não. Если вы используете общий доступ в Интернет, проблема может быть с компьютером с таким же IP-адресом, как у вас. Орратитеitivamente к с о и и с с с с с с с с с с с с с с с с с с с с с с с с с с с с с с с с с с с с с с с с с с с с с с с с с с с с с с с с с с с с с с с с с с с с с с а с с а с а а а а а а а а а а а а а а а а а а а а а а а а а а а а а а а а а а а а а а а а а а а а а а а а а а а а а а а а а а а а а а а ”. ПодробнÉ.
Проверка по слову может также появляться, если вы вводите сложные запросы, обычно распространяемые автоматизированными системами, или же вводите запросы очень часто.
Comunicação de dados #
O que eu ganho do webrtc’s Comunicação de dados? #
O WebRTC fornece canais de dados para comunicação de dados. Entre dois colegas, você pode abrir 65.534 canais de dados. Um canal de dados é baseado em datagrama e cada um tem suas próprias configurações de durabilidade. Por padrão, cada canal de dados garantiu a entrega ordenada. Se você estiver se aproximando do WebRTC de uma mídia, os canais de dados em segundo plano podem parecer desperdiçados. Por que eu preciso de todo esse subsistema quando eu poderia usar HTTP ou WebSockets? O poder real dos canais de dados é que você pode configurá -los para se comportar como UDP com entrega não ordenada/com perdas. Isso é necessário para situações de baixa latência e alto desempenho. Você pode medir a contrapressão e garantir que você está enviando apenas o máximo de suporte à sua rede.
Como funciona? #
O WebRTC usa o protocolo de transmissão de controle de fluxo (SCTP), definido no RFC 4960. O SCTP é um protocolo de camada de transporte que se destinava como uma alternativa ao TCP ou UDP. Para WebRTC, nós o usamos como um protocolo de camada de aplicativo que percorre nossa conexão DTLS. O SCTP fornece fluxos e cada fluxo pode ser configurado de forma independente. Os canais de dados webrtc são apenas abstrações finas ao redor deles. As configurações em torno da durabilidade e pedidos são passadas diretamente para o agente SCTP. Os canais de dados têm alguns recursos que o SCTP pode’T Express, como rótulos de canal. Para resolver que o WebRTC usa o Protocolo de Estabelecimento do Canal de Dados (DCEP), que é definido na RFC 8832. DCEP define uma mensagem para comunicar o rótulo e o protocolo do canal.
DCEP #
DCEP tem apenas duas mensagens Data_Channel_Open e Data_Channel_ack . Para cada canal de dados aberto, o controle remoto deve responder com um ACK.
Data_channel_open #
Esta mensagem é enviada pelo agente WebRTC que deseja abrir um canal.
Formato de pacote #
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 de mensagem | Tipo de canal | Prioridade | +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+| Parâmetro de confiabilidade | +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+| Comprimento da etiqueta | Comprimento do protocolo | +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+ \ \ / Label / \ \ +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+ \ \ / Protocol / \ \ +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
Tipo de mensagem #
O tipo de mensagem é um valor estático de 0x03 .
Tipo de canal #
- Data_channel_reliable (0x00) – Nenhuma mensagem é perdida e chegará em ordem
- Data_channel_reliable_unordered (0x80) – Nenhuma mensagem é perdida, mas elas podem chegar fora de ordem.
- Data_channel_parcial_reliable_rexmit (0x01) – As mensagens podem ser perdidas após tentar a quantidade solicitada de vezes, mas elas chegarão em ordem.
- Data_channel_parcial_reliable_rexmit_unordered (0x81) – As mensagens podem ser perdidas após a tentativa da quantidade solicitada de vezes e podem chegar fora do pedido.
- Data_channel_parcial_reliable_timed (0x02) – As mensagens podem ser perdidas se não o fizer’T chegar ao tempo solicitado, mas eles chegarão em ordem.
- Data_channel_parcial_reliable_timed_unordered (0x82) – As mensagens podem ser perdidas se não derramar’chega ao tempo solicitado e pode chegar fora de ordem.
Prioridade #
A prioridade do canal de dados. Os canais de dados com uma prioridade mais alta serão agendados primeiro. Grandes mensagens de usuário de prioridade inferior não atrasarão o envio de mensagens de usuário de maior prioridade.
Parâmetro de confiabilidade #
Se o tipo de canal de dados for data_channel_parcial_reliable, os sufixos configuram o comportamento:
- Rexmit – define quantas vezes o remetente será lançado novamente a mensagem antes de desistir.
- Cronometrado – define por quanto tempo (no MS) o remetente será lançado novamente a mensagem antes de desistir.
Rótulo #
Uma string codificada por UTF-8 contendo o nome do canal de dados. Esta string pode estar vazia.
Protocolo #
Se essa for uma string vazia, o protocolo não é especificado. Se for uma string não vazia, deve especificar um protocolo registrado no “WebSocket Subprotocol Name Registry”, definido no RFC 6455.
Data_channel_ack #
Esta mensagem é enviada pelo agente WebRTC para reconhecer que este canal de dados foi aberto.
Formato de pacote #
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 de mensagem | +-+-+-+-+-+-+-+-+
Protocolo de transmissão de controle de fluxo #
SCTP é o poder real por trás dos canais de dados do WebRTC. Ele fornece todos esses recursos do canal de dados:
- Multiplexação
- Entrega confiável usando um mecanismo de retransmissão do tipo TCP
- Opções de confiabilidade parcial
- Evitação de congestionamento
- Controle de fluxo
Para entender o SCTP, iremos explorá -lo em três partes. O objetivo é que você saiba o suficiente para depurar e aprender os detalhes profundos do SCTP por conta própria após este capítulo.
Conceitos #
SCTP é um protocolo rico em recurso. Esta seção só vai cobrir as partes do SCTP que são usadas pelo WebRTC. Os recursos no SCTP que não são usados pelo WebRTC incluem seleção de multi-homing e caminho.
Com mais de vinte anos de desenvolvimento, o SCTP pode ser difícil de entender completamente.
Associação #
Associação é o termo usado para uma sessão SCTP. É o estado que é compartilhado entre dois agentes SCTP enquanto eles se comunicam.
Fluxos #
Um fluxo é uma sequência bidirecional de dados do usuário. Quando você cria um canal de dados, você está apenas criando um fluxo SCTP. Cada associação SCTP contém uma lista de fluxos. Cada fluxo pode ser configurado com diferentes tipos de confiabilidade.
O WebRTC apenas permite que você configure na criação de fluxos, mas o SCTP realmente permite alterar a configuração a qualquer momento.
# Baseado em datagrama
SCTP enquadra os dados como datagramas e não como um fluxo de bytes. Enviar e receber dados parece usar UDP em vez de TCP. Você não’não precisa adicionar qualquer código extra para transferir vários arquivos por um fluxo.
Mensagens SCTP Don’T tem limites de tamanho como UDP. Uma única mensagem SCTP pode ser vários gigabytes em tamanho.
Pedaços #
O protocolo SCTP é composto de pedaços. Existem muitos tipos diferentes de pedaços. Esses pedaços são usados para toda a comunicação. Dados do usuário, inicialização da conexão, controle de congestionamento e muito mais são feitos por meio de pedaços.
Cada pacote SCTP contém uma lista de pedaços. Então, em um pacote UDP, você pode ter vários pedaços carregando mensagens de diferentes fluxos.
Número da sequência de transmissão #
O número da sequência de transmissão (TSN) é um identificador exclusivo global para pedaços de dados. Um pedaço de dados é o que carrega todas as mensagens que um usuário deseja enviar. O TSN é importante porque ajuda um receptor a determinar se os pacotes estão perdidos ou fora de ordem.
Se o receptor perceber um TSN ausente, não’t Dê os dados ao usuário até que sejam cumpridos.
Identificador de fluxo #
Cada fluxo tem um identificador único. Quando você cria um canal de dados com um ID explícito, ele é realmente passado para o SCTP como o identificador de fluxo. Se você não for’t aprovar um id, o identificador de fluxo é escolhido para você.
Identificador de protocolo de carga útil #
Cada pedaço de dados também possui um identificador de protocolo de carga útil (PPID). Isso é usado para identificar exclusivamente que tipo de dados está sendo trocado. O SCTP tem muitos PPIDs, mas o WebRTC está usando apenas os cinco seguintes:
- WebRTC DCEP (50) – Mensagens DCEP.
- String WebRTC (51) – Mensagens de String de Datachannel.
- Webrtc Binário (53) – Mensagens binárias de dados.
- String webrtc vazio (56) – Mensagens de string de dados com 0 comprimento.
- Webrtc Binário vazio (57) – Mensagens binárias de dados com 0 comprimento.
Protocolo #
A seguir, alguns dos pedaços usados pelo protocolo SCTP. Esta não é uma demonstração exaustiva. Isso fornece estruturas suficientes para a máquina de estado fazer sentido.
Cada pedaço começa com um campo de tipo. Antes de uma lista de pedaços, você também terá um cabeçalho.
Data Shunk #
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 | Reservado | u | B | e | Comprimento | +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+| Tsn | +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+| Identificador de fluxo | Número da sequência do fluxo | +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+| Identificador de protocolo de carga útil | +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+ \ \ / User Data / \ \ +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
O pedaço de dados é como todos os dados do usuário são trocados. Quando você envia qualquer coisa sobre o canal de dados, é assim que ele é trocado.
U bit está definido se este for um pacote não ordenado. Podemos ignorar o número da sequência do fluxo.
B e E são os bits iniciais e finais. Se você deseja enviar uma mensagem muito grande para um pedaço de dados, ele precisa ser fragmentado em vários pedaços de dados enviados em pacotes separados. Com os números B e E Bit e sequência, o SCTP é capaz de expressar isso.
- B = 1, e = 0 – Primeira peça de uma mensagem de usuário fragmentada.
- B = 0, e = 0 – peça do meio de uma mensagem de usuário fragmentada.
- B = 0, e = 1 – Última peça de uma mensagem de usuário fragmentada.
- B = 1, e = 1 – mensagem não sacmentada.
TSN é o número da sequência de transmissão. É o identificador exclusivo global para este pedaço de dados. Depois de 4.294.967.295 pedaços, isso vai se envolver para 0. O TSN é incrementado para cada pedaço em uma mensagem de usuário fragmentada para que o receptor saiba como ordenar os pedaços recebidos para reconstruir a mensagem original.
Identificador de fluxo é o identificador exclusivo para o fluxo que esses dados pertencem a.
O número da sequência do fluxo é um número de 16 bits incrementado a cada mensagem do usuário e incluído no cabeçalho da mensagem de mensagem de dados. Após 65535 mensagens, isso vai durar para 0. Este número é usado para decidir a ordem de mensagem de entrega ao receptor se u estiver definido como 0. Semelhante ao TSN, exceto que o número da sequência do fluxo é incrementado apenas para cada mensagem como um todo e nem cada pedaço de dados individual.
Identificador de protocolo de carga útil é o tipo de dados que está fluindo através deste fluxo. Para o WebRTC, vai ser DCEP, corda ou binário.
Dados do usuário é o que você está enviando. Todos os dados que você envia por meio de um canal de dados WebRTC é transmitido por meio de um pedaço de dados.
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 | Bandeiras de pedaços | Comprimento de pedaço | +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+| Iniciar tag | +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+| Crédito da janela do receptor anunciado (A_RWND) | +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+| Número de fluxos de saída | Número de fluxos de entrada | +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+| TSN inicial | +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+\ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ @ +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
O chunk init inicia o processo de criação de uma associação.
A tag de iniciação é usada para geração de biscoitos. Os cookies são usados para o homem no meio e a negação de proteção de serviço. Eles são descritos em mais detalhes na seção de máquina de estado.
O crédito da janela do receptor anunciado é usado para SCTP’s Controle de congestionamento. Isso comunica o tamanho de um buffer que o receptor alocou para esta associação.
O número de fluxos de saída/entrada notifica o controle remoto de quantos fluxos esse agente suporta.
O TSN inicial é um UINT32 aleatório para iniciar o TSN local em.
Parâmetros opcionais permitem que o SCTP apresente novos recursos no protocolo.
Sack Bunk #
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 | BANDS DE CHUNK | Comprimento de pedaço | +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+| TSN cumulativo ACK | +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+| Crédito da janela do receptor anunciado (A_RWND) | +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+| Número de bloqueios de gap ack = n | Número de TSNs duplicados = x | +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+| Bloco ACK GAP #1 Iniciar | Bloco ACK GAP #1 Fim | +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+ / / \ . \ / /+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+| Bloco ACK GAP #N Iniciar | Bloco ACK GAP #N END | +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+| TSN duplicado 1 | +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+ / / \ . \ / /+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+| Duplicado tsn x | +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
O saco (reconhecimento seletivo) Chunk é como um receptor notifica um remetente que recebeu um pacote. Até que um remetente receba um saco para um TSN, ele será lançado novamente o pedaço de dados em questão. Um saco faz mais do que apenas atualizar o TSN.
TSN cumulativo ack o TSN mais alto que foi recebido.
Tamanho do Bufer de Crédito da Janela do Receptor Anunciado. O receptor pode alterar isso durante a sessão se mais memória estiver disponível.
ACK bloqueia os TSNs que foram recebidos após o TSN acum . Isso é usado se houver uma lacuna em pacotes entregues. Deixar’S dizem que os dados com TSNs 100, 102, 103 e 104 são entregues. O TSN Cumulativo ACK seria 100, mas os blocos ACK poderiam ser usados para dizer ao remetente que não’T necessidade de reenviar 102, 103 ou 104 .
O TSN duplicado informa ao remetente que recebeu os seguintes pedaços de dados mais de uma vez.
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 = 4 | Bandeiras de pedaços | Comprimento de batimento cardíaco | +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+ \ \ / Heartbeat Information TLV (Variable-Length) / \ \ +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
O pedaço de batimento cardíaco é usado para afirmar que o controle remoto ainda está respondendo. Útil se você não estiver’t enviando qualquer pedaço de dados e precisa manter um mapeamento NAT aberto.
Abortar pedaços #
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 | Reservado | T | Comprimento | +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+ / / \ zero ou mais causas de erro \ / / / / / / / / / / / / / / /-+-+-+ / / \ Zero ou mais causas de erro \ / / / / / / / / / / / / / / / / / +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
Um pedaço de aborto abruptamente desliga a associação. Usado quando um lado entra em um estado de erro. Terminando graciosamente a conexão usa o pedaço de desligamento.
Shutdown 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 | Bandeiras de pedaços | Comprimento = 8 | +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+| TSN cumulativo ACK | +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
O pedaço de desligamento inicia um desligamento gracioso da associação SCTP. Cada agente informa o controle remoto do último TSN que ele enviou. Isso garante que nenhum pacotes seja perdido. Webrtc não’T Faça um desligamento gracioso da associação SCTP. Você precisa derrubar cada canal de dados para lidar com isso graciosamente.
TSN ack cumulativo é o último TSN que foi enviado. Cada lado sabe não terminar até receber o pedaço de dados com este TSN.
Erro de erro #
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 | Bandeiras de pedaços | Comprimento | +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+\ \ / um ou mais erro causas / \ \ \ \ \ \ +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
Um erro de erro é usado para notificar o agente SCTP remoto que ocorreu um erro não fatal.
ADICE
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 | Sinalizadores = 0x00 | Comprimento = variável | +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+| Novo TSN cumulativo | +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+| Stream-1 | Sequência de fluxo-1 | +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+ \ / / \ +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+ | Stream-n | Sequência de fluxo N | +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
O pedaço TSN para a frente move o TSN global para a frente. O SCTP faz isso, para que você possa pular alguns pacotes que você não’t Realtre -se com mais. Deixar’s Diga que você envia 10 11 12 13 14 15 e esses pacotes só são válidos se todos chegarem. Esses dados também são sensíveis em tempo real; portanto, se chegar tarde, não é’T útil.
Se você perder 12 e 13, não há razão para enviar 14 e 15 ! O SCTP usa o pedaço TSN para a frente para alcançar isso. Diz ao receptor que 14 e 15 ARM’vai ser entregue mais.
Novo TSN cumulativo Este é o novo TSN da conexão. Quaisquer pacotes antes que este TSN não seja retido.
Sequência de fluxo e fluxo são usados para pular o número do número da sequência do fluxo à frente. Consulte o pedaço de dados para o significado deste campo.
Máquina de estado #
Estas são algumas partes interessantes da máquina de estado SCTP. Webrtc não’t Utilize todos os recursos da máquina de estado SCTP, por isso excluímos essas partes. Também simplificamos alguns componentes para torná -los compreensíveis por conta própria.
Fluxo de estabelecimento de conexão #
O init e o init ack são usados para trocar as capacidades e configurações de cada par. O SCTP usa um cookie durante o aperto de mão para validar o par que está se comunicando. Isso é para garantir que o aperto de mão não seja interceptado e para evitar ataques de DOS.
O pedaço init ack contém o biscoito. O cookie é então devolvido ao seu criador usando o cookie eco . Se a verificação de biscoitos for bem -sucedida, o Cookie ACK será enviado e os pedaços de dados estão prontos para serem trocados.
Fluxo de desmontagem de conexão #
O SCTP usa o pedaço de desligamento. Quando um agente recebe um pedaço de desligamento, ele esperará até receber o TSN Cumulativo solicitado . Isso permite ao usuário garantir que todos os dados sejam entregues, mesmo que a conexão seja com perda.
Mecanismo de Keep-Alive #
O SCTP usa a solicitação de batimentos cardíacos e os pedaços de ACK de batimentos cardíacos para manter a conexão viva. Estes são enviados em um intervalo configurável. O SCTP também realiza um retorno exponencial se o pacote tiver’T chegou.
O pedaço de batimento cardíaco também contém um valor temporal. Isso permite que duas associações calculem o tempo de viagem entre dois agentes.