前言
本篇博客是读完《图解HTTP》之后,摘录和总结其中个人感觉需要知道的知识点,因为这部分知识点比较枯燥乏味,所以本篇博客力求简单,明了,有趣。
- WEB 及其网络的基础
- 确保Web安全的HTTPS
- 确认访问用户身份的认证
- 基于HTTP追加协议
WEB 及其网络的基础
TCP/IP 分层管理
ISO制定的OSI参考模型的过于庞大、复杂招致了许多批评。与此对照,由技术人员自己开发的TCP/IP协议栈获得了更为广泛的应用。

接下来的图,主要说明各个层的作用和各层涉及到协议:

常用协议:IP、TCP、DNS
####IP协议(网路层)
- 概念:IP协议是在源地址要和目的地址之间传送一种称为数据包的东西

####TCP 协议(传输层)
TCP 协议是提供可靠的字节流服务;
- 可靠:确保数据能够精确可靠的传给对方(三次握手);
- 字节流服务:为了传输方便,将大块数据分割为以报文段为单位的数据包进行管理;
通过三次握手建立连接:

四次挥手关闭连接:

####DNS 协议
提供域名和IP地址之间的解析服务

TCP/IP 通信传输流

URL 和 URI 格式
URI 是统一资源标识符,而 URL 是统一资源定位符

web客户端访问资源的流程

HTTP协议简介
定义
HTTP-超文本传输协议,是位于计算机网络中的应用层,HTTP是建立在TCP协议之上,所以HTTP协议的瓶颈及其优化技巧都是基于TCP协议本身的特性,例如tcp建立连接的3次握手和断开连接的4次挥手以及每次建立连接带来的RTT延迟时间;
发展历史
HTTP 发展起来是因为在互联网的黎明时期,CERN(欧洲核子研究组织)的蒂姆.博纳斯-李 博士提出了一种让远隔两地的研究者们共享知识的设想。最初的设想的基本理念是:借助多文档之间互相关联行程超文本,连成互相参阅的WWW(万维网)。后来提出了三项技术:作为页面的文本标记语言-HTML(超文本标记语言);作为文档传输协议的-HTTP(超文本传输协议);指定文档所在地址的URL(统一资源定位符);
- 1991 HTTP/0.9 (没多久就废弃了)
- 1996 HTTP/1.0 (需要使用keep-alive参数来告知服务器端要建立一个长连接)
- 1999 HTTP/1.1 (默认支持长连接)
- 2015 HTTP/2 (主要是性能的提高)
确保Web安全的HTTPS
HTTP的缺点
- 通信使用明文(不加密),可能会被窃听;
- 不验证通信方的身份,可能遭到伪装;
- 无法证明报文的完整性,可能已遭篡改;
1. 通信使用明文(不加密),可能会被窃听
- HTTP 本身不具备加密的功能,所以无法做到对通信整体进行加密;
- TCP/IP 协议族的工作机制,通信内容在所有的通信线路上都有可能遭到窥视;
2. 不验证通信方的身份,可能遭到伪装
- 在HTTP协议通信时,由于不存在确认通信方的处理步骤,任何人都可以发起请求;
3. 无法证明报文的完整性,可能已遭篡改
- 由于HTTP 无法证明通信报文的完整性,所以即使请求或者响应的内容遭到了篡改(中间人攻击),也没有办法获悉。
HTTPS的诞生
由于 HTTP 的以上缺点,为了确保安全就诞生了HTTPS。简单的说 ** HTTPS = HTTP + 加密 + 认证 + 完整性保护**。HTTPS并不是一种新的协议,只是HTTP通信接口部分用SSL和TLS协议代替而已。例如,HTTP直接和TCP通信,使用了SSL时候,就会演变为先和SSL通信,再由SSL和TCP通信。

常用的加密技术
- 共享密钥加密/对称密钥加密
- 公开密钥加密/非对称加密
- 混合加密机制
共享密钥加密/对称密钥加密
- 概念:信息的发送方和信息的接收方使用 同一套密码 进行加密和解密;
- 共享密钥加密可以理解为服务器为了数据传输安全,送给你了一把钥匙,这把钥匙可以把数据锁在盒子里,也可以打开已经锁上的盒子。当数据发送到服务器时,服务器会用同样的钥匙打开盒子。

- 缺点:密钥有很大的风险可能会被黑客拦截;
- 优点:处理速度快;
- 总结:这个例子可以简单的理解为:小红和小花是朋友,小花家的门有一个钥匙,有一天为了方便,配了个钥匙给小红,从此小红就可以随便的进出小花家了,但是钥匙得好好保存,万一被小偷得到,就也可以随便进出小花家了。
公开密钥加密/非对称加密
- 概念:公开密钥有 一对非对称的密钥,一把公开密钥,一把私有密钥,公开密钥可以发送给任何发送请求方,而私有密钥 只有一方有,一对中的一把密钥加密后,只能用另外一个进行解密,即使是自己也不可以解密;
- 公开密钥加密可以理解为,服务器首先给发送请求的客户端发送了一个公开密钥**(公钥可以发给任何请求方)**,客户端收到好,对报文进行加密后,发送给服务器,服务器再用独有的私钥进行解密。

- 优点:获取;
- 缺点:处理速度慢;
- 公钥用来进行加密,私钥用来数字签名
混合加密机制
- 概念:混合使用公开密钥加密和共享密钥加密,在交换密钥的环节采用公开密钥加密,之后建立的通信报文阶段则使用共享密钥加密,这样既可以避免密钥被盗取,又可以提高通信的效率;

- HTTPS 采用的混合加密机制;
数字签名和证书
数字签名
- 概念
一封信中,文末的签名是为了证明这封信是签名者写的,同理,数字签名也是为了证明某个消息是特定的某个人发的(有效性);同时,数字签名还能证明消息没有被篡改(完整性);
- 作用
- 如何生成数字签名
一般不对消息直接进行签名,而是对消息的哈希值进行签名。
- 对消息进行哈希计算,得到哈希值;
- 利用私钥对哈希值进行加密,生成数字签名;
- 将签名附件在消息后面,一起发送过去;
- 验证签名
- 收到消息后提取消息中的签名;
- 用公钥对签名进行解密,得到哈希值1;
- 对消息中的正文进行计算得到哈希值2;
- 比较哈希值1和哈希值2,如果相同,则验证成功;
证书
- 概念:
证书其实就是对公开加密方法中的公钥进行加密,是对公钥的合法性提供证明的技术;
- 作用:
- 认证服务器的公开密钥是真实有效的数字证书认证机构;
- 服务器的公开密钥是值得信赖的;
- 认证机构
可以使用数字认证机构(CA)和其他相关的机关颁发公开的密钥证书(就像是银行);
- 证书种类
- EV SSL 证书
EV SSL证书可以证明作为通信一方的服务器是否规范,同时也可以确认服务器背后运营的企业是否是真实存在的。
- 客户端证书
证明服务器正在通信的对方始终是预料之内的客户端;
- 自签名证书
- 概念:由自认证机构(独立构建的认证机构)颁发的证书称为自签名证书;
- 浏览器访问该服务器的时候,会显示“无法确认连接安全性”或“该网站的安全可能存在问题”等警告;
- 由自认证机构颁发的服务器证书之所以不起作用,是因为它无法消除伪装的可能性(就像是跑路的p2p公司);
- 生成证书
- 服务器会将公钥A给CA(公钥是服务器的);
- CA用自己的私钥B对A进行加密,生成数字签名C;
- CA把公钥A,数字签名C,和附加服务器的一些信息生成证书,发给服务器;
- 验证证书
多数浏览器会将开发商发布版本的时候,会事先在内部植入常用的认证机关的公开密钥;
- 客户端得到证书;
- 客户端得到证书公钥D;
- 客户端用公钥D对证书中的数字签名进行解密,得到哈希值1;
- 客户端对公钥A进行哈希值计算,得到哈希值2;
- 如果哈希值1和哈希值2相等,则证书是合法的;
- 证书作废
当用户私钥丢失或者被盗,认证机构需要对证书进行作废;
总结
https的通信流程(阮大神的一篇博文):http://www.ruanyifeng.com/blog/2011/08/what_is_a_digital_signature.html
确认访问用户身份的认证
何为认证
- 概念:
就像是你买的保险箱只想某些人可以看一样,网页上的web页面也有可能只想特定的人浏览,这就少不了认证功能了,简单的说,认证就是判断访问服务器者的身份。
- 核对信息通常有以下几点:
- 密码:只有本人才会知道的字符串信息;
- 动态令牌:仅限本人持有的设备内显示的一次性密码;
- 数字证书:仅限本人(终端)持有的信息;
- 生物认证:指纹和虹膜等本人的生理信息;
- IC 卡等: 仅限本人持有的信息;
- HTTP 使用的认证方式
- BASIC 认证 (基本认证,不常用)
- DIGEST 认证 (摘要认证,不常用)
- SSL 客户端认证 (付费)
- FormBase 认证 (基于表单的认证)
SSL 客户端认证
- 概念:SSL 客户端认证是借由HTTPS的客户端证书完成认证的方式,要完成这种认证,需事先将客户端证书分发给客户端,且客户端必须安装此证书;
- 认证步骤
- 接收到需要认证资源的请求,服务器会发送 Certificate(证书) Request,要求客户端提供客户端证书;
- 用户选择将发送的客户端证书后,客户端会把客户端证书信息以Client Certificate 报方式发送给服务器;
- 服务器验证客户端证书验证通过后方可领取证书内客户端的公开密钥,然后开始HTTPS加密通信;
- SSL 客户端认证需要费用
一般这部分费用是:
- 认证机构购买客户端证书的费用;
- 服务器运营者为保证自己搭建的认证机构安全运营所产生的费用;
- 自己搭建的认证机构,为维持安全运行产生的费用;
基于表单的认证
- 概念:
客户端会向服务器上的Web应用程序发送登录信息,按登录信息的验证结果认证;
- session 管理及Cookie应用
因为HTTP是无状态协议,所以一般使用 Cookie 来管理 Session;
- 步骤
- 客户端把用户ID和密码等登录信息放入报文的实体部分,通常是以POST方法把请求发送给服务器;
- 服务器在Set-Cooki中写入Session ID (区分不同用户的等位号,为了防止被盗,session id 应该使用难以推测的字符串,且服务器也需要进行有效期的管理,为了保证安全建议在Cookie内写httponly)
- 客户端收到从服务器发来的Session ID 后,会将其作为Cookie保存在本地,下次向服务器发送请求时,浏览器会自动发送Cookie;
双因素认证
SSL客户端认证和表单认证结合,SSL客户端认证来认证客户端的计算机,而表单认证来确定用户本人的行为;
基于HTTP追加协议
HTTP 通信的瓶颈
- HTTP 协议的最大弊端就是每个 TCP 连接只能对应一个 HTTP 请求,即每个 HTTP 连接只请求一个资源,浏览器只能通过建立多个连接来解决;
- 请求只能从客户端开始,客户端不可以接受响应以外的指令;
- 请求/响应首部未经压缩就发送,首部信息越多越延迟
- 发送冗长的首部,每次互相发送相同的首部造成浪费较大;
- 可任意的选择数据压缩格式,非强制的压缩发送;
例如论坛上,成千上万的用户发布内容的时候,web网站需要及时的更新,而使用HTTP协议探知服务器上是否有内容更新,就必须频繁地从客户端到服务器端进行确认。如果服务器上没有内容更新,就会产生徒劳的通信。
追加的几种协议:
- Ajax
- Comet
- SPDY(已经被废弃)
- WebSocket
- HTTP/2.0
WebSocket
HTTP/2.0
支持HTTP2.0的条件
- 需要浏览器的支持,目前最新版的 Chrome、Opera、 FireFox、 IE11、 edge 都已经支持了;
- 需要 WEB 服务器的支持,比如 Nginx , H20;
如何浏览器或者服务器有一方不支持,就会自动变为HTTP/1.1
HTTP/2.0 改进点
- 二进制分帧
- 压缩头部
- 多路复用
- 请求优先级
- 服务器推送
- 强制 SSL
HTTP/2.0 性能增强的核心:二进制分帧
在应用层和传输层之间增加了一个二进制分帧层,以达到“在不改动HTTP语义,HTTP方法、状态码、URI机及首部字段的情况下,突破HTTP/1.1 的性能限制,改进传输性能,实现低延迟和高吞吐量”;

在二进制分帧层上,HTTP2.0 会将所有的信息分割为更小的消息和帧,并对它们采用二进制格式的编码,其中HTTP1.X 的首部信息会被封装到Headers帧,而request body则封装到Data帧里。
HTTP2.0 通信都在一个连接上完成,这个连接可以承载任意数量的双向数据流。每个数据流以消息的形式发送,而消息又是由一个或者多个帧组成,这些帧可以乱序发送,然后再根据每个帧首部的流标识符重新组装;
压缩头部
HTTP/2.0规定了在客户端和服务器端会**使用并且维护「首部表」**来跟踪和存储之前发送的键值对,对于相同的头部,不必再通过请求发送,只需发送一次。
如果请求中不包含首部,那么首部的开销就是零字节,此时所有的首部都自动使用之前请求发送的首部;如果首部发变化了,那么只需要发送变化了数据在Headers帧里面,新增或者修改的首部帧会被追加到“首部表”。首部表在HTTP2.0连接存续4qi期内始终的存在,由客户端和服务器共同渐进地更新。
多路复用
HTTP2.0所有的通信都是在一个TCP连接上完成的。HTTP2.0 把 HTTP 协议通信的基本单位缩小为一个个的帧,这些帧对应着逻辑流中的消息。**这些帧并行地同在一个TCP连接上双向交换消息。**也就是说同一链接上有多个不同方向的数据流在传输。客户端可以一边乱序发送streams,也可以一边接收服务器的响应,而服务器端同理。
-
优点
HTTP性能的关键在于低延迟,而不是高带宽。大多数的HTTP连接的时间短,而且是突发性的,但是TCP只在长时间连接传输大块数据时效率才最高。HTTP2.0 通过让所有的数据流公用一个连接,可以更有效地使用TCP连接,让高带宽也能真正服务于HTTP的性能。
同时,单链接多资源的方式,有如下好处:
-
可以减少服务器的压力,内训占用少,连接的吞吐量大;
-
由于 TCP 连接减少,使得网络阻塞的情况得以改观;
-
慢启动时间减少,拥塞和丢包恢复速度更快。
因此, “资源合并减少请求”的优化手段对于HTTP2.0来说是没有效果的。
请求优先级
既然所有资源都是并行发送,那么就需要“优先级”的概念了,这样就可以对重要的文件进行先传输,加速页面的渲染。
服务器推送
在 HTTP2.0中,服务器推送是指客户端请求之前发送数据的机制。
强制 SSL
虽然 HTTP2.0 协议并没有声明一定要使用SSL,但是Google Chrome 等浏览器强制要使用 HTTP2.0 必须使用SSL。
前言
本篇博客是读完《图解HTTP》之后,摘录和总结其中个人感觉需要知道的知识点,因为这部分知识点比较枯燥乏味,所以本篇博客力求简单,明了,有趣。
WEB 及其网络的基础
TCP/IP 分层管理
ISO制定的OSI参考模型的过于庞大、复杂招致了许多批评。与此对照,由技术人员自己开发的TCP/IP协议栈获得了更为广泛的应用。

接下来的图,主要说明各个层的作用和各层涉及到协议:

常用协议:IP、TCP、DNS
####IP协议(网路层)
####TCP 协议(传输层)
TCP 协议是提供可靠的字节流服务;
通过三次握手建立连接:
四次挥手关闭连接:
####DNS 协议
提供域名和IP地址之间的解析服务
TCP/IP 通信传输流
URL 和 URI 格式
URI 是统一资源标识符,而 URL 是统一资源定位符

web客户端访问资源的流程
HTTP协议简介
定义
HTTP-超文本传输协议,是位于计算机网络中的应用层,HTTP是建立在TCP协议之上,所以HTTP协议的瓶颈及其优化技巧都是基于TCP协议本身的特性,例如tcp建立连接的3次握手和断开连接的4次挥手以及每次建立连接带来的RTT延迟时间;
发展历史
HTTP 发展起来是因为在互联网的黎明时期,CERN(欧洲核子研究组织)的蒂姆.博纳斯-李 博士提出了一种让远隔两地的研究者们共享知识的设想。最初的设想的基本理念是:借助多文档之间互相关联行程超文本,连成互相参阅的WWW(万维网)。后来提出了三项技术:作为页面的文本标记语言-HTML(超文本标记语言);作为文档传输协议的-HTTP(超文本传输协议);指定文档所在地址的URL(统一资源定位符);
确保Web安全的HTTPS
HTTP的缺点
1. 通信使用明文(不加密),可能会被窃听
2. 不验证通信方的身份,可能遭到伪装
3. 无法证明报文的完整性,可能已遭篡改
HTTPS的诞生
由于 HTTP 的以上缺点,为了确保安全就诞生了HTTPS。简单的说 ** HTTPS = HTTP + 加密 + 认证 + 完整性保护**。HTTPS并不是一种新的协议,只是HTTP通信接口部分用SSL和TLS协议代替而已。例如,HTTP直接和TCP通信,使用了SSL时候,就会演变为先和SSL通信,再由SSL和TCP通信。

常用的加密技术
共享密钥加密/对称密钥加密
公开密钥加密/非对称加密
混合加密机制
数字签名和证书
数字签名
一封信中,文末的签名是为了证明这封信是签名者写的,同理,数字签名也是为了证明某个消息是特定的某个人发的(有效性);同时,数字签名还能证明消息没有被篡改(完整性);
一般不对消息直接进行签名,而是对消息的哈希值进行签名。
证书
证书其实就是对公开加密方法中的公钥进行加密,是对公钥的合法性提供证明的技术;
可以使用数字认证机构(CA)和其他相关的机关颁发公开的密钥证书(就像是银行);
EV SSL证书可以证明作为通信一方的服务器是否规范,同时也可以确认服务器背后运营的企业是否是真实存在的。
证明服务器正在通信的对方始终是预料之内的客户端;
多数浏览器会将开发商发布版本的时候,会事先在内部植入常用的认证机关的公开密钥;
当用户私钥丢失或者被盗,认证机构需要对证书进行作废;
总结
https的通信流程(阮大神的一篇博文):http://www.ruanyifeng.com/blog/2011/08/what_is_a_digital_signature.html
确认访问用户身份的认证
何为认证
就像是你买的保险箱只想某些人可以看一样,网页上的web页面也有可能只想特定的人浏览,这就少不了认证功能了,简单的说,认证就是判断访问服务器者的身份。
SSL 客户端认证
一般这部分费用是:
基于表单的认证
客户端会向服务器上的Web应用程序发送登录信息,按登录信息的验证结果认证;
因为HTTP是无状态协议,所以一般使用 Cookie 来管理 Session;
双因素认证
SSL客户端认证和表单认证结合,SSL客户端认证来认证客户端的计算机,而表单认证来确定用户本人的行为;
基于HTTP追加协议
HTTP 通信的瓶颈
例如论坛上,成千上万的用户发布内容的时候,web网站需要及时的更新,而使用HTTP协议探知服务器上是否有内容更新,就必须频繁地从客户端到服务器端进行确认。如果服务器上没有内容更新,就会产生徒劳的通信。
追加的几种协议:
WebSocket
推荐两篇文章:
HTTP/2.0
支持HTTP2.0的条件
如何浏览器或者服务器有一方不支持,就会自动变为HTTP/1.1
HTTP/2.0 改进点
HTTP/2.0 性能增强的核心:二进制分帧
在应用层和传输层之间增加了一个二进制分帧层,以达到“在不改动HTTP语义,HTTP方法、状态码、URI机及首部字段的情况下,突破HTTP/1.1 的性能限制,改进传输性能,实现低延迟和高吞吐量”;

在二进制分帧层上,HTTP2.0 会将所有的信息分割为更小的消息和帧,并对它们采用二进制格式的编码,其中HTTP1.X 的首部信息会被封装到Headers帧,而request body则封装到Data帧里。
HTTP2.0 通信都在一个连接上完成,这个连接可以承载任意数量的双向数据流。每个数据流以消息的形式发送,而消息又是由一个或者多个帧组成,这些帧可以乱序发送,然后再根据每个帧首部的流标识符重新组装;
压缩头部
HTTP/2.0规定了在客户端和服务器端会**使用并且维护「首部表」**来跟踪和存储之前发送的键值对,对于相同的头部,不必再通过请求发送,只需发送一次。
如果请求中不包含首部,那么首部的开销就是零字节,此时所有的首部都自动使用之前请求发送的首部;如果首部发变化了,那么只需要发送变化了数据在Headers帧里面,新增或者修改的首部帧会被追加到“首部表”。首部表在HTTP2.0连接存续4qi期内始终的存在,由客户端和服务器共同渐进地更新。
多路复用
HTTP2.0所有的通信都是在一个TCP连接上完成的。HTTP2.0 把 HTTP 协议通信的基本单位缩小为一个个的帧,这些帧对应着逻辑流中的消息。**这些帧并行地同在一个TCP连接上双向交换消息。**也就是说同一链接上有多个不同方向的数据流在传输。客户端可以一边乱序发送streams,也可以一边接收服务器的响应,而服务器端同理。
优点
HTTP性能的关键在于低延迟,而不是高带宽。大多数的HTTP连接的时间短,而且是突发性的,但是TCP只在长时间连接传输大块数据时效率才最高。HTTP2.0 通过让所有的数据流公用一个连接,可以更有效地使用TCP连接,让高带宽也能真正服务于HTTP的性能。
同时,单链接多资源的方式,有如下好处:
可以减少服务器的压力,内训占用少,连接的吞吐量大;
由于 TCP 连接减少,使得网络阻塞的情况得以改观;
慢启动时间减少,拥塞和丢包恢复速度更快。
因此, “资源合并减少请求”的优化手段对于HTTP2.0来说是没有效果的。
请求优先级
既然所有资源都是并行发送,那么就需要“优先级”的概念了,这样就可以对重要的文件进行先传输,加速页面的渲染。
服务器推送
在 HTTP2.0中,服务器推送是指客户端请求之前发送数据的机制。
强制 SSL
虽然 HTTP2.0 协议并没有声明一定要使用SSL,但是Google Chrome 等浏览器强制要使用 HTTP2.0 必须使用SSL。