# Border Gateway Protocol

O BGP [RFCs 1771,1772,1773,1774,1657] é um protocolo de roteamento entre sistemas autônomos (ASs), criado para uso nos roteadores principais da Internet.
O BGP foi projetado para evitar laços de roteamento em topologias arbitrárias, o mais sério problema de seu antecessor, o EGP (Exterior Gateway Protocol). Outro problema que o EGP não resolve - e é abordado pelo BGP - é o do Roteamento Baseado em Política (policy-based routing), um roteamento com base em um conjunto de regras não técnicas, definidas pelos Sistemas Autônomos. Sendo assim, o BGP melhora o EGP.

## Descrição detalhada

A função primária de um sistema BGP é trocar informação de acesso à rede, inclusive informação sobre a lista das trajetórias dos ASs, com outros sistemas BGP. Esta informação pode ser usada para construir um gráfico da conectividade dos ASs a partir do qual laços de roteamento podem ser detectados e reforçadas as políticas de decisão com outros ASs.
Quando um roteador se conecta à rede pela primeira vez, os roteadores BGP trocam suas tabelas de rotas completas. De maneira similar, quando a tabela de rotas muda, roteadores enviam a parte da tabela que mudou. Roteadores BGP não enviam regularmente atualizações de roteamento planejadas e as atualizações de rotas informam somente a trajetória ótima para uma rede.
BGP usa uma única métrica para determinar a melhor trajetória para uma dada rede. Esta métrica consiste de número arbitrário que especifica o grau de preferência de um enlace em particular e é atribuído pelo administrador da rede. Este número pode ser baseado em qualquer critério: número de ASs que a trajetória cruza, estabilidade, velocidade, retardo ou custo. Os 4 tipos de mensagens BGP são:
1. Abertura (open message) – abre uma sessão de comunicação entre BGP pares (peers) e é a primeira mensagem enviada de cada lado depois que uma conexão de protocolo de transporte é estabelecida; essa mensagem é confirmada usando uma mensagem de keep-alive enviada pelo roteador par e tem que ser confirmada antes das atualizações, notificações e outras mensagens de keep-alive.
2. Atualização (update message) – é usada para informar atualizações de rotas para outros sistemas BGP, permitindo que os roteadores possam construir uma visão consistente da topologia da rede, usando o TCP para garantir uma entrega confiável; essas mensagens podem retirar rotas inviáveis (unfeasible routes) da tabela de roteamento e simultaneamente informar uma nova rota.
3. Notificação (notification message) – é enviada quando uma condição de erro é detectada; elas são usadas para encerrar uma sessão ativa e informar a quaisquer roteadores conectados do porquê do encerramento da sessão.
4. Keep-alive – notifica aos roteadores BGP pares que um dispositivo está ativo.

### Formatos do pacote

1. Cabeçalho – todos os tipos de mensagens usam o cabeçalho básico mais alguns campos adicionais, exceto a mensagem Keep-alive que usa somente o cabeçalho básico; seus campos são:
* Marcador (Marker) – contém um valor de autenticação que o recebedor pode verificar.
* Comprimento (Length) – indica o comprimento total da mensagem em bytes.
* Tipo (Type) – especifica o tipo de mensagem.
* Dados (Data) – opcional, contém informação das camadas superiores.
2. Abertura –fornece o critério de troca para que dois roteadores BGP estabeleçam uma relação par (peer relationship); seus campos são:
* Versão (Version) – informa o número da versão do protocolo BGP.
* Sistema Autônomo (Autonomous System - AS)– número do AS do enviador.
* Hold-time – indica o número máximo de segundos que podem decorrer, sem receber uma mensagem, antes que o transmissor seja assumido como não funcional.
* Identificador do BGP (BGP Identifier) – fornece um identificador BGP do transmissor (endereço IP) determinado na inicialização sendo idêntico para todas as interfaces locais e para todos os BGPs pares.
* Comprimento dos parâmetros opcionais (Optional Parameters Length) – indica o comprimento do campo opcional de parâmetros (se existir).
* Parâmetros opcionais (Optional Parameters) – contém uma lista dos parâmetros opcionais (se existir); atualmente somente um tipo está definido: informação de autenticação.
3. Atualização – ao receberem um pacote de mensagem de atualização, os roteadores estarão aptos a adicionar ou excluir entradas específicas de suas tabelas de roteamento; seus campos são:
* Comprimento das Rotas Inviáveis (Unfeasible Routes Length) – indica o comprimento total do campo de retirada de rotas ou indica que o campo não está presente.
* Retirada de Rotas (Withdrawn Routes) – contém a lista dos prefixos dos endereços IP para as rotas que estão sendo retiradas de serviço.
* Comprimento total dos atributos de trajetória (Total Path Attribute Length) – indica o comprimento total do campo de atributos da trajetória ou que indica que o campo não está presente.
* Atributos da Trajetória (Path Attributes) – descreve as características da trajetória informada.
* Informação de Acessibilidade da Camada de Rede (Network Layer Reachability Information) – contém a lista de prefixos dos endereços IP para as rotas informadas.
4. Notificação – este pacote é usado para indicar algum tipo de condição de erro para os pares do roteador de origem; seus campos são:
* Código de Erro (Error Code) – indica o tipo de erro que ocorreu.
* Sub-código de Erro (Error Subcode)– fornece informação mais específica sobre a natureza do erro informado.
* Dados do Erro (Error Data) – contém os dados baseados no código de erro e campos de sub-código de erro; este campo é usado para diagnosticar a causa para a mensagem de notificação.

### Formato do cabeçalho

Cada pacote BGP contém um cabeçalho cujo principal propósito é identificar a função do pacote em questão. As seguintes descrições resume a função de cada campo do cabeçalho BGP.
* Marcador (16 bytes) – Contém um valor de autenticação que o destinatário da mensagem poderá prever.
* Comprimento (2 bytes)– Indica o comprimento total da mensagem em bytes.
* Tipo (1 byte) – Especifica o tipo de mensagem desnecessária,como um dos seguintes:
** Abrir;
** Atualizar;
** Notificação;
** Keep Alive (Manter vivo)
* Dados (tamanho variável) – Contém informações da camada superior nesse campo opcional.
A última versão do BGP, o BGP4, foi projetada para suportar os problemas causados pelo grande crescimento da Internet.

## Tópicos relacionados

* OSPF
* RIP
* Traceroute
* Ping
* WHOIS