tcprstat源码分析之tcp数据包分析

tcprstat是percona用来监测mysql响应时间的。不过对于任何运行在TCP协议上的响应时间,都可以用。本文主要做源码分析,如何使用tcprstat请大家查看博文《tcprstat分析服务的响应速度利器》

tcprstat和tcpdump一样,使用libpcap库进行抓包,然后再通过程序对抓取的tcp包进行分析。
tcprstat对tcp包分析的大概流程如下:

<img src="//pic.ikafan.com/imgp/L3Byb3h5L2h0dHAvd3d3LmJvNTYuY29tL3dwLWNvbnRlbnQvdXBsb2Fkcy8yMDE0LzA2L3Byb2Nlc3NfaXAuanBn.jpg" alt="process_ip" width="552" height="313" class="alignnone size-full wp-image-396" /></a><br /> 1、通过分析来源ip和目标ip,看那个ip是本地ip,来判断是进来的包(请求包)还是出去的包(响应包)。
2、如果包的数据大小为0,那么就跳过,不再处理。数据大小为0的视为tcp控制包。
3、如果数据包为进来的包(请求包),则插入一条记录到哈希表。
4、如果数据包为出去的包(响应包),则用现在的包和之前插入哈希表中的响应包做时间差计算。并把之前的包在哈希表中删除。

数据包分析的代码在process-packet.c文件中,方法如下:

int
process_ip(pcap_t *dev, const struct ip *ip, struct timeval tv) {
    char src[16], dst[16], *addr;
    int incoming;
    unsigned len;

    addr = inet_ntoa(ip->ip_src);
    strncpy(src, addr, 15);
    src[15] = '\0';

    addr = inet_ntoa(ip->ip_dst);
    strncpy(dst, addr, 15);
    dst[15] = '\0';

    if (is_local_address(ip->ip_src))
        incoming = 0;
    else if (is_local_address(ip->ip_dst))
        incoming = 1;
    else
        return 1;

    len = htons(ip->ip_len);

    switch (ip->ip_p) {
        struct tcphdr *tcp;
        uint16_t sport, dport, lport, rport;
        unsigned datalen;

    case IPPROTO_TCP:
        tcp = (struct tcphdr *) ((unsigned char *) ip + sizeof(struct ip));

#if defined(__FAVOR_BSD)
        sport = ntohs(tcp->th_sport);
        dport = ntohs(tcp->th_dport);
        datalen = len - sizeof(struct ip) - tcp->th_off * 4;    // 4 bits offset
#else
        sport = ntohs(tcp->source);
        dport = ntohs(tcp->dest);
        datalen = len - sizeof(struct ip) - tcp->doff * 4;
#endif

        // Capture only "data" packets, ignore TCP control
        if (datalen == 0)
            break;

        if (incoming) {
            lport = dport;
            rport = sport;

            inbound(tv, ip->ip_dst, ip->ip_src, lport, rport);

        }
        else {
            lport = sport;
            rport = dport;

            outbound(tv, ip->ip_src, ip->ip_dst, lport, rport);

        }

        break;

    default:
        break;

    }

    return 0;

}

ps:在这个文件中,process_packet 方法用户获取头信息。

时间: 2024-10-30 03:13:11

tcprstat源码分析之tcp数据包分析的相关文章

《Wireshark数据包分析实战(第2版)》目录—导读

版权声明 Wireshark数据包分析实战(第2版) Copyright 2011 by Chris Sanders. Title of English-language original:Practical Packet Analysis:Using Wireshark to Solve Real-World Network Problems(2nd Edition), ISBN 978-1-59327-266-1, published by No Starch Press. Simplifi

《Wireshark数据包分析实战(第2版)》—第6章6.1节地址解析协议

第6章 通用底层网络协议 Wireshark数据包分析实战(第2版) 无论是处理延迟问题,还是甄别存在错误的应用,抑或对安全威胁进行聚焦检查,都是为了发现异常的流量,而你必须首先了解正常的流量.在下面的几章中,你将会学到正常的网络流量在数据包级别是如何工作的. 我们将介绍最常见的几种协议,包括最基础的TCP.UDP和IP,以及如HTTP.DHCP.DNS等最常用的应用层协议.在每个协议的相关部分,都会至少有一个捕获文件供你下载,并可以让你直接上手分析.在这一章中,我们将着重关注在OSI分层模型中

《Wireshark数据包分析实战(第2版)》—第6章6.3节传输控制协议

6.3 传输控制协议传输控制协议(Transmission Control Protocol, TCP)的最终目的是为数据提供可靠的端到端传输.TCP在RFC793中定义,在OSI模型中的第4层工作.它能够处理数据的顺序和错误恢复,并且最终保证数据能够到达其应到达的地方.很多普遍使用的应用层协议都依赖于TCP和IP将数据包传输到其最终目的地. 6.3.1 TCP头TCP提供了许多功能,并且反映在了其头部的复杂性上面.如图6-16所示,以下是TCP头的域. 源端口(Source Port):用来传

c#-C#网络编程使用SharpPcap.dll来抓取网络上的TCP数据包,怎么才能完整的还原抓取的数据?

问题描述 C#网络编程使用SharpPcap.dll来抓取网络上的TCP数据包,怎么才能完整的还原抓取的数据? 5C 如题,C#网络编sd程使用SharpPcap.dll来抓取网络上的TCP数据包,怎么才能完整的还原抓取的数据?我是要抓取特定的两台机器之间的数据传递,已知传递的数据包的组成规则,有这么几个问题:1.怎么才能完整的获取所有的数据包?2.获取的数据包需不需要考虑TCP数据包的重传或者错误传递的数据包? 谢谢. 解决方案 c# 使用sharppcap实现 网络抓包 使用SharpPCa

Wireshark抓包工具--TCP数据包seq ack等解读

1.Wireshark的数据包详情窗口,如果是用中括号[]括起来的,表示注释,在数据包中不占字节 2.在二进制窗口中,如"DD 3D",表示两个字节,一个字节8位 3.TCP数据包中,seq表示这个包的序号,注意,这个序号不是按1递增的,而是按tcp包内数据字节长度加上,如包内数据是21字节,而当前IP1发到IP2的包的seq是10的话,那下个IP1发到IP2的包的seq就是10+21=31 4.注意我们分析tcp包时,要以一个会话做为一个完整对象,即通讯只发生在两个IP之间,两个固定

《精通Wireshark》—第1章1.4节通过Wireshark进行数据包分析

1.4 通过Wireshark进行数据包分析 数据包分析(也称为数据包嗅探或协议分析)的作用是抓取在网络(以太网或WiFi)传输中的数据包,并且对其中的信息进行解答的过程,其目的在于了解网络中正在发生的情况.数据包分析需要借助像Wireshark这样的协议分析软件来实现,这些软件可以在互联网上进行下载.其中有些软件是免费的,也有一些软件需要付费才能用于商业目的.在本书中,我们会使用Wireshark来进行网络分析.Wireshark是一款开源软件,同时也是互联网上最优秀的免费网络分析软件. 在当

设计- 关于数据包分析程序与数据库联动系统的问题

问题描述 关于数据包分析程序与数据库联动系统的问题 各位达人:有这样一个需求从交换机映射出一个口,数据包从此口出来,要求进入一个数据包分析程序将数据包进行解析:只解析http数据包,要求提取源ip地址.目的ip地址.url,并将这几样数据写入一个数据库房. 问题如下: 1.如果此程序对速度要求较高的话用什么程序编写数据包分析程序. 谢谢. 解决方案 如果我来做这个程序的话,我会这样做: 用C来编写这个程序: 数据库假如可以选择的话,用SQLite: 首先将来自交换机映射的端口数据包过滤,过滤条件

《Wireshark数据包分析实战(第2版)》—第6章6.5节互联网控制消息协议

6.5 互联网控制消息协议互联网控制消息协议(Internet Control Message Protocol, ICMP)是TCP/IP协议族中的一个效用协议,负责提供在TCP/IP网络上设备.服务以及路由器可用性的信息.大多数网络检修技巧和工具都是基于常用的ICMP消息类型.ICMP在RFC792中定义. 6.5.1 ICMP头ICMP是IP的一部分并依赖IP来传递消息.ICMP头相对较小并根据用途而改变.如图6-29所示,ICMP头包含了以下几个域. 类型(Type):ICMP消息基于R

基于数据包分析的大数据技术解决网络安全问题

1.网络攻击简介 网络攻击是利用网络存在的漏洞和安全缺陷对网络系统的硬件.软件及其系统中的数据进行的攻击.网络信息系统所面临而对威胁来自很多方面,而且会随着时间的变化而变化.从宏观上看,这些威胁可分为人为威胁和自然威胁. 自然威胁来自于各种自然灾害.恶劣的场地环境.电磁干扰.网络设备的自然老化等.这些威胁是无目的性的,但会对网络通信系统造成损害,威胁通信安全. 而人为威胁是对网络信息系统的人为攻击,通常是通过寻找系统的弱点,以非授权方式达到破坏.欺骗和窃取数据信息等目的.两者相比,精心设计的人为