Operação

Tipos de mensagem

As mensagens RPL são um novo tipo de mensagem de controle do protocolo ICMPv6, cuja estrutura está retratada abaixo. O número 155 em tipo, especifica que o protocolo a ser utilizado será o RPL. Enquanto o RPL Type especifica a mensagem de controle que será utilizada. As mensagens de controle se dividem em 3, estando elas descritas nas seções seguintes.


DODAG Information Solicitation (DIS):

Um nó envia uma mensagem DIS para solicitar informações de roteamento de seus vizinhos. As informações solicitadas serão enviadas por um DIO que parte do nó RPL ao qual foram solicitadas as informações.

DODAG Information Object (DIO):

São as maiores responsáveis por toda formação da rede RPL. Levando informações como o rank do nó que envia a mensagem, a identificação da instância do DODAG e também a flag que indica o suporte a rotas downward (pacotes irem da internet para nós internos). São mensagens enviadas periodicamente visando manter a conectividade da rede.


Destination Advertisement Object (DAO):

As mensagens DAO são utilizadas quando a rede, mais especificamente a instância do DODAG, deseja suportar rotas downward, sendo essas criadas a partir do envio do DAO até a raiz do DODAG ou, num outro caso, para cada nó intermediário.


Construção do DODAG

A construção do DODAG começa pelo nó raiz, que envia mensagens DIO (Destination Oriented DAG Object) para todos os nós que estão ao seu alcance. Essas mensagens contêm informações sobre a identificação do DODAG que vai ser formado (DODAGID), assim como o rank do nó raiz e a função objetivo que será utilizada para o cálculo do rank.

Caso um nó que deseja participar do DODAG receba a mensagem DIO pela primeira vez, ele irá adicionar o emissor daquela mensagem à sua lista de pais, computar o rank de acordo com a função objetivo escolhida pelo nó raiz e, por fim, enviar a mensagem DIO com as informações de rank atualizadas.

Para finalizar o processo, se a flag indicando o suporte a rotas para baixo estiver ativo, cada nó filho deve enviar até o nó raiz um DAO (Destination Advertisement Object) que, ao passar por todos os nós intermediários, informa-os da sua existência (do nó filho). Permitindo que estes (nós intermediários), a partir do preenchimento de suas tabelas, sejam capazes de transmitirem pacotes para direção inferior do DODAG.

Num último cenário, caso o nó que receba a mensagem já esteja associado àquele DODAG, ele pode prosseguir de 2 maneiras:

1. Descarta a mensagem;

2. Processa a mensagem e, caso consiga diminuir o valor do seu rank, ele adiciona o emissor a lista de pais (caso este não esteja) e descarta os nós com valor de rank maior que o seu (evitando loops).


Prevenção de loops

Assim como em todo protocolo que utiliza vetores-distância, a formação de loops pode vir a ser um problema no RPL. Para superar isso, o RPL se baseia em mecanismos que utilizem o rank e o caminho que os dados estão tomando para evitar e detectar loops.

Enviando Vetores-Distância envenenados

Uma das técnicas mais simples de se evitar um loop é o envio de vetores distância nos quais o rank passa a ser infinito. Esse envio deve ocorrer sempre que um nó se desconecta do DODAG e deseja informar aos seus filhos a respeito dessa desconexão. Entretanto, caso a mensagem com o rank infinito seja perdida, um loop poderá ser formado, podendo ser ainda detectado pelo mecanismo na seção abaixo.

Limitando o rank após desconexão dos pais


Uma dessas formas se baseia no controle do rank de um nó. Limitando o rank máximo que um nó pode adquirir após perder a conexão com todos os seus pais é uma medida que não impede a formação de loops mas evita o problema de contagem até o infinito.

Para exemplificar o mecanismo, imaginemos que, na imagem acima, o nó 15 perde a conexão com o seu único pai (o nó raiz). Após a desconexão, ele recebe um novo DIO, enviado pelo nó 13, e desejando se conectar ao DODAG, calcula seu novo rank que, supondo, seja 4. Entretanto, percebemos que esta nova configuração cria um loop entre os nós 15 -> 13 -> 14 -> 15.

A forma de tratar este problema é, levando em conta o antigo rank do nó 15 (1, quando ligado a raiz), limitemos o próximo rank que o nó poderá ter em:

Max_rank = antigo_rank + Aumento_max_rank

Onde o aumento_max_rank limita o rank máximo de 15.

Na situação acima, caso o aumento_max_rank seja 6, o rank máximo que o nó 15 poderá assumir é 7. Sendo assim, após o envio de alguns DIO o nó 15 irá aumentar seu rank, já que 13 irá aumentar com o aumento de 14, até certo ponto em que ele irá ultrapassar o valor 7. Fazendo com que o nó 13 seja descartado da lista de pais do 15.

Utilizando o caminho dos pacotes

Outra forma de detecção de loops é através das informações de controle transportadas pelo pacote de dados. A principal diferença desse mecanismo para os outros citados é que, além do rank, utiliza-se também para a detecção a flag que representa a direção que o pacote deve seguir.

Utilizando como exemplo a imagem da seção anterior, caso um pacote de dados transmitido por 14 (na direção de subida, upward) chegasse em 13, ele detectaria que aquele pacote não deveria ter chegado nele. A condição abaixo exemplifica a tomada de decisão em 13:

Se Rank(13) > Rank(14) e Pacote(Upward): Possível loop