Linux在man-page tcp(7)中描述了ioctl SIOCOUTQ,它返回套接字缓冲区中未发送数据的数量.如果我理解内核代码正确,则所有非ACK数据都被计为"未发送".ioctl至少从2.4.x开始可用.
{Free,Net,Open,*} BSD,Solaris,Windows有什么相似之处吗?
您可能需要(至少)两条不同的信息:尚未发送的数据量,以及已发送但未确认的数据量.
在Linux上:SIOCOUTQ
记录为提供未发送数据的数量,但实际上给出了(未发送数据+发送但未确认数据)的总和.一个最近的补丁(2月2016)使人们有可能从一开始实际未发送的数据tcpi_notsent_bytes
在外地TCP_INFO
结构.
在macOS和iOS上:getsockopt(fd, SOL_SOCKET, SO_NWRITE, ...)
就像SIOCOUTQ
:它记录了提供未发送数据的数量,但实际上给出了(未发送的数据+发送但未确认的数据)的总和.我不知道如何获得更细粒度的信息.
在Windows上:GetPerTcpConnectionEStats
使用该TcpConnectionEstatsSendBuff
选项可以将未发送的数据和已发送但未确认的数据作为两个单独的数字.
我不知道如何在其他操作系统上获取此信息.