图解HTTP
第1章 了解 Web 及网络基础
TCP/IP协议族
TCP/IP是把与互联网相关联的协议集合起来的总称
层次化
应用层(FTP、DNS、HTTP协议)
应用层决定了向用户提供应用服务时的通信活动
传输层(TCP、UDP)
传输层对上层应用层,提供处于网络连接中的两台计算机之间的数据传输
网络层
网络层用来处理在网络上流动的数据包
数据链路层
用来处理连接网络的硬件部分
图示 IP 协议、 TCP 协议和 DNS 服务在使用HTTP 协议的通信过程中各自发挥了哪些作用
URI 和 URL
URI 用字符串标识某一互联网资源, 而 URL表示资源的地点(互联网上所处的位置)
URI( Uniform Resource Identifier,统一资源标识符)
绝对 URI 的格式
URL(Uniform Resource Locator, 统一资源定位符)
第 2 章 简单的 HTTP 协议
HTTP 是不保存状态的协议
TTP 是一种不保存状态, 即无状态协议。HTTP 协议自身不对请求和响应之间的通信状态进行保存。 也就是说在 HTTP 这个级别, 协议对于发送过的请求或响应都不做持久化处理。
有了 Cookie 再用 HTTP 协议通信, 就可以管理状态了,Cookie 技术通过在请求和响应报文中写入 Cookie 信息来控制客户端的状态
告知服务器意图的 HTTP 方法
GET : 获取资源
指定的资源经服务器端解析后返回响应内容。
POST: 传输实体主体
虽然用 GET 方法也可以传输实体的主体, 但一般不用 GET 方法进行传输, 而是用 POST 方法。 虽说 POST 的功能与 GET 很相似, 但POST 的主要目的并不是获取响应的主体内容。
PUT: 传输文件
PUT 方法用来传输文件。 就像 FTP 协议的文件上传一样, 要求在请求报文的主体中包含文件内容, 然后保存到请求 URI 指定的位置。
HEAD: 获得报文首部
HEAD 方法和 GET 方法一样, 只是不返回报文主体部分。 用于确认URI 的有效性及资源更新的日期时间等。
DELETE: 删除文件
DELETE 方法用来删除文件, 是与 PUT 相反的方法。 DELETE 方法按请求 URI 删除指定的资源。
OPTIONS: 询问支持的方法
OPTIONS 方法用来查询针对请求 URI 指定的资源支持的方法。
TRACE: 追踪路径
TRACE 方法是让 Web 服务器端将之前的请求通信环回给客户端的方法。
CONNECT: 要求用隧道协议连接代理
CONNECT 方法要求在与代理服务器通信时建立隧道, 实现用隧道协议进行 TCP 通信。 主要使用 SSL(Secure Sockets Layer, 安全套层)和 TLS(Transport Layer Security, 传输层安全) 协议把通信内容加 密后经网络隧道传输
持久连接节省通信量
背景:HTTP 协议的初始版本中, 每进行一次 HTTP 通信就要断开一次 TCP连接。随着 HTTP 的普及, 文档中包含大量图片的情况多了起来
解决:HTTP/1.1 和一部分的 HTTP/1.0 想出了持久连接的方法。 持久连接的特点是, 只要任意一端没有明确提出断开连接, 则保持 TCP 连接状态。
好处:减少了 TCP 连接的重复建立和断开所造成的额外开销, 减轻了服务器端的负载。 另外, 减少开销的那部分时间, 使HTTP 请求和响应能够更早地结束, 这样 Web 页面的显示速度也就相应提高了。
第 3 章 HTTP 报文内的 HTTP 信息
请求报文及响应报文的结构
请求行:包含用于请求的方法, 请求 URI 和 HTTP 版本。
状态行:包含表明响应结果的状态码, 原因短语和 HTTP 版本。
首部字段:包含表示请求和响应的各种条件和属性的各类首部。
编码提升传输速率
报文主体和实体主体的差异
报文( message):是 HTTP 通信中的基本单位, 由 8 位组字节流(octet sequence,其中 octet 为 8 个比特) 组成, 通过 HTTP 通信传输。
实体( entity):作为请求或响应的有效载荷数据(补充项) 被传输, 其内容由实体首部和实体主体组成。
压缩传输的内容编码
常用的内容编码有以下几种:gzip( GNU zip)、compress( UNIX 系统的标准压缩)、deflate( zlib)、identity( 不进行编码)
执行范围请求时, 会用到首部字段 Range 来指定资源的 byte 范围
内容协商返回最合适的内容
内容协商技术有以下 3 种类型
服务器驱动协商( Server-driven Negotiation)
由服务器端进行内容协商。 以请求的首部字段为参考, 在服务器端自动处理。
客户端驱动协商( Agent-driven Negotiation)
由客户端进行内容协商的方式。 用户从浏览器显示的可选项列表中手动选择。 还可以利用 JavaScript 脚本在 Web 页面上自动进行上述选 择。
透明协商( Transparent Negotiation)
是服务器驱动和客户端驱动的结合体, 是由服务器端和客户端各自进行内容协商的一种方法
第 4 章 返回结果的 HTTP 状态 码
状态码的职责是当客户端向服务器端发送请求时, 描述返回的请求结果。
数字中的第一位指定了响应类别, 后两位无分类, 响应类别有以上 5种。只要遵守状态码类别的定义, 即使改变 RFC2616 中定义的状态码, 或服务器端自行创建状态码都没问题。
2XX 成功
2XX 的响应结果表明请求被正常处理了
200 OK
表示从客户端发来的请求在服务器端被正常处理了。
204 No Content
该状态码代表服务器接收的请求已成功处理, 但在返回的响应报文中不含实体的主体部分。 另外, 也不允许返回任何实体的主体。
一般在只需要从客户端往服务器发送信息, 而对客户端不需要发送新信息内容的情况下使用。
206 Partial Content
该状态码表示客户端进行了范围请求, 而服务器成功执行了这部分的GET 请求。 响应报文中包含由 Content-Range 指定范围的实体内容。
3XX 重定向
3XX 响应结果表明浏览器需要执行某些特殊的处理以正确处理请求
301 Moved Permanently
永久性重定向。 该状态码表示请求的资源已被分配了新的 URI, 以后应使用资源现在所指的 URI。 也就是说, 如果已经把资源对应的 URI 保存为书签了, 这时应该按 Location 首部字段提示的 URI 重新保存。
302 Found
临时性重定向。 该状态码表示请求的资源已被分配了新的 URI, 希望用户(本次) 能使用新的 URI 访问。
和 301 Moved Permanently 状态码相似, 但 302 状态码代表的资源不是被永久移动, 只是临时性质的。 换句话说, 已移动的资源对应的 URI 将来还有可能发生改变。
303 See Other
该状态码表示由于请求对应的资源存在着另一个 URI, 应使用 GET方法定向获取请求的资源
303 状态码和 302 Found 状态码有着相同的功能, 但 303 状态码明确表示客户端应当采用 GET 方法获取资源, 这点与 302 状态码有区 别。
304 Not Modified
该状态码表示客户端发送附带条件的请求 2 时, 服务器端允许请求访问资源, 但未满足条件的情况。
304 状态码返回时, 不包含任何响应的主体部分。 304 虽然被划分在 3XX 类别中, 但是和重定向没有关系
307 Temporary Redirect
临时重定向
该状态码与 302 Found 有着相同的含义。 尽管 302 标准禁止 POST 变换成 GET, 但实际使用时大家并不遵守。307 会遵照浏览器标准, 不会从 POST 变成 GET。 但是, 对于处理响应时的行为, 每种浏览器有可能出现不同的情况。
4XX 客户端错误
4XX 的响应结果表明客户端是发生错误的原因所在
400 Bad Request
该状态码表示请求报文中存在语法错误。 当错误发生时, 需修改请求的内容后再次发送请求。
401 Unauthorized
该状态码表示发送的请求需要有通过 HTTP 认证(BASIC 认证、DIGEST 认证) 的认证信息。另外若之前已进行过 1 次请求, 则表示用户认证失败。
403 Forbidden
该状态码表明对请求资源的访问被服务器拒绝了。
服务器端没有必要给出拒绝的详细理由, 但如果想作说明的话, 可以在实体的主体部分对原因进行描述, 这样就能让用户看到了。
404 Not Found
该状态码表明服务器上无法找到请求的资源
也可以在服务器端拒绝请求且不想说明理由时使用
5XX 服务器错误
5XX 的响应结果表明服务器本身发生错误
500 Internal Server Error
该状态码表明服务器端在执行请求时发生了错误。也有可能是 Web应用存在的 bug 或某些临时的故障
503 Service Unavailable
该状态码表明服务器暂时处于超负载或正在进行停机维护, 现在无法处理请求。 如果事先得知解除以上状况需要的时间, 最好写入RetryAfter 首部字段再返回给客户端。
第 5 章 与 HTTP 协作的 Web 服 务器
通信数据转发程序 : 代理、 网关、 隧道
代理
代理是一种有转发功能的应用程序, 它扮演了位于服务器和客户端“中间人”的角色, 接收由客户端发送的请求并转发给服务器, 同时也接收服务器返回的响应并转发给客户端。
网关
网关是转发其他服务器通信数据的服务器, 接收从客户端发送来的请求时, 它就像自己拥有资源的源服务器一样对请求进行处理。 有时客户端可能都不会察觉, 自己的通信目标是一个网关。
隧道
隧道是在相隔甚远的客户端和服务器两者之间进行中转, 并保持双方通信连接的应用程序。
第 6 章 HTTP 首部
HTTP 报文首部
HTTP 请求报文
HTTP 响应报文
HTTP 首部字段
HTTP 首部字段是由首部字段名和字段值构成的, 中间用冒号“:” 分隔
4 种 HTTP 首部字段类型
通用首部字段( General Header Fields)
请求报文和响应报文两方都会使用的首部
请求首部字段( Request Header Fields)
从客户端向服务器端发送请求报文时使用的首部。 补充了请求的附加内容、 客户端信息、 响应内容相关优先级等信息。
响应首部字段( Response Header Fields)
从服务器端向客户端返回响应报文时使用的首部。 补充了响应的附加内容, 也会要求客户端附加额外的内容信息。
实体首部字段( Entity Header Fields)
针对请求报文和响应报文的实体部分使用的首部。 补充了资源内容更新时间等与实体有关的信息。
其他首部字段
X-Frame-Options
首部字段 X-Frame-Options 属于 HTTP 响应首部, 用于控制网站内容在其他 Web 网站Frame 标签内的显示问题。 其主要目的是为了防止点击劫持(clickjacking) 攻击。
DENY : 拒绝
SAMEORIGIN : 仅同源域名下的页面(Top-level-browsingcontext) 匹配时许可
X-XSS-Protection
首部字段 X-XSS-Protection 属于 HTTP 响应首部, 它是针对跨站脚本攻击(XSS) 的一种对策, 用于控制浏览器 XSS 防护机制的开关。
0 : 将 XSS 过滤设置成无效状态
1 : 将 XSS 过滤设置成有效状态
DNT
首部字段 DNT 属于 HTTP 请求首部, 其中DNT 是 Do Not Track 的简称, 意为拒绝个人信息被收集, 是表示拒绝被精准广告追踪的一种方 法。
0 : 同意被追踪
1 : 拒绝被追踪
P3P
首部字段 P3P 属于 HTTP 相应首部, 通过利用 P3P(The Platform for Privacy Preferences, 在线隐私偏好平台) 技术, 可以让 Web 网站上的个人隐私变成一种仅供程序可理解的形式, 以达到保护用户隐私的目的
第 7 章 确保 Web 安全的HTTPS
共享密钥加密的困境
加密和解密同用一个密钥的方式称为共享密钥加密(Common key crypto system) , 也被叫做对称密钥加密。
可究竟怎样才能安全地转交? 在互联网上转发密钥时, 如果通信被监听那么密钥就可会落入攻击者之手, 同时也就失去了加密的意义。 另外还得设法安全地保管接收到的密钥。
使用两把密钥的公开密钥加密
公开密钥加密方式很好地解决了共享密钥加密的困难。公开密钥加密使用一对非对称的密钥。 一把叫做私有密钥(private key) , 另一把叫做公开密钥(public key) 。 顾名思义, 私有密钥不能让其他任何人知道, 而公开密钥则可以随意发布, 任何人都可以获得。
使用公开密钥加密方式, 发送密文的一方使用对方的公开密钥进行加密处理, 对方收到被加密的信息后, 再使用自己的私有密钥进行解密。 利用这种方式, 不需要发送用来解密的私有钥,也不必担心密钥被攻击者窃听而盗走
公开密钥加密与共享密钥加密相比, 其处理速度要慢
HTTPS 采用混合加密机制
在交换密钥环节使用公开密钥加密方式, 之后的建立通信交换报文阶段则使用共享密钥加密式。
证明公开密钥正确性的证书
遗憾的是, 公开密钥加密方式无法证明公开密钥本身就是货真价实的公开密钥。为了解决上述问题, 可以使用由数字证书认证机构(CA Certificate Authority) 和其相关机关颁发的公开密钥证书。
第 8 章 确认访问用户身份的认证
核对的信息通常是
密码: 只有本人才会知道的字符串信息
动态令牌: 仅限本人持有的设备内显示的一次性密码
数字证书: 仅限本人( 终端) 持有的信息
生物认证: 指纹和虹膜等本人的生理信息
IC 卡等: 仅限本人持有的信息
HTTP 使用的认证方式
BASIC 认证( 基本认证)
DIGEST 认证( 摘要认证)
SSL 客户端认证
FormBase 认证( 基于表单认证)
此外, 还有 Windows 统一认证(Keberos 认证、 NTLM 认证)
因篇幅问题不能全部显示,请点此查看更多更全内容