获取每个连接传输的包数

时间:2010-12-29 08:08:20

标签: java linux sockets network-programming

如何获取每个TCP连接传输的包数?

我正在使用Java,但我知道我必须从底层操作系统中获取数字,因此这个准则适用于Linux和Windows操作系统,并且我会假设它们各有不同的答案。

我需要这些信息来分析应用程序的网络负载,这似乎通过过于频繁地刷新套接字流来发送太多小包。

4 个答案:

答案 0 :(得分:2)

我认为纯Java API不允许你这样做。作为解决方法,我建议您尝试JPcap

答案 1 :(得分:1)

但是,我首先要检查您的代码是否正确使用缓冲。如果Nagle保持打开状态,即使您一次发送一个字节,操作系统也会将这些写入合并在一起。如果Nagle关闭,您的NIC驱动程序仍然可以将数据合并在一起。使用tcpdump / windump将确认发送的实际数据包大小。

应用程序刷新流的频率对操作系统发送数据的频率几乎没有影响。您也可以使用像yourkit这样的探查器或像strace这样可以监视OS调用次数的系统工具。

答案 2 :(得分:1)

看起来你可以通过检查/ proc / net / nf_conntrack或运行带有适当参数的“conntrack”实用程序来获取它(以root身份)。

这假设已启用netfilter连接跟踪并且您具有该实用程序。

您必须自己找到正确的连接 - 但您应该能够通过src / dst / sport / dport

识别它

答案 3 :(得分:1)

访问TCP连接探查器将在本地或服务器连接级别提供此信息。由于以下几个原因,数据包的数量通常高于预期:报头数据包和帧数据包,连接建立和确认或响应数据包,安全协议协商和控制数据包,小到足以通过某些类型的连接中的POTS电话线设备处理的数据包,密码术身份和算法控制数据包,正在使用的数据传输协议通过tcp连接充当较低的传输层,实际用户或应用程序数据以分组和帧的形式,连接断开数据包和响应。如果存在多线程或多用户情况,并且每个连接的用户都无法从输出流中接收刚刚传输给其他用户的任何数据字符,则可以经常刷新流。