1.1 http的概念及历史版本
http的概念
: 超文本传输协议,当年http的出现主要是为了解决文本传输的难题。
http版本:
HTTP/0.9、HTTP/1.0 、HTTP/1.1。其中HTTP/1.1是目前主流的HTTP协议版本。
1.2 TCP/IP
TCP/IP
: 是互联网相关的各类协议族的总称。
TCP/IP协议族按层次分别分为以下四层: 应用层、传输层、网络层和数据链路层。
应用层:
应用层决定了向用户提供应用服务时通信的活动。TCP/IP协议族内预存了各类通用的应用服务。比如,FTP(文件传输协议)和DNS(域名系统)服务就是其中两类;HTTP协议也处于该层。
传输层:
传输层对上层应用层提供处于网络连接中的两台计算机之间的数据传输。传输层有两个性质不同的协议TCP和UDP。
网络层
: 网络层是用来处理网上流动的数据包。数据包是网络传输的最小数据单位。该层规定了通过怎样的路径到达对方的计算机(所谓的传输路线),并把数据包传给对方。与对方计算机之间通过多台计算机或网络设备进行传输时,网络层所起的作用就是在众多的选项内选择一条传输路径。
链路层:
用来处理连接网络的硬件部分。包括控制操作系统、硬件的设备驱动、NIC(网络适配器即网卡),及光纤等物理可见部分。硬件上的范畴均在链路层的作用范围之内。
1.3 TCP/IP通信传输流
利用TCP/IP协议族进行网络通信时,会通过分层顺序与对方进行通信。发送端从应用往下走,接受端则从应用层往上走。
发送端在层与层之间传输数据时,每经过一层时必定会被打上一个该层所属的首部信息。反之,接受端在层与层传输数据时,每经过一层时会把对应的首部去掉。
1.4 与HTTP关系密切的协议IP、TCP和DNS
IP协议
IP协议:
按层次分IP网际协议位于网络层。TCP/IP协议族中的IP指的就是网级协议。 IP协议的作用是把各种数据包传送给对方。
IP地址:
指明节点被分配到的地址,可变换。
MAC地址:
是指网卡所属的固定地址,MAC地址基本不会更改。
使用ARP协议凭借MAC地址进行通信
IP间的通信依赖MAC地址。在网络上,通信的双方在同一局域网内的情况很少,通常是经过多台计算机和网络设备中转才能连接到对方。而在进行中转时,会利用下一站中转设备的MAC地址来搜索下一个中转目标。这时,会采用ARP协议。ARP协议是一种以解析地址的协议,根据通信的双方的IP地址就可以反查出对应的MAC地址。
TCP协议
TCP协议:
按层次分,TCP位于传输层,提供可靠的字节流服务。
字节流服务
:为了方便传输,将大块数据分割成报文段为单位的数据包进行管理。
TCP协议为了更容易传送大数据才进行分割,而且TCP协议能够确认数据最终是否送达到对方。
确保数据能到达目标
为了准确无误地将数据送达目标处,TCP协议采用了三次握手策略。用TCP协议把数据包送出去后,TCP不会对传送后的情况置之不理,它一定会向对方确认是是否成功送达。
三次握手的过程
握手过程中使用了TCP的标志(flag)SYN和ACK。
发送端首先发送一个带SYN标志的数据包给对方。接受端收到后,回传一个带SYN/ACK标志的数据包以示传达确认信息。最后,发送端再回传一个带ACK标志的数据包,代表“握手”结束。若在握手过程中某个阶段莫名中断,TCP协议会再次以相同的顺序发送相同的数据包
DNS服务
DNS服务:
按层次分,位于应用层的协议,它提供域名到IP地址之间的解析服务。
1.5 各种协议和HTTP协议的关系
2. HTTP协议
HTTP协议:
HTTP协议和TCP/IP协议族内的其他众多的协议相同,用于客户端和服务器之间的通信。
请求访问文本或者图像等资源的一端称为客户端,而提供资源响应的一端称为服务器端。
请求报文:
请求报文是由请求方法、请求URI、协议版本、可选的请求首部字段和内容实体构成的。
响应报文:
响应报文基本上是由协议版本、状态码、用以解释状态码的原因短语、可选的响应首部字段以及实体主体构成。2.1 HTTP是不保存状态的协议
HTTP是一种不保存状态,即无状态协议。HTTP协议自身不对请求和响应之间的通信状态进行保存。也就是说在HTTP这个级别,协议对于发送过的请求或者响应都不做持久化处理。
2.2请求URI定位资源
HTTP协议使用URI定位互联网上的资源。当客户端请求访问资源而发送请求是,URI需要将作为请求报文包含在内。
请求URI的方式
a. URI为完整的请求URI
b.在首部字段Host中写明网络域名或者IP地址
2.3 HTTP请求的方法
- GET: 获取资源
- POST: 传输实体
- PUT: 传输文件
- HEAD: 获得报文首部
- DELETE: 删除文件
- OPTION: 询问支持的方法
2.4 持久连接节省通信量
HTTP协议的初始版本中,每进行一次HTTP通信就要断开一次TCP连接。
持久连接
为了解决TCP连接问题,HTTP/1.1和一部分的HTTP/1.0想出了持久连接(也称为HTTP keep-alive)的方法。持久连接的特点是,只要任意一端没有明确提出断开连接,则保持TCP连接状态。
持久连接旨在建立1次TCP连接后进行多次请求和响应的交互
持久连接的优点
: 减少TCP连接的重复建立和断开所造成的额外开销,减轻服务器的负载。另外,减少开销的那部分时间,使HTTP请求和响应能够更早结束,这样客户端响应的速度也提高了。
2.5 管线化
持久连接使得多数请求以管线化方式发送成为可能。从前发送请求后需要等待并收到响应,才能发送下一个请求。管线化技术出现后,不用等待响应也可以直接发送下一个请求。
2.6 使用cookie的状态管理
Cookie:
Cookie技术是通过在请求和响应报文中写入Cookie信息来控制客户端的状态。
Cookie保存客户端状态的具体过程:
Cookie会根据从服务器端发送的响应报文内的一个叫Set-Cookie的首部字段信息,通知客户端保存Cookie。当客户端再往该服务器发送请求时,客户端会在动在请求报文中加入Cookie值后发送出去。服务器端发现客户端发送过来的Cookie后,会去检查究竟是从那一个客户端发送过来的连接请求,然后对比服务器上的记录,最后得到之前的状态。
-
没有Cookie信息状态下的请求
-
第2次以后(存有cookie信息状态)的请求
(1) 请求报文 (没有Cookie信息状态)
(2) 响应报文(服务器端生成Cookie信息)
(3)请求报文 (自动发送保存着的Cookie信息)
3.1 HTTP报文
用于HTTP协议交互的信息被称为HTTP报文。请求端(客户端)的HTTP报文叫做请求报文,响应端(服务器端)的叫做响应报文。HTTP报文本身是由多行(用CR+LF作换行符)数据构成的字符串文本。HTTP报文大致可分为报文首部和报文主体两块。两者由最初出现的空行(CR+LF)来划分。通常,并不一定有报文主体。
3.2请求报文及响应报文的结构
图:请求报文(上)和响应报文(下)的结构
图: 请求报文(上)和响应报文(下)的实例
请求行:
包含用于请求的方法,请求URI和HTTP版本。
状态行:
包含表明响应结果的状态码,原因短语和HTTP版本。
首部字段:
包含表示请求和响应的各种条件和属性的各类首部。
一般有4种首部,分别是:通用首部、请求首部、响应首部、和实体首部。
4.1返回结构的HTTP状态码
2XX的响应结构表明请求被正常处理了。
3XX的响应结果表明浏览器需要执行某些特殊的处理以正确处理请求。(重定向)
4XX的响应结果表明客户端是发生错误的原因所在。
5XX的响应结果表明服务器本身发生错误。
5.1 HTTP常用的首部字段
HTTP首部字段是由首部字段名和字段值构成的,中间用冒号“:”分隔
首部字段名:字段值
例如:
Content-Type: text/html
另外,字段值对应单个HTTP首部字段可以有多个值,例如
Keep-Alive: timeout=15, max = 100
6. HTTPS相关
在HTTP协议中有可能存在信息窃听或身份伪装等安全问题。使用HTTPS通信机制可以有效地防止这些问题。
HTTP的缺点:
- 通信使用明文(不加密),内容可能被窃听
- 不验证通信方的身份,因此有可能遭遇伪装
- 无法证明报文的完整性,所以有可能已遭篡改
我们把添加了加密及认证机制的HTTP称为HTTPS。
HTTP + 加密 + 认证 + 完整性保护 = HTTPS
7.1 HTTPS是身披SSL外壳的HTTP
HTTPS并非是应用层的一种新协议。只是HTTP通信接口部分使用SSL和TLS协议代替而已。
通常,HTTP直接和TCP通信。当使用SSL时,则演变成先和SSL通信,再由SSL和TCP通信了。简而言之,所谓HTTPS,其实就是身披SSL协议这层外壳的HTTP。
在采用了SSL后,HTTP就拥有了HTTPS的加密、证书和完整性保护这些功能。
SSL采用一种叫做公开密钥加密的加密处理方式
共享密钥加密
加密和解密同用一个密钥的方式称为共享密钥加密,也被叫做对称密钥加密。这种加密方式有两个问题一个是密钥在发送过程中会被窃取还有就是密钥的保存问题。
公开密钥加密
公开密钥加密使用一对非对称密钥。一把叫做私有密钥,另一把叫做公开密钥。使用公开密钥加密方式,发送密钥的一方使用对方的公开密钥进行加密处理,对方收到被加密的信息后,再使用自己的私有密钥进行解密。
HTTPS采用混合加密机制
HTTPS采用共享密钥加密和公开密钥加密两者混合并用的混合加密机制。在密钥交换环节使用公开密钥加密方式,之后的建立通信交换报文阶段则使用共享密钥加密方式。
7.2 证明公开密钥正确性的证书。
为了解决公开密钥在传输过程中,真正的公开密钥被攻击者替换掉,可以使用由数字证书认证机构和相关颁发的公开密钥证书。
数字证书
数字证书认证机构处于客户端与服务器双方都可信赖的第三方认证机构的立场上。
数字证书认证机构的业务流程
首先,服务器的运营人员向数字证书认证机构提出公开密钥的申请,数字证书认证机构在判明提出申请者的身份之后,会对已申请的公开密钥做数字签名,然后分配这个已签名的公开密钥,并将该公开密钥放入公钥证书后绑定在一起。
服务器会将这份由数字证书认证机构颁发的公钥证书发送给客户端,以进行公开密钥加密方式通信。公钥证书也可以叫做数字证书或者直接称为证书。
接到证书的客户端可使用数字证书认证机构的公开密钥,对那张证书上的数字签名进行验证,一旦验证通过,客户端便可以明确两件事:一、认证服务器的公开密钥是真实有效的数字证书认证机构。二、服务器的公开密钥是值得信赖的。
7.3 HTTPS的安全通信机制
步骤1: 客户端通过发送Client Hello 报文开始SSL通信。报文中包含客户端支持的SSL的指定版本、加密组件列表(所使用的加密算法及密钥长度)
步骤2: 服务器可进行SSL通信时,会以Server Hello 报文作为应答。和客户端一样,在报文中包含SSL版本及加密组件。服务器的加密组件内容是从接收到的客户端加密组件内筛选出来的。
步骤3: 之后服务器发送Certificate报文。报文中包含公开密钥证书。
步骤4: 最后服务器发送Server Hello Done报文通知客户端,最初阶段的SSL握手协商部分结束。
步骤5: SSL第一次握手结束之后,客户端以Client Key Exchange报文最为回应。报文中包含通信加密中使用的一种被称为Pre-master secret的随机密码串。该报文已用步骤3中的公开密钥进行加密。
步骤6:接着客户端继续发送Change Cipher Spec报文。该报文会提示服务器,在此报文之后的通信会采用Pre-master secret密钥加密。
步骤7: 客户端发送Finished报文。该报文包含连接至今全部报文的整体校验值。这次握手协商是否能够成功,要以服务器是否能够真确解密该报文作为判断标准。
步骤8: 服务器同样发送Change Cipher Spec 报文。
步骤9: 服务器同样发送Finished 报文。
步骤10: 服务器和客户端的Finished报文交换完毕之后,SSL连接就算建立完成。当然,通信会受到SSL的保护。从此处开始进行应用层协议通信。即发送HTTP请求。
步骤11: 应用层协议通信,即发送HTTP响应。
步骤12: 最后由客户端断开连接。断开连接时,发送close_nofity报文。这步之后再发送TCP FIN 报文来关闭与TCP的通信。
以上流程中,应用层发送数据时会附加一种叫做MAC的报文摘要。MAC能够查知报文是否遭到篡改,从而保护报文完整性。
SSL速度慢吗?
SSL的慢分两种。一种是指通信慢。另一种是指由于大量消耗CPU及内存等资源,导致处理速度变慢。和使用HTTP相比,网络负载可能会变慢2到100倍。除去和TCP连接,发送HTTP请求响应外,还必须进行SSL通信,因此整体上处理通信量不可避免会增加。
另一点是SSL必须进行加密处理。服务器和客户端都需要进行加密和解密的运算处理。因此从结果上讲,比起HTTP会更多地消耗服务器和客户端的硬件资源,导致负载增强。
为什么不一直使用HTTPS?
其中一个原因是,因为与纯文本通信相比,加密通信会消耗更多的CPU及内存资源。如果每次通信都加密,会消耗相当多的资源,平摊到一台计算机上时,能够处理的请求数量必定也会随之减少。因此如果是非敏感信息则使用HTTP通信,只有在包含个人信息等敏感数据时,才利用HTTPS加密通信。