反骨仔

一个业余的 .NET Core 攻城狮

0%

07 HTTP 协议压缩和 URL Encode

HTTP 压缩是指 Web 服务器和浏览器之间压缩传输“ 文本内容” 的方法。HTTP 采用通用的压缩算法,比如用 gzip 来压缩 HTTP、JavaScript、css 文件,能大大减少网络传输的数据量,提高了用户显示网页的速度。当然,这同时也会增加一点点服务器的开销。

7.1 HTTP 压缩的过程

  1. 浏览器发送 HTTP 请求给 Web 服务器,请求中的 Header 能 Accept-Encoding: gzip,deflate(告诉服务器,浏览器支持 gzip 压缩)。
  2. Web 服务器接到 HTTP 请求后,生成原始的 HTTP 响应,其中有原始的 Content-Type 和 Content-Length。
  3. Web 服务器通过 gzip 来对 HTTP 响应进行编码,编码后 Header 中有 Content-Type 和 Content-Length(压缩后的大小),并且增加了 Content-Encoding:gzip,然后把 HTTP 响应发送给浏览器
  4. 浏览器接到 HTTP 响应后,根据 Content-Encoding:gzip 来对 HTTP 响应进行解码,获取到原始 HTTP 响应后显示出网页

image-20210109003334055

7.1.1 实例 Fiddler 观察 HTTP 压缩

我们可以使用 Fiddler 来捕获网站、 查看压缩。比如博客园就使用了 gzip 压缩。启动 Fiddler,在浏览器中打开 https://www.cnblogs.com,可以看到 HTTP 响应是乱码,并且出现了一个长长的黄色按钮 Responsebody is encoded.Click to decode.。单击这个按钮就可以解压 HTTP 响应。

image-20210109003617340

在 Fiddler 中,每次都要手动去 Decode 实在太麻烦。单击工具栏上的“ Decode ”按钮,就可以自动解压了。

image-20210109003651570

7.1.2 内容编码类型

HTTP 定义了 一些标准的内容编码类型,并允许用扩展的形式添加更多的编码。

Conte-Encoding header 就是用这些标准化的代号来说明编码时使用的算法。

gzip 表明实体采用 GNU zip 编码 。

compress 表明实体采用 UNIX 的文件压缩程序 。

deflate 表明实体是用 zlib 的格式压缩的 。

identity 表明没有对实体进行编码;当没有 Content-Encoding header 时,就默认为这种情况。

gzip、compress 以及 deflate 编码都是无损压缩算法,用于减少传输报文的大小,不会导致信息损失。其中 gzip 通常效率最高,使用最为广泛。

7.1.3 压缩的好处

减少了数据传输,节省了带宽资源。

【实例】博客园首页压缩前的大小是 46171 bytes,压缩后的大小是 12082 bytes,只有原来的 35%,节省了 65% 的数据传输,从而大大提高了性能。

image-20210109003956583

7.1.4 gzip 的不足之处

JPEG 这类文件用 gzip 压缩的效果不够好,gzip 占用了一些服务器和客户端的 CPU。

7.1.5 gzip 是如何压缩的

简单来说,gzip 压缩是在一个文本文件中找出类似的字符串,并临时替换它们,从而使整个文件变小。这种形式的压缩对 Web 来说非常适合,因为 HTML 和 css 文件通常包含大量重复的字符串,例如空格、标签。

7.1.6 HTTP 请求也是可以编码的

浏览器一般不会对 HTTP 请求编码,但是一些程序在发送 HTTP 请求时会对其进行编码。

image-20210109004146924

7.1.7 HTTP 内容编码和 HTTP 压缩的区别

在 HTTP 协议中,可以对内容(也就是 Body 部分)进行编码,如可以采用 gzip 这样的编码,从而达到压缩的目的;也可以使用其他的编码方式把内容搅乱或加密,以此来防止未被授权的第三方看到文档的内容 。

所以,我们说 HTTP 压缩其实就是 HTTP 内容编码的一种,不要把 HTTP 压缩和 HTTP 内容编码两个概念混淆了。

7.2 URL Encode 介绍

URL Encode (URL 编码)就是把所有非英文字母、数字字符都替换成百分号(%)后加两位十六进制数,比如空格的编码为“ %20”。

7.2.1 查询字符串中包含汉字

打开 Firefox 浏览器,输入网址:https://www.baidu.com/s?wd=小坦克

  • 【注意】“小坦克”属于查询字符串,不属于网址路径

image-20210109004526325

用 Fiddler 抓包,我们发现,实际的网址是 https://www.baidu.com/s?wd=小坦克

image-20210109004612215

Firefox 自动把“小坦克”编码成了“ %E5%B0%8F%E5%9D%A6%E5%85%8B ”。

7.2.2 POST 中的数据包含汉字

启动 Fiddler,在浏览器中打开 https://account.cnblogs.com,输入注册信息进行注册,这样我们能捕获到 POST 的一些数据。

image-20210109004727534

我们可以看到 body 里面的数据同样被编码了:“ @”转义成了“ %4。”,汉字也被转义成了“%E5%B0%8F%E5%9D%A6%E5%85%8B2 ” 。

POST 中的主体在传输的时候同样会被转义。

7.3 Fiddler 中的 TextWizard

我们经常需要进行字符编码,比如把字符进行 URL Encode 或者 URL Decode 。 我们可以使用 TextWizard 来对字符编码。

单击 Fiddler 工具栏 中的“ TextWizard ”,可以启动 TextWizard 小工具。

image-20210109004839664

参考

  • 《HTTP抓包实战》

修改

创建时间:2021–01-09 00:49