2009-02-27 11 views
5

Linux tiene ioctl SIOCOUTQ descrito en man-page tcp (7) que devuelve la cantidad de datos no enviados en los búferes de socket. Si entiendo el código del núcleo correcto, todos los datos no acreditados se cuentan como "no enviados". El ioctl está disponible al menos desde 2.4.x.¿Cómo obtener la cantidad de datos TCP no ACK-ed para el socket?

¿Hay algo similar para {Free, Net, Open, *} BSD, Solaris, Windows?

+0

¿Alguna vez encontró una solución? –

+0

No, el TCP_INFO solo para Linux era aceptable para mí. – darkk

Respuesta

0

Dado que TCP/IP se implementa como un dispositivo de transmisión, es posible realizar una inmersión en el kernel y obtener la cola-> q_count (cantidad de bytes en la cola).

+0

Por supuesto, es posible parchear kernel y obtener la información requerida. Me preguntaba sobre alguna API existente. – darkk

5

Existen (al menos) dos tipos diferentes de información que podría desear: la cantidad de datos que aún no se han enviado y la cantidad de datos que se han enviado pero no ACK-ed.

En Linux: SIOCOUTQ está documentado para proporcionar la cantidad de datos no enviados, pero en realidad da la suma de (datos no enviados + datos enviados pero no ACK). Un recent patch (Feb 2016) hizo posible obtener los datos reales no enviados del campo tcpi_notsent_bytes en la estructura TCP_INFO.

en MacOS y el IOS: getsockopt(fd, SOL_SOCKET, SO_NWRITE, ...) es igual SIOCOUTQ: está documentado para dar la cantidad de datos enviados, pero en realidad le da la suma de (datos no enviados + datos-pero-no-ACK-ed enviado). No conozco ninguna forma de obtener información más precisa.

En Windows: GetPerTcpConnectionEStats con la opción TcpConnectionEstatsSendBuff le proporciona tanto los datos no enviados como los enviados pero no los datos ACK-ed as two separate numbers.

No sé cómo obtener esta información en otros sistemas operativos.

Cuestiones relacionadas