当前位置: 首页 > 软件库 > 管理和监控 > 系统监控 >

tcplstat

网络监控工具
授权协议 LGPL
开发语言 C/C++
所属分类 管理和监控、 系统监控
软件类型 开源软件
地区 国产
投 递 者 高钱青
操作系统 Windows
开源组织
适用人群 未知
 软件概览

tcplstat是基于libpcap网络嗅探程序包的网络监控工具,它能旁路捕获所有经过网络设备过滤规则的TCP数据,跟踪当前所有TCP连接会话,记录所有经过的TCP分组,当连接断开或到达最大记录数时倒出统计信息,包含但不限于连接两端网络地址、建立时间戳、三步握手各分组延迟、四步分手各分组延迟,数据分组明细、往来分组间延迟和相反方向分组延迟的最小、平均、最大统计值。

tcplstat在旁路工作,所以不会对应用造成任何影响,也无需侵入应用,即可获得网络数据往来分组明细和统计信息。

tcplstat在实现基础网络监控功能时还实现了采集分析SQL耗时和HTTP耗时信息,同样也是旁路捕获,不影响应用也无需改造应用,帮助应用优化性能。

tcplstat是开源的,除了引用了Linux内核的红黑树和链表源码外,自身源码只有1500行左右,源码结构简单易读。

安装

(理论上tcplstat可以安装在任何有libpcap的环境,包括Linux、WINDOWS、AIX等,以下以Linux操作系统为例)

2.1. 源码编译安装

从tcplstat源码托管站点(网址在最后)下载最新源码包,解开并进入源码目录

$ tar xvzf tcplstat.tar.gz
...
¥ cd tcplstat/src

按需修改安装目录

$ vi makeinstall
_BINBASE        =       $(HOME)/bin

注意:编译环境需要开发包libpcap-devel,请预先安装好。

编译、安装tcplstat

$ make -f makefile.Linux
gcc -g -fPIC -O2 -Wall -Werror -fno-strict-aliasing -I/home/calvin/include -I. -I/home/calvin/include  -c list.c
gcc -g -fPIC -O2 -Wall -Werror -fno-strict-aliasing -I/home/calvin/include -I. -I/home/calvin/include  -c rbtree.c
gcc -g -fPIC -O2 -Wall -Werror -fno-strict-aliasing -I/home/calvin/include -I. -I/home/calvin/include  -c rbtree_ins.c
gcc -g -fPIC -O2 -Wall -Werror -fno-strict-aliasing -I/home/calvin/include -I. -I/home/calvin/include  -c Util.c
gcc -g -fPIC -O2 -Wall -Werror -fno-strict-aliasing -I/home/calvin/include -I. -I/home/calvin/include  -c main.c
gcc -g -fPIC -O2 -Wall -Werror -fno-strict-aliasing -I/home/calvin/include -I. -I/home/calvin/include  -c PcapCallback.c
gcc -g -fPIC -O2 -Wall -Werror -fno-strict-aliasing -I/home/calvin/include -I. -I/home/calvin/include  -c ProcessTcpPacket.c
gcc -g -fPIC -O2 -Wall -Werror -fno-strict-aliasing -I/home/calvin/include -I. -I/home/calvin/include  -c AddTcpPacket.c
gcc -g -fPIC -O2 -Wall -Werror -fno-strict-aliasing -I/home/calvin/include -I. -I/home/calvin/include  -c OutputTcplSession.c
gcc -g -fPIC -O2 -Wall -Werror -fno-strict-aliasing -o tcplstat list.o rbtree.o rbtree_ins.o Util.o main.o PcapCallback.o ProcessTcpPacket.o AddTcpPacket.o OutputTcplSession.o -L/home/calvin/lib -L. -L/home/calvin/lib -lpcap 
$ make -f makefile.Linux install
cp -rf tcplstat /home/calvin/bin/

编译链接只产生了一个可执行程序tcplstat,也可自行复制到目标目录。

显示版本信息

$ tcplstat -v
tcplstat v0.5.0 build Feb  6 2018 22:40:44
copyright by calvin<calvinwilliams@163.com> 2018

使用

命令行参数说明

不带命令行参数执行显示所有命令行参数

$ tcplstat
USAGE : tcplstat -v
                 -l
                 [ -i (network_interface) ] [ -f (filter_string) ] [ -o [ESPDd] ] [ --sql ] [ --http ] [ --max-packet-trace-count ] [ --log-file (pathfilename) ]
-o E : Output EVENT
   S : Output SESSION
   P : Output PACKET
   D : Output PACKET DATA
   d : Output DEBUG
--sql : Output SQL time elapse
NOTICE : See pcap-filter(7) for the syntax of filter
  • -i设置网络设备接口,不设置则默认使用any

  • -f设置网络过滤规则,比如tcp port 445嗅探所有连接到端口445的往来TCP分组,具体参见pcap-filter(7)

  • -o一旦捕获到TCP分组,输出数据类型,E表示输出分组事件,S表示连接断开输出会话统计信息,P表示连接断开输出TCP分组统计信息,D表示连接断开输出TCP分组数据信息,d表示输出调试信息

  • --sql捕获SQL统计耗时信息

  • --http捕获HTTP统计耗时信息

  • --max-packet-trace-count针对长连接不释放,总是不能侦测到连接断开也就不能输出会话总结信息,该选项设置TCP分组累积到多少时强制输出并清空TCP分组明细信息,默认为1000,下次输出会话统计信息时前缀从'E |'变成'E -'

  • --log-file输出到日志文件,不设置文件则输出到屏幕

注意:执行tcplstat需要root权限。

一个示例(即时输出TCP分组事件)

第一屏运行tcplstat

# tcplstat -f "tcp port 445" -o E

第二屏向445端口发送一个字符串,然后被samba服务器无情强行断开

$ echo "hello" | nc 114.215.179.129 445

第一屏输出

E | 2018-02-07T20:09:21.249992 | LHT[113] | SMAC[] DMAC[] | SIP[114.215.179.129] DIP[114.215.179.129] | SPORT[44200] DPORT[445] SEQ[3750544418] ACKSEQ[0] SYN[1] ACK[0] FIN[0] PSH[0] RST[0] URG[0] | [0]BYTES
E | 2018-02-07T20:09:21.250004 | LHT[113] | SMAC[] DMAC[] | SIP[114.215.179.129] DIP[114.215.179.129] | SPORT[445] DPORT[44200] SEQ[974809372] ACKSEQ[3767321634] SYN[1] ACK[1] FIN[0] PSH[0] RST[0] URG[0] | [0]BYTES
E | 2018-02-07T20:09:21.250018 | LHT[113] | SMAC[] DMAC[] | SIP[114.215.179.129] DIP[114.215.179.129] | SPORT[44200] DPORT[445] SEQ[3767321634] ACKSEQ[991586588] SYN[0] ACK[1] FIN[0] PSH[0] RST[0] URG[0] | [0]BYTES
E | 2018-02-07T20:09:21.251501 | LHT[113] | SMAC[] DMAC[] | SIP[114.215.179.129] DIP[114.215.179.129] | SPORT[44200] DPORT[445] SEQ[3767321634] ACKSEQ[991586588] SYN[0] ACK[1] FIN[0] PSH[1] RST[0] URG[0] | [6]BYTES
E |                  0  1  2  3  4  5  6  7  8  9  A  B  C  D  E  F    0123456789ABCDEF
E |     0x00000000   68 65 6C 6C 6F 0A                                 hello.          
E | 2018-02-07T20:09:21.251507 | LHT[113] | SMAC[] DMAC[] | SIP[114.215.179.129] DIP[114.215.179.129] | SPORT[445] DPORT[44200] SEQ[991586588] ACKSEQ[3867984930] SYN[0] ACK[1] FIN[0] PSH[0] RST[0] URG[0] | [0]BYTES
E | 2018-02-07T20:09:21.251661 | LHT[113] | SMAC[] DMAC[] | SIP[114.215.179.129] DIP[114.215.179.129] | SPORT[44200] DPORT[445] SEQ[3867984930] ACKSEQ[991586588] SYN[0] ACK[1] FIN[1] PSH[0] RST[0] URG[0] | [0]BYTES
E | 2018-02-07T20:09:21.256246 | LHT[113] | SMAC[] DMAC[] | SIP[114.215.179.129] DIP[114.215.179.129] | SPORT[445] DPORT[44200] SEQ[991586588] ACKSEQ[3884762146] SYN[0] ACK[1] FIN[1] PSH[0] RST[0] URG[0] | [0]BYTES
E | 2018-02-07T20:09:21.256267 | LHT[113] | SMAC[] DMAC[] | SIP[114.215.179.129] DIP[114.215.179.129] | SPORT[44200] DPORT[445] SEQ[3884762146] ACKSEQ[1008363804] SYN[0] ACK[1] FIN[0] PSH[0] RST[0] URG[0] | [0]BYTES
...

E开头的行为一个TCP分组,各列分别是发生时间戳、链路层头结构、发送方MAC、接收方MAC、发送方IP、接收方IP、发送方PORT、接收方PORT、序列号、反馈序列号、分组类型标志集合、有效荷载数据长度。

另一个示例(短连接断开后输出统计信息)

第一屏运行tcplstat

# tcplstat -f "tcp port 445" -o SPD

第二屏向445端口发送一个字符串,然后被samba服务器无情强行断开

$ echo "hello" | nc 114.215.179.129 445

第一屏输出

S | [114.215.179.129:44205]->[114.215.179.129:445] | 2018-02-07T20:20:41.903338 | 0.016535 | 0.000016 0.000015 , 0.000006 0.000741 0.001477 0.000006 0.000749 0.001492 , 0.000036 0.014964 0.000021 | 2 6
P |     2018-02-07T20:20:41.903338 | 0.000000 0.000000 | [114.215.179.129:44205]->[114.215.179.129:445] | S..... 0
P |     2018-02-07T20:20:41.903354 | 0.000016 0.000016 | [114.215.179.129:44205]<-[114.215.179.129:445] | S..A.. 0
P |     2018-02-07T20:20:41.903369 | 0.000015 0.000015 | [114.215.179.129:44205]->[114.215.179.129:445] | ...A.. 0
P |     2018-02-07T20:20:41.904846 | 0.001477 0.001492 | [114.215.179.129:44205]->[114.215.179.129:445] | ..PA.. 6
D |                  0  1  2  3  4  5  6  7  8  9  A  B  C  D  E  F    0123456789ABCDEF
D |     0x00000000   68 65 6C 6C 6F 0A                                 hello.          
P |     2018-02-07T20:20:41.904852 | 0.000006 0.000006 | [114.215.179.129:44205]<-[114.215.179.129:445] | ...A.. 0
P |     2018-02-07T20:20:41.904888 | 0.000036 0.000036 | [114.215.179.129:44205]->[114.215.179.129:445] | .F.A.. 0
P |     2018-02-07T20:20:41.919852 | 0.014964 0.014964 | [114.215.179.129:44205]<-[114.215.179.129:445] | .F.A.. 0
P |     2018-02-07T20:20:41.919873 | 0.000021 0.000021 | [114.215.179.129:44205]->[114.215.179.129:445] | ...A.. 0
...

S开头的行为一个连接统计信息,各列分别是连接方地址、被连接方地址、建立连接时间戳、连接总存在时间、三步握手各分组延迟、四步分手各分组延迟、往来分组间延迟和相反方向分组延迟的最小、平均、最大统计值,总分组数,有效载荷数据总大小。

P开头的行为一个连接中的一个TCP分组统计信息,各列分别是分组发生时间戳、往来分组间延迟和相反方向分组延迟、连接方地址、分组发送方向、被连接方地址、分组类型标志集合、有效荷载数据长度。

可以看出,自己想获得什么样的数据,就组合命令行参数-o后面的字母集合即可,最详细的信息参数组合是ESPDd

再一个示例(采集统计SQL耗时)

捕获SQL的原理很简单,检查每一个TCP分组中是否存在SQL语句,如果有则做个标记,等待下一个有效载荷的反向TCP分组到来后,计算时间差即是SQL执行时间。

这里以PostgreSQL为例,MySQL、Oracle等同样有效。

第一屏运行tcplstat

# tcplstat -f "tcp port 8432" --sql

第二屏用psql打开数据库连接,查询所有表总记录数

calvin=# \d
                               关联列表
 架构模式 |                   名称                   |  型别  | 拥有者 
----------+------------------------------------------+--------+--------
 public   | alphastock_company_info                  | 资料表 | calvin
 public   | alphastock_company_ipo                   | 资料表 | calvin
 public   | alphastock_stock_code                    | 资料表 | calvin
 public   | alphastock_stock_kline                   | 资料表 | calvin
 public   | alphastock_stock_kline_max_closing_price | 资料表 | calvin
 public   | financing_chinawealth                    | 资料表 | calvin
 public   | whoispider_domain                        | 资料表 | calvin
(7 行记录)

calvin=# select count(*) from alphastock_company_info;
 count 
-------
  3596
(1 行记录)

calvin=# select count(*) from alphastock_company_ipo ;
 count 
-------
  3596
(1 行记录)

calvin=# select count(*) from alphastock_stock_code ;
 count 
-------
  3596
(1 行记录)

calvin=# select count(*) from alphastock_stock_kline ;
  count  
---------
 8826375
(1 行记录)

calvin=# select count(*) from financing_chinawealth ;
calvin-# ;
 count  
--------
 168148
(1 行记录)

第一屏输出

Q | 2018-02-07T20:28:07.978745 0.000869 | select count(*) from alphastock_company_info;
Q | 2018-02-07T20:28:10.427744 0.000605 | select count(*) from alphastock_company_ipo ;
Q | 2018-02-07T20:28:12.923744 0.000737 | select count(*) from alphastock_stock_code ;
Q | 2018-02-07T20:28:15.291747 42.884759 | select count(*) from alphastock_stock_kline ;
Q | 2018-02-07T20:29:35.218747 3.505407 | select count(*) from financing_chinawealth ;
...

Q开头的行为一条SQL耗时统计,各列是开始执行时间戳、执行耗时、SQL语句。

可以看到表alphastock_stock_kline很大,SQLselect count(*) from alphastock_stock_kline花了42秒,表alphastock_company_ipo很小,SQLselect count(*) from alphastock_company_ipo花了0.6毫秒。

整个采集统计过程完全以旁路方式进行,不影响应用也无需侵入应用。

最后

欢迎使用tcplstat,如果你使用中碰到了问题请告诉我,谢谢 ^_^

源码托管地址 : 开源中国github

作者邮箱 : 网易Gmail

 相关资料
  • tcpdump 命令行语法基本命令 tcpdump -nn 参数 描述 Verbose 定义日志输出级别: -v -vv -vvv v 越多,输出的日志越详细。示例 tcpdump -nn -v Snaplen -s SIZE RHEL 6 之后的 tcpdump 抓取数据包时每个包的默认抓取长度为 65535 字节,而旧版本(RHEL5 之前)的 tcpdump 每个包默认抓取长度为 68 字节

  • 问题内容: 我可以在Java监视程序上创建网络流量吗?该程序必须控制从计算机程序(包括OS模块)到网络驱动程序再返回的所有网络流量。如果是,如何? 注意: 我不仅要监视流量,还要对其进行控制。我想在Windows NT上实现这样的系统。仅靠Java无法实现它。如何在JNI的帮助下执行它? 也许是另一个变体。我不熟悉Windows服务,但仍然如此。我将在C 上编写一个程序并将其注册为Windows服

  • 我对普罗米修斯很陌生。我目前是一名在职学生,我的任务是为运行在客户端的服务器构建一个监控系统(我们无法访问)。我已经在客户端安装了节点导出器和从Prometheus服务(Ubuntu VM、Kubernetes节点)。我们有一个集中的主Prometheus服务器和托管在AWS上的Grafana,但它无法连接到客户端Prometheus服务器。 有没有什么方法可以让从Prometheus将指标推送到

  • ManageEngine OpManager 是一款全面的网络监视软件,可为网络管理员提供集成控制台,用于管理路由器,防火墙,服务器,交换机和打印机。

  • Cnyunwei-Cacti+Nagios 是一个基于CentOS 系统集成Cacti、Nagios、Centreon、Check_MK、Nconf的全自动安装系统,并集成Cacti的相关常用插件,及集成Nconf在线配置 Nagios,及集成简单实用的MySQL数据库管理工具phpMyAdmin等实用工具,省去自己一步一步安装的麻烦, 集成了我们运维最常用的插件,足以应付我们日常的工作需要,集成

  • 本文向大家介绍iOS实时监控网络状态的改变,包括了iOS实时监控网络状态的改变的使用技巧和注意事项,需要的朋友参考一下 在网络应用中,有的时候需要对用户设备的网络状态进行实时监控,有两个目的:  (1)让用户了解自己的网络状态,防止一些误会(比如怪应用无能)  (2)根据用户的网络状态进行智能处理,节省用户流量,提高用户体验    WIFI网络:自动下载高清图片    4G/3G网络:只下载缩略图