Quand dois-je utiliser TCP_NODELAY et quand TCP_CORK?
J'ai compris que les deux d'entre eux désactiver l'algorithme Nagle.
Quand devrait/ne devrait-on pas utiliser chacun d'entre eux?
Vous devez vous connecter pour publier un commentaire.
J'ai compris que les deux d'entre eux désactiver l'algorithme Nagle.
Quand devrait/ne devrait-on pas utiliser chacun d'entre eux?
Vous devez vous connecter pour publier un commentaire.
Tout d'abord pas deux désactive l'algorithme Nagle.
L'algorithme Nagle est de réduire davantage le nombre de petits paquets réseau en fil de fer. L'algorithme est: si des données est inférieure à une limite (généralement MSS), attendre jusqu'à ce que la réception d'un ACK pour les paquets émis et dans le temps, d'accumuler des données de l'utilisateur. Puis envoyer les données accumulées.
Cela aidera à des applications comme telnet. Toutefois, en attente de l'accusé de réception peut augmenter le temps d'attente lors de l'envoi de données en continu. En outre, si le récepteur met en œuvre le "ACK retardé politique", il va provoquer un blocage temporaire de la situation. Dans de tels cas, la désactivation de l'algorithme Nagle est une meilleure option.
Donc TCP_NODELAY est utilisé pour la désactivation de l'algorithme Nagle.
TCP_CORK agressivement accumule des données. Si TCP_CORK est activée dans une socket, il ne sera pas envoyer des données jusqu'à ce que le tampon se remplit à une limite fixe. Similaire à l'algorithme Nagle, il s'accumule également les données de l'utilisateur, mais jusqu'à ce que le tampon se remplit à une limite fixe pas jusqu'à la réception d'un ACK. Ce sera utile lors de l'envoi de plusieurs blocs de données. Mais vous devez être plus prudent lors de l'utilisation TCP_CORK.
Jusqu'à ce noyau 2.6, ces deux options sont mutuellement exclusives. Mais plus tard dans le noyau, les deux peuvent coexister. Dans de tels cas, TCP_CORK sera donné plus de préférence.
Ref:
TCP_NODELAY
Utilisé pour désactiver l'algorithme Nagle pour améliorer les réseaux TCP/IP et de diminuer le nombre de paquets en attente jusqu'à ce qu'un accusé de réception envoyé précédemment données est reçu pour envoyer le cumul des paquets.
//À partir de la tcp(7) manuel:
TCP_CORK
(ouTCP_NOPUSH
dans FreeBSD)Ne pas envoyer de trames partielles. Toutes les trames partielles en attente sont envoyées lorsque cette option est désactivée à nouveau. Ceci est utile pour préparer les en-têtes avant d'appeler
sendfile(2)
, ou pour optimiser le débit. Tel qu'il est actuellement mis en œuvre, il y a un ** 200 millisecondes plafond** sur le temps pendant lequel la sortie est bouchée parTCP_CORK
. Si ce plafond est atteint, alors en file d'attente les données sont automatiquement transmises. Cette option peut être combinée avecTCP_NODELAY
seulement depuis Linux 2.5.71. Cette option ne doit pas être utilisé dans le code destinés à être portables.C'est une optimisation, donc, comme tout d'optimisation:
Fondamentalement, le but est d'éviter d'avoir à envoyer plusieurs trames où une seule image peut être utilisée, avec sendfile() et ses amis.
Ainsi, par exemple, dans un serveur web, vous envoyez les en-têtes suivie par le contenu du fichier, les en-têtes seront assemblés en mémoire, le fichier sera alors envoyé directement par le noyau. TCP_CORK vous permet d'avoir des en-têtes et le début de l'envoi d'un fichier en une seule image, même avec TCP_NODELAY, ce qui pourrait entraîner le premier morceau à être envoyé immédiatement.
TCP_CORK est à l'opposé de TCP_NODELAY. Les forces anciennes de paquets accumulation de retard; le dernier, il désactive.
TCP_CORK
n'est pas le contraire deTCP_NODELAY
. L'algorithme Nagle, qui agrège les données lors de l'attente d'un retour d'accusé de réception, dont la dernière option désactive; l'ancien agrégats de base de données de la mémoire tampon de pression à la place.