7.2.1 减少请求带宽

- 使用高效的数据交换格式 - 为客户端与服务器之间传输的数据选择高效的编码.

- 在可能的情况下使用预先压缩的数据 - 使用专用算法对诸如音频、视频和图像进行压缩或按比较缩放以适应通道与设备

- 压缩每一个请求与响应负载 - 压缩文本负载以减少带宽, 同时又不太影响服务器与客户端代码

实际上, 可以通过压缩服务器响应或是客户端请求为非媒体负载开启负载压缩.

压缩模式与 JSON 与 XML

1. 响应压缩

响应负载压缩是最简单的一种 HTTP 负载压缩形式. HTTP 响应由返回给客户端的用于响应上一个 HTTP 请求的响应头与响应体构成. 响应压缩会对响应体应用数据压缩算法, 但不会操纵 HTTP 头

在 iOS HTTP 负载中, 默认情况下, 所有的 HTTP NSURLConnection 请求都是开启压缩的. 接收到的负载会自动解压缩并以最初的格式呈现在代码中. 解压缩的计算代码要比传输 10 倍字节的通信代价低; 因此, 激活响应压缩几乎总是有益无害的

在默认请况下, NSURLConnection 会向每个请求添加好下 HTTP 头:

Accept-Encoding: gzip, deflate

Accept-Encoding 头告诉服务器, 客户端可以接收使用 gzip 或 DEFLATE 压缩的负载, 不过服务器可以自己选择是否压缩响应. 这样, 通过响应负载压缩来提升性能的关键就在于配置服务器以支持压缩

有些浏览器无法正确处理 DEFLATE 压缩, 因此最常用的压缩其实是 gzip

比如, 配置 Apache Web 服务器的过程涉及加载压缩模块并针对特定的文档类型激活输出过滤器
LoadModulefilter_module library-path/mod_filter.so
LoadModuledeflate_module library-path/mod_deflate.so

library-path 的值会根据 Apache 的安装位置而发生变化

filter_module 是个常用的模块, 并且可能已经被加载了. deflate_module 则不太常用, 不过也是 Linux、OSX 与 Windows 上标准 Apache 安装的组成部分

deflate_module 支持的是 gzip 而非 DEFLATE 压缩

为那些能够从压缩中获益的内容类型添加输出过滤器(非图片、音频和视频)

添加压缩类型

禁用负载压缩, 可以通过清除自动设定的 Accept-Encoding 头来实现


清除 Accept-Encoding

对请求的响应不会再被服务器压缩. 响应压缩是优化应用网络带宽使用的一种简单手段, 只需要对服务层做很小的修改即可实现

2. 请求压缩

与响应压缩不同, 请求压缩的实现更为复杂, 因为它既需要客户端与服务端的协调实现. 

模式一: 
iOS 应用首先查询服务器来判断是否支持压缩, 然后根据服务器的响应来调整其行为

请求压缩会为移动应用带来很大的好处, 因为广域无线传输速率是非对称的, 为发送给设备的数据提供了更大的带宽, 而对设备发出的数据则提供了很小的带宽. 之所以使用这种非对称的带宽, 原因在于大多数 Web 流量都是非对称的. 如果应用定义了标准的非对称模式, 那么你绝对应该考虑使用请求压缩. 比如, 如果应用上传到服务器, 那么应用就会通过上传负载的压缩而获益(传输到服务器以及回传给设备时就会消耗 80KB 的带宽, 在请求与响应开启了压缩, 那么同样一次往返, 数据只会消耗 12KB 的带宽)

要想创建请求压缩, 首先需要在 Web 服务器上定义好输入过滤器

Apache 并不会在通过 PHP 或 mod_jk 模块等资源过滤器发送数据前对其解压缩, 因此, 如果通过资源过滤器向 Web 应用传递了压缩数据, 那么目标 Web 应用就要负责负载的解压缩

与响应压缩一样, 客户端应用不应该将 CPU 时间浪费在压缩诸如 PDF、加密数据、图像、音频及视频等已经压缩的内容上. 然而, 代表预先压缩的数据的 Base64 数据常常会从请求压缩中获益, 比如, 如果要以 Base64 格式上传 JPEG 文件, 那么可以对 Base64 数据进行压缩, 相较于未压缩的 Base64 数据, 压缩后的数据体积会降低 30% 左右

在 Apache 中, 用于响应压缩的模块也可以执行请求压缩. 如下配置片段会加载所需模块:

配置所需模块

接下来需要为 DEFLATE 模块定义输入过滤器

定义一个输入过滤器和一个 CGI 别名

如果带有 Content-Encoding:gzip 头的请求到达 HTTP 服务器, HTTP 服务器就会尝试解压缩请求体并将其传给过滤器链中的下一个过滤器. 出于说明的目的, 这个示例请求压缩应用带有一段简单的 Perl脚本, 它会将接收到的响应体负载回显出来, 脚本并不关心接收到的负载是不是压缩过的

Perl脚本: 将接收到的响应体负载回显出来

接下来, 为 iOS 应用添加压缩代码. 需要压缩负载并向请求添加 Content-Encoding 头. 示例压缩代码使用了 libz.dylib 框架, 这需要项目在编译任何压缩代码前行先链接到该框架


压缩 HTTP 请求体的方法


Content-Encoding 头添加到请求中的代码

示例应用实现了压缩并提供了一种方式以执行多个请求(包含了针对你所选择的 URL 的示例负载). 除了请求所消耗的平均时间与总时间外, 还会显示出负载的大小. 时间包含了计算出的压缩所需的时间.  

图 7-4: 通过 Network Link Conditioner 工具计算的请求与响应压缩的时间变化

通过 DSL 可以看到收益, 因为 DSL 连接对于上下游的速率来说通常是非对称的. 值得注意的是, 在 Edge 网络上要 10 秒钟才能完成的请求, 如果对请求和响应进行了压缩, 处理时间会降到 3 秒以下

最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 203,937评论 6 478
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 85,503评论 2 381
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 150,712评论 0 337
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 54,668评论 1 276
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 63,677评论 5 366
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 48,601评论 1 281
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 37,975评论 3 396
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 36,637评论 0 258
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 40,881评论 1 298
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 35,621评论 2 321
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 37,710评论 1 329
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 33,387评论 4 319
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 38,971评论 3 307
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 29,947评论 0 19
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 31,189评论 1 260
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 44,805评论 2 349
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 42,449评论 2 342

推荐阅读更多精彩内容

  • Spring Cloud为开发人员提供了快速构建分布式系统中一些常见模式的工具(例如配置管理,服务发现,断路器,智...
    卡卡罗2017阅读 134,590评论 18 139
  • 【摘要】 面对大量用户访问、高并发请求,海量数据,可以使用高性能的服务器、大型数据库,存储设备,高性能Web服务器...
    静修佛缘阅读 4,531评论 0 24
  • 试想一下,一个科班出身,拥有丰富开发经验的程序员对于HTTP协议却不甚了解?还是很尴尬的!这么一个可以说是常识的问...
    一个人在路上走下去阅读 91,720评论 18 189
  • 开学伊始,我们师生之间是陌生的。 孩子们开启了人生一段新的旅程,种种不适应是一定的,但是每个人的性格、特点、经历不...
    我是张老师阅读 780评论 0 8
  • 姓名:崔丽丽 日精进打卡第二天 【打卡始于2017.10.18持续于2017.10.19】 【知~学习】 ...
    小紫茉莉阅读 132评论 0 0