网络协议分析前端
原文博客地址:网络协议分析git
知乎专栏&&简书专题:前端进击者(知乎)&&前端进击者(简书)github
关于Fiddler: Fiddler是一款由C#开发的免费http调试代理软件,有.net 2和.net 4两种版本。Fiddler可以记录全部的电脑和互联网之间的http通信,Fiddler 能够也能够检查全部的http通信,设置断点,以及Fiddle 全部的"进出"的数据。chrome
优势:express
a.Firebug虽然能够抓包,可是对于分析http请求的详细信息,不够强大。模拟http请求的功能也不够,且firebug经常是须要"无刷新修改",若是刷新了页面,全部的修改都不会保存; b.Wireshark是通用的抓包工具,可是比较庞大,对于只须要抓取http请求的应用来讲,彷佛有些大材小用。且Wireshark没法解密HTTPS故而选择使用fiddler来对HTTP协议进行分析; c.Httpwatch也是比较经常使用的http抓包工具,可是只支持IE和firefox浏览器(其余浏览器可能会有相应的插件),对于想要调试chrome浏览器的http请求,彷佛稍显无力,而Fiddler2 是一个使用本地 127.0.0.1:8888 的 HTTP 代理,任何可以设置 HTTP 代理为 127.0.0.1:8888 的浏览器和应用程序均可以使用 Fiddler。segmentfault
这里为体现我的特点,选择在本地服务器运行观察抓包结果,如图: 浏览器
实际上,Wireshark抓不到本地服务器发送报文,这也是Fiddler更利于开发调试的缘由之一。 HTTP协议分析(1):因为以前本地测试过,因此第一次抓到的包返回的状态码是304,清除缓存后变为正常的200,图中咱们能够看到返回的数据:"谭继臻FiddlerHTTP协议测试",这里咱们经过请求头报文能够看到请求站点(localhost:81),请求方式(XMLHttpReQuest)等信息。因为Fiddler只能抓到HTTP/HTTPS的包,关于HTTP协议的深刻分析咱们使用Wireshark进行。、缓存
关于Wireshark: Wireshark(前称Ethereal)是一个网络封包分析软件。网络封包分析软件的功能是撷取网络封包,并尽量显示出最为详细的网络封包资料。Wireshark使用WinPCAP做为接口,直接与网卡进行数据报文交换。 优势:服务器
a.使用操做很是简单,对于初级和中级网络学习者来讲是一款完美的抓包软件。网络
b.有不少小工具和小技巧能够帮助咱们更快更好的了解网络,例如filter,expression,statistics等等。
c.界面设计很简洁,给使用者一种很是清新的感受。
d.与Fiddler相比可抓取的包更广,更多,而且软件开源,用着放心。
实例分析TCP三次握手过程:
这里咱们打开哔哩哔哩网站首页观察抓包状况(www.bilibili.com/);
客户端发送一个TCP,标志位为SYN,序列号为0, 表明客户端请求创建链接。以下图:
服务器发回确认包, 标志位为 SYN,ACK. 将确认序号(Acknowledgement Number)设置为客户的I S N加1以.即0+1=1, 以下图:
客户端再次发送确认包(ACK) SYN标志位为0,ACK标志位为1.而且把服务器发来ACK的序号字段+1,放在肯定字段中发送给对方.而且在数据段放写ISN的+1,以下图:
就这样经过了TCP三次握手,创建了链接,三次握手基本结束,开始真正的数据传送阶段: 创建了三次握手后,咱们就开始利用这个连接来传送信息了。下面咱们看看通过三次握手后的第四个TCP报文段。这是服务器返回来的报文段:
咱们惊奇的发现服务器返回了ack=557,即请求第557Byte的数据,而这557Bytes是何时发出去的呢,咱们想到了在第三次握手的时候,客户端发送的TCP是可以携带数据的。怎么验证是否携带了557Bytes数据呢,咱们想到了HTTP协议封装的报文,咱们来验证一下是不是557Bytes,打开HTTP协议以下:
咱们看到,HTTP协议封装的报文,长度为Bytes in flight:556。表示已经发送了557Bytes,因此,服务器理应返回一个ack=554的确认,以表示接收到了556Bytes之前的数据,但愿接受557bytes以及之后的数据。而上面的第四个报文也正是这么作的。 服务端返回了ack=557以后,服务端没有继续停下,而是继续向客户端发送了两个报文段。咱们来看下第5、六个报文段:
第五个报文段发送了seq=557,ack=1203告诉服务端,请求你的1203数据,我这是第557个数据。发完后服务端又发送了第六个报文,以下:
服务端发送了seq=1113,ack=2400,这表示:我请求第2400Bytes,这是个人第1113Bytes,这个报文以后,服务端会继续给客户端传送数据,这里就不一一列出了。
断开链接: 断开链接时,要发送FIN=1,而且对方要回复ACK=1。咱们来看下截取的报文段。
咱们看到FIN=1。
返回了ACK=1,结束链接。
到这里HTTP协议就算分析结束了,咱们能够看到HTTP传输数据确实是靠TCP协议来完成的,因为哔哩哔哩网站内容不少,因此看起来很乱...这点没有考虑周全。
在显示筛选编辑框中输入"arp",回车,分组列表窗口将只显示ARP消息。点击第一行查看具体数据:
能够看出硬件类型(hardware type)是以太网(1),协议类型(protocol type)为0x0800,表示使用ARP的协议类型为IPV4。硬件地址长度(hardware size)为6。协议地址长度(protocol size)为4。 发送方硬件地址(sender MAC address):bc:30:7d:97:c8:08 发送方协议地址(Sender IP address):192.168.1.5 目的硬件地址(target MAC address)为00:00:00:00:00:00,表示是广播地址。 目的协议地址(target IP address)为192.168.1.1,定义目的设备的协议地址。
在cmder(也能够是通常的命令行窗口)中以www.damonare.cn(我的网站)为目标主机,在命令行窗口执行Ping命令,要求ping通10次;
中止截获报文,抓包结果:(只显示ping的数据包) 在显示筛选编辑框中输入"icmpv6",回车,分组列表窗口将只显示icmp消息。点击第一行查看具体数据:
在显示筛选编辑框中输入"ip",回车,分组列表窗口将只显示IP消息。选取一个有IP协议的数据报: