Linux在man-page tcp(7)中描述了ioctl SIOCOUTQ,它返回套接字缓冲区中未发送数据的数量。如果我理解内核代码正确,则所有非ACK数据都被计为“未发送”。 ioctl至少在2.4.x之后可用。
{Free,Net,Open,*} BSD,Solaris,Windows有什么相似之处吗?
答案 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(队列中的字节数)。