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

标签 networking sockets tcp

Linux 具有 ioctl SIOCOUTQ,在 man-page tcp(7) 中有描述,它返回套接字缓冲区中未发送的数据量。如果我正确理解内核代码,所有未确认的数据都算作“未发送”。 ioctl 至少从 2.4.x 开始可用。

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

最佳答案

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

在 Linux 上:SIOCOUTQ 被记录为给出未发送数据的数量,但实际上给出了(未发送数据 + 已发送但未确认的数据)的总和。 recent patch (Feb 2016)使得可以从 TCP_INFO 结构中的 tcpi_notsent_bytes 字段获取实际未发送的数据。

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

在 Windows 上:GetPerTcpConnectionEStats使用 TcpConnectionEstatsSendBuff 选项可以为您提供未发送的数据和已发送但未确认的数据 as two separate numbers .

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

关于networking - 如何获取套接字的非 ACK-ed TCP 数据量?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/595426/

相关文章:

c++ - 绑定(bind) falis 以绑定(bind) (TCP) 并返回 -1

c++ linux - 从IP获取接口(interface)

amazon-web-services - AWS : Elastic IP vs ENI

c# - 客户端断开连接时检测并写入

java - 在 Apache 和游戏服务器之间拆分 https

linux - super 终端使用的TCP/IP通信协议(protocol)?

java - Applet 信任库 API 代码

linux - Linux 上机器之间的 tcp/ip 连接数是否有限制?

networking - Docker CNI:无法设置网络

c++ - 在 Windows 中从接口(interface)名称获取 IP 地址