如何获取套接字中未确认的TCP数据量?

11

Linux中的ioctl SIOCOUTQ被描述在tcp(7)手册中,可以返回套接字缓冲区中未发送数据的数量。如果我理解内核代码正确,所有未被确认的数据都被计算为“未发送”数据。该ioctl自2.4.x版本开始可用。

{Free,Net,Open,*}BSD、Solaris和Windows是否有类似的功能呢?


你找到解决方案了吗? - Nathan Kidd
不,仅适用于Linux的TCP_INFO对我来说是可以接受的。 - darkk
2个回答

10

你可能需要(至少)两种不同的信息:尚未发送的数据量和已经发送但未收到确认的数据量。

在Linux系统中:SIOCOUTQ被记录为提供未发送数据的数量,但实际上它给出的是(未发送数据+已发送但未收到确认的数据)的总和。最近的一个补丁(2016年2月)使得可以从TCP_INFO结构体中的tcpi_notsent_bytes字段获取实际的未发送数据。

在macOS和iOS中:getsockopt(fd, SOL_SOCKET, SO_NWRITE, ...)SIOCOUTQ类似:它被记录为提供未发送数据的数量,但实际上它给出的是(未发送数据+已发送但未收到确认的数据)的总和。我不知道有什么方法可以获得更细粒度的信息。

在Windows上:GetPerTcpConnectionEStatsTcpConnectionEstatsSendBuff选项一起使用,可以将未发送的数据和已发送但未收到ACK的数据作为两个单独的数字给出。
我不知道如何在其他操作系统上获取此信息。

有人在 Windows 上让 GetPerTcpConnectionEStats() 读取 TcpConnectionEstatsSendBuff 正常工作吗?我已经尝试了,但是我没有得到合理的值。我猜测这些信息必须明确地启用,但当我尝试使用 SetPerTcpConnectionEStats() 启用它时,我会收到拒绝访问的错误。 :-( - Mario Klebsch

0

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


1
当然可以打补丁内核并获取所需信息。我在想是否有现有的API。 - darkk

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接