在 Linux 上,有没有办法以编程方式获取单个 TCP 连接的统计信息?我正在寻找的统计数据是由 打印出来的netstat -s
,但是对于单个连接而不是在所有连接的聚合中。举一些例子:字节输入/输出、重传、丢包等等。
我可以在拥有套接字的进程中运行代码,并且可以为它提供套接字文件描述符。但是,发送/接收数据的代码是遥不可及的,因此例如无法包装recv()/send()
以计算输入/输出字节数。
我会接受任何语言的答案,但 C 或 Java 与标签特别相关。
在 Linux 上,有没有办法以编程方式获取单个 TCP 连接的统计信息?我正在寻找的统计数据是由 打印出来的netstat -s
,但是对于单个连接而不是在所有连接的聚合中。举一些例子:字节输入/输出、重传、丢包等等。
我可以在拥有套接字的进程中运行代码,并且可以为它提供套接字文件描述符。但是,发送/接收数据的代码是遥不可及的,因此例如无法包装recv()/send()
以计算输入/输出字节数。
我会接受任何语言的答案,但 C 或 Java 与标签特别相关。
编号所指的信息可从 C 获得:
#include <linux/tcp.h>
...
struct tcp_info info;
socklen_t optlen;
getsockopt(sd, IPPROTO_TCP, TCP_INFO, &info, &optlen)
不幸的是,由于这是特定于 Linux 的,它没有通过 Java Socket API 公开。如果有办法从套接字获取原始文件描述符,您也许可以将其作为本机方法来实现。
我看不到获取描述符的方法。但是,您可以使用自己的SocketImplFactory和SocketImpl。
可能值得注意的是TCP(7) 手册页说这是 TCP_INFO:
此选项不应在旨在可移植的代码中使用。
您使用 netstat -s 看到的大多数统计信息都不会基于每个连接进行跟踪,仅存在总体计数器。
你能做的,就是把/proc/net/tcp里面的信息拉出来
首先,在 /proc/self/fd 上的 readlink(),您想从该符号链接中解析 inode 编号,并将其与 /proc/net/tcp 中具有相同 inode 编号的行进行匹配,其中将包含一些关于该套接字/连接。该文件虽然没有很好的文档记录,所以希望花一些时间在 google 上并阅读 linux 内核源代码来解释它们。