怎么用网络最好的抓包工具具最好是有 流程的

网络抓包工具的开发和实现
0、说在前面的话
1)本文将以一个初学者的角度,一步一步几乎是从0开始讲述如何完成一个基于winpcap+MFC的sniffer(嗅探器)当然我指的“0”并不是指连编程都不会,如果C/C++不知为何物那么还是别看这篇文章了,本文只有那么几点小小要求:
a.懂基本的编程语法,只会的没关系,语言这东西语法差别不大,看着看着就懂了
&&&&&&&&&b.懂一点点网络知识,起码知道OSI七层网络模型或者TCP/IP四层(也有说五层的)网络模型
&&&&&&&&&c.想学怎么做一个sniffer,而不是想来这里down代码,这种代码CSDN下载里多得是,不用来这里了
2)本文里的程序不是最优秀的,不是最牛的,甚至不知道能不能算作优秀,所以牛人可以略过此文,此文是给那些想开发但又不会开发,懂那么一点点又其实不太懂的人看的(写这个程序之前,我在MFC方面也算是这一类人:)
3)本文不讨论专业、学术内容,什么之类的都不在讨论范围之类,一切以实用为主,一切以开发出一个sniffer为核心
4)本文主要内容:
& a.工欲善其事,必先配环境——配置winpcap开发环境
b.掀起你的盖头来,让我来画你的脸——用MFC开发GUI
&c.安得广厦千万间,先画蓝图再砌砖——搭建wipcap抓包框架
d.要想从此过,留下协议头——各层网络协议头的实现
e.莫道无人能识君,其实我懂你的心——解析数据包
f.千呼万唤始出来,不抱琵琶也露面——将解析数据写到GUI上&
5)来看看我们要做的最终成果:&
&&&&&&列出监测主机的所有网卡,选择一个网卡,在混杂模式下进行监听。
捕获所有流经网卡的数据包,并利用WinPcap函数库设置过滤规则。
可以本地文件形式保存和读取已捕获的数据包信息。
分析捕获到的数据包的包头和数据,按照各种协议的格式进行格式化显示。
支持协议包括:、、、、、、&&
&&&一、工欲善其事,必先配环境——配置winpcap开发环境
&&&&&&&&1.0、背景
&&&&&&&&WinPcap(Windows
Packet Capture)是Windows平台下的链路层网络访问工具,其目的在于为Windows应用程序提供访问网络底层的能力。需要注意的是WinPcap只能把数据包从网络中抓过来(其实是复制过来,并没有真实的抓过来,感觉像是拍了张照),并不能修改数据。
&&&&&&&&“那么在哪里可以买得到呢?”,其实不用买,要得到很容易,更何况咱中国人没有为软件付费的习惯:),参看下一节,“不可或缺的东西”:
&&&&&&&&1.1、不可或缺的东西
V4.1.2:驱动程序、Dll文件
WinPcap V4.1.2
Developer’s
Pack:库文件、头文件、简单的示例程序代码和帮助文件
当然还有VisualStudio2008或者VC++6.0,本文用的是VS2008
&&&&&&&&(这玩意的下载网址就不用我介绍了吧)
1.2、配置过程
l添加头文件目录
&&&&&&&&工具-&属性-&项目和解决方案-&
VC++目录-&包含文件-&添加WinPcap开发包中的Include目录,如下图:
Tools-&Options-&Derectories-&Include
files-&添加WinPcap开发包中的Include目录,如下图:
l添加库文件目录
与上一个步骤一样,只有一小个变化,选择“库文件”,然后添加WinPcap开发包中的Lib目录,如下图:
Tools-&Options-&Derectories-&Library
files-&添加WinPcap开发包中的Lib目录,如下图:
l增加与WinPcap有关的预处理定义
&&&&&&&&项目-&项目属性-&配置属性-&预处理定义-&添加WPCAP和HAVE_REMOTE,如下图:
&&&&&&&&&&&&&&&&&&VC6:
Project-&Setting-&C/C++-&Preprocessor-&添加WPCAP和HAVE_REMOTE,如下图:
l添加wpcap.lib库文件
&&&&&&&&&&&&&&&&&&&&&&&&&&&
项目-&项目属性-&配置属性-&连接器-&命令行-&附加选项框中加入wpcap.lib,如下图:&
&&&&&&&&&&&&&&&&&&&&&&&&Project-&setting-&link-&加入wpcap.lib,如下图:
l添加pcap.h头文件
在使用WinPcap
API的所有源文件中添加#include "pcap.h”
1.3、运行测试代码
所有配置工作全部搞定,现在来运行测试代码,如果能顺利执行,那么就配置成功了。
这里的测试代码其实就是WinPcap中自带的实例,还记得“不可或缺的文件”中下载的两个文件没?从WpdPack_4_1_2.zip解压出来的文件中有Examples-pcap和Examples-remote两个文件夹,进入Examples-pcap中可以看到,里面有很多实例,任意打开一个文件夹,打开其中的.dsw文件,执行一下就知道了。
笔者这里选择的是UDPdump这个实例,执行成功的画面如下:&
第一步,打开VS,新建工程,选择“MFC应用程序”,如下图:
输入工程名,我这里命名为lixsniff,其他的没什么了,点击“确定”,进入下面这个画面,选择“基于对话框”(再多解释下,“单文档”、“多个文档”是应用于多窗口之类较为复杂的界面,我们这个程序很简单,在一个界面上就完成所有的事,所以就先最简单的“基于对话框”):
其他的没什么,点击“完成”,进入下面的画面,可以看到画面中间,写有“TODO:在此放置对话框控件”的窗口,这就是我们要画的GUI的底板啦:
&&&&&&&&&&&&&&&&&
下面把这个“底板”适当的调整一下大小,直接用鼠标拖就行了,选中按delete把默认生成的“确定”和“取消”按钮删了,我们用不着,结果如下图:
&&&&&&&&&&&&&&
MFC写GUI非常的方便,直接在控件库里拖动就行了,下面按照上一节最开始看到的最终效果图来一步一步添加控件,点击右侧的“工具箱”,可以看到有很多可供选择,如下图:
第一步,添加下拉列表,点击“工具箱”,选择“combo
box”,在“底板”上拖动,增添一个合适长宽的控件,然后右键点击此控件,选择“属性”,在“外观-Type”栏中选择“DropList”,再复制粘贴一个此控件,整体情况,如下图:
下一步,添加四个按钮:开始、结束、保存、读取。点击“工具箱”中的“button”,在“底板”增添一个适当大小的的按钮,点击此按钮,把“外观-Caption”修改为“开始”,这样,按钮上的文字就被设置为“开始”了,其他三个按钮方法相同,结果如下:
第三步,添加列表,用来显示接受到的包信息,点击“工具箱”,选择“List
Control”,添加一个适当大小的列表框控件,设置其属性,“外观-View”项设置为“Report”,“外观-single
selection”设置为“true”,如下图:
第四步,添加树形列表,显示每一个包的具体字段信息,点击“工具箱”,选择“Tree
Control”,添加一个合适大小树形列表控件,将其“属性”中的“外观”下面的“Full Row
Select”、“Has
Buttons”、“Info
Tip”、“Lines At
Root”均设置为“True”,如下图:
第五步,添加文本框,显示数据包的二进制信息,添加一个合适大小的“Edit
Control”,将“Multiline”、“Readonly”、“Auto
Vscroll”、“Horizon
Scroll”、“Vertical
Scroll”均设置为“True”,如下图:
最后,再添加若干适当大小“Edit
Control”及“Static
Text”,用于显示,并添加一个“Group
Box”它们包围起来,具体步骤就不详述了,见下图:
至此为止,所有的GUI算是画完了,表面上是完成了,但是实际上还有些数据及属性的设置需要通过后台对相应的控件来完成,如何实现这一点,将在最后一章“千呼万唤始出来,不抱琵琶也露面——将解析数据写到GUI上”详细阐述。
这一章要讲的是winpcap核心编程,首先来看一下sniffer程序的整体框架,程序主要由三个部分构成,其示意图如下:
其中,winpcap对数据的捕获主要在cmcf6Dlg.cpp中完成(偷了些懒,就没有把界面与这部分程序分开了,我得承认这不是一个好习惯),一些功能函数如解析数据包等程序在utilities.cpp中完成,协议包及类型定义在Protocol.h完成。
winpcap的主要流程如下:
1)&&&&&&&&调用pcap_findalldevs()获得网卡接口信息,一台计算机上可能有很多个网卡接口,知道有哪些接口是非常有必要的。
//初始化winpcap&&
int&Cmcf6Dlg::lixsniff_initCap()&&
&&&&devCount&=&0;&&
&&&&if(pcap_findalldevs(&alldev,&errbuf)&==-1)&&
&&&&&&&&return&-1;&&
&&&&for(dev=dev=dev-&next)&&
&&&&&&&&devCount++;&&&&&//记录设备数&&
&&&&return&0;&&
&其中 alldev与dev声明如下,主要是用来记录查找到的网卡设备
&& pcap_if_t *
&& pcap_if_t *
2)&&&&&&&&在获取了网卡接口信息后,即可调用pcap_open_live()打开指定网卡接口,winpcap将在此接口上侦听数据
"code"&class="cpp"&if&((adhandle=&pcap_open_live(dev-&name,&&//&设备名&&
&&&&&&&&&&&&&&&&&&&&&&&&&&&&&65536,&&&&&//捕获数据包长度&&
&&&&&&&&&&&&&&&&&&&&&&&&&&&&&1,&//&混杂模式&(非0意味着是混杂模式)&&
&&&&&&&&&&&&&&&&&&&&&&&&&&&&&1000,&&&&&//&读超时设置&&
&&&&&&&&&&&&&&&&&&&&&&&&&&&&&errbuf&&&&//&错误信息&&
&&&&&&&&&&&&&&&&&&&&&&&&&&&&&))&==&NULL)&&
&&&&&&&&MessageBox(_T("无法打开接口:"+CString(dev-&description)));&&&
&&&&&&&&pcap_freealldevs(alldev);&&
&&&&&&&&return&-1;&&
3)&&&&&&&&调用pcap_datalink()、pcap_compile()、pcap_setfilter()分别检查是否是以太
网,并对过滤器进行设置。网络中过来的数据有些可能不是以太网数据,这样的数据我们处理不了,所以首先要进行一个检查;而过滤器是什么呢,简单的说,网络
中过来的数据是不同层次、不同协议的,过滤器的作用就是可以设定一些的规则来查看你想要的数据包,如指定只需要TCP包。
&&&&if(pcap_datalink(adhandle)!=DLT_EN10MB)&&
&&&&&&&&MessageBox(_T("这不适合于非以太网的网络!"));&&
&&&&&&&&pcap_freealldevs(alldev);&&
&&&&&&&&return&-1;&&
&&&&if(0==filter_index)&&
&&&&&&&&char&filter[]&=&"";&&
&&&&&&&&if&(pcap_compile(adhandle,&&fcode,&filter,&1,&netmask)&&0&)&&
&&&&&&&&{&&
&&&&&&&&&&&&MessageBox(_T("语法错误,无法编译过滤器"));&&
&&&&&&&&&&&&pcap_freealldevs(alldev);&&
&&&&&&&&&&&&return&-1;&&
&&&&&&&&}&&
&&&&}else{&&
&&&&&&&&CString&&&
&&&&&&&&char&*&&
&&&&&&&&int&len,x;&&
&&&&&&&&this-&m_comboBoxRule.GetLBText(filter_index,str);&&
&&&&&&&&len&=&str.GetLength()+1;&&
&&&&&&&&filter&=&(char*)malloc(len);&&
&&&&&&&&for(x=0;x
&&&&&&&&{&&
&&&&&&&&&&&&filter[x]&=&str.GetAt(x);&&
&&&&&&&&}&&
&&&&&&&&if&(pcap_compile(adhandle,&&fcode,&filter,&1,&netmask)&&0&)&&
&&&&&&&&{&&
&&&&&&&&&&&&MessageBox(_T("语法错误,无法编译过滤器"));&&
&&&&&&&&&&&&pcap_freealldevs(alldev);&&
&&&&&&&&&&&&return&-1;&&
&&&&&&&&}&&
&&&&if&(pcap_setfilter(adhandle,&&fcode)&0)&&
&&&&&&&&MessageBox(_T("设置过滤器错误"));&&
&&&&&&&&pcap_freealldevs(alldev);&&
&&&&&&&&return&-1;&&
4)&&&&&&&&调用pcap_dump_open()先创建一个文件,捕获的数据将会存储到此文件中,后面捕获的数据包将会实时地写入一个临
时文件,文件默认存储在工程中的SaveData文件中,文件名为存储时的时间,如在日14:15:16存储的,那么其文件名即为
16,在捕获数据结束时,用户可以选择将此文件存储于指定路径。
dumpfile&=&pcap_dump_open(adhandle,&filepath);&&
if(dumpfile==NULL)&&
&&&&&&&&&MessageBox(_T("文件创建错误!"));&&
&&&&&&&&&return&-1;&&
5)&&&&&&&&完成以上设置后,即可开始捕获数据包了。调用CreateThread()创建一个新的线程,调用
lixsinff_CapThread()函数在线程中完成数据包的捕获工作。为什么要新建一个线程来完成这项工作?那是因为我们的主进程是一个
Dialog(对话框),它主要的任务是处理界面交互,而数据捕获是一项后台工作,将数据包的捕获与界面进程分离,可以提高程序效率,避免了二者的干扰。
LPDWORD&threadCap=NULL;&&
m_ThreadHandle=CreateThread(NULL,0,lixsinff_CapThread,this,0,threadCap);&&
if(m_ThreadHandle==NULL)&&
&&&&int&code=GetLastError();&&
&&&&CString&&&
&&&&str.Format(_T("创建线程错误,代码为%d."),code);&&
&&&&MessageBox(str);&&
&&&&return&-1;&&
6)在lixsinff_CapThread()中调用pcap_next_ex()函数进行数据包捕获,每到达一个数据包,调用自定义的包处理函数analyze_frame()完成对捕获数据的解析。注:对于analyze_frame()函数将在第五章专门介绍其工作流程。
while((res&=&pcap_next_ex(&pthis-&adhandle,&&header,&&pkt_data))&&=&0)&&
&&&&&&&&if(res&==&0)&&&&&&&&&&&&&&&&//超时&&
&&&&&&&&&&&&continue;&&
&&&&&&&&&&
&&&&&&&&struct&datapkt&*data&=&(struct&datapkt*)malloc(sizeof(struct&datapkt));&&&&&&&
&&&&&&&&memset(data,0,sizeof(struct&datapkt));&&
&&&&&&&&if(NULL&==&data)&&
&&&&&&&&{&&
&&&&&&&&&&&&MessageBox(NULL,_T("空间已满,无法接收新的数据包"),_T("Error"),MB_OK);&&
&&&&&&&&&&&&return&-1;&&
&&&&&&&&}&&
&&&&&&&&//分析出错或所接收数据包不在处理范围内&&
&&&&&&&&if(analyze_frame(pkt_data,data,&(pthis-&npacket))&0)&&
&&&&&&&&&&&&continue;&&&&
…….(以下省略)&&
7)&&&&&&&&经过analyze_frame()函数处理后将相关数据更新到GUI。这一点第六章会讲到。
&以下是cmcf6Dlg.h以及cmcf6Dlg.cpp的源代码,也就是我们的主程序代码,在代码中可以看到完整的实现过程,实际上对于如何将数据写到GUI上已经大体从这里可以看得出来了:)
下一章:要想从此过,留下协议头——各层网络协议头的实现
cmcf6Dlg.h:
//&mcf6Dlg.h&:&头文件&&
#pragma&once&&
#include&"afxcmn.h"&&
#include&"afxwin.h"&&
#include"pcap.h"&&
#include&"Protocol.h"&&
#include&"utilities.h"&&
//&Cmcf6Dlg&对话框&&
class&Cmcf6Dlg&:&public&CDialog&&
&&&&Cmcf6Dlg(CWnd*&pParent&=&NULL);&//&标准构造函数&&
&&&&/////////////////////////////////////////////[my&fuction]//////////////////////////////////////////////&&
&&&&int&lixsniff_initCap();&&
&&&&int&lixsniff_startCap();&&
&&&&int&lixsniff_updateTree(int&index);&&
&&&&int&lixsniff_updateEdit(int&index);&&
&&&&int&lixsniff_updateNPacket();&&
&&&&int&lixsniff_saveFile();&&
&&&&int&lixsniff_readFile(CString&path);&&
&&&&//////////////////////////////////////////////[my&data]/////////////////////////////////////////////&&
&&&&int&devC&&
&&&&struct&pktcount&&&&&&&&&&&&&&&&&//各类数据包计数&&
&&&&char&errbuf[PCAP_ERRBUF_SIZE];&&
&&&&pcap_if_t&*&&
&&&&pcap_if_t&*&&
&&&&pcap_t&*&&
&&&&pcap_dumper_t&*&&
&&&&char&filepath[512];&&&&&&&&&&&&&&&&&&&&&&&&&//&&文件保存路径&&
&&&&char&filename[64];&&&&&&&&&&&&&&&&&&&&&&&&&&//&&文件名称&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&
&&&&HANDLE&m_ThreadH&&&&&&&&&&//线程&&
&&&&CPtrList&m_pktL&&&&&&&&&&&&&&&&&&&&&&&&&//捕获包所存放的链表&&
//&对话框数据&&
&&&&enum&{&IDD&=&IDD_MCF6_DIALOG&};&&
&&&&protected:&&
&&&&virtual&void&DoDataExchange(CDataExchange*&pDX);&&&&//&DDX/DDV&支持&&
protected:&&
&&&&HICON&m_hI&&
&&&&//&生成的消息映射函数&&
&&&&virtual&BOOL&OnInitDialog();&&
&&&&afx_msg&void&OnSysCommand(UINT&nID,&LPARAM&lParam);&&
&&&&afx_msg&void&OnPaint();&&
&&&&afx_msg&HCURSOR&OnQueryDragIcon();&&
&&&&DECLARE_MESSAGE_MAP()&&
&&&&CListCtrl&m_listC&&
&&&&CComboBox&m_comboB&&
&&&&CComboBox&m_comboBoxR&&
&&&&CTreeCtrl&m_treeC&&
&&&&CEdit&m_&&
&&&&afx_msg&void&OnBnClickeon1();&&
&&&&afx_msg&void&OnBnClickeon2();&&
&&&&CButton&m_buttonS&&
&&&&CButton&m_buttonS&&
&&&&CPtrList&m_localDataL&&&&&&&&&&&&&&&//保存被本地化后的数据包&&
&&&&CPtrList&m_netDataL&&&&&&&&&&&&&&&&&//保存从网络中直接获取的数据包&&
&&&&CBitmapButton&m_bitButton&&&;&&&&&&&//图片按钮&&
&&&&int&&&
&&&&afx_msg&void&OnLvnItemchangedList1(NMHDR&*pNMHDR,&LRESULT&*pResult);&&
&&&&CEdit&m_editNT&&
&&&&CEdit&m_editNU&&
&&&&CEdit&m_editNI&&
&&&&CEdit&m_editNIp;&&
&&&&CEdit&m_editNA&&
&&&&CEdit&m_editNH&&
&&&&CEdit&m_editNO&&
&&&&CEdit&m_editNS&&
&&&&afx_msg&void&OnNMCustomdrawList1(NMHDR&*pNMHDR,&LRESULT&*pResult);&&
&&&&afx_msg&void&OnBnClickeon5();&&
&&&&CButton&m_buttonS&&
&&&&CButton&m_buttonR&&
&&&&afx_msg&void&OnBnClickeon4();&&
&&&&CEdit&m_editNIpv4;&&
&&&&CEdit&m_editIcmpv6;&&
来源:http://blog.csdn.net/litingli/article/details/5950962
本人个人开发实现了以后认为如果用QT来开发会相对更容易一些,而且界面也更加友好。
已投稿到:
以上网友发言只代表其个人观点,不代表新浪网的观点或立场。如何用抓包工具分析出有用的网络数据_百度知道
如何用抓包工具分析出有用的网络数据
我用的供涪垛皇艹郝讹酮番捆是HttpAnalyzerStdV6,我想用这个工具分析出例如我登陆163邮箱时我的用户名和密码是用什么样的数据格式发送到哪一个网络文件中去的。要详细一点最好有视频教程。
我有更好的答案
这些内容都是加密的,抓包是分析不出来的!!
我分析出了一些,你看哪些有用,我只想知道密码和账号以什么样的格式向目标页提交数据的,目标页又是图中的哪个地址。
第一行应该就是你说的目标页,用户名和密码你是看不到的,!!
我只想知道账号和密码是以什么样的形式发送的,格式,
密文方式。。你这个看不到,如果你用wireshark的话,你会看到高层相关部分都是不可读的,类似乱码的!!
其他类似问题
为您推荐:
您可能关注的推广
抓包工具的相关知识
等待您来回答
下载知道APP
随时随地咨询
出门在外也不愁1 位朋友发表了看法
这个值得收藏!!
深蓝软件 | 蜀ICP备号-1 | Powered By zBlog |HTTP调试工具 fiddler图文使用教程详细介绍(附软件下载)
作者:佚名
字体:[ ] 来源:互联网 时间:09-26 15:55:00
Fiddler可以帮您记录,调试Microsoft Internet Explorer与Web应用程序的交互,找到Web程序运行性能的瓶颈,还有如查看向Web服务器发送cookies的内容,下载内容的大小等功能
Fiddler可以帮您记录,调试Microsoft Internet Explorer与Web应用程序的交互,找到Web程序运行性能的瓶颈,还有如查看向Web服务器发送cookies的内容,下载内容的大小等功能。&
说多一点是,Fiddler站在用户与Web服务器的中间,由它转发请求与响应,因此Fiddler作为一个可检视,可定制的工具,能让您了解交互过程细节,有利于解决Web程序的交互问题。如下列示意图:&
Internet Explorer &-& WinINET? (由Fiddler运行时自动注册) &-& Fiddler &-& Web Server&
Fiddler可以用于:&性能测试。如查看页面的大小调试。在会话选项中,可暂停,编辑HTTP通讯&。
Fiddler不仅可用于Microsoft Internet Explorer,其它浏览器,如Mozilla Firefox,Opera等也适用。软件界面友好,精于HTTP,可能比NetMon易用,还可用.NET进行扩展。官方站点上,还有视频教学。&
这个工具我已经使用比较长时间了,对我的帮助也挺大,今天我翻译的微软的文章,让更多的朋友都来了解这个不错的工具,也是我第一次翻译文章,不恰当之处请大家大家多多指正。
你是不是曾经疑惑过你的web程序和IE是如何交互的?你是不是遇到过一些奇怪的而你又无法解决的性能瓶颈?你是不是对那些发送给服务器端的cookie 和那些你下载下来的被标记为可缓存的内容感到好奇?
Fiddler官方网站及下载地址:/Fiddler/dev/
微 软的Fiddler能够帮助你回答以上的问题,不但如此,它还是一个http调试代理,它能 够记录所有的你电脑和互联网之间的http通讯,Fiddler 可以也可以让你检查所有的http通讯,设置断点,以及Fiddle 所有的&进出&的数据(指cookie,html,js,css等文件,这些都可以让你胡乱修改的意思)。 Fiddler 要比其他的网络调试器要更加简单,因为它仅仅暴露http通讯还有提供一个用户友好的格式。
Fiddler 包含一个简单却功能强大的基于JScript .NET 事件脚本子系统,他非常灵活性非常棒,可以支持众多的http调试任务。Fiddler 是用C#写出来的。
。。。。。接下来是一大段废话,关于如何安装的,只要一路next,就可以了。这段话我就跳过,直接切入正题了。
Running Fiddler
当你启动了Fiddler,程序将会把自己作为一个微软互联网服务的系统代理中去。你可以通过检查代理设置对话框来验证Fiddler是被正确地截取了web请求。操作是这样的:点击IE设置,工具,局域网设置,最后点击高级。
作为系统代理,所有的来自微软互联网服务(WinInet)的http请求再到达目标Web服务器的之前都会经过Fiddle,同样的,所有的Http响应都会在返回客户端之前流经Fiddler。这样,就能明白Fiddler很多作用了吧!
当你关闭Fiddler的时候,它就会自动从系统注册表中移出,换句话说,当你关闭了Fiddler后,不会占着茅坑不拉屎。
下面,是一个Fillder的用户界面,大家可以参考参考其功能。
用Fiddler来做性能测试 HTTP统计视图通 过显示所有的Http通讯,Fiddler可以轻松的演示哪些用来生成一个页面,通过统计页 面(就是Fiddler左边的那个大框)用户可以很轻松的使用多选,来得到一个WEB页面的&总重量&(页面文件以及相关js,css等)你也可以很轻松 得看到你请求的某个页面,总共请求了多少次,以及多少字节被转化了。
另外,通过暴露HTTP头,用户可以看见哪些页面被允许在客户端或者是代理端进行缓存。如果要是一个响应没有包含Cache-Control 头,那么他就不会被缓存在客户端。
用Fiddler来调试&
Fiddler支持断点调试概念,当你在软件的菜单&rules&automatic breakpoints选项选择beforerequest,或者当这些请求或响应属性能够跟目标的标准相匹配,Fiddler就能够暂停Http通讯, 情切允许修改请求和响应。这种功能对于安全测试是非常有用的,当然也可以用来做一般的功能测试,因为所有的代码路径都可以用来演习。
Session检查用 户可以在BuilderPage项种来以手工的方式来创建一个HTTP请求(即在 Fiddler右侧的tab的第三个,RequestBUILDER),或者可以使用拖拽操作从Session列表中来移动一个已经存在的请求到 builder page 来再次执行这个请求。。。
Fiddler 扩展Fiddler可以使用 .来对它进行扩展。有2种为Fiddler扩展准备的基本机制:
自定义规则,和规则检查。
使用脚本化的规则来扩展Fiddler
Fiddler支持JScript .NET引擎,它可以允许用户自动地修改Http请求和响应。这个引擎能够在可视化界面修改在FiddlerUI中的Session,可以从列表中提取你感兴趣的错误,也可以移除你不感兴趣的Session。&
以下的示例代码演示当cookie被加载的时候把界面变成紫色。
static function OnBeforeRequest(oSession:Fiddler.Session){ if (oSession.oRequest.headers.Exists(&Cookie&)){ oSession[&ui-color&] = &purple&; oSession[&ui-bold&] = &cookie&; }}
通过加入Inspectors来扩展Fiddler用户可以加入一个Inspector插件对象,来使用.net下的任何语言来编写Fiddler扩展。RequestInspectors 和 ResponseInspectors提供一个格式规范的,或者是被指定的(用户自定义)Http请求和响应视图。
默认安装中,Fiddler加入了一下的Inspectors:
Request Inspectors
[RW] Headers&Shows request headers and status.&
[RW] TextView&Shows the request body in a text box. (原始的请求body视图)
[RW] HexView&Shows the request body in a hexadecimal view. (body的16进制视图)
[RO] XML&Shows the request body as an XML DOM in a tree view.(以XML方式展示请求)
Response Inspectors
[RW] Transformer&Removes GZip, DEFLATE, and CHUNKED encodings for easier debugging.&
[RW] Headers&Shows response headers and status.&
[RW] TextView&Shows the response body in a text box.&
[RW] HexView&Shows the response body in a hexadecimal view. (16进制视图)
[RO] ImageView&Shows the response body as an Image. Supports all .NET image formats.
[RO] XML&Shows the response body as an XML DOM in a tree view.&
[RO] Privacy&Explains the P3P statement in the response headers, if present.(如果在响应头中有关于隐私策略的说明就展示出来)
学习如何通过Fiddler建立一个速度更快的网站。在这篇文章中,我们将使用Fiddler去探究HTTP的性能,缓存,以及压缩。
如果你要是没有安装和配置过Fiddler, 请从文章的第一篇开始。
HTTP性能总览毫 无疑问用户都喜欢访问速度快的网站。用户是非常的不耐烦,除非你的网站是没有竞争对手,换句 话就是处于垄断地位的。如果你的访问者来自世界各地,那你就必须要保证你的网站在执行效率方面要非常好,甚至要更加标准。作为一个国际化的网络连接点,通 常要受到来自两个方面的压力:高访问量以及低带宽。
在第一次至关重要的访问中,用户必须要下载每一个内容片断,来生成页面,包括JS,CSS,Images,HTML,如果你的页面太难加载(包括IIS接到请求执行并返回给客户端HTML),访问者也许就会离开你的页面!
通过暴露所有的HTTP通讯,Fiddler很容易得向你展示哪些文件经常被用于生成一个页面,
Shift+click 可以在Fiddler左边框的会话列表中多选会话,来计算那些被选会话的&页面总重量&。那些被转换成字节的数量。
如果你想让你的客户在第一次访问的时候就留下深刻的印象 ,那么最好的,也是唯一的途径就是返回给客户更少的文件。
1 使用更少的图画
2 将所有的CSS浓缩到一个CSS文件中
3 将所有的脚本浓缩到一个JS文件中
4 简化你的页面时间
5 使用HTTP压缩
如果要是你已经对用户的第一次来访的性能进行了优化,那么你可以通过Http 缓存的优势来使得你的网站访问速度更快!
HTTP 缓存介绍&2种方式来提升你的web 应用程序的速度:
减少请求和响应的往返次数
减少请求和响应的往返字节大小。
HTTP 缓存是最好的减少客户端服务器端往返次数的办法。缓存提供了提供一种机制来保证客户端 或者代理能够存储一些东西,而这些东西将会在稍后的HTTP 响应中用到的。(即第一次请求了,到了客户端,缓存起来,下次如果页面还要这个JS文件或者CSS文件啥的,就不要到服务器端去取下来了,但是还是要去服 务器上去访问一次,因为请求要对比ETAG值,关于这个值,我将会在下次翻译中介绍其作用)这样,就不用让文件再次跨越整个网络了。&
缓存相关的请求头&
为了提高性能,微软的IE和其他的web客户端总是想尽办法来维持从远程服务器上下载下来的本地的缓存。
当客户端需要一个资源(html,css.js&),他们有3种可能的动作:
1 发送一个一般的HTTP请求到远程服务器端,请求这个资源。
2 发送一个有条件的HTTP请求到服务器,条件就是如果它不同于本地的缓存版本。
3 如果缓存的拷贝可用,就使用本地的缓存资源。
当发送一个请求,客户也许会使用如下的几个HEADER
Table 1. Client Cache Headers
Pragma: no-cache
The client is unwilling to accept any cached responses from caches along the route and the origin server must be contacted for a fresh copy of the resource.
If-Modified-Since: datetime
The server should return the requested resource only if the resource has been modified since the date-time provided by the client.
If-None-Match: etagvalue
The server should return the requested resource if the ETAG of the resource is different than the value provided by the client. An&ETAG&is a unique identifier representing a particular version of a file.
1 Pragma:no-cache 表明客户端不愿意接受缓存请求,它需要的是最即时的资源。
2 If-Modified-Since: datetime 表明如果这个资源自从上次被客户端请求,就已经修改了,那么服务器就会返回给客户端最新的。
3 If-None-Match: etagvalue 如果客户端资源的ETAG值跟服务器端不一致了,那么服务器端返回最新的资源。ETAG就是一个唯一的ID,用来表示一个文件的一个特定的版本。
如 果要是这些有条件的请求,也就是含有If-Modified-Since 或者 If-None-MatchHeader头的请求,服务器将会以HTTP/304 Not Modified 来作为响应,那么客户端就知道可以使用客户端的缓存了。否则,服务器将会返回一个新的响应并且客户端就会抛弃过期的缓存资源。
你 可以观察2个连贯的请求,来请求同一个图片,你会在Fiddler中发现:在第一个本地缓存 版本中,服务器返回一个含有ETAG的文件,和一个含有最后修改日期的文件,在这个第一次的请求会话中,一个本地的缓存版本已经可以使用了。这样一来,一 个有条件的请求就被创建出来。然后你再次请求这个图片的时候,他就就会响应一个本地缓存的文件,当然前提是第一次缓存的图片的ETAG值或者If- Modified-Since 值跟服务器上匹配的话,服务器就响应一个304给客户端。
Session #1
GET /images/banner.jpg HTTP/1.1
HTTP/1.1 200 OK
Date: Tue, 08 Mar :46 GMT
Content-Length: 6171
Content-Type: image/jpeg
ETag: &40c7f76e8d30c31:2fe20&
Last-Modified: Thu, 12 Jun :50 GMT
Session #2
GET /images/banner.jpg HTTP/1.1
If-Modified-Since: Thu, 12 Jun :50 GMT
If-None-Match: &40c7f76e8d30c31:2fe20&
HTTP/1.1 304 Not Modified
因为一个HTTP304响应仅仅包含头,没有body,所有它在穿越互联网的时候要比携带了资源的快很多,尽管如此,HTTP/304响应需要一个服务器的往返,但是通过细心的设置响应头,web程序员可以消除这种因素,甚至是有条件的请求。
缓存相关响应头&
通常缓存机制是由响应头来控制的。HTTP规范描述了Header控制缓存,The optional Cache-Control,Expires(过期)。
Expires头包含一个绝对的日期,当超过此日期,它将不会被考虑更新了。
Table 2. Common Cache-Control Headers
The response may be stored in any cache, including caches shared among many users.
The response may only be stored in a private cache used by a single user.
The response should not be reused to satisfy future requests.
The response should not be reused to satisfy future requests, and should not be written to disk. This is primarily used as a security measure for sensitive responses.
max-age=#seconds
The response may be reused to satisfy future requests within a certain number of seconds.
must-revalidate
The response may be reused to satisfy future requests, but the origin server should first be contacted to verify that the response is still fresh.
Cache-Control头的参数设置:
Public 响应会被缓存,并且在多用户间共享。
Private 响应只能够作为私有的缓存,不能再用户间共享。
No-cache 响应不会被缓存
No-store 响应不会被缓存,并且不会被写入到客户端的磁盘里,这也是基于安全考虑的某些敏感的响应才会使用这个。
Max-age=#seconds 响应将会某个指定的秒数内缓存,一旦时间过了,就不会被缓存。
Must-revalidate 响应会被重用来满足接下来的请求,但是它必须到服务器端去验证它是不是仍然是最新的。
如果你要想在iis中配置缓存,请参阅温软的知识技术文章:
你可以学习更多关于在asp.net中使用缓存的知识文章:
如果你发现你经常在你的网站上更新文件,但是并没有更改文件名字,那你就必须要非常小心地设置 你的缓存生存时间。例如:如果你要一个thisyear.gif图片文件显示当前的年份在网站上,你需要保证这个缓存过期时间不能超过一天,否则一个用户 在12月31号访问你的网站的时候,在1月1号就不能显示正确的日期。
由于某些原因,服务器可能会设置:Progma:no-cache 头,Cache-control:no-cache
Header中的参数:Vary 是一个缓存信号,Vary:User-Agent表示缓存当前的响应,但是仅限于当发送同样的User-Agent 头的时候。指令 Vary:* 就相当于Cache-Control:no-Cache。
Vary就相当于asp.net中的缓存的参数一样,意思是根据什么来缓存,如果要是知道asp.net的缓存的使用方法,就很容易明白这个参数的意思。
使用HTTP会话列表,Fiddler用户可以看到在页面里包含的HTTP缓存头。
Fiddler 会话列表如果响应不包含Expires或者Cache-Control,那么客户端就会被迫作为一个有条件的请求,来保证所有的资源都是最新的。
有条件的请求和WinInetCache
IE通过Microsoft windows Internet Services来最大程度的利用缓存服务。WinInet允许用户配置缓存的大小和行为,设置缓存进行如下操作:
1 打开IE,
2 工具选项,选择Inrernet选项,在一般子选项中,临时文件夹内,点击设置
下图就是选村的四种设置:
标记性能问题:你可以使用Fiddler的自定义规则来标记某些你需要的,比如如果某个响应大于25KB,你可以把当前的Session标记为红色,更加醒目。以下代码都是在OnBeforeResponse事件中:
// Flag files over 25KB if (oSession.responseBodyBytes.length & 25000){ oSession[&ui-color&] = &red&; oSession[&ui-bold&] = &true&; oSession[&ui-customcolumn&] = &Large file&; }同样,你也可以标记响应并不指示缓存信息。 // Mark files which do not have caching informationif (!oSession.oResponse.headers.Exists(&Expires&) &&!oSession.oResponse.headers.Exists(&Cache-Control&)){ oSession[&ui-color&] = &purple&; oSession[&ui-bold&] = &true&; }介绍HTTP压缩所有的目前流行的WEB服务器和浏览器都提供HTTP压缩支持。 HTTP压缩可以非常显著地降 低客户端和服务器端的通讯量。节省超过50%的HTML,XML,CSS,JS等文件。一个浏览器发送一个信号给服务器,他可以介绍HTTP压缩过的内 容,并且会把客户端所支持的压缩类型放在请求的Header中,例如:考虑如下的请求:
GET / HTTP/1.1Accept: */*Accept-Language: en-usAccept-Encoding: gzip, deflateUser-Agent: Mozilla/4.0 ( MSIE 6.0; Windows NT 5.1; SV1; .NET CLR 1.1.4322)Host: 这个 Accept-Encoding 头表明IE将愿意接受GZIP格式的和DEFLATE格式的压缩响应。
相应的响应如下:
HTTP/1.1 200 OKContent-Type: text/ charset=utf-8Server: Microsoft-IIS/6.0 --Microsoft-HTTPAPI/1.0X-Powered-By: ASP.NETVary: Accept-EncodingContent-Encoding: gzipDate: Tue, 15 Feb :36 GMTContent-Length: 1277Connection: closeCache-Control: private, max-age=3600 你可以使用Fiddler来解压缩这些数据。实验表明,使 用HTTP压缩能大量减少数据往返, 一个普通的CSS文件甚至能减少80%!当然压缩是以牺牲CPU性能为代价的。特别是压缩动态文件,但是一般的权宜之策是压缩例如JS,CSS等静态文 件,因为他们在第一次压缩后,就会被存储在服务器上,如果要压缩asp.net动态文件,一定要有个权衡才行
Fiddler(HTTP调试抓包工具)下载地址:
大家感兴趣的内容
12345678910
最近更新的内容

我要回帖

更多关于 最好的抓包工具 的文章

 

随机推荐