¿Qué se puede esperar en términos de latencia con tcp/ip sobre la interfaz loopback en Windows?

Estoy midiendo la latencia de una conexión TCP/IP en Windows a través de la interfaz de bucle invertido y obtengo aproximadamente 4 ms para el tiempo desde que se envía un mensaje hasta que se recibe una respuesta.

Para propósitos de RPC hay un TCF capa encima de TCP/IP. Los mensajes enviados y recibidos contienen un solo carácter como carga útil además de la trama TCF.

El "servidor" que maneja los comandos se implementa en C++ usando boost asio. Los comandos de envío del "cliente" son una secuencia de comandos de Python que utiliza la implementación de referencia de Python TCF.

Intenté establecer las opciones de socket en TCP_NODELAY para deshabilitar el algoritmo de Nagle y experimenté con varios tamaños de búfer para el socket, pero el tiempo de ida y vuelta se mantiene en aproximadamente 4 ms. Esperaba que fuera un poco más bajo.

La generación de perfiles en el lado de C++ muestra que pasa aproximadamente el 50% de su tiempo de ejecución esperando comandos, por lo que el siguiente paso será intentar reemplazar el script de python con una implementación de C++, pero sería bueno saber qué se puede esperar de el tiempo de ida y vuelta en la interfaz loopback.

Este SO, pregunta:
Rendimiento de bucle invertido de Linux con TCP_NODELAY habilitado está relacionado pero no respondió mi pregunta.

preguntado el 30 de junio de 12 a las 18:06

Si el lado de C++ pasa aproximadamente la mitad de su tiempo esperando, presumiblemente pasa aproximadamente la mitad de su tiempo sin esperar. Si asume lo mismo para el otro lado, eso deja una latencia estimada de cero. Se contabiliza todo el tiempo. La mitad del tiempo lo consume el código C++ haciendo trabajo. La mitad del tiempo lo consume el código de Python haciendo el trabajo. Eso no deja tiempo para que ninguno de los lados esté funcionando, que es lo que sucedería durante cualquier latencia de TCP/IP. (El lado que envía estaría esperando una respuesta y el lado que recibe estaría esperando para recibir. Ambos lados estarían esperando). -

+1 para la respuesta de 'Spock' de @DavidSchwartz -

@DavidSchwarz: +1 No pensé en eso :-) Gracias. Aún así, me gustaría mucho saber cuál debería ser un tiempo de ida y vuelta típico de TCP/IP. -

Después de implementar el "cliente" en C++, la latencia de un par de comando/respuesta se redujo a 170 µs. Reemplazar las llamadas a json_spirit con jsonificación artesanal de cadenas lo redujo a aproximadamente 150 µs. -

1 Respuestas

Puede establecer un límite inferior en la latencia con ping localhost. El número que informa es un paquete enviado, uno recibido.

Si su mensaje TCP se envía en una conexión existente, es posible que obtenga casi esa latencia.

Si su tiempo medido incluyera la configuración de la conexión TCP, podría obtener 10 veces esa latencia.

Respondido 03 Jul 12, 14:07

No es la respuesta que estás buscando? Examinar otras preguntas etiquetadas or haz tu propia pregunta.