tcprstat源码分析之tcp数据包分析
tcprstat是percona用来监测mysql响应时间的。不过对于任何运行在TCP协议上的响应时间,都可以用。本文主要做源码分析,如何使用tcprstat请大家查看博文《tcprstat分析服务的响应速度利器》
tcprstat和tcpdump一样,使用libpcap库进行抓包,然后再通过程序对抓取的tcp包进行分析。
tcprstat对tcp包分析的大概流程如下:
1、通过分析来源ip和目标ip,看那个ip是本地ip,来判断是进来的包(请求包)还是出去的包(响应包)。
2、如果包的数据大小为0,那么就跳过,不再处理。数据大小为0的视为tcp控制包。
3、如果数据包为进来的包(请求包),则插入一条记录到哈希表。
4、如果数据包为出去的包(响应包),则用现在的包和之前插入哈希表中的响应包做时间差计算。并把之前的包在哈希表中删除。
数据包分析的代码在process-packet.c文件中,方法如下:
| 
 1 
2 
3 
4 
5 
6 
7 
8 
9 
10 
11 
12 
13 
14 
15 
16 
17 
18 
19 
20 
21 
22 
23 
24 
25 
26 
27 
28 
29 
30 
31 
32 
33 
34 
35 
36 
37 
38 
39 
40 
41 
42 
43 
44 
45 
46 
47 
48 
49 
50 
51 
52 
53 
54 
55 
56 
57 
58 
59 
60 
61 
62 
63 
64 
65 
66 
67 
68 
69 
70 
 | 
intprocess_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 方法用户获取头信息。
tcprstat源码分析之tcp数据包分析的更多相关文章
- 《Wireshark数据包分析实战》 - http背后,tcp/ip抓包分析
		
作为网络开发人员,使用fiddler无疑是最好的选择,方便易用功能强. 但是什么作为爱学习的同学,是不应该止步于http协议的,学习wireshark则可以满足这方面的需求.wireshark作为抓取 ...
 - snmp数据包分析
		
今天看了一下snmp数据包的报文格式,用wireshark抓了两个数据包来分析. 先说说snmp get-request的书报包格式吧,get-next-request,get-response,se ...
 - Fiddler抓取数据包分析案例
		
案例:利用Fiddler抓取苏宁易购网站数据包分析 抓包软件:Fiddler4 请求名字:www.suning.com 详细内容: 一.了解数据包区域的字段含义 图1数据包区域 #:顺序号,按照抓包的 ...
 - 从linux源码看socket(tcp)的timeout
		
从linux源码看socket(tcp)的timeout 前言 网络编程中超时时间是一个重要但又容易被忽略的问题,对其的设置需要仔细斟酌.在经历了数次物理机宕机之后,笔者详细的考察了在网络编程(tcp ...
 - 从Linux源码看Socket(TCP)Client端的Connect
		
从Linux源码看Socket(TCP)Client端的Connect 前言 笔者一直觉得如果能知道从应用到框架再到操作系统的每一处代码,是一件Exciting的事情. 今天笔者就来从Linux源码的 ...
 - 从Linux源码看Socket(TCP)的listen及连接队列
		
从Linux源码看Socket(TCP)的listen及连接队列 前言 笔者一直觉得如果能知道从应用到框架再到操作系统的每一处代码,是一件Exciting的事情. 今天笔者就来从Linux源码的角度看 ...
 - 从Linux源码看Socket(TCP)的accept
		
从Linux源码看Socket(TCP)的accept 前言 笔者一直觉得如果能知道从应用到框架再到操作系统的每一处代码,是一件Exciting的事情. 今天笔者就从Linux源码的角度看下Serve ...
 - WireShark数据包分析数据封装
		
WireShark数据包分析数据封装 数据封装(Data Encapsulation)是指将协议数据单元(PDU)封装在一组协议头和尾中的过程.在OSI七层参考模型中,每层主要负责与其它机器上的对等层 ...
 - Wireshark抓包工具--TCP数据包seq ack等解读
		
1.Wireshark的数据包详情窗口,如果是用中括号[]括起来的,表示注释,在数据包中不占字节 2.在二进制窗口中,如“DD 3D”,表示两个字节,一个字节8位 3.TCP数据包中,seq表示这个包 ...
 
随机推荐
- 使用shell脚本获取虚拟机中cpu使用率(读/proc/statc)
			
#!/bin/bash interval= cpu_num=`-] -c` start_idle=() start_total=() cpu_rate=() cpu_rate_file=./`host ...
 - Linux如何修改文件/文件夹内所有文件的权限
			
一.修改文件权限 修改文件权限前,需要了解一下权限中的”rwx”与数字的对应关系,其中r=4,w=2,x=1. 例如:”drwxr-xr-x”,第一个”d”是代表文件夹,这里不用考虑,后面九个字符,每 ...
 - excel公式应用大全
			
excel公式应用大全 1.ABS函数 函数名称:ABS 主要功能:求出相应数字的绝对值. 使用格式:ABS(number) 参数说明:number代表需要求绝对值的数值或引用的单元格. 应用举例:如 ...
 - LR_问题_运行场景时提示scripts you are running in invalid
			
问题描述 脚本在virtual user generator中运行正常. 在Controller中运行场景时报错: the target you defined cannot be reached. ...
 - TCL语言笔记:TCL中的控制结构命令
			
一.引言 控制结构允许程序根据不同的状态.条件和参数来选择不同的处理和执行路径,从而使代码具有更强的灵活性.健壮性和可读性. Tcl 提供了 if.if/else.if/elseif.foreach. ...
 - Android:改变Activity切换方式
			
overridePendingTransition(enterAnim, exitAnim); Intent intent =new Intent(this,item2.class); startAc ...
 - Servlet编写登录界面
			
package com.mhb; import java.io.IOException;import java.io.PrintWriter; import javax.servlet.Servlet ...
 - Android The content of the adapter has changed but ListView did not receive a notification
			
The content of the adapter has changed but ListView did not receive a notification. Make sure the co ...
 - Nodejs实现web静态服务器对多媒体文件的支持
			
前几天,一个同事说他写的web静态服务器不支持音视频的播放,现简单实现一下. 原理:实现http1.1协议的range部分. 其实这一点都不神秘,我们常用的下载工具,如迅雷,下载很快,还支持断点续传, ...
 - 【原创】30分钟入门 github
			
很久没更新了,这篇文章重点在github的入门使用,读者可以下载github for windows shell,边看边操作,加深印象. 好了,30分钟的愉快之旅开始吧: 一.github使用的注意事 ...