《图解HTTP》读书笔记

4天读完

一、了解web及网络基础

1.1 三项www构建技术:

  1. HTML:超文本标记语言
  2. HTTP:文本传输协议
  3. URL:统一资源定位符,指定文档所在地址

1.2 网络基础 TCP/IP

通常使用的网络是在 TCP/IP 协议族的基础上运作的。HTTP属于它内部的一个子集。

TCP/IP是互联网相关的各类协议族的总称

计算机与网络设备要互相通信,双方必须基于相同的方法。比如,探测信号目标、由谁先发起通信、使用哪种语言进行通信、怎样结束通信等规则需要事先确定。我们把这种规则称为协议(protocol)。

TCP/IP 协议族按层次分别分为4层:

  • 应用层:决定向用户提供应用服务时通信的活动。FTP、DNS、HTTP处于其中
  • 传输层:对上层(应用层)提供处于网络连接中的两台计算机之间的数据传输。有两个性质不同的协议:TCP(传输控制协议)和UDP(用户数据报协议)
  • 网络层:处理在网络中流动的数据包,数据包是网络传输中的最小数据单位。该层规定了通过怎样的路径到达对方计算机,并把数据包传送给对方。就是在众多选项中选择一条传输路线
  • 数据链路层:处理连接网络的硬件部分,包括控制操作系统、硬件的设备驱动、网卡及光纤等物理可见部分

分层是有好处的,比如,如果互联网只由一个协议统筹,某地方需要改变设计时,就必须把所有部分整体替换掉。而分层之后只需把变动的层替换掉即可。

TCP/IP通信传输流

在层与层之间传输数据时,每经过一层时必定会被打上一个该层所属的首部信息。反之,接收端在层与层传输数据时,每经过一层时会把对应的首部消去。这叫做封装

封装

1.3 与HTTP关系密切的协议:IP、TCP、DNS

1.3.1 负责传输的IP协议

IP协议处于网络层,作用是把各种数据包传送给对方。需要确定IP地址MAC地址

IP地址指明了节点被分配到的地址,MAC地址指网卡的固定地址。IP地址可以和MAC地址配对。

ARP协议:凭借MAC地址进行通信
IP通信依赖MAC地址,网络上,通信的双方要经过多台计算机和网络设备中转才能连接到对方。在中转时,会利用下一站中转设备的MAC地址来搜索下一个目标。这时,就用到了ARP协议——根据通信双方的IP地址就可以反查出对应的MAC地址。

中转过程中,计算机和路由器等网络设备只能获取很粗略的传输路线,称为路由选择

1.3.2 确保可靠性的TCP协议

TCP处于传输层,提供可靠的字节流服务。

字节流服务:为了方便传输,将大块数据分割成以报文段为单位的数据包进行管理。

TCP协议为了更容易传送大数据才把数据分割,而且TCP协议能够确认数据最终是否送达对方。

确保数据能到达目标
TCP采用三次握手策略。TCP协议把数据送出去后,不会对传送后的情况置之不理,一定会向对方确认是否成功送达。握手过程中使用了TCP的标志:SYNACK

发送端首先发送一个带 SYN 标志的数据包给对方。接收端收到后,回传一个带有 SYN/ACK 标志的数据包以示传达确认信息。最后,发送 端再回传一个带 ACK 标志的数据包,代表“握手”结束。

TCP三次握手

若在握手过程中某个阶段莫名中断,TCP 协议会再次以相同的顺序 发送相同的数据包。

1.3.3 负责域名解析的DNS协议

处于应用层,提供域名到IP地址之间的解析服务。

DNS解析过程

二、简单的HTTP协议

2.1 请求和响应

HTTP协议用于客户端和服务器之间的通信。HTTP协议能够区分哪端是客户端,哪些是服务器端。

HTTP协议通过请求响应的交换来达成通信

HTTP协议规定,请求由客户端发出,最后由服务器端响应请求并返回。

请求报文:请求方法、请求URI、协议版本、可选的请求首部字段和内容实体构成。

请求报文

响应报文

响应报文

2.2 HTTP是不保存状态的

HTTP是不保存状态,即无状态协议。HTTP协议自身不对请求和相应之间的通信状态进行保存。

所以为了记录状态,引入了Cookie技术

2.3 HTTP请求方法

2.4 使用Cookie状态管理

Cookie会根据服务器发送的响应报文内的一个 Set-Cookie的首部字段信息,通知客户端保存Cookie。当下次客户端再往服务器发送请求时,客户端会自动在请求报文中加入 Cookie 值后发送出去。

服务端收到Cookie后,会去检查究竟是从哪一个客户端发来的连接请求,然后对比服务器上的记录,最后得到之前的状态信息。

1
2
3

三、HTTP报文内的HTTP信息

报文结构
请求报文及响应报文
  • 请求行 包含用于请求的方法、URI、HTTP版本
  • 状态行 包含表明响应结果的状态码、原因短语和HTTP版本
  • 首部字段 包含表示请求和响应的各种条件和属性的各类首部

3.1 压缩传输的内容编码

HTTP协议中有一种被称为内容编码的功能,在实体内容上编码,并保持实体信息原样压缩,内容编码后的实体由客户端接受并负责编码。

常用的内容编码

  • gzip
  • compress
  • deflate
  • identity

3.2 分割发送的分块传输编码 - Transfer Coding

把实体主体分块

3.3 发送多种数据的多部分对象集合 - MIME

MIME机制,允许邮件处理文本、图片、视频等多个不同类型的数据。MIME扩展中会使用一种称为多部分对象集合的方法,容纳多份不同类型的数据。

  • multipart/form-data web表单文件上传时使用
  • multipart/byteranges

Content-Type / boundary

3.4 获取部分内容的范围请求 - Range

请求范围

执行范围请求时,谁用到首部字段 Range 来指定资源的 byte 范围。

// 5001-10000 字节
Range: bytes=5001-10000

// 5001字节后的
Range: bytes=5001-

// 一开始到3000字节和5000-7000字节的多重范围
Range: bytes=-3000, 5000-7000

范围请求响应会返回 206状态码 Partial Content 的响应报文。

另外,多重范围的范围请求,响应会在首部字段 Content-Type 标明 multipart/byterange 后返回响应报文。

如果服务端无法响应范围请求,则会返回状态码为200 OK和完整的实体内容。

3.5 内容协商 Content Negotiation

demo

内容协商机制 是指客户端和服务端就响应的资源内容进行交涉,提供给客户端最适合的资源。

响应资源的语言字符集编码方式等判断:

  • Accept
  • Accept-Charset
  • Accept-Encoding
  • Accept-Language
  • Content-Language

内容协商类型:

  1. 服务器驱动协商:由服务端进行内容协商,以请求的首部字段为参考,在服务器端自动处理,但对用户来说,以浏览器发送的信息作为判定的依据,并不一定能筛选出最优内容
  2. 客户端驱动协商:用户从浏览器显示的可选项列表中手动选择,或者用JS选择。比如按照OS类型自动切换成PC版或手机版页面
  3. 透明协商:服务器驱动和客户端驱动的结合体,由服务器端和客户端各自进行内容协商的一种办法

四、返回结果的HTTP状态码

借助状态码,用户可以知道服务器端的情况。

状态码类别

4.1 2XX 成功

200 OK

表示从客户端发来的请求在服务端被正常处理


204 No Content

表示请求成功但返回的响应报文中不含实体的主体部分。表示执行成功,但是没有数据,浏览器不用刷新页面,也不用导向新的页面。


206 Partial Content

表示客户端进行了范围请求,而服务器成功执行了这部分的GET请求。响应报文中包含由 Content-Range 指定范围的实体内容。

4.2 3XX重定向

响应结果表明浏览器需要执行某些特殊的处理以正确处理请求。

301 Moved Permanently

永久性重定向,该状态码表示请求的资源已被分配了新的URI,以后应使用资源现在所指的URI。

google就是例子


302 Found

临时性重定向,表示请求的资源被分配了新的URI,希望用户本次能使用新的URI访问

ifeng.com就是例子,会跳到 www.ifeng.combaidu.com也一样


303 See Other

由于请求对应资源存在着另一个URI,应使用GET方法定向获取请求的资源。

与302有着相同的功能,但303明确表示客户端采用GET方法


304 Not Modified

客户端发送附带条件时,服务端允许请求访问资源,但未满足条件的情况。返回时,不包含任何响应的主体部分。

附带条件指:采用GET方法的请求报文中包含 If-Modified-Since / If-None-Match / If-Range / If-Unmodified-SInce 中任一首部


307 Temporary Redirect

临时重定向,与 302 相同,302 禁止POST变换成GET,但实际并不遵守。307会遵照浏览器,不会从POST变换成GET。

4.3 4XX客户端错误

400 Bad Request

请求报文中存在语法错误


401 Unauthorized

发送的请求需要有通过HTTP认证的认证信息


403 Forbidden

请求资源时被服务器拒绝(可能是未获得文件系统的访问授权、访问权限出现问题等)


404 Not Found

服务器上无法找到请求资源

4.4 5XX服务器错误

500 Internal Server Error

服务端在执行请求时发生了错误


503 Service Unavailable

服务器暂时处于停机维护状态

五、与HTTP协作的Web服务器

5.1 数据转发:代理、网关、隧道

HTTP通信时,除客户端和服务器外,还有一些用于通信数据转发的程序,它们可以配合服务器工作。

这些程序和服务器可以将请求转发给通信线路上的下一站服务器,并且能接收从那台服务器发送的响应再转发给客户端。

代理

代理是一种有转发功能的程序,扮演了位于服务器和客户端『中间人』的角色,接收由客户端发送的请求转发给服务器,同时也接收服务器返回的响应转发给客户端。


网关

网关是转发其他服务器通信数据的服务器,接收从客户端发送来的请求时,就像自己拥有资源的服务器一样对请求进行处理。

网关与代理类似,网关能使通信线路上的服务器提供非HTTP协议服务。


隧道

在相隔甚远的客户端和服务端之间进行中转,并保持双方通信连接的应用程序。

建立起一条与其他服务器的通信线路,届时使用SSL等加密手段进行通信。隧道的目的是确保客户端与服务器进行安全的通信。

六、HTTP首部

首部字段名: 字段值

6.1 4种HTTP首部字段类型

  • 通用首部字段:请求报文和相应报文都会使用的首部
  • 请求首部字段
  • 响应首部字段
  • 实体首部字段:针对请求报文和响应报文的实体部分使用的首部,补充了资源内容更新时间等。
通用首部字段
请求首部字段
响应首部字段
响应首部字段
实体首部字段

6.2 非HTTP/1.1 首部字段

Cookie、Set-Cookie等

6.3 HTTP/1.1 通用首部字段

Cache-Control 操作缓存的工作机制

多个指令间 , 分隔:

Cache-Control: private, max-age=0, no-cache

p84页


Connection 控制不再转发给代理的首部字段;管理持久连接


Date 创建HTTP报文的日期和时间

Date: Tue,03 Jul 2012 04:00:59 GMT

Pragma HTTP/1.1 之前版本的历史遗留字段,仅作为与HTTP/1.0的向后兼容而定义的。

Pragma: no-cache

Trailer

在报文主体后记录了哪些首部字段


Transfer-Encoding 规定传输报文主体时采用的编码方式。


Upgrade 检测HTTP协议以及其他协议是否可使用更高的版本进行通信,参数值指定一个完全不同的通信协议。


Via 追踪客户端与服务器之间的请求和响应报文的传输路径。

6.4 请求首部字段

Accept 通知服务器,用户代理能够处理的媒体类型及媒体类型的相对优先级

使用 q= (0~1) 来额外表示权重值,不指定q时,默认权重1,用分号进行分隔。

text/html,application/xhtml+xml,application/xml;q=0.9,image/webp,*/*;q=0.8
  • 文本文件
    • text/html text/plain text/css ...
    • application/xhtml+xml application/xml
  • 图片文件
    • image/jpeg image/gif image/png
  • 视频文件
    • video/mpeg video/quicktime
  • 应用程序使用的二进制文件
    • application/octet-stream application/zip

Accept-Charset 首部字段可用来通知服务器用户代理支持的字符集及字符集的相对优先顺序。


Accept-Encoding 告知服务器用户代理支持的内容编码及内容编码的优先级顺序。可一次性指定多种内容编码。

  • gzip
  • compress
  • deflate

Accept-Language 告知服务器用户代理能够处理的自然语言集,以及自然语言集的相对优先级。


Authorization 用户代理的认证信息


Expect 告知服务器,期望出现的某种特定行为


From 告知服务器使用用户代理的用户的电子邮件地址


Host 请求资源所处的互联网主机名和端口号。

Host是HTTP/1.1规范内唯一一个必须被包含在请求内的首部字段

因为虚拟主机在同一个IP上,因此要使用首部字段Host区分


If-MatchETag 匹配一致时,服务器才接受请求


If-Modified-SinceLast-Modified 匹配一致时


If-None-MatchIf-Match 作用相反,用于指定 If-None-Match 字段值的实体标记 ETag与请求资源的ETag不一致时,告知服务器处理该请求。


If-Range 告知服务器若指定的If-Range字段值和请求资源ETag值一致时,则作为范围请求处理。反之,返回全体资源。


If-Unmodified-SinceIf-Modified-Since 相反


Max-Forwards 指定可经过的服务器最大数目,为0时不再转发。


User-Agent

6.5 响应首部字段

Accept-Ranges 告知客户端 服务器是否能处理范围请求,以指定获取服务器端某个部分的资源


Age 告知客户端源服务器在多久前创建了响应,字段值的单位为秒。


ETag 告知客户端实体标示,是一种可将资源以字符串形式做唯一性标示的方式。服务器为每个资源分配对应ETag。

资源更新时,ETag也更新。


Location 引导至某个与请求URI位置不同的资源

6.6 实体首部字段

。。。

6.7 为Cookie服务的首部字段

Cookie首部字段

6.8 其他首部字段

HTTP首部字段是可以自己扩展的,所以在服务器和浏览器的应用上,会出现各种非标准的首部字段。

X-Frame-Options

控制网站在其他网站的<frame>内的显示问题,主要是防止点击劫持。

  • DENY: 拒绝
  • SAMEORIGIN: 仅同源下页面匹配时许可

X-XSS-Protection

首部字段 X-XSS-Protection 属于HTTP响应头部,是针对XSS的一种对策,用于控制浏览器XSS防护机制的开关。

  • 0: 将XSS过滤设置成无效状态
  • 1: 将XSS过滤设置成有效状态

DNT 拒绝个人信息被收集


P3P 可以让网站上的个人隐私编程仅供程序可理解的形式,达到保证用户隐私的目的。

七、确保安全的HTTPS

7.1 HTTP的缺点

  • 通信使用明文(不加密),内容可能会被窃听
  • 不验证通信双方身份,可能遭遇伪装
  • 无法证明报文的完整性,可能遭篡改(中间人攻击)

7.2 HTTPS的应对

  • 两方面:
    • 通信加密,HTTP协议中没有加密机制,但可以通过和SSL或TLS的组合使用,加密HTTP通信内容
    • 内容加密,客户端和服务端同时具备加密和解密机制
  • SSL不仅提供加密处理,而且还使用了一种被称为证书的手段,用于确定方。

HTTP+加密+认证+完整性保护=HTTPS

HTTPS通信

HTTPS是身披SSL外壳的HTTP

HTTPS不是应用层的一种新协议,只是HTTP通信接口部分用SSL(Secure Socket Layer) 和 TLS(Transport Layer Security) 协议代替而已。

通常,HTTP直接和TCP通信,但是用HTTPS时,则演变成先和SSL通信,再由SSL和TCP通信了。

采用SSL后,HTTP就有了加密、证书和完整性保护这些功能。

HTTPS通信
  • 步 骤 1 :客户端通过发送 Client Hello 报文开始 SSL 通信。报文中 包含客户端支持的 SSL 的指定版本、加密组件(Cipher Suite)列表(所使用的加密算法及密钥长度等)。
  • 步 骤 2 :服务器可进行 SSL 通信时,会以 Server Hello 报文作为应 答。和客户端一样,在报文中包含 SSL 版本以及加密组 件。服务器的加密组件内容是从接收到的客户端加密组件 内筛选出来的。
  • 步 骤 3 :之后服务器发送 Certificate 报文。报文中包含公开密钥证书。
  • 步骤 4: 最后服务器发送 Server Hello Done 报文通知客户端,最初 阶段的 SSL 握手协商部分结束。
  • 步骤 5:SSL 第一次握手结束之后,客户端以 Client Key Exchange 报文作为回应。报文中包含通信加密中使用的一种被称为 Pre-master secret 的随机密码串。该报文已用步骤 3 中的公 开密钥进行加密。
  • 步骤 6:接着客户端继续发送 Change Cipher Spec 报文。该报文会 提示服务器,在此报文之后的通信会采用 Pre-master secret 密钥加密。
  • 步骤 7:客户端发送 Finished 报文。该报文包含连接至今全部报文 的整体校验值。这次握手协商是否能够成功,要以服务器 是否能够正确解密该报文作为判定标准。
  • 步骤 8: 服务器同样发送 Change Cipher Spec 报文。
  • 步骤 9 :服务器同样发送 Finished 报文。
  • 步骤 10:服务器和客户端的 Finished 报文交换完毕之后,SSL 连接 就算建立完成。当然,通信会受到 SSL 的保护。从此处开 始进行应用层协议的通信,即发送 HTTP 请求。
  • 步骤 11:应用层协议通信,即发送 HTTP 响应。
  • 步骤 12:最后由客户端断开连接。断开连接时,发送 close_notify报文。

HTTPS会比较慢,通信慢和处理速度慢

八、确认用户身份的认证

  • BASIC认证
  • DIGEST认证
  • SSL客户端认证

但以上均不常使用,认证多半为表单认证,配合Cookie管理Session。

通常,安全的方法是先利用给密码加盐(salt)增加额外信息,再使用散列(hash)计算出散列值后保存。

九、基于HTTP的功能追加协议

9.1 HTTP的瓶颈

  • 一条连接上只可发送一个请求。
  • 请求只能从客户端开始。客户端不可以接收除响应以外的指令。
  • 请求 / 响应首部未经压缩就发送。首部信息越多延迟越大。
  • 发送冗长的首部。每次互相发送相同的首部造成的浪费较多。
  • 可任意选择数据压缩格式。非强制压缩发送。

解决办法:

  • AJAX
  • Comet

但本质是HTTP协议的缺陷,需要新的协议——WebSocket。

WebSocket,web浏览器与web服务器之间全双工通信。一旦建立websocket连接,之后所有通信都依靠这个专用协议进行,可互相发JSON、XML、HTML等资源。

websocket特点:

  • 推送功能,服务器向客户端推送数据
  • 减少通信量,不用每次重新连接
websocket通信

先通过HTTP的Upgrade,告知服务器通信协议改变,然后返回 101 Switching Protocols 的响应。确定连接后,通信不再使用HTTP,采用WebSocket独立的数据帧。


HTTP/2.0

HTTP/2.0目标是改善用户在使用web时的速度体验。

十、构建web内容的技术

十一、web攻击技术

HTTP不具备必要的安全功能,且在客户端可篡改请求

  • 以服务器为目标的主动攻击:SQL注入和OS命令注入攻击
  • 以服务器为目标的被动攻击:XSS和CSRF
XSS
CSRF

推荐阅读更多精彩内容