如何获取套接字的非ACK TCP数据量?

时间:2009-02-27 16:17:15

标签: networking sockets tcp

Linux在man-page tcp(7)中描述了ioctl SIOCOUTQ,它返回套接字缓冲区中未发送数据的数量。如果我理解内核代码正确,则所有非ACK数据都被计为“未发送”。 ioctl至少在2.4.x之后可用。

{Free,Net,Open,*} BSD,Solaris,Windows有什么相似之处吗?

2 个答案:

答案 0 :(得分:5)

您可能需要(至少)两条不同的信息:尚未发送的数据量,以及已发送但未确认的数据量-ed。

在Linux上:记录SIOCOUTQ以提供未发送数据的数量,但实际上给出了(未发送的数据+已发送但未确认的数据)的总和。 recent patch (Feb 2016)可以从tcpi_notsent_bytes结构中的TCP_INFO字段获取实际的未发送数据。

在macOS和iOS上:getsockopt(fd, SOL_SOCKET, SO_NWRITE, ...)就像SIOCOUTQ一样:它记录了未发送数据的数量,但实际上给出了(未发送数据+发送 - 但 - 的总和未确认的数据)。我不知道如何获得更细粒度的信息。

在Windows上:GetPerTcpConnectionEStats使用TcpConnectionEstatsSendBuff选项为您提供未发送的数据和已发送但未确认的数据as two separate numbers

我不知道如何在其他操作系统上获取此信息。

答案 1 :(得分:0)

由于TCP / IP是作为流设备实现的,因此可以进行内核潜水并获取队列 - > q_count(队列中的字节数)。