图解 HTTP 要点记录
原文链接 http://www.rogerblog.cn/2017/02/22/http/
注:以下为加速网络访问所做的原文缓存,经过重新格式化,可能存在格式方面的问题,或偶有遗漏信息,请以原文为准。
图解 HTTP
作为 Android 开发人员,HTTP 的相关知识是很重要的一块。《图解 HTTP》是我见过读起来最舒服的一本技术书籍,虽然不像《HTTP权威指南》,《TCP/IP详解》这两本网络圣经来得出名,但是对于不必深刻深入的初学者来说,《图解 HTTP》应该是为最适合的一本书籍。文中大量的图片重在让大家理解其中的原理内容,读起来毫不生涩,非常容易理解。
第一章 基本介绍
- TCP/IP 协议族按层次分别为 应用层、传输层、网络层 和 数据链路层。
- 应用层即 FTP、DNS服务即其中的两类,HTTP协议也处于该层
- 传输层对上层应用层,提供处于网络链接中的两台计算机之间的数据传输。主要是 TCP 和 UDP 。
- 网络层用来处理在网络上流动的数据包,数据包是网络传输的最小数据单位。该层规定了通过怎样的路径达到对方计算机,并把数据包传送给对方。
- 链路层用来处理连接网络的硬件部分
2.
- 与 HTTP 关系密切的协议: IP,TCP 和 DNS
- 负责传输的IP协议,位于网络层。作用就是把各种数据包传送给对方。
- 确保可靠性的 TCP 协议,TCP 位于传输层,提供可靠的字节流服务。为了确保数据能够到达目标,TCP 协议采用了三次握手的策略。用 TCP 协议把数据包送出去后, TCP 一定会向对方确认是否成功送达。握手过程中使用了 TCP 的标志 SYN (synchronize) 和 ACK (acknowledgement)。发送端先发送一个 SYN 标志的数据包给对方。服务端接受后回传一个 SYN/ACK 标志的数据包表示传达确认信息。最后发送端再回传一个 ACK 标志代表握手结束。 若在中途的某个阶段中断,TCP 协议会再次以相同的顺序发送相同的数据包。
- 负责域名解析的 DNS 服务,用户通常使用主机名或域名来访问对方的计算机,而不是直接通过 IP 地址来访问。而这时候就需要 DNS 服务来通过域名查找 IP 地址,或逆向从 IP 地址反查域名的服务。
各种协议族的配合使用如下图:
第二章 简单的 HTTP 协议
- HTTP 是不保存状态的协议。
HTTP 中可以使用的方法:
- GET : 获取资源
- POST : 传输实体主体
- PUT : 传输文件
- HEAD :获得报文首部,和 GET 方法一样,只是不返回报文主体部分。
- DELETE : 删除文件,与 PUT 相反的方法,但是由于不带验证机制,所以一般的 Web 网站也不使用 DELETE 方法。
- OPTIONS : 询问支持的方法。
- TRACE : 追踪路径,TRACE 方法是让 Web 服务器端将之前的请求通信环回给客户端的方法。
- CONNECT : 要求用隧道协议连接代理, CONNECT 方法要求在与代理服务器通信时建立隧道,实现用隧道协议进行 TCP 通信。主要使用 SSL 和 TLS 协议把通信内容加密后经网络隧道传输。
使用 Cookie 的状态管理 Cookie 技术通过在请求和响应报文中写入 Cookie 信息来控制客户端的状态。
第三章 HTTP 报文内的 HTTP 信息
HTTP 报文分为 报文首部 和 报文主体。
报文主体 和 实体主体 的差异:
- 报文 是 HTTP 通信中的基本单位,由 8 位组字节流组成,通过 HTTP 通信传输。
- 实体 作为请求或响应的有效载荷数据被传输,其内容由实体首部和实体主体组成。
压缩传输的内容编码,向待发送邮件内增加附件时,为了使邮件容量变小,我们会先用 ZIP 压缩文件之后再添加附件发送。
第四章 返回结果的 HTTP 状态码 (重要)
- 状态码的职责是当客户端向服务端发送请求时,描述返回的请求结果。
- 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 服务器
- 通信数据转发程序,代理,网关,隧道
- 代理 代理是一种有转发功能的应用程序,它扮演了位于服务器和客户端 “中间人” 的角色,接受由客户端发送的请求并转发给服务器。
- 网关 网关是转发其他服务器通信数据的服务器,接受从客户端发送来的请求时,他就像自己拥有资源的源服务器一样对请求进行处理。有时客户端可能都不会查血,自己的通信目标是一个网关。
- 隧道 隧道是在和相隔胜远的客户端和服务器两者之间进行中转,并保持双方通信连接的应用程序
第六章 HTTP 报文首部
- HTTP 首部字段结构,由字段名和字段值构成,中间用冒号 “ :” 分隔。
- 各个首部字段信息,用到时 google 即可,这里特殊说明一个 Authorization 字段,用来告知服务器,用户代理的认证信息,在开发中一般是用于传输 token 等加密信息
第七章 确保 Web 安全的 HTTPS
- HTTP 通信使用明文,内容可能被窃听。不验证通信方的身份,因此有可能遭遇伪装。无法证明报文的完整性,所以有可能已遭篡改
- TCP/IP 是可能被窃听的网络,使用抓包工具可以很简单的监听到
- 通信的加密。HTTP 协议中没有加密机制,但可以通过和 SSL 或 TLS 的组合使用,加密 HTTP 的通信内容。
- 使用 SSL 使用证书来确定请求发送方的身份。
- 通常 HTTP 直接和 TCP 通信,当使用 HTTPS 时,则演变成先和 SSL 通信,再由 SSL 和 TCP 通信了。所谓 HTTPS ,其实就是身披 SSL 协议这层外壳的 HTTP。
HTTPS 通信步骤:
HTTPS 也存在一些问题,那就是当使用 SSL 时,它的处理速度会变慢。
- 和使用 HTTP 相比,网络负载可能会变慢到 2 到 100 倍。除去和 TCP 连接、发送 HTTP 请求和响应以外,还必须进行 SSL 通信,因此整体上处理通信量不可避免的增加。
- 另一点就是 SSL 必须进行加密处理,在服务器和客户端都需要进行加密和解密的运算处理,所以从结果上讲, 比起 HTTP 会更多的消耗服务端和客户端的硬件资源,造成负载增强。
第八章 确认访问用户身份的认证
- BASIC 认证,是从 HTTP/1.0 就定义的认证方式。输入用户名和密码来确认信息。如果被人窃听,被盗的可能性极高。
- DIGEST 认证同样使用质询/响应的方式,但不会像 BASIC 认证那样直接发送明文密码。
- SSL 客户端认证,是借由 HTTPS 的客户端证书完成认证的方式。凭借客户端证书认证,服务器可确认访问是否来自已登录的客户端。
- 基于表单的认证。
第九章 基于 HTTP 的功能追加协议
- 消除 HTTP 瓶颈的 SPDY 。 HTTP 的瓶颈在于,如果客户端不进行请求,那么页面就不能进行刷新。
- AJAX 的解决方法,ajax 是一种有效利用 JavaScript 和 DOM 的操作,已达到局部 Web 页面替换加载的异步通信手段。
- Comet 的解决方法,一旦服务器端有内容更新了,Comet 不会让请求等待,而是直接给客户端返回响应。这是一种通过延迟应答,模拟实现服务器端向客户端推送的功能。
- SPDY 的设计与功能