54 votes

Pourquoi un serveur n'enverrait-il pas un paquet SYN/ACK en réponse à un paquet SYN ?

Récemment, nous avons été informés d'un problème de connexion TCP qui se limite principalement aux utilisateurs de Mac et de Linux qui naviguent sur nos sites web.

Du point de vue de l'utilisateur, cela se traduit par un temps de connexion très long à nos sites web (>11 secondes).

Nous avons réussi à identifier la signature technique de ce problème, mais nous n'arrivons pas à comprendre pourquoi il se produit ni comment le résoudre.

En fait, la machine du client envoie le paquet SYN pour établir la connexion TCP et le serveur web le reçoit, mais ne répond pas avec le paquet SYN/ACK. Après que le client a envoyé de nombreux paquets SYN, le serveur répond finalement par un paquet SYN/ACK et tout se passe bien pour le reste de la connexion.

Et, bien sûr, le nœud du problème : il est intermittent et ne se produit pas tout le temps (bien qu'il se produise entre 10 et 30 % du temps).

Nous utilisons Fedora 12 Linux comme système d'exploitation et Nginx comme serveur web.

Capture d'écran de l'analyse wireshark

Screenshot of wireshark analysis

Mise à jour :

La désactivation de la mise à l'échelle des fenêtres sur le client a empêché le problème de se produire. Il ne me reste plus qu'à trouver une solution côté serveur (nous ne pouvons pas obliger tous les clients à le faire) :)

Dernière mise à jour :

La solution a consisté à désactiver les deux Mise à l'échelle de la fenêtre TCP et Horodatage TCP sur nos serveurs accessibles au public.

17voto

mcdizzle Points 281

Nous avons eu exactement le même problème. La simple désactivation des horodatages TCP a résolu le problème.

sysctl -w net.ipv4.tcp_timestamps=0

Pour rendre cette modification permanente, faites une entrée dans le fichier /etc/sysctl.conf .

Soyez très prudent lorsque vous désactivez l'option TCP Window Scale. Cette option l'option est importante pour offrir des performances maximales sur l'internet. Une personne disposant d'une connexion de 10 mégabits/seconde aura un transfert sous-optimal si la connexion de l'internet est de 10 mégabits/seconde. durée du voyage aller-retour (identique au ping) est supérieur à 55 ms.

Nous avons vraiment remarqué ce problème lorsqu'il y avait plusieurs appareils derrière le même NAT. Je soupçonne le serveur d'avoir été confus en voyant les horodatages des appareils Android et des machines OSX en même temps, car ils ont mis des valeurs complètement différentes dans les champs d'horodatage.

16voto

lav Points 341

Dans mon cas, la commande suivante a permis de résoudre le problème des réponses SYN/ACK manquantes du serveur Linux :

sysctl -w net.ipv4.tcp_tw_recycle=0

Je pense que c'est plus correct que de désactiver les horodatages TCP, car les horodatages TCP sont utiles pour haute performance (PAWS, mise à l'échelle des fenêtres, etc.).

La documentation sur le tcp_tw_recycle indique explicitement qu'il n'est pas recommandé de l'activer, car de nombreux routeurs NAT conservent les horodatages et les PAWS interviennent donc, car les horodatages provenant de la même adresse IP ne sont pas cohérents.

   tcp_tw_recycle (Boolean; default: disabled; since Linux 2.4)
          Enable fast recycling of TIME_WAIT sockets.  Enabling this
          option is not recommended for devices communicating with the
          general Internet or using NAT (Network Address Translation).
          Since some NAT gateways pass through IP timestamp values, one
          IP can appear to have non-increasing timestamps.  See RFC 1323
          (PAWS), RFC 6191.

4voto

Alex Li Points 41

Nous venons de rencontrer exactement le même problème (il nous a fallu un certain temps pour déterminer que le serveur n'envoyait pas de syn-ack).

"La solution a consisté à désactiver les fonctions tcp Windows scaling et tcp timestamps sur nos serveurs accessibles au public".

3voto

lstg Points 29

L'absence de SYN/ACK peut être due à des limites trop basses de votre protection SYNFLOOD sur le pare-feu. Cela dépend du nombre de connexions que l'utilisateur crée sur votre serveur. L'utilisation de spdy réduirait le nombre de connexions et pourrait aider dans les cas où l'activation de la protection SYNFLOOD est nécessaire. net.ipv4.tcp_timestamps n'aide pas.

2voto

joeqwerty Points 106914

Pour poursuivre ce qu'Ansis a dit, j'ai vu des problèmes de ce type lorsque le pare-feu ne prend pas en charge le TCP Windows Scaling. Quelle marque/modèle de pare-feu se trouve entre ces deux hôtes ?

SistemesEz.com

SystemesEZ est une communauté de sysadmins où vous pouvez résoudre vos problèmes et vos doutes. Vous pouvez consulter les questions des autres sysadmins, poser vos propres questions ou résoudre celles des autres.

Powered by:

X