前言

本书对互联网基盘——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 攻击
  • 后门程序

最新文章

  1. Hibernate(九)__OpenSessionInView解决懒加载问题
  2. linux 内核驱动--Platform Device和Platform_driver注册过程
  3. CSS应用二
  4. 拉电流(source current)与灌电流(sink current)
  5. No-Touch Integration 在SharePoint中使用社区支持的Silverlight应用程序
  6. python函数下篇装饰器和闭包,外加作用域
  7. js判断数组里是否有重复元素的方法
  8. 潭州课堂25班:Ph201805201 django框架 第十课 GET,POST 请求 文件上传,HttpResponse,cookie (课堂笔记)
  9. 分页控件 AspNetPager的使用
  10. 【python接口自动化框架-unittest】【一】unittest单元测试框架概念
  11. docker登录运行中的容器的4方案
  12. android录音实现不再担心—一个案例帮你解决你的问题
  13. Java Calendar,Date,DateFormat,TimeZone,Locale等时间相关内容的认知和使用(3) Date
  14. 2014年10月底/终于/HTML5定稿……/技术从来不会成为发展的绝对瓶颈/反而商业成了无法逾越的鸿沟【转载+整理】
  15. centos 7 下图形验证码乱码
  16. 用linux的iconv函数 转换编码
  17. 《JavaScript高级程序设计》5.5 Function类型
  18. 【转】SpringMVC+Spring3+Hibernate4开发环境搭建
  19. Git访问TFS出现权限不足(Using Personal Access Tokens to access Visual Studio Online)
  20. windows下nginx的安装

热门文章

  1. git 常规操作 windows版
  2. mysql 1215错误 外键建立失败
  3. gorm demo
  4. Improved robustness of reinforcement learning policies upon conversion to spiking neuronal network platforms applied to Atari Breakout game
  5. ElementUI 不维护了?供我们选择的 Vue 组件库还有很多!
  6. Kubernetes入门(一)——Kubernetes v1.18.5 安装部署
  7. js对象数组新增、修改时的验证是否重复的逻辑
  8. OGG复制进程延迟高,优化方法二(存在索引),SQL选择不好的索引
  9. SEO大神都是些什么人
  10. 常被问到的八个 Java 面试题