使用wireshark分析http

Author Avatar
WoodyXiong 3月 18, 2018
  • 在其它设备中阅读本文章

由于最近要分析shadowsocks的源码,所以从最简单的抓裸奔的包开始,即最简单的http包。http协议已经十分熟悉了,但是从底层的tcp开始还是第一次研究。

准备工作

准备要抓的http包

尝试直接抓网站的首页,发现又是文字又是图片,不好分析。所以就抓一些简单的文本,类似css或者是github上面的raw,尼玛只能抓一次,后面刷新就是304了。之后直接在自己的服务器上部署一句PHP代码,之后抓都是200了。

<?php
echo "this is test";

准备抓包工具

这里使用的是著名的wireshark,进入后选择网卡,然后过滤ipip.addr == IP即可抓到需要测试的http包

开始抓包

在wireshark点击开始捕获,然后再浏览器刷新部署在服务器上的动态页面,就可以抓到最原生态的http包了
wireshark抓包截图
以上就是最原生态的http的原始包

抓包分析

为了描述的更加清楚,以下所说的包的序列如图中的黑框所示

包序列

分析过程

TCP/IP连接的创建

  1. 27号包 客户端向http服务器的80端口发送SYN请求连接
  2. 43号包 http服务器的80端口发送ACK应答,允许连接
  3. 44号包 客户端向服务端再发送应答码,完成三次握手

http包分析

  1. 48号包 客户端向服务器发送请求头

请求头

  1. 57号包 服务端接收信息,发送应答码
  2. 58号包 服务端将html文档返回给客户端

返回的信息

  1. 64号包 客户端收到服务端发送的信息,发送应答码

TCP/IP连接断开

  1. 130号包 http服务器端主动断开连接,发送SYN,服务端说再见
  2. 131号包 客户端发送准许断开的应答码
  3. 189号包 客户端发送再见
  4. 191号包 服务端含泪最终告别

遇到的问题

测试过程中服务端发送完html的信息之后并没有马上断开连接,而是过了一段时间,这是什么原因

客户端收到服务器端的html中,头部有Keep-Alive:timeout=5即说明服务器在发送完这个html文档后有5秒钟的时间继续等待,如果客户端在这5秒内继续向服务端请求数据,服务端会继续做出回复,如果没有数据交换,则5秒钟之后,服务器端会主动断开连接。这样做是为了减少http服务器不必要的握手,加快传输速度。