抓包分析

TCP协议规定HTTP进程的服务器端口号为80,通常,由HTTP客户端发起一个请求,建立一个到服务器指定端口(默认是80端口)的TCP连接。(注意这里指的是服务器开发的端口80)HTTP服务器则在那个端口监听客户端发送过来的请求。

开启wireshark抓包,过滤http协议,File–Export Objects–HTTP 选择需要导出的包,然后点击save As按钮,用于查看后台上传和下载的文件:wireshark导出http下载或post上传的文件

wireshark导出数据:

导出解码后的报文内容,包含详细报文和简单数据信息, "Save as Type" 为 "Plain Text"

仅导出指定的数据信息摘要,Export as CSV (Comma Separated Values) File

访问www.baidu.com的流程

对于直接通过Ethernet联网的机器,Wireshark Capture Filter为"hostwww.baidu.com";对于通过PPP over Ethernet(PPPoE)联网的机器,Wireshark Capture Filter为"pppoes and hostwww.baidu.com"。

三次握手建立TCP连接的流程如下:

   C(Browser)                                    S(www.baidu.com)
  CLOSED                                             LISTEN
 SYN-SENT    →<SEQ=0><CTL=SYN>              → SYN-RECEIVED
 ESTABLISHED← <SEQ=0><ACK=1><CTL=SYN,ACK> ← SYN-RECEIVED
 ESTABLISHED→ <SEQ=1><ACK=1><CTL=ACK>      → ESTABLISHED

S调用socket的listen函数进入监听状态;C调用connect函数连接S:[SYN],S调用accept函数接受C的连接并发起与C方向上的连接:[SYN,ACK]。C发送[ACK]完成三次握手,connect函数返回;S收到C发送的[ACK]后,accept函数返回。

关于Seq和Ack

  Seq即Sequence Number,为源端(source)的发送序列号;Ack即Acknowledgment Number,为目的端(destination)的接收确认序列号。在Wireshark Display Filter中,可使用tcp.seq或tcp.ack过滤。

  在Packet1中,C:5672向S:80发送SYN握手包,Seq=0;在Packet2中,S:80向C:5672发送ACK握手回应包,Ack=1,同时发送SYN握手包,Seq=0;在Packet3中,C:5672向S:80发送ACK握手回应包,Seq=1,Ack=1。

  至此,Seq=1为C的ISN,后期某一时刻的Seq=ISN+累计发送量(cumulative sent);Ack=1为C的IAN,后期某一时刻的Ack=IAN+累计接收量。对于S而言,Seq和Ack情同此理。

2.TCP获取网站数据流程

  连接建立后,下一步发送(“GET / HTTP/1.1”)请求(Request)HTML页面,这里“/”表示S的默认首页,“GET”为HTTP Request Method;“/”为Request-URI,这里为相对地址;HTTP/1.1表示使用的HTTP协议版本号为1.1。

以下为HTTP GET请求数据包(Packet4)。

4  192.168.89.125:5672→220.181.6.175:80 HTTP 417
GET / HTTP/1.1

  HTTP GET报文长=417-54=363个字节,其中Next sequence number: 364(relative sequence number)表示,若在规定的时间内收到S响应Ack=364,表明该报文发送成功,可以发送下一个报文(Seq=364);否则重传(TCP Retransmitssion)。序列号确认机制是TCP可靠性传输的保障。

S(http)收到HTTP GET报文(共363个字节),向C(amqp)发送TCP确认报文(Packet5)。

5   220.181.6.175:80→ 192.168.89.125:5672 TCP 60
http > amqp [ACK] Seq=1 Ack=364 Win=6432 Len=0

  这里Seq=1,为S的ISN,意为已发送过SYN。Packet2中,Ack=1为S的IAN。这里的Ack-IAN=364-1=363表示S已经从C接收到363个字节,即HTTP GET报文。同时,Ack=364也是S期待C发送的下一个TCP报文序列号(上面分析的Next sequence number)。

  接下来,S向C发送Http Response,根据HTTP协议,先发响应头(Response Header),再发百度首页HTML文件。

Http Response Header报文(Packet6)如下。

6  220.181.6.175:80→ 192.168.89.125:5672 TCP 465
[TCP segment of a reassembled PDU] 

其部分内容如下:

HTTP/1.1 200 OK
……

Content-Length: 2139
Content-Type: text/html;charset=gb2312
Content-Encoding: gzip

  S响应C的“GET / HTTP/1.1”请求,先发送带[PSH]标识的411个字节的Http Response Header(Packet 6)。

  TCP头部[PSH]标识置位,敦促C将缓存的数据推送给应用程序,即先处理Http Response Header,实际上是一种“截流”通知。相应C的socket调用send时在IPPROTO_TCP选项级别设置TCP_NODELAY为TRUE禁用Nagle算法可以“保留发送边界”,以防粘连。

  GET条件请求时,客户端会提供给服务器一个If-Modified-Since请求头,其值为服务器上次返回的Last-Modified响应头中的日期值,还会提供一个If-None-Match请求头,值为服务器上次返回的ETag响应头的值:

  服务器会读取到这两个请求头中的值,判断出客户端缓存的资源是否是最新的,如果是的话,服务器就会返回HTTP/304 Not Modified响应,但没有响应体.客户端收到304响应后,就会从缓存中读取对应的资源.

  另一种情况是,如果服务器认为客户端缓存的资源已经过期了,那么服务器就会返回HTTP/200 OK响应,响应体就是该资源当前最新的内容.客户端收到200响应后,就会用新的响应体覆盖掉旧的缓存资源.

  只有在客户端缓存了对应资源且该资源的响应头中包含了Last-ModifiedETag的情况下,才可能发送条件请求.如果这两个头都不存在,则必须无条件(unconditionally)请求该资源,服务器也就必须返回完整的资源数据.

  尽管握手协商的MSS为1460,但服务器或者代理平衡服务器,每次发送过来的TCP数据最多只有1420个字节。可以使用ping -f -l size target_name命令向指定目标target_name发送指定字节量的ICMP报文,其中-l size指定发送缓冲区的大小;-f则表示在IP数据报中设置不分片DF(Don’t Fragment),这样便可探测出到目标路径上的MTU。

  执行“ping -f -l 1452 www.baidu.com”的结果如下:

220.181.6.18的 Ping统计信息:

数据包:已发送 = 4,已接收 = 4,丢失 = 0 (0%丢失)

  执行“ping -f -l 1453 www.baidu.com”的结果如下:

  需要拆分数据包但是设置 DF。

220.181.6.18的 Ping统计信息:

数据包:已发送 = 4,已接收 = 0,丢失 = 4 (100%丢失)

  从以上ping结果可知,在不分片时,从本机出发到百度的路由上能通过的最大数据量为1452,由此推算出MTU{local,baidu}=sizeof(IP Header)+ sizeof(ICMP Header)+sizeof(ICMP Data Portion)=20+8+1452=1480。

  S调用socket的send函数发送2139个字节的Http Response Content(Packet 7、Packet 9),在TCP层将分解为两段(segment)后再发出去。

7  220.181.6.175:80→ 192.168.89.125:5672 TCP 1474
    [TCP segment of a reassembled PDU]

由“Content-Length: 2139”可知,HTML文件还有2139-(1474-54)=719个字节。但此时,C已经发送了确认报文(Packet8)。

8  192.168.89.125:5672→  220.181.6.175:80 TCP 54
amqp > http [ACK] Seq=364 Ack=1832 Win=65535 Len=0 

Seq-ISN=364-1=363,表示C已经发出了363个字节,上边已经收到了S的确认。Ack-IAN=1832-1=(465-54)+(1474-54),表示C至此已经接收到S发来的1831个字节。

接下来,C收到HTML文件剩余的719个字节,报文(Packet9)如下。

9  220.181.6.175:80→ 192.168.89.125:5672 HTTP  773
HTTP/1.1 200 OK

至此,C收到S发送过来的全部HTTP响应报文,即百度首页HTML内容(text/html)。

Packet6、Packet7和Packet9的ACK都是364,这是因为这三个segment都是针对Packet4的TCP响应。S将百度首页HTML文件(一个完整的HTTP报文)按照MSS分段提交给TCP层。在Wireshark中可以看到Packet9的报文中有以下reassemble信息:

[Reassembled TCP segments (2555 bytes): #6(411),#7(1420),#9(719)]
[Frame: 6, payload: 0-410(411 bytes)]
[Frame: 7, payload: 411-1830(1420 bytes)]
[Frame: 9, payload: 1831-2549(719 bytes)]

C(amqp)接收到百度首页的HTML文件后,开始解析渲染。在解析过程中,发现页面中含有百度的logo资源baidu_logo.gif,并且需要bdsug.js脚本

<img src="http://www.baidu.com/img/baidu_logo.gif" width="270" height="129" usemap="#mp">

{d.write(‘<script src=http://www.baidu.com/js/bdsug.js?v=1.0.3.0><//script>‘)}

于是上面那个连接(C:5672)继续向S请求logo图标资源,报文(Packet10)如下。

10 192.168.89.125:5672→  220.181.6.175:80 HTTP 492
GET /img/baidu_logo.gif HTTP/1.1

与此同时,C(jms)新建一个连接(TCP 5673)向S请求js脚本文件。报文(Packet11)如下。

11 192.168.89.125:5673→  220.181.6.175:80 TCP 62
jms > http [SYN] Seq=0 Win=65535 Len=0 MSS=1460 SACK_PERM=1

(Packet12)Packet13、Packet14、Packet16和Packet17为对Packet10的TCP响应(它们的Ack=802),在逻辑上它们是一个完整的TCP报文。其Http Response Content为图片文件baidu_logo.gif。我们在Wireshark中可以看到Packet17的报文中有以下reassemble信息:

[Reassembled TCP segments (1801 bytes): #13(312),#14(1420),#16(28) ,#17(41)]

[Frame: 13, payload: 0-311(312 bytes)]
[Frame: 14, payload: 312-1731(1420 bytes)]
[Frame: 16, payload: 1732-1759(28 bytes)]
[Frame: 17, payload: 1760-1800(41 bytes)] 

Packet11-Packet19-Packet20完成新连接的三次握手。然后,C(jms)发送“GET /js/bdsug.js?v=1.0.3.0 HTTP/1.1”报文(Packet21),以获取bdsug.js脚本文件。

21 192.168.89.125:5673→  220.181.6.175:80 HTTP 465
GET /js/bdsug.js?v=1.0.3.0 HTTP/1.1 

(Packet22)Packet23、Packet24、Packet26和Packet27为对Packet21的TCP响应(它们的Ack=412),在逻辑上它们是一个完整的TCP报文。其Http Response Content为脚本文件bdsug.js。我们在Wireshark中可以看到Packet27的报文中有以下reassemble信息:

[Reassembled TCP segments (3897 bytes): #23(310),#24(1420),#26(1420) ,#27(747)]

[Frame: 23, payload: 0-309(310 bytes)]
[Frame: 24, payload: 310-1729(1420 bytes)]
[Frame: 26, payload: 1730-3149(1420 bytes)]
[Frame: 27, payload: 3150-3896(747 bytes)]

通常,浏览器会自动的搜索网站的根目录,只要它发现了favicon.ico这个文件,就把它下载下来作为网站地址栏图标。于是,C(amqp)还将发起“GET /favicon.ico HTTP/1.1”请求网站地址栏图标,见报文Packet29。

3.TCP四次挥手关闭连接

经Packet28确认收到了完整的japplication/javascript文件后,链路1(本地端口5673)使命结束,S关闭该链路,进入四次挥手关闭双向连接。

(Packet30)Packet31和Packet32为对Packet29的TCP响应(它们的Ack=1201)。经Packet33确认收到了完整的image/x-icon文件后,链路2(本地端口5672)使命结束,S关闭该链路,进入四次挥手关闭双向连接。

为什么握手是三次,而挥手是四次呢?这是因为握手时,服务器往往在答应建立连接时,也建立与客户端的连接,即所谓的双向连接。所以,在Packet2中,服务器将ACK和SYN打包发出。挥手,即关闭连接,往往只是表明挥手方不再发送数据(无数据可发),而接收通道依然有效(依然可以接受数据)。当对方也挥手时,则表明对方也无数据可发了,此时双向连接真正关闭。

时间: 2024-09-29 22:28:37

抓包分析的相关文章

tcpdump抓包分析具体解释

說實在的,對於 tcpdump 這個軟體來說,你甚至能够說這個軟體其實就是個駭客軟體, 因為他不但能够分析封包的流向,連封包的內容也能够進行『監聽』, 假设你使用的傳輸資料是明碼的話,不得了,在 router 上面就可能被人家監聽走了! 非常可怕吶!所以,我們也要來瞭解一下這個軟體啊!(註:這個 tcpdump 必須使用 root 的身份執行) [[email protected] ~]# tcpdump [-nn] [-i 介面] [-w 儲存檔名] [-c 次數] [-Ae] [-qX] [

云计算之路-阿里云上:Wireshark抓包分析一个耗时20秒的请求

这篇博文分享的是我们针对一个耗时20秒的请求,用Wireshark进行抓包分析的过程. 请求的流程是这样的:客户端浏览器 -> SLB(负载均衡) -> ECS(云服务器) -> SLB -> 客户端浏览器. 下面是分析的过程: 1. 启动Wireshark,针对内网网卡进行抓包. 2. 在IIS日志中找出要分析的请求(借助Log Parser Studio) 通过c-ip(Client IP Address)可以获知SLB的内网IP,在分析Wireshar抓包时需要依据这个IP进

Python 爬虫知识点 - 淘宝商品检索结果抓包分析(续二)

一.URL分析 通过对“Python机器学习”结果抓包分析,有两个无规律的参数:_ksTS和callback.通过构建如下URL可以获得目标关键词的检索结果,如下所示: https://s.taobao.com/search?data-key=s&data-value=44&ajax=true&_ksTS=1482325509866_2527&callback=jsonp2528&q=Python机器学习&imgfile=&js=1&stat

使用Fiddler对手机进行抓包分析

场景:一个html页面,安卓app使用webview来显示,但是显示效果不是预期的.于是自己写了一个基本webview的demo,使用webview的loadurl方法请求这个html页面.可以正确显示,但是客户端组抓包说我请求的地址不一样,让我自己抓包分析. 分析:app在请求这个页面时请求附加了字符串及cookie等信息. 解决方法:使用Fiddler抓包,抓包过程网上有很多教程,注意一点有的手机可能设置代理时不能设置全局代理,可以使用ProxyDroid来设置全局代理. Fiddler抓包

云计算之路-阿里云上:超过70秒的请求抓包分析

超过70秒的请求是通过分析IIS日志发现的: 10.159.63.104是SLB的内网IP. 通过Wireshark抓包分析请求是9:22:21收到的(tcp.stream eq 23080): 09:22:21.299838000 10.159.63.104 10.161.241.208 HTTP 291 GET /eastsea/p/3764040.html HTTP/1.0 这个请求响应内容的长度是:Content-Length 1154110(1.1MB) 云服务器(ECS)在收到请求后

Wireshark抓包分析从入门到精通

曾近有个牛逼的实战课程放在你的面前,你不懂得好好珍惜,直到失去后才追悔莫及,如果G-LAB可以给你再来一次的机会,你会不会抓住?没错,G-LAB真的给了你再来一次的机会.[Wireshark抓包分析从入门到精通]主讲<郭主任>(月光宝盒索取)请联系QQ:2853771084

TcpIP协议,HTTP,DNS 实战:基于wireshark与BurpSuit抓包分析

TcpIP协议,HTTP,DNS 实战:基于wireshark与BurpSuite抓包分析

python Pycurl 库 —— 实现对网站抓包分析

经常使用基调网络的同学,可能对基调网络对页面元素的性能展示感觉很好.它可以做到对一条URL做详细的检测,包括:阻塞时间.DNS解析时间.建立连接时间.SSL握手时间.发出请求时间.首包时间等. 其实,我们也可以做到.比如Python pycurl 库就可以做到对数据的收集,然后可以对收集的数据写入redis或者Mysql.最后前端使用echars通过图形的形式进行展示出来. echars是百度一个开源项目,功能很强大(项目URL:http://echarts.baidu.com)可以将数据通过各

[转]Linux操作系统tcpdump抓包分析详解

PS:tcpdump是一个用于截取网络分组,并输出分组内容的工具,简单说就是数据包抓包工具.tcpdump凭借强大的功能和灵活的截取策略,使其成为Linux系统下用于网络分析和问题排查的首选工具. tcpdump提供了源代码,公开了接口,因此具备很强的可扩展性,对于网络维护和入侵者都是非常有用的工具.tcpdump存在于基本的Linux系统中,由于它需要将网络界面设置为混杂模式,普通用户不能正常执行,但具备root权限的用户可以直接执行它来获取网络上的信息.因此系统中存在网络分析工具主要不是对本

python编写网络抓包分析脚本

python编写网络抓包分析脚本 写网络抓包分析脚本,一个称手的sniffer工具是必不可少的,我习惯用Ethereal,简单,易用,基于winpcap的一个开源的软件 Ethereal自带许多协议的 decoder,但是它的架构并不灵活,如果你要加入一个自己定义的的解码器,得去修改Ethereal的代码,再重新编译,相当的烦琐 对于一般的明文协议,没有什么问题,但是对于加密协议,比如网络游戏,客户端程序一般会在刚连接上的时候,发送一个随机密钥,而后的报文都会用这个密钥进 行加密,诸如此类.要想