Как получить количество не-ACK-данных TCP для сокета? - PullRequest
5 голосов
/ 27 февраля 2009

В Linux ioctl SIOCOUTQ описан в man-странице tcp (7), которая возвращает количество неотправленных данных в буферах сокетов. Если я правильно понимаю код ядра, все не-ACKed данные считаются «неотправленными». Ioctl доступен как минимум с версии 2.4.x.

Есть ли что-нибудь похожее для {Free, Net, Open, *} BSD, Solaris, Windows?

Ответы [ 2 ]

5 голосов
/ 23 октября 2016

Существует (как минимум) две разные части информации, которые вам могут понадобиться: объем данных, которые еще не были отправлены, и объем данных, которые были отправлены, но не подтверждены.

В Linux: SIOCOUTQ задокументировано для указания количества неотправленных данных, но фактически дает сумму (неотправленные данные + отправленные, но не подтвержденные данные). Недавний патч (февраль 2016 г.) позволил получить фактические неотправленные данные из поля tcpi_notsent_bytes в структуре TCP_INFO.

В macOS и iOS: getsockopt(fd, SOL_SOCKET, SO_NWRITE, ...) аналогично SIOCOUTQ: задокументировано, что оно дает количество неотправленных данных, но фактически дает сумму (неотправленные данные + отправленные, но не подтвержденные данные). Я не знаю, как получить более детальную информацию.

В Windows: GetPerTcpConnectionEStats с опцией TcpConnectionEstatsSendBuff дает вам как неотправленные данные, так и данные, отправленные, но не подтвержденные ACK в виде двух отдельных чисел .

Я не знаю, как получить эту информацию в других операционных системах.

0 голосов
/ 27 мая 2009

Поскольку TCP / IP реализован как потоковое устройство, может быть возможно выполнить погружение ядра и получить очередь-> q_count (количество байтов в очереди).

...