O BGP não usa o keepalive TCP, ele usa seu próprio mecanismo de keepalive. Minha pergunta é por que o bgp não pode ativar o SO_KEEPaLIVE do TCP e viver feliz? por que ele não usa o tcp keepalive e implementa seu próprio keepalive?
O TCP "keepalive" é um recurso que não está presente em todos os sistemas operacionais. Não está no próprio padrão TCP e não é confiável. O RC1122 o especifica, mas afirma explicitamente:
Os implementadores PODEM incluir "manter-vivos" em suas implementações de TCP, embora essa prática não seja universalmente aceita. Se keep-alives estão incluídos, o aplicativo DEVE ser capaz de ativá-los ou desativá-los para cada conexão TCP, e eles DEVEM desativar como padrão.
Ainda mais importante:
É extremamente importante lembrar que os segmentos ACK que não contêm dados não são transmitidos com segurança pelo TCP. Conseqüentemente, se um mecanismo keep-alive for implementado, NÃO DEVE interpretar a falha em responder a qualquer investigação específica como uma conexão morta.
O keepalive do TCP usa o protocolo TCP de uma maneira especial, enviando um ACK duplicado sem dados anexados. A coisa é: você não pode contar com a disponibilidade. Alguns firewalls também filtram os keepalives do TCP.
Para que o BGP funcione corretamente, você precisa de uma maneira de implementar temporizadores específicos para keepalive (com que frequência enviamos uma mensagem) e hold (após o qual declaramos que um par não responde) que são enviados com confiabilidade . Portanto, o BGP está usando sua própria mensagem de manutenção de atividade, que não apresenta muita sobrecarga (19 bytes) em comparação com a manutenção de atividade TCP.