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

dar*_*rkk 6 sockets networking tcp

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

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

Nat*_*ith 5

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

在Linux上:SIOCOUTQ记录为提供未发送数据的数量,但实际上给出了(未发送数据+发送但未确认数据)的总和.一个最近的补丁(2月2016)使人们有可能从一开始实际未发送的数据tcpi_notsent_bytes在外地TCP_INFO结构.

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

在Windows上:GetPerTcpConnectionEStats使用该TcpConnectionEstatsSendBuff选项可以将未发送的数据和已发送但未确认的数据作为两个单独的数字.

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


小智 0

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