Linux中的ioctl SIOCOUTQ被描述在tcp(7)手册中,可以返回套接字缓冲区中未发送数据的数量。如果我理解内核代码正确,所有未被确认的数据都被计算为“未发送”数据。该ioctl自2.4.x版本开始可用。
{Free,Net,Open,*}BSD、Solaris和Windows是否有类似的功能呢?
Linux中的ioctl SIOCOUTQ被描述在tcp(7)手册中,可以返回套接字缓冲区中未发送数据的数量。如果我理解内核代码正确,所有未被确认的数据都被计算为“未发送”数据。该ioctl自2.4.x版本开始可用。
{Free,Net,Open,*}BSD、Solaris和Windows是否有类似的功能呢?
你可能需要(至少)两种不同的信息:尚未发送的数据量和已经发送但未收到确认的数据量。
在Linux系统中:SIOCOUTQ
被记录为提供未发送数据的数量,但实际上它给出的是(未发送数据+已发送但未收到确认的数据)的总和。最近的一个补丁(2016年2月)使得可以从TCP_INFO
结构体中的tcpi_notsent_bytes
字段获取实际的未发送数据。
在macOS和iOS中:getsockopt(fd, SOL_SOCKET, SO_NWRITE, ...)
与SIOCOUTQ
类似:它被记录为提供未发送数据的数量,但实际上它给出的是(未发送数据+已发送但未收到确认的数据)的总和。我不知道有什么方法可以获得更细粒度的信息。
GetPerTcpConnectionEStats
与TcpConnectionEstatsSendBuff
选项一起使用,可以将未发送的数据和已发送但未收到ACK的数据作为两个单独的数字给出。由于TCP/IP被实现为流设备,因此可能可以进行内核潜水并获取队列-> q_count(队列中的字节数)。