Mensajes TCP fusionados?

Tengo una aplicación que envía 100 de 186 bytes (excluyendo cabeceras) TCP posts atrás a espalda sin laguna del anfitrión A al anfitrión B.

Corrí tcpdump para capturar los packages en el host A (donde está el remitente), y me di count de que después de unos cuantos posts (como 9), los siguientes ~ 25 posts se fusionaron en un post de 5 + K.

Ya he desactivado el algorithm de Nagle a través de setsockopt () en la aplicación remitente, y las windows TCP calculado es más de 14K byte todo el time. Por lo tanto, no parece que los primeros 9 posts llenaron el anfitrión B y el anfitrión B pidió a anfitrión A para retrasar.

¿Algún consejo sobre cómo averiguar por qué se fusionaron los posts TCP?

¡Gracias!

Tengo una aplicación que envía 100 de 186 bytes (excluyendo cabeceras) TCP posts atrás a espalda sin laguna del anfitrión A al anfitrión B.

Entonces puede estar enviando más rápido de lo que la networking puede transportar, en cuyo caso, en el momento en que la implementación TCP en el remitente está listo para enviar un package en la networking, puede haber varios posts en queue, Enviaré tantos como pueda en un solo segmento de TCP. El protocolo TCP ofrece un service de byte-stream, sin la noción de límites de posts, por lo que se permite hacer eso.

Ya he activado el algorithm de Nagle

El algorithm de Nagle explícitamente hace lo que está diciendo el TCP en el remitente está haciendo :

El algorithm de Nagle funciona combinando un número de pequeños posts salientes, y enviándolos todos a la vez.

así que encenderlo no impedirá eso. Desactivarla podría, en algunos casos, evitar eso, pero dado que su aplicación envía una ráfaga de posts, probablemente no lo evitará.

(Es decir, la respuesta a "¿por qué el TCP en el remitente unir los posts?" Es "porque puede".)

Lo que está viendo es más probable debido a la funcionalidad que se descarga de la stack de la networking del núcleo a la interfaz de networking y / o controller.

La interfaz de networking seguirá recibiendo los packages individuales de la networking. Pero antes de que los packages se entregan al kernel se fusionan por la interfaz o el controller.

Puede ver la configuration actual de todas las funciones de descarga mediante este command:

ethtool -k eth0 

Si desea desactivar esta function en particular, puede realizarse con este command:

 ethtool -K eth0 generic-receive-offload off 

Puedes leer más sobre la descarga en esta vieja pregunta .