Pour les simulations de catastrophe du réseau de notre environnement de serveur, nous recherchons un moyen d'expiration intentionnelle d'un socket TCP. Existe-t-il des moyens simples pour les sockets existants? De plus, un petit programme de test C serait un plus.
Nous avons déjà essayé de désactiver les interfaces réseau pendant la lecture du tampon TCP et la lecture à partir de ressources montées déconnectées (samba).
Notre serveur de test est Ubuntu 12.04.4.
/proc/sys/net/ipv4/tcp_keepalive_time
pour un très petit nombrencat -v
pour voir ce qui se passe exactementncat
. Il m'a fallu 2m7.291s sur une installation Ubuntu 12.04 vanille pour expirerLa première réponse est correcte, mais j'ai découvert comment ces délais d'attente fonctionnent, vous pouvez donc les observer et les tester (n'oubliez pas de bloquer le port!).
Il existe 4 paramètres de noyau les plus intéressants qui traitent des délais d'expiration TCP:
Maintenant, il y a 2 scénarios:
Le socket est ouvert et essaie de transmettre - puis (s'il n'y a pas de réponse de l'autre côté), le système réessaye
tcp_retries2
fois. Avec la valeur par défaut de retires, cela prend quelque part plus de 2 minutes et le socket expire.Le socket est ouvert et inactif - alors les limites de keepalive sont intéressantes. Avec un système de socket inactif, il faudra attendre
tcp_keepalive_time
quelques secondes, puis essayertcp_keepalive_probes
d'envoyer un KEEPALIVE TCP par intervalles detcp_keepalive_intvl
secondes. Et seulement après que tout échoue, le socket expire.la source
netstat -o