Question (Pourquoi) FreeBSD 'net.inet.tcp.always_keepalive' viole-t-il le RFC1122?


Alors que je travaillais sur une application serveur fonctionnant sous FreeBSD et utilisant TCP, j’ai remarqué que les sondes keepalive TCP envoyé même si mon application désactive explicitement SO_KEEPALIVE sur les sockets TCP.

Selon RFC1122 section 4.2.3.6 (TCP Keep-Alives):

"Si les Keep-Alives sont inclus, l'application DOIT pouvoir activer   activés ou désactivés pour chaque connexion TCP, et ils DOIVENT être désactivés par défaut. "

J'ai trouvé que le paramètre ajustable net.inet.tcp.always_keepalive avait été activé (défini sur 1) et que sa désactivation empêcherait l'envoi des sondes keepalive.

Quel est le raisonnement derrière l'inclusion de ce comportement dans FreeBSD? D'après ce que je peux dire, Linux et Windows ne disposent pas d'une telle option, contrairement à FreeBSD et Mac OS X, ils violent donc le RFC.

Pour être plus précis, dans quelles circonstances aurait-il un sens d'ignorer les souhaits de l'application?

C'est une solution simple dans mon cas, car je peux désactiver l'option, mais j'aimerais comprendre pourquoi elle est là.

Cette question montre que Linux se comporte conformément à la RFC.


5
2018-02-26 17:56


origine




Réponses:


La justification pour activer Keep-Alive par défaut a été donnée ici: https://svnweb.freebsd.org/base?view=revision&revision=47752

Ajouter un handle pour contrôler les keepalives TCP globaux et les activer comme   défaut.

Malgré leur nom, il ne maintient pas les sessions TCP en vie, il les tue   si l'autre extrémité a disparu. Cela arrive souvent avec les clients qui   utiliser NAT, attribution IP dynamique ou qui a un 2 ^ 32   * 10 ^ -3 secondes la limite supérieure de leur temps de disponibilité.

Il n’ya pas d’augmentation détectable du trafic réseau pour cette raison: deux   paquets TCP minimaux toutes les deux heures pour une connexion TCP en direct.

De nombreux serveurs activent déjà eux-mêmes la conservation.

La configuration requise pour l'hôte RFC a 10 ans et ne connaît pas le   perdre des clients de nos jours Internet.

Quoi qu'il en soit, il est préférable de désactiver le maintien en vie si demandé par l'application, par exemple (en C):

int val = 0;
setsockopt(s, SOL_SOCKET, SO_KEEPALIVE, &val, sizeof(val));

mais ce n'est pas facile à résoudre.


6
2018-02-26 20:24



Je ne suis pas sûr de comprendre la raison d'être de ce message de validation et de convenir qu'il est préférable de faire ce que demande l'application. Comme vous le dites, il ne serait pas facile de résoudre ce problème car de nombreuses configurations de serveur existantes reposent probablement sur le comportement actuel. - Ross Kilgariff
Pour référence, j'ai trouvé le message de validation d'origine pour le sysctl. - Ross Kilgariff


Je pense que le bouton de réglage devrait exister mais peut-être était-il préférable de le désactiver par défaut.

Mon raisonnement est le suivant: un développeur d’applications peut prendre de telles décisions erronées et, au bout du compte, un administrateur système devrait pouvoir contrôler ce type de stratégie réseau et non le développeur d’applications.


0
2018-04-17 00:41



Je ne comprends pas cette réponse ... - Pierre.Vriens