前言
本书对互联网基盘——HTTP协议进行了全面系统的介绍。作者由HTTP协议的发展历史娓娓道来,严谨细致地剖析了HTTP协议的结构,列举诸多常见通信场景及实战案例,最后延伸到Web安全、最新技术动向等方面。本书的特色为在讲解的同时,辅以大量生动形象的通信图例,更好地帮助读者深刻理解HTTP通信过程中客户端与服务器之间的交互情况。读者可通过本书快速了解并掌握HTTP协议的基础,前端工程师分析抓包数据,后端工程师实现REST API、实现自己的HTTP服务器等过程中所需的HTTP相关知识点本书均有介绍。
本书适合Web开发工程师,以及对HTTP协议感兴趣的各层次读者。
第一章、了解 WEB 及网络基础
HTTP 的诞生
1989年3月,HTTP 诞生了,最初设想的理念是:借助多文本之间互相关联形成的超文本,连成 WWW。
Web 成长时代
1990年11月,CERN 研发了世界上第一台 WEB 服务器。
1990年,大家针对 HTML1.0 草案进行讨论,因存在多处模糊的地方,草案被直接废弃。
1992年9月,日本第一个网站的主页上线了。
1993年1月,现代浏览器的祖先 Mosaic 问世,它以内联等形式显示 HTML 的图像,迅速在世界范围内流行开来。
1994年12月,网景公司发布 Netscape Navigator 1.0。
1995年,微软发布了 Internet Explorer 1.0 和 2.0。
驻足不前的 HTTP
HTTP 0.9 :因为那时的 HTTP 并没有正式的标准被建立,所有含有 HTTP 1.0 之前版本的意思。
HTTP 1.0 :1996年5月正式作为标准被公布,并记载于 RFC1945。
HTTP 1.1 :1997年1月公布,最新标准版本为 RFC2616。
网络基础 TCP/IP
通常使用的网络(包括互联网)是在 TCP/IP 协议族的基础上运作的。而 HTTP 属于它内部的一个子集。
TCP/IP 协议族
TCP/IP 是互联网相关的各类协议族的总称。
TCP/IP 的分层管理
分为四层:
- 应用层:决定了向用户提供应用服务时通信的活动,例如:FTP、DNS、HTTP。
- 传输层:提供处于网络连接中的两台计算机之间的数据传输,TCP、UDP。
- 网络层:处理在网络上流动的数据包,规定传输路线。
- 数据链路层:处理连接网络的硬件部分。包括控制操作系统、硬件的设备驱动、网卡及光纤等物理可见部分。
分层的好处:把各层之间的接口部分规划好后,修改某个地方时只需修改对应的层,每个层次内部不影响其他层。
TCP/IP 通信传输流
HTTP 举例:
与 HTTP 关系密切的协议 : IP、TCP 和DNS
- 负责传输的 IP 协议
-
确保可靠性的 TCP 协议
-
负责域名解析的 DNS 服务
各种协议与 HTTP 协议的关系
第二章、简单的 HTTP 协议
HTTP 协议用于客户端和服务器之间的通信,请求资源方成为客户端,提供资源响应方成为服务器端。
请求报文是由请求方法、请求 URI、协议版本、可选的请求首部字段和内容实体构成的。
请求报文的构成:
响应报文的构成:
HTTP 是不保存状态的协议
HTTP 是一个无状态协议,自身不具备保存之前发送过的请求或响应的功能。
之后随着发展,引入了 Cookie 技术。
请求 URI 定位资源
HTTP 协议使用 URI 定位互联网上的资源。正是因为 URI 的特定功能,在互联网上任意位置的资源都能访问到。
告知服务器意图的 HTTP 方法
持久连接节省通信量
HTTP 协议的初始版本中,每进行一次 HTTP 通信就要断开一次 TCP连接。
持久连接
为解决上述 TCP 连接的问题,HTTP/1.1 和一部分的 HTTP/1.0 想出了持久连接的方法。
持久连接的特点是,只要任意一端没有明确提出断开连接,则保持 TCP 连接状态。
好处在于减少了 TCP 连接的重复建立和断开所造成的额外开销,减轻了服务器端的负载。
管线化
管线化技术出现后,能够做到同时并行发送多个请求,而不需要一个接一个地等待响应了。
使用 Cookie 的状态管理
Cookie 技术通过在请求和响应报文中写入 Cookie 信息来控制客户端的状态。
Cookie 会根据从服务器端发送的响应报文内的一个叫做 Set-Cookie 的首部字段信息,通知客户端保存 Cookie。当下次客户端再往该服务器发送请求时,客户端会自动在请求报文中加入 Cookie 值后发送出去。
服务器端发现客户端发送过来的 Cookie 后,会去检查究竟是从哪一个客户端发来的连接请求,然后对比服务器上的记录,最后得到之前的状态信息。
第三章、HTTP 报文内的 HTTP信息
HTTP 报文
用于 HTTP 协议交互的信息被称为 HTTP 报文。
HTTP 报文本身是由多行(用 CR+LF 作换行符)数据构成的字符串文本。
HTTP 报文大致可分为报文首部和报文主体两块,通常,并不一定要有报文主体。
结构
实例
编码提升传输速率
HTTP 在传输时可以原样直接传输,也可以在传输时通过编码提升传输速率,通过编码,能有效地处理大量的访问请求,但也消耗更多的 CPU 等资源。
报文主体和实体主体的差异
- 报文:HTTP 通信中的基本单位,由8位组字节流组成,通过 HTTP 通信传输。
- 实体:作为请求或响应的有效载荷数据(补充项)被传输,其内容由实体首部和实体主体组成。
压缩传输的内容编码
常用的内容编码有以下几种:
- gzip(GNU zip)
- compress(UNIX 系统的标准压缩)
- deflate(zlib)
- identity(不进行编码)
分割发送的分块传输编码
在传输大容量数据时,通过把数据分割成多块,能够让浏览器逐步显示页面,这种把实体主体分块的功能称为分块传输编码。
分块传输编码会将实体主体分成多个部分(块)。每一块都会用十六进制来标记块的大小,而实体主体的最后一块会使用“0(CR+LF)”来标记。
发送多种数据的多部分对象集合
发送的一份报文主体内可含有多类型实体。通常是在图片或文本文件等上传时使用。
多部分对象集合包含的对象如下:
- multipart/form-data:在 Web 表单文件上传时使用。
- multipart/byteranges:状态码 206,响应报文包含了多个范围的内容时使用。
获取部分内容的范围请求
为了解决加载超大图片导致网络中断的情况而实现的一种手段,叫做范围请求。
对一份 10 000 字节大小的资源,如果使用范围请求,可以只请求5001~10 000 字节内的资源。
内容协商返回最合适的内容
当浏览器的默认语言为英语或中文,访问相同 URI 的 Web 页面时,则会显示对应的英语版或中文版的 Web 页面。这样的机制称为内容协商。
第四章、返回结果的状态码
HTTP 状态码负责表示客户端 HTTP 请求的返回结果、标记服务器端的处理是否正常、通知出现的错误等工作。
状态码类别:
更多:HTTP 响应代码
第五章、与 HTTP 协作的 Web 服务器
用单台虚拟主机实现多个域名
即便物理层面只有一台服务器,但只要使用虚拟主机的功能,则可以搭建多个站点。
通信数据转发程序:代理、网关、隧道
HTTP 通信时,除客户端和服务器以外,还有一些用于通信数据转发的应用程序:
- 代理:一种有转发功能的应用程序,扮演了服务器和客户端中间人的角色。
- 网关:转发其他服务器通信数据的服务器,它就像自己拥有资源的源服务器一样对请求进行处理。
- 隧道:将相隔甚远的客户端和服务器两者之间进行中转,并保持双方通信连接的应用程序。
保存资源的缓存
缓存是指代理服务器或客户端本地磁盘内保存的资源副本。利用缓存可减少对源服务器的访问,因此也就节省了通信流量和通信时间。
客户端的缓存
缓存不仅可以存在于缓存服务器内,还可以存在客户端浏览器中。以 Internet Explorer 程序为例,把客户端缓存称为临时网络文件。
第六章、HTTP 首部
注:这部分太多解释,建议看原文
HTTP 请求报文
在请求中,HTTP 报文由方法、URI、HTTP 版本、HTTP 首部字段等部分构成
HTTP 响应报文
在响应中,HTTP 报文由 HTTP 版本、状态码(数字和原因短语)、HTTP 首部字段 3 部分构成。
HTTP/1.1 首部字段一览
通用首部字段:
请求首部字段:
响应首部字段:
实体首部字段:
第七章、HTTP 的缺点
主要的不足,例举如下:
- 通信使用明文(不加密),内容可能会被窃听(例如:抓包)
- 不验证通信方的身份,因此有可能遭遇伪装(例如:DoS)
- 无法证明报文的完整性,所以有可能已遭篡改(例如:中间人攻击)
HTTP+ 加密 + 认证 + 完整性保护=HTTPS
为了统一解决上述这些问题,需要在 HTTP 等机制。我们把添加了加密及认证机制的称为 HTTPS。
使用 HTTPS 通信
经常会在 Web 的登录页面和购物结算界面等使用 HTTPS 通信。
HTTPS 是身披 SSL 外壳的 HTTP
HTTPS 并非是应用层的一种新协议。只是 HTTP 通信接口部分用 SSL 和 TLS 协议代替而已。
简言之,所谓 HTTPS,其实就是身披SSL 协议这层外壳的 HTTP。
SSL 是独立于 HTTP 的协议,所以不光是 HTTP 协议,其他运行在应用层的 SMTP 和 Telnet 等协议均可配合 SSL 协议使用。可以说 SSL 是当今世界上应用最为广泛的网络安全技术。
相互交换密钥的公开密钥加密技术
SSL 采用一种叫做公开密钥加密(非对称加密)的加密处理方式。
HTTPS 的安全通信机制
通信步骤:
SSL 速度慢吗
HTTPS 也存在一些问题,那就是当使用 SSL 时,它的处理速度会变慢。
HTTPS 比 HTTP 要慢 2 到 100 倍,因为与纯文本通信相比,加密通信会消耗更多的CPU 及内存资源。如果每次通信都加密,会消耗相当多的资源,平摊到一台计算机上时,能够处理的请求数量必定也会随之减少。
第八章、确认访问用户身份的认证
何为认证
服务器为了确认用户的身份,通常需要核对一些信息:
- 密码
- 动态令牌
- 数字证书
- 生物认证
- IC 卡
HTTP 使用的认证方式
- BASIC 认证(基本认证)
- DIGEST 认证(摘要认证)
- SSL 客户端认证
- FormBase 认证(基于表单认证)
第九章、基于 HTTP 的功能追加协议
消除 HTTP 瓶颈的 SPDY
Google 在 2010 年发布了 SPDY(取自 SPeeDY,发音同 speedy),其开发目标旨在解决 HTTP 的性能瓶颈,缩短 Web 页面的加载时间(50%)。
SPDY 的目标
陆续出现的 Ajax 和 Comet 等提高易用性的技术,一定程度上使 HTTP得到了改善,但 HTTP 协议本身的限制也令人有些束手无策。为了进行根本性的改善,需要有一些协议层面上的改动。
处于持续开发状态中的 SPDY 协议,正是为了在协议级别消除 HTTP所遭遇的瓶颈。
使用 SPDY 后,HTTP 协议额外获得以下功能。
- 多路复用流:通过单一的 TCP 连接,可以无限制处理多个 HTTP 请求。
- 赋予请求优先级:可以给请求逐个分配优先级顺序。这样主要是为了在发送多个请求时,解决因带宽低而导致响应变慢的问题。
- 压缩 HTTP 首部
- 推送功能:支持服务器主动向客户端推送数据的功能。
- 服务器提示功能:服务器可以主动提示客户端请求所需的资源。
使用浏览器进行全双工通信的WebSocket
利用 Ajax 和 Comet 技术进行通信可以提升 Web 的浏览速度。但问题在于通信若使用 HTTP 协议,就无法彻底解决瓶颈问题。WebSocket网络技术正是为解决这些问题而实现的一套新协议及 API。
WebSocket 协议
主要特点:
- 推送功能:支持由服务器向客户端推送数据的推送功能。
- 减少通信量:只要建立起 WebSocket 连接,就希望一直保持连接状态。
期盼已久的 HTTP/2.0
特点:
Web 服务器管理文件的 WebDAV
WebDAV(基于万维网的分布式创作和版本控制)是一个可对 Web 服务器上的内容直接进行文件复制、编辑等操作的分布式文件系统。
第十章、构建 Web 内容的技术
- HTML
- CSS
- JavaScript
- 动态 HTML
- CGI
- Servlet
- XML
- RSS/Atom
- JSON
第十一章、Web 的攻击技术
对 Web 应用的攻击模式有以下两种:
- 主动攻击:是指攻击者通过直接访问 Web 应用,把攻击代码传入的攻击模式
- 被动攻击:指利用圈套策略执行攻击代码的攻击模式
因输出值转义不完全引发的安全漏洞:
- XSS 注入
- SQL 注入
- OS 命令注入
- HTTP 首部注入攻击
- 邮件首部注入攻击
- 目录遍历攻击
- 远程文件包含漏洞
因设置或设计上的缺陷引发的安全漏洞:
- 强制浏览
- 不正确的错误信息处理
- 开放重定向
因会话管理疏忽引发的安全漏洞:
- 会话劫持
- 会话固定攻击
- 跨站点请求伪造
其他安全漏洞:
- 密码破解
- 点击劫持
- DoS 攻击
- 后门程序