Http协议分析

写在前面

之前做 爬虫相关的 工作基本上都是基于 Http 这个应用层的协议来做的,包括查看请求头,分析一些加密字段等等从而用代码来模拟客户端(浏览器)的行为,达到快速获取数据的目的。
今天我们借助 Wireshark 这个工具来分析一下 Http 协议。


1. Http 简介

Http(Hyper Text Transfer Protocol) 超文本传输协议,是运行在 应用层上的,默认端口为80,详细规定了 浏览器和万维网服务器 之间的通信规则,是 应用最广泛的协议。类似应用层的协议还有 FTP@port 21、SMTP@25、TELNET@23。

TCP/IP四层模型


2. Http 特点

之前在介绍TCP的时候,大概介绍了 Http。特点如下:

  • 快速:客户端发起请求时候,只传 请求方法路径,所以通信快
  • 灵活:就是所谓媒体独立性。可以传输任意类型的数据对象,只要双方进行指定。
  • 无连接:每次处理一个请求
  • 无状态:无连接,所以无状态。对处理事务没有记忆能力
  • 支持 C/S 模式:支持基本认证和安全认证。

3. Http 工作流程

这里的工作流程很简单。
一次 HTTP 操作成为一个事务,工作流程分为4步:

  • C/S建立连接:只要单击某个超链接,HTTP就开始工作,建立连接。
  • 客户端发送 request:建立连接后,客户端发送请求给服务器。
  • 服务器处理请求并响应:返回特定格式的响应。
  • C接收响应:客户端接收服务器的相应,并且由浏览器显示,之后 断开连接(也就是上面提到的无连接)。

下面我们用 Wireshark 抓包来看一下整体 HTTP 协议的运行流程。需要注意的是,HTTP是基于TCP协议之上的,所以这里当然也可以看到很多 TCP 的包穿插其中。


访问百度图片首页抓包情况

1)TCP 三次握手。可以看到是帧号 47/71/73 这三个包。TCP 连接已经建立。
2)我的电脑(10.112.88.112)给百度的服务器(112.34.111.226) 发送了一个 HTTP 请求,是帧号为 76 的包。
看这个HTTP请求包的详细信息:


第一个HTTP 请求包

可以看到,倒数第二行 response in Frame:105。 就是说这个HTTP请求会在 105帧由服务器应答。而我们看105帧,确实是一个返回状态码200/OK 的由S到C的HTTP包。
进一步,看一下 105帧的 HTTP 包:
HTTP Response 包

可以看到,这个包里注明了,是回应 76帧 的 HTTP request,这个response包中包含了 response的内容。并且制定了下一个 request 和 response 的帧号。
按照无连接的特点来说,这里一次HTTP连接已经断开,直到下一次请求重新建立。

这里只是看一下流程,至于具体的 request 和 response 的报文结构我们后面再看。


4. HTTP 请求消息 Request

客户端发送一个HTTP请求消息包括:

  • 请求行:请求类型、访问的资源、HTTP版本
  • 请求头:说明服务器要使用的附加信息
  • 空行:请求头后面要有一个空行
  • 请求数据:请求数据的主体
(1)Get请求例子
一个Http Get请求

第一部分:请求行
第二部分:请求头
第三部分:空行是必须的
第四部分:请求数据的主体。 Get请求是没有这个部分的。Get请求发送的数据都放在URL后面,以?和URL隔开(这也就是之前做爬虫时候需要获得的那些参数。)

Get请求这里实际上只有三个部分

(2)POST请求例子
HTTP Post

同样对应了上面四个部分。


5. HTTP 响应 Response

在以前做爬虫相关的工作中,也看了很多Response。这里 Response 也是包含4个部分:状态行、消息报头、空行、响应正文。


HTTP POST 请求

6. 状态码

三位数组成的状态码,其中第一位定义了相应的类别:

  • 1xx:指示信息--表示请求已接收,继续处理
  • 2xx:成功--表示请求已被成功接收、理解、接受
  • 3xx:重定向--要完成请求必须进行更进一步的操作
  • 4xx:客户端错误--请求有语法错误或请求无法实现
  • 5xx:服务器端错误--服务器未能实现合法的请求

7. HTTP的 Request 方法

HTTP1.0定义三种请求方法:GET/POST/HEAD
HTTP1.1新增了5中方法:OPTIONS/PUT/DELETE/TRACE/CONNECT


request 方法

8. HTTP 工作原理

按照上面说的工作步骤来叙述工作原理:
1)客户端连接到Web服务器:
浏览器与Web服务器的HTTP端口建立一个 TCP套接字连接
2)发送HTTP请求
通过套接字,C发送包括请求行、请求头、空行、请求数据组成的请求报文。
3)服务器接收请求并返回HTTP响应
Web 服务器解析请求,定位请求资源,将资源复本写到 TCP 套接字,由C读取。
4)释放TCP连接
如果 connection 模式为 close,则服务器主动关闭 TCP 连接;如果是 keep-alive,保持TCP连接。
5)浏览器解析HTML内容
浏览器对 Response 从头到尾解读,显示在浏览器窗口中。

总之就是C/S端到端的模式。


9.Get 和 POST 的区别

  1. Get 提交的数据在 URL 之后,以?分隔。POST提交的数据在 第4部分的 body 中。
  2. Get 提交数据会有安全问题。所以一般不用来提交 name/paswd,因为对于用户是可见的,如1中提到的,是在 url 中的。

但是实际上 post 请求的包,如果去抓包的话,也是会抓到的,也不安全。

  1. Get 提交数据大小有限制。POST没有

  2. POST 请求,产生两个 TCP数据包,先发送 header 信息,服务器响应之后,再发送 data信息。

  3. 获取变量值的方法不同。
    GET 请求直接用 get() 方法就可以获得,POST请求要通过表单来获得。

  4. 一般来说 ,GET 用来获取数据 , POST 用来向服务器发送数据。

当然,这个也不算不同点。

你可能感兴趣的:(Http协议分析)