web-dev-qa-db-fra.com

Définissez TCP_QUICKACK et TCP_NODELAY

Si vous définissez le paramètre TCP_QUICKACK sur chaque appel sur le socket, après avoir défini TCP_NODELAY, l'option QUICKACK écrasera-t-elle l'appel NODELAY?

À la connexion:

int i = 1;
setsockopt( iSock, IPPROTO_TCP, TCP_NODELAY, (void *)&i, sizeof(i));

A chaque écriture:

int i = 1;
setsockopt( iSock, IPPROTO_TCP, TCP_QUICKACK, (void *)&i, sizeof(i));

L'appel à TCP_QUICKACK annulera-t-il l'appel précédent à TCP_NODELAY?

21
donalmg

Il n'y a pas de relation directe entre ces deux options, elles sont juste à des fins différentes.

TCP_NODELAY est destiné à désactiver/activer la mise en mémoire tampon des segments afin que les données puissent être envoyées au pair aussi rapidement que possible, donc cela est généralement utilisé pour améliorer l'utilisation du réseau. TCP_QUICKACK est utilisé pour envoyer des accusés de réception le plus tôt possible avant d'être retardé sous certains échanges de niveau de protocole, et ce n'est pas stable/permanent, les TCP (qui peuvent se produire sous le capot) peut ignorer cette option en fonction du traitement au niveau du protocole réel ou de tout désaccord réel entre les paramètres utilisateur et le comportement de la pile.

NOTE TCP_NODELAY est portable tandis que TCP_QUICKACK ne l'est pas (ne fonctionne que sous Linux 2.4.4+).

25
Fei

Utilisez TCP_QUICKACK, pas TCP_NODELAY

L'activation de TCP_NODELAY a des effets similaires, mais peut aggraver le débit pour les petites écritures. Si vous écrivez une boucle qui n'envoie que quelques octets (le pire des cas, un octet) à une socket avec "write ()" et que l'algorithme Nagle est désactivé avec TCP_NODELAY, chaque écriture devient un paquet IP. Cela augmente le trafic d'un facteur 40, avec des en-têtes IP et TCP pour chaque charge utile. La prévention Tinygram ne vous permettra pas d'envoyer un deuxième paquet si vous en avez un en vol, sauf si vous avez suffisamment de données pour remplir le paquet de taille maximale. Il accumule des octets pour un aller-retour, puis envoie tout dans la file d'attente. C'est presque toujours ce que vous voulez. Si vous avez TCP_NODELAY défini, vous devez être beaucoup plus conscient des problèmes de mise en mémoire tampon et de vidage. Aucun cela est important pour les transferts unidirectionnels en vrac, qui est le plus HTTP aujourd'hui. (Je n'ai jamais examiné l'impact de cela sur la négociation SSL, où cela pourrait avoir de l'importance.) Version courte: définissez TCP_QUICKACK. Si vous trouvez un cas où cela aggrave les choses, faites le moi savoir. John Nagle

https://news.ycombinator.com/item?id=10608356

10
rofrol

TCP_QUICKACK et TCP_NODELAY affectent différentes opérations dans TCP. La page de manuel tcp (7) décrit les options de socket pour TCP qui interfèrent les unes avec les autres, par exemple TCP_CORK et TCP_NODELAY.

3
Mats