平时用抓包工具比较多,很多时候使用 Fidder 做一些简单的抓包,当功能不够用时,就使用 WireShark 相对于 Fidder 来说,上手比较难一点,但功能强大很多。
WireShark 就基于网卡的,也就是说只要是经过该网卡的数据包都能抓到,而 Fidder 就是相当于在本地启动了一个 HTTP 中间代理,在请求发出和接收时,将内容抓下来。
开始
很简单,点击 options
,选中需要抓包的网卡后,点 start
则可启动抓包了。
如果支接点的话,会发现不停的有包啊,什么杂七杂八想要不想要的就像瀑布一想往下滚,所以,开始之前,通常要指定一个过滤器,填在Capture fiter for selected interfaces:
里面,意思就是选择网卡的过滤器。
TIP1 : WireShark过滤器说明在
Help -> Manual pages -> WireShark Fiter
TIP2 : 网卡开始抓取前使用的过滤器和抓取后能使用的过滤器是不一样的,通常指定协议就可以过滤掉大部分不需要抓的包了。
TCP
先看抓的结果图:如下
抓包记录里面,Source 表示请求源IP, Destination 表示目的IP,还有一个就是 Info,里面有这样的信息 65206 -> 80 [ACK] Seq=1 … 先了解一下基本常识:
TCP协议状态:
状态 | 说明 |
---|---|
SYN | 建立连接 |
FIN | 关闭连接 |
ACK | 响应 |
PSH | 有DATA数据传输 |
RST | 连接重置 |
其中,ACK 是与 SYN,FIN 等同时使用的,比如 SYN 和 ACK 同时为1,它表示的就是建立连接之后的响应,
如果只是单个的一个 SYN,它表示的只是建立连接。
TCP协议的三次握手
简单点说
- A 请求 B 的时候,A 要先发个数据给 B,要求建立连接,就是第一次
- B 收到数据后,B 再发个数据给 A,就是第二次
- A 收到 B 的数据后,再发个数据给 B,连接建立完成。
详细的可以 Google,里面有发送的数据包,数据状态的详细定义,这里面只要知道有三次握手即可。
为什么呢?如上图,我一般用 Follow -> TCP Stream
去查看请求与响应的信息。但是每次一 Follow
后,过滤器中会自动改为 tcp.stream eq xxx
,也就是自动给一个TCP会话定了一个ID,这样一看,在我抓的 GET / 之前的三个交互,就是三次握手了,分别是
- 本机向目标148服务器发送了一个62字节的数据包,里面包括一些要求建立连接的数据
- 目标服务器向本机也发送了一个数据包,里面包括一些信息
- 本又发送了一个数据包,建立连接完成
- HTTP 请求,都知道 HTTP 是 TCP 的子协议了,就不多说了,469字节的数据包除了以上那些,还包括请求地址,请求头,请求体等信息。
- 响应头回来了,
- 7、8、9 响应体也来了,由于体积较大,所以就分段返回。
当然,很多时候会发现1个 Tcp 会话中,有多个 HTTP 会话,实际上是浏览器收到了网页后,发现还要请求其它资源,就没有关闭连接,接着再发 HTTP 请求了。这样就结省了几次握手的时间。
常用方法:
- WireShark的核心还是基本功,基本功强的,可以看懂各种数据包,由于本人基本功太弱,就不献丑了
- 在Source、Destinaion、Length三列,可以
右键 -> Apply as Filter -> Selected 、 AND 、 OR 、AND NOT 、OR NOT
,快速的添加到过滤器当前的条件,非常好用 - 很多网页都是Gzip压缩的,直接Folow会有乱码,在
Edit -> Preference -> Protocols -> HTTP
里面,勾选Uncompress entity bodies
可以查看的时候自动解GZIP压缩,不过需要HTTP响应头里面包含Content-Encoding:gizp
,才能生效 - 如果还是找不到你要找的包,可以使用
File -> Export Objects -> HTTP
,可以比较清楚的看到HTTP请求。选中Save即可,不到紧急时刻,不要Sava All
,不服去试。