Comment TCP_NODELAY affecter consécutives write() appelle?
TCP_NODELAY est une option à activer l'aperçu de l'envoi de paquets TCP, indépendamment de leur taille. Ceci est très utile lorsque la vitesse de questions, cependant, je suis curieux de savoir ce qu'il va faire à présent:
Socket socket = [some socket];
socket.setTcpNoDelay(true);
OutputStream out = socket.getOutputStream();
out.write(byteArray1);
out.write(byteArray2);
out.write(byteArray3);
out.flush();
J'ai essayé de trouver ce flush en fait sur un SocketOutputStream
, mais pour autant que je sais maintenant, cela ne sert à rien. J'avais espéré que ce serait de dire au socket "envoyer toutes vos données mises en mémoire tampon MAINTENANT", mais, malheureusement, non, il ne le fait pas.
Ma question est: ce sont ces 3 tableaux d'octets envoyés dans un paquet? Je sais que vous n'avez pas beaucoup de contrôle sur la façon dont TCP construit un réseau de paquets, mais est-il possible de dire à la prise de (au moins essayer) pack ces tableaux d'octets, de sorte que la surcharge du réseau est évitée? Pourrait manuellement l'emballage des tableaux d'octets et de les envoyer dans un appel à write
aider?
SUGGESTION: Obtenir une copie de wireshark et trace les paquets envoyés pour un couple de test socket programmes.
Oui, c'est ce que je voulais dire. 😉 Je sais que c'est inefficace, mais dans mon cas, la réactivité est plus important que d'attendre que suffisamment de données. Cependant, pour le cas où la question est à propos, je veux l'optimiser, parce que l'envoi de l'unique tableaux d'octets n'a pas beaucoup de sens, c'est le contenu de tous ceux que les questions.
Puis envoyer les données à la fois. Prend un supplément de quelques microsecondes à les combiner entre eux, et c'est en supposant que pas-petits tampons. Ce temps n'est rien par rapport à combien de temps le trafic réseau peut prendre.
Ce serait mon approche actuelle, mais j'étais curieux de savoir si il y a de meilleures manières, à la recherche de ne pas céder quoi que ce soit, j'ai donc demandé à cette question.
OriginalL'auteur AyCe | 2013-08-06
Vous devez vous connecter pour publier un commentaire.
Que vous avez désactivé l'algorithme Nagle, certainement pas, mais vous ne pouvez pas être sûr à 100%.
Oui. Ne pas désactiver l'algorithme Nagle.
Oui, ou encore plus simple tout simplement enrouler le support du flux de sortie dans un
BufferedOutputStream
et appelflush()
lorsque vous souhaitez que les données soient envoyées, selon votre présent code. Il est exact que lesflush()
ne fait rien sur un socket flux de sortie, mais il vide unBufferedOutputStream.
BufferedOutputStream
pour l'envoi déjà, cela garantit que les données soient envoyées qu'une seule foisflush()
est appelé?Oui, si l'
BufferedOutputStream
tampon est assez grand pour contenir toutes les données en attente. (8k par défaut.) Toutefois, si vous vous attendez à recevoir toutes les données ensemble, détrompez-vous. Il n'y a aucune garantie. Vous avez encore à boucle au niveau du récepteur jusqu'à ce que vous avez tout ce dont vous avez besoin, ou de l'utilisationDataInputStream.readFully()
si vous connaissez la longueur attendue.Ok, sympa! Bien sûr, je sais que je ne peut pas le recevoir comme un "paquet" comme j'ai pu avec UDP. Tous ces tableaux d'octets sont des messages simples, mais ils n'ont de sens une fois que le dernier d'entre eux est reçu. Donc, il serait inutile de les envoyer sous forme de paquets simples.
excellente réponse, sur tous les points!
OriginalL'auteur user207421
Pourrait manuellement l'emballage des tableaux d'octets et de les envoyer dans un appel d'écrire aider?
Oui, envoyez-les tous dans un seul appel à l'écriture. Cela permettra de maximiser les chances que votre octets sera envoyé dans un seul paquet.
Bien sûr, vous ne pouvez jamais savoir, car il y a trop de variables en jeu - les différents systèmes d'exploitation et de beaucoup de différents réseaux d'engrenage entre vous et vos pairs, mais si vous donnez l'OS de la capacité d'emballer le tout, de façon générale, essayez d'.
Si vous désactivez nagle et faire de séparer les appels système (rappelez-vous, le système d'exploitation contrôle les prises de courant, pas de votre inscription ou java), vous demandez à l'OS pour les envoyer individuellement. L'OS n'a aucune idée de qui vous êtes sur le point d'appeler écrire à nouveau avec un peu plus de données.
si vous pensez que cela répond à votre question mieux que l'autre réponse, je vous en serais reconnaissant si vous passer le a accepté de répondre.
Vous répondez est grande, vous expliquer la séparation de l'OS/Java pour les Sockets et également de donner une réponse à ma question secondaire, tout en répondant à ma question principale (si ces 3 tableaux d'octets seront probablement envoyés dans un paquet) indirectement. EJP réponses à ces deux questions, mais donne aussi des conseils pour utiliser
BufferedOutputStream
, donc j'ai envie que la réponse est plus complète 🙂ok, pas de problème.
Vous êtes à la demander l'OS pour les envoyer individuellement, mais il n'y a toujours pas de garantie qu'il sera.
OriginalL'auteur xaxxon