O Protocolo DCCP

Formato dos pacotes

O cabeçalho do protocolo DCCP tem no mínimo 12 e no máximo 1200 bytes. A parte inicial do cabeçalho carrega a mesma semântica para todos os tipos de pacotes conhecidos atualmente. Depois vem o campo adicional que depende do tipo de pacote e, depois, um campo opcional para opções, finalizando o cabeçalho do DCCP. Por último, seguindo o cabeçalho, tem o application data area, onde ficam os dados da aplicação, a depender do tipo de pacote.

Protocolo DCCP. A parte em cinza é o cabeçalho do protocolo.

Cabeçalho genérico
Campos adicionais (a depender do tipo de pacote)
Opções (opcional)
Application data area (a depender do tipo de pacote)

Cabeçalho genérico

O cabeçalho genérico DCCP toma diferentes formas dependendo do valor de X, que é o bit de número de sequência estendido. Para X = 1, o campo do número de sequência tem 48 bits de comprimento e o cabeçalho genérico ocupa 16 bytes.

Source port Dest port
Data offset CCVal CsCov Checksum
Res Type X = 1 Reserved Sequence Number (high bits)
Source port Dest port
Sequence Number (low bits)

Se X = 0, apenas os 24 bits menos significativos do número de sequência são transmitidos. O cabeçalho genérico terá 12 bytes de comprimento.

Source port Dest port
Data offset CCVal CsCov Checksum
Res Type X = 0 Reserved Sequence Number (low bits)

Source port e Dest port - 16 bits cada - Esses campos identificam a conexão, de maneira similar aos campos de TCP e UDP correspondentes. Ao iniciar uma conexão, o client deve escolher a Source port de maneira aleatória para reduzir a possibilidade de ataque.

Data offset - 8 bits - Esse é o offset do início do cabeçalho do pacote DCCP até o início do application data area desse pacote, em palavras de 32 bits. O receptor deve ignorar pacotes com offset menor do que o tamanho mínimo de cabeçalho para o tipo de pacote, ou maior que o próprio pacote.

CCVal - 4 bits - Especifica o código do tipo de controle de congestionamento a ser 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 - Algoritmo de soma de verificação do pacote. Res - 3 bits - quem envia deve colocar esse campo todo em zero em pacotes gerados e quem recebe deve ignorar esse campo.

Type - 4 bits - especifica o tipo do pacote.

Sequence Number - 24 ou 48 bits - Identifica de forma única um pacote na sequência de todos os pacotes enviados pela source em dada conexão.



Todos os tipos de pacotes DCCP definidos atualmente (exceto DCCP-Request e Data) possuem um Acknowledgement Number Subheader ocupando os 4 ou 8 bytes que seguem o cabeçalho genérico.

Se X = 1

Reserved Acknowledgement Number (high bits)
Acknowledgement Number (low bits)

Se X = 0

Reserved Acknowledgement Number (low bits)

Reserved - 16 ou 8 bits - quem envia deve colocar esse campo todo em zero em pacotes gerados e quem recebe deve ignorar esse campo.

Acknowledgement Number - 48 or 24 bits - Contém o maior número de sequência recebido (e processado com sucesso até o fim) em qualquer pacote até o momento.

Tipos de Pacote

Campo Type no cabeçalho genérico Tipo de pacote correspondente
0 DCCP-Request
1 DCCP-Response
2 DCCP-Data
3 DCCP-Ack
4 DCCP-DataAck
5 DCCP-CloseReq
6 DCCP-Close
7 DCCP-Reset
8 DCCP-Sync
9 DCCP-SyncAck
10-15 Reserved

DCCP-Request

Resposta do servidor ao pacote DCCP-Request, com X = 1.

Cabeçalho DCCP genérico
Service code
Opções e padding
Application data area

Service code - 32 bits - informa o tipo de aplicação com a qual se deseja fazer a conexão.

DCCP-Response

Pacote utilizado pelo cliente na inicialização da conexão, com X = 1.

Cabeçalho DCCP genérico
Subcabeçalho de número acknowledgement
Service code
Opções e padding
Application data area

Service code - 32 bits - informa o tipo de aplicação com a qual se deseja fazer a conexão.

Subcabeçalho de número acknowledgement - 48 bits - Os DCCP-Responses são sempre enviados durante a inicialização de conexão, portanto esse campo sempre será igual ao número de sequência num Request recebido.

DCCP-Data

Pacote que carrega os dados transferidos.

Cabeçalho DCCP genérico
Opções e padding
Application data area

DCCP-Ack e DCCP-DataAck

São utilizados para mensagens de acknowledgment. DataAck também transporta dados.

Cabeçalho DCCP genérico
Subcabeçalho de número acknowledgement
Opções e padding
Application data area

DCCP-CloseReq e DCCP-Close

Participam do encerramento da conexão. Tanto cliente quanto servidor pode enviar pacotes Close, mas apenas o servidor pode enviar CloseReq. Com X = 1.

Cabeçalho DCCP genérico
Subcabeçalho de número acknowledgement
Opções e padding
Application data area

DCCP-Reset

Esse pacote encerra a conexão, com X = 1.

Cabeçalho DCCP genérico
Subcabeçalho de número acknowledgement
Reset code Dado 1 Dado 2 Dado 3
Opções e padding
Application data area (error text)

Reset code - 48 bits - Motivo pelo qual a conexão foi encerrada.

Dados 1, 2 e 3 - 8 bits cada - Informação adicional sobre o motivo de encerramento.

Application data area (error text) - 48 bits - Log de descrição dos erros.

Reset code Nome
0 Não especificado
1 Closed
2 Aborted
3 Sem conexão
4 Erro de pacote
5 Erro de opção
6 Mandatory error
7 Connection refused
8 Bad service code
9 Too busy
10 Bad init cookie
11 Aggression penalty
12-127 Reserved
128-255 Códigos específicos CCID

DCCP-Sync e DCCP-SyncAck

Pacotes auxiliam endpoints DCCP na recuperação de sincronização após várias perdas de pacotes. Com X = 1.

Cabeçalho DCCP genérico
Subcabeçalho de número de acknowledgement
Opções e padding
Application data area

Conexão DCCP

O DCCP é um protocolo unicast com transferência de dados por parte de cliente e servidor. A conexão do DCCP é realizada por meio de duas conexões unidirecionais separadas, as meia-conexões. As meia-conexões são definidas como dados que são enviados por uma estação e a resposta ACK da outra parte.

A conexão é caracterizada por estado, como ilustrado na tabela abaixo.

Cliente Servidor
Sem conexão
CLOSED LISTEN
Inicialização
REQUEST DCCP-Request -> RESPOND
<- DCCP-Response
PARTOPEN DCCP-Ack/DataAck ->
Transferência de dados
OPEN <- DCCP-Data, Ack, DataAck -> OPEN
Finalização
CLOSING <- DCCP-CloseReq CLOSEREQ




CLOSED
DCCP-Close ->
<- DCCP-Reset
TIMEWAIT
CLOSED