HTTP协议的基本格式
HTTP协议是典型的“一问一答”模式的协议,即请求和响应一一对应。为了进一步理解HTTP协议的工作过程以及理解HTTP协议报文格式,我们需要用到抓包工具,这里我们以Fiddler为例。
1.使用Fiddler进行抓包
使用Fiddler能够将网络上传输的HTTP数据获取到并且显示出来,其本质上是一个代理程序。在我们访问百度时,Fiddler的左侧就会出现很多数据。
这些数据是浏览器在打开百度时给百度发送的HTTP/HTTPS请求数据,可以看到在访问百度时,往往不是只发送一个请求,而是发送很多个请求。在图中,我们还能看到不同颜色的请求数据,通常蓝色表示的是HTML数据,黑色表示的是普通数据,当然,还会有其他的颜色,这里我们不做过多的介绍。那么既然数据已经显示出来了,我们怎么去查看它具体的请求和响应呢?
只需要选中对应的数据,并选择Raw(显示HTTP请求的原始数据),右侧就会显示出请求和响应,上框中的是请求的详情,下框中的是响应的详情。
注:1.如果字体太小看不清楚,可以点击请求或者响应右下角的View in Notepad按钮,就可以调用记事本来显示信息 2.在响应数据中,可能会存在一些乱码(HTTP把响应数据压缩后再返回),需要点击响应中顶上的Response body is encoded.Click to decode.按钮,就可以把响应数据解压缩
2.请求
一个HTTP请求报文,可以分为四个部分:
• 首行:包含请求的方法,请求的URL以及版本号
• 请求头(Header):包含若干行数据,本质上是一个“键值对”结构,每一行是一个键值对,使用冒号分割
• 空行:最后一个Header后面存在一个空行,作为结尾的标识
• 正文(body):正文是可选的,可能有,可能没有
2.1 URL基本格式
• 协议方案名:描述了URL接下来要做什么,常见的有http和https,也有其他的类型
• 登录信息:现在的网站的身份认证一般不采用URL进行,可以省略
• 服务器地址:标识要访问的服务器是哪一个,地址可以是IP地址或者域名
• 服务器端口号:可以省略,浏览器会设置默认的端口号,如果是HTTP协议,端口号为80,如果是HTTPS协议,端口号为443
• 带层次的文件路径:标识要访问服务器的哪一个资源
• 查询字符串(query string):能够通过参数,把客户端想要传给服务器的数据发送过去,查询字符串也是一个键值对结构,使用&分割键值对,使用=分割键和值,在查询字符串中,一些特殊符号(?,+,=等等)可能会使URL的解析出现问题,所以当值中包含这些特殊符号时,需要对特殊符号进行转义(取该符号原始编码的十六进制,前面加上%,例如+→%2B),中文同样需要进行转义
• 片段标识符:区分页面中的不同部分的目录或者导航
2.2 请求的方法
方法 | 说明 | 支持的HTTP协议版本 |
GET | 获取资源 | 1.0,1.1 |
POST | 传输实体主体 | 1.0,1.1 |
PUT | 传输文件 | 1.0,1.1 |
HEAD | 获得报文首部 | 1.0,1.1 |
DELETE | 删除文件 | 1.0,1.1 |
OPTIONS | 询问支持的方法 | 1.1 |
TRACE | 追踪路径 | 1.1 |
CONNECT | 要求用隧道协议连接代理 | 1.1 |
LINK | 建立和资源之间的连接 | 1.0 |
UNLINK | 断开连接关系 | 1.0 |
PUT:用于给服务器提交数据,与POST类似
DELETE:和GET类似,通常没有正文,使用查询字符串传输数据
GET和POST的区别:
1.GET是从服务器获取某个数据,POST是往服务器发送或者提交某个数据
2.GET通常不会搭配正文,通过查询字符串传输数据,POST通常不搭配查询字符串,通过正文传输数据(不是绝对的,GET可以有正文,POST也可以有查询字符串)
3.服务器对于GET请求的设计通常是“幂等”的,对POST请求的设计通常不要求“幂等”(同样也是不绝对的,“幂等”简单来说就是当许多人在浏览器中重复搜索同一个关键词时,搜索结果相同)
4.GET请求的结果可以被缓存(当一个网站通过GET获取图片时,浏览器就可以缓存这些图片,下次访问时就可以直接从缓存中读取),可以被浏览器收藏夹收藏,POST一般不行(同样也是不绝对的)
2.3 请求头
HOST:请求对应的主机的IP和端口
Content-Length:描述正文body的长度(图中的请求没有正文,所以没有这条数据)
Content-Type:body的数据类型(没有正文,同样没有这条数据)
User-Agent(UA):表示浏览器/操作系统的属性
Refer:表示当前的页面是从哪里跳转过来的
Cookie(键值对结构):浏览器提供给网页的一种能够持久化存储数据的机制,浏览器会针对不同网站保存对应的不同的Cookie,Cookie中的数据都是来自于服务器,当第一次访问某一个网站时,此时对应的Cookie本来是空的,在访问之后,网站的服务器会返回一些HTTP请求,在HTTP请求中会有Set-Cookie这样的数据,把一些键值对结构的数据保存到Cookie中,后续浏览器再访问该网站时,就会在请求头中,把之前保存在Cookie中的这些键值对给带入进去并发回给服务器
大部分Cookie中有一个特殊的键值对,用于标识用户的身份信息,即SessionID,那么它有什么作用呢?我们以网站的登录过程为例来简单了解一下。
3.响应
一个HTTP响应报文,也可以分为四个部分:
• 首行:包含版本号,状态码以及状态码描述
• 响应头(Header):包含若干行数据,与请求头的结构相同
• 空行:最后一个Header后面存在一个空行,作为结尾的标识
• 正文(body):可选的,可能有,可能没有
3.1 状态码
状态码描述了此次HTTP请求是否成功以及当请求失败,显示出失败的原因
1) 200 OK:最常见的状态码,表示访问成功
2) 404 NOt Found:客户端请求的资源在服务器中并不存在
3) 403 Forbidden:客户端权限不足,被禁止访问
4) 405 Method Not Allowed:请求中使用的方法,服务器不支持
5) 500 Internal Server Error:服务器内部发生错误
6) 504 GateWay Timeout:服务器访问超时
7) 302 Move Temporarily:临时重定向,访问某个地址时,访问的是旧的地址但自动跳转到了新的地址上,旧地址是否要重定向以及重定向到哪里,都是可变的,每次访问旧地址,需要旧地址访问服务器,根据获取到的响应的Location属性进行跳转
8) 301 Move Permanently:永久重定向,访问的旧地址和跳转的新地址之间的映射关系固定,后续访问旧地址都会跳转到新地址