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?

"TCP_NODELAY .. est utile lorsque la vitesse de questions." AUCUN. Il est utile lors de la la réactivité questions (l'obtention d'un octet envoyé pour être reçu aussi rapidement que possible). TCP_NODELAY pouvez réduction débit global, par l'envoi de la agrégation de données relativement INEFFICACEMENT. Mise en mémoire tampon est bonne: quand et dans la mesure du possible. À mon humble avis...
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