图解 HTTP 要点记录

HTTP协议复习

Posted by Roger on February 22, 2017

图解 HTTP

作为 Android 开发人员,HTTP 的相关知识是很重要的一块。《图解 HTTP》是我见过读起来最舒服的一本技术书籍,虽然不像《HTTP权威指南》,《TCP/IP详解》这两本网络圣经来得出名,但是对于不必深刻深入的初学者来说,《图解 HTTP》应该是为最适合的一本书籍。文中大量的图片重在让大家理解其中的原理内容,读起来毫不生涩,非常容易理解。

第一章 基本介绍

  1. TCP/IP 协议族按层次分别为 应用层、传输层、网络层 和 数据链路层。
    • 应用层即 FTP、DNS服务即其中的两类,HTTP协议也处于该层
    • 传输层对上层应用层,提供处于网络链接中的两台计算机之间的数据传输。主要是 TCP 和 UDP 。
    • 网络层用来处理在网络上流动的数据包,数据包是网络传输的最小数据单位。该层规定了通过怎样的路径达到对方计算机,并把数据包传送给对方。
    • 链路层用来处理连接网络的硬件部分

2. image

  1. 与 HTTP 关系密切的协议: IP,TCP 和 DNS
    • 负责传输的IP协议,位于网络层。作用就是把各种数据包传送给对方。
    • 确保可靠性的 TCP 协议,TCP 位于传输层,提供可靠的字节流服务。为了确保数据能够到达目标,TCP 协议采用了三次握手的策略。用 TCP 协议把数据包送出去后, TCP 一定会向对方确认是否成功送达。握手过程中使用了 TCP 的标志 SYN (synchronize) 和 ACK (acknowledgement)。发送端先发送一个 SYN 标志的数据包给对方。服务端接受后回传一个 SYN/ACK 标志的数据包表示传达确认信息。最后发送端再回传一个 ACK 标志代表握手结束。 若在中途的某个阶段中断,TCP 协议会再次以相同的顺序发送相同的数据包。

image

  • 负责域名解析的 DNS 服务,用户通常使用主机名或域名来访问对方的计算机,而不是直接通过 IP 地址来访问。而这时候就需要 DNS 服务来通过域名查找 IP 地址,或逆向从 IP 地址反查域名的服务。

各种协议族的配合使用如下图:

image

第二章 简单的 HTTP 协议

  1. HTTP 是不保存状态的协议。
  2. HTTP 中可以使用的方法: * GET : 获取资源 * POST : 传输实体主体 * PUT : 传输文件 * HEAD :获得报文首部,和 GET 方法一样,只是不返回报文主体部分。 * DELETE : 删除文件,与 PUT 相反的方法,但是由于不带验证机制,所以一般的 Web 网站也不使用 DELETE 方法。 * OPTIONS : 询问支持的方法。 * TRACE : 追踪路径,TRACE 方法是让 Web 服务器端将之前的请求通信环回给客户端的方法。 * CONNECT : 要求用隧道协议连接代理, CONNECT 方法要求在与代理服务器通信时建立隧道,实现用隧道协议进行 TCP 通信。主要使用 SSL 和 TLS 协议把通信内容加密后经网络隧道传输。

  3. 使用 Cookie 的状态管理 Cookie 技术通过在请求和响应报文中写入 Cookie 信息来控制客户端的状态。

第三章 HTTP 报文内的 HTTP 信息

  1. HTTP 报文分为 报文首部 和 报文主体。

  2. 报文主体 和 实体主体 的差异: * 报文 是 HTTP 通信中的基本单位,由 8 位组字节流组成,通过 HTTP 通信传输。 * 实体 作为请求或响应的有效载荷数据被传输,其内容由实体首部和实体主体组成。

  3. 压缩传输的内容编码,向待发送邮件内增加附件时,为了使邮件容量变小,我们会先用 ZIP 压缩文件之后再添加附件发送。

第四章 返回结果的 HTTP 状态码 (重要)

  1. 状态码的职责是当客户端向服务端发送请求时,描述返回的请求结果。 * 1XX : 信息性状态码,接受的请求正在处理 * 2XX : 成功状态码,请求正常处理完成
    • 204 该状态码代表服务器接收的请求已处理成功,但在返回的响应报文中不含实体的主体部分
    • 206 该状态码表示客户端进行了范围请求,而服务器成功执行了这部分的 GET 请求
      • 3XX : 重定向状态码,需要进行附加操作以完成请求
    • 301 永久性重定向,表示请求的资源已经被分配了新的 URI
    • 302 临时性重定向,表示请求的资源已经临时被分配了新的 URI
    • 303 表示由于请求对应的资源存在着另一个 URI,应使用 GET 方法定向获取请求的资源
    • 304 表示客户端发送附带条件的请求时,服务器端允许请求访问资源,但未满足条件的情况。304 状态码返回时不包含任何响应的主体部分。虽然 304 被划分在 3XX 类别中,但是和重定向没有关系。
      • 4XX : 客户端错误状态码,服务器无法处理请求
    • 400 表示请求报文中存在语法错误
    • 401 表示发送的请求需要有通过 HTTP 认证的认证信息,若之前已经进行过 1 次请求,则表示用户认证失败。
    • 403 表明对请求资源的访问被服务器拒绝了。服务器端没有必要给出拒绝的详细理由。
    • 404 表明服务器上无法找到请求的资源,除此之外,也可以在服务器端拒绝请求且不想说明理由时使用。
      • 5XX : 服务器错误状态码,服务器处理请求出错
    • 500 表明服务器端在执行请求时发生了错误,也可能是 Web 应用存在的 bug 或某些临时的故障
    • 503 表明服务器暂时处于超负荷或正在进行停机维护,现在无法处理请求。

第五章 与 HTTP 协作的 Web 服务器

  1. 通信数据转发程序,代理,网关,隧道 * 代理 代理是一种有转发功能的应用程序,它扮演了位于服务器和客户端 “中间人” 的角色,接受由客户端发送的请求并转发给服务器。 * 网关 网关是转发其他服务器通信数据的服务器,接受从客户端发送来的请求时,他就像自己拥有资源的源服务器一样对请求进行处理。有时客户端可能都不会查血,自己的通信目标是一个网关。 * 隧道 隧道是在和相隔胜远的客户端和服务器两者之间进行中转,并保持双方通信连接的应用程序

第六章 HTTP 报文首部

  1. HTTP 首部字段结构,由字段名和字段值构成,中间用冒号 “ :” 分隔。
  2. 各个首部字段信息,用到时 google 即可,这里特殊说明一个 Authorization 字段,用来告知服务器,用户代理的认证信息,在开发中一般是用于传输 token 等加密信息

第七章 确保 Web 安全的 HTTPS

  1. HTTP 通信使用明文,内容可能被窃听。不验证通信方的身份,因此有可能遭遇伪装。无法证明报文的完整性,所以有可能已遭篡改 * TCP/IP 是可能被窃听的网络,使用抓包工具可以很简单的监听到
  2. 通信的加密。HTTP 协议中没有加密机制,但可以通过和 SSL 或 TLS 的组合使用,加密 HTTP 的通信内容。
  3. 使用 SSL 使用证书来确定请求发送方的身份。
  4. 通常 HTTP 直接和 TCP 通信,当使用 HTTPS 时,则演变成先和 SSL 通信,再由 SSL 和 TCP 通信了。所谓 HTTPS ,其实就是身披 SSL 协议这层外壳的 HTTP。
  5. HTTPS 通信步骤: image image

  6. HTTPS 也存在一些问题,那就是当使用 SSL 时,它的处理速度会变慢。 * 和使用 HTTP 相比,网络负载可能会变慢到 2 到 100 倍。除去和 TCP 连接、发送 HTTP 请求和响应以外,还必须进行 SSL 通信,因此整体上处理通信量不可避免的增加。 * 另一点就是 SSL 必须进行加密处理,在服务器和客户端都需要进行加密和解密的运算处理,所以从结果上讲, 比起 HTTP 会更多的消耗服务端和客户端的硬件资源,造成负载增强。

第八章 确认访问用户身份的认证

  1. BASIC 认证,是从 HTTP/1.0 就定义的认证方式。输入用户名和密码来确认信息。如果被人窃听,被盗的可能性极高。
  2. DIGEST 认证同样使用质询/响应的方式,但不会像 BASIC 认证那样直接发送明文密码。
  3. SSL 客户端认证,是借由 HTTPS 的客户端证书完成认证的方式。凭借客户端证书认证,服务器可确认访问是否来自已登录的客户端。
  4. 基于表单的认证。

第九章 基于 HTTP 的功能追加协议

  1. 消除 HTTP 瓶颈的 SPDY 。 HTTP 的瓶颈在于,如果客户端不进行请求,那么页面就不能进行刷新。 * AJAX 的解决方法,ajax 是一种有效利用 JavaScript 和 DOM 的操作,已达到局部 Web 页面替换加载的异步通信手段。 * Comet 的解决方法,一旦服务器端有内容更新了,Comet 不会让请求等待,而是直接给客户端返回响应。这是一种通过延迟应答,模拟实现服务器端向客户端推送的功能。
  2. SPDY 的设计与功能