BGP n'utilise pas TCP keepalive, il utilise son propre mécanisme keepalive. Ma question est pourquoi bgp ne peut-il pas activer SO_KEEPaLIVE de TCP et vivre heureux? pourquoi n'utilise-t-il pas tcp keepalive et n'implémente pas son propre keepalive?
TCP "keepalive" est une fonctionnalité qui n'est pas présente sur tous les systèmes d'exploitation. Ce n'est pas dans la norme TCP elle-même et ce n'est pas fiable. RC1122 le spécifie, mais déclare explicitement:
Les implémenteurs PEUVENT inclure des "Keep-Alives" dans leurs implémentations TCP, bien que cette pratique ne soit pas universellement acceptée. Si des connexions persistantes sont incluses, l'application DOIT être en mesure de les activer ou de les désactiver pour chaque connexion TCP, et elles DOIVENT être désactivées par défaut.
Encore plus important:
Il est extrêmement important de se rappeler que les segments ACK qui ne contiennent aucune donnée ne sont pas transmis de manière fiable par TCP. Par conséquent, si un mécanisme de maintien en vie est implémenté, il NE DOIT PAS interpréter l'échec de réponse à une sonde spécifique comme une connexion morte.
TCP keepalive utilise le protocole TCP d'une manière spéciale, en envoyant un ACK en double sans données attachées. La chose est: vous ne pouvez pas compter sur sa disponibilité. Certains pare-feu filtrent également les keepalives TCP.
Pour que BGP fonctionne correctement, vous avez besoin d'un moyen d'implémenter des temporisateurs spécifiques pour keepalive (à quelle fréquence envoyons-nous un message) et hold (après quoi déclarons-nous un homologue non réactif) qui sont envoyés de manière fiable . BGP utilise donc son propre message keepalive qui ne représente pas beaucoup de surcharge (19 octets) par rapport à TCP keepalive.