在Linux上,有没有办法以编程方式获取单个TCP连接的统计信息?我正在寻找的统计数据是由netstat -s
打印出来的排序,但是对于单个连接而不是在所有连接中的汇总。举一些例子:字节输入/输出,重传,丢包等。
我可以在拥有套接字的进程中运行代码,并且可以给它套接字文件描述符。发送/接收数据的代码虽然无法访问,因此例如,无法将recv()/send()
包装为计数字节输入/输出。
我会接受任何语言的答案,但C或Java与标签特别相关。
答案 0 :(得分:2)
可以从C获得nos引用的信息:
#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) manual page表示这是TCP_INFO:
此选项不应用于可移植的代码。
答案 1 :(得分:1)
您在netstat -s中看到的大多数统计信息都没有按每个连接进行跟踪,只有整体计数器存在。
你可以做的是取出/ proc / net / tcp
中的信息首先,/ proc / self / fd上的readlink(),你要解析该符号链接中的inode号,并将它与/ proc / net / tcp中具有相同inode号的行匹配,其中包含一些关于该套接字/连接的基本信息。虽然没有很好的记录,所以期望在谷歌上花一些时间并阅读linux内核源代码来解释它们。