O Datagram Congestion Control Protocol, desde 2006, é um padrão proposto na Internet Engineering Task Force - IETF; esse, seguindo os requisitos apontados na seção 2.3, tem como proposta a versatilidade no que diz respeito às aplicações multimídia. Sendo um protocolo pensado para a modalidade real-time, o DCCP não possui garantias de entrega confiável. Sua principal característica é a possibilidade de oferecimento de mais de uma opção de controle de congestionamento.
Nas próximas sub-seções, o protocolo é descrito com mais detalhes.
Os protocolo DCCP possui, por padrão, dez tipos de pacotes: DCCP-Request, DCCP-Response, DCCP-Data, DCCP-Ack, DCCP-DataAck, DCCP-CloseReq, DCCP-Close, DCCP-Reset, DCCP-Sync e DCCP-SyncAck.
Todo pacote que desempenha funções do DCCP é acompanhado de um cabeçalho genérico. A Figura 1 mostra a representação dos pacotes.
Figura 1
O cabeçalho genérico do DCCP, Figura 2, possui tamanho variável, dependendo do valor do campo X.
Figura 2 -Source and Destination port - 16 bits cada campo: expressos os valores das portas de remetente e da porta de destino;
-Data Offset - 8 bits: tamanho do cabeçalho do pacote;
-CCVal - 4 bits: especifica o código do tipo de controle de congestionamento usado;
-CsCov - 4 bit: informa qual parte do pacote vai ser checada pelo algoritmo de Checksum, permitindo a tolerância à corrupção de dados;
-Checksum - 16 bits: Soma de verificação do pacote;
-Res - 3 bits: campo reservado;
-Type - 4 bits: especifica o tipo do pacote;
-X - 1 bit: Especifica o tamanho dos números de sequência usados nos pacotes. Quando X=1, Sequence Number possui 48 bits, quando X=0, 24 bits;
-Sequence Number - 24 ou 48 bits: número de sequência dos pacotes. Acrescido de um por pacote;
-Acknowledgement Number - 24 ou 48 bits: expressa o maior número de sequência recebido por um pacote acknowledgement - Ack.
Pacote usado pelo cliente na inicialização da conexão. Imagem abaixo (Figura 3). Os pacote deve usar o campo X com o valor 1.
Figura 3 -Service Code - 32 bits: informa o tipo de aplicação que deseja realizar a conexão.
Resposta do servidor ao pacote de tipo DCCP-Request. O pacote deve usar o campo X com o valor 1.
Figura 4
O pacote DCCP-Data carrega os dados transferidos.
Figura 5
Os pacotes DCCP-Ack e DCCP-DataAck são usados para acknowledgements, sendo que o segundo transporta, também, dados. Os pacotes podem possuir opções.
Figura 6
Pacotes participam do fechamento da conexão. Cliente e servidor podem enviar pacotes DCCP-Close, mas apenas o esse pode enviar requisições de encerramento DCCP-CloseReq. Os pacotes devem usar o campo X com o valor 1.
Figura 7
Pacote termina a conexão. O pacote deve usar o campo X com o valor 1.
Figura 8
-Reset Code - 8 bits: motivo do encerramento da conexão.
Figura 9
-Data 1, 2 e 3 - 8 bits cada: informação adicional sobre encerramento.
-Application Data Error: Descrição, em linguagem legível, de erros ocorridos.
Pacotes auxiliam na recuperação de sincronização após perdas sucessivas de pacotes. Os pacotes devem usar o campo X com o valor 1.
Figura 10
Qualquer pacote DCCP pode conter opções. Cada opção tem como tamanho múltiplos de 8 bits e opções do tipo Padding devem ser utilizadas para preencher o espaço até o fim do campo.
Figura 11
Geralmente no início das conexões, o cliente e o servidor negociam os parâmetros que serão utilizados durante sua comunicação. As opções 32-35, na Figura 11, expressam as opções usadas pelos pacotes para a realização da tarefa: as opções Change iniciam a negociação, as Confirm realizam o término; opções L são enviadas por quem inicia a negociação, e opções R, para quem é solicitada a mudança. Pacotes com opções de negociação são retransmitidos.
Nas negociações, são especificados o tipo de parâmetro que é desejada a mudança e a ordem de preferência daquela estação para aquele campo. “Change L(CCID, 3 2)” deseja a mudança do parâmetro CCID, e a ordem de preferência é expressa após a vírgula; “Confirm R(CCID, 3, 3 2)” diz a confirmação da segunda estação, confirmando o parâmetro 3 e expressando sua ordem de preferência.
O DCCP é um protocolo unicast com troca de mensagens bidirecional: é possível a troca de dados por ambas as partes comunicantes. Sua conexão é realizada por duas conexões unidirecionais separadas, chamadas de meia-conexões, que são definidas como dados sendo enviados por uma estação, e o ACK correspondente respondido pela outra parte. Sua inicialização é feita por um three-way handshake.
A conexão é caracterizada por estados e uma sequência de pacotes bem definidos. A Figura 12 mostra um exemplo, especificando os estados de conexão.
Figura 12
-CLOSED: não há conexão;
-LISTEN: estação em estado passivo;
-REQUEST: cliente entra nesse estado após o envio de um pacote tipo DCCP-Request;
-RESPOND: servidor entra nesse estado após o recebimento de um pacote do tipo DCCP-Request;
-PARTOPEN: terceira parte do three-way handshake. Cliente entra nesse estado após o recebimento de um pacote do tipo DCCP-Response;
-OPEN: estado central de troca de dados;
-CLOSEREQ: servidor entra nesse estado quando faz requisita o término da conexão;
-CLOSING: servidor e cliente entram nesse estado para fechar a conexão;
-TIMEWAIT: cliente e servidor entram nesse estado após o término da conexão por determinado tempo, para evitar a entrega de pacotes antigos.