1、TCP/IP协议族
HTTP是TCP/IP内部中的一个子集,HTTP是建立TCP协议之上的,当进行HTTP通信时,也可以说进行了TCP通信。具体流程如下图所示:
图片来源于 图解HTTP
1.1 TCP协议
按层次分,TCP位于传输层,提供可靠的字节流服务。所谓的字节流服务是指,为了方便传输,将大块数据分割成以报文段为单位的数据包进行管理。
为了准确无误地将数据送达目标处,TCP协议采用了三次握手策略,发送端首先发送一个带SYN标志的数据包给对方,接收端收到后,回传一个带有SYS/ACK的数据包以示传达确认信息。最后,发送端再回传一个带ACK标志的数据包,代表“握手”结束。
图片来源于 图解HTTP
在断开连接时,经过四次挥手就可以断开连接了。四次挥手最后会经过一个TIME_WAIT阶段,需要等待2MSL时间才能断开,主要是为了防止在最后主动方发送给被动方的确认报文没有发送到,导致被动方超时重传FIN报文。
1.2 各种协议与HTTP协议的关系
可以用一下图片来解释它们之间的关系。
2 HTTP协议
2.1 通过请求和响应的交换达成通信
HTTP之间的通信通过请求报文和响应报文来实现,请求报文是由请求方法、请求URI、协议版本、可选的请求首部字段和内容实体构成的。
响应报文基本上由协议版本、状态码、用以解释状态码的原因短语、可选的响应首部字段以及实体主体构成。
2.2 HTTP是不保存状态的协议
HTTP是一种不保存状态,即无状态协议。HTTP协议自身不对请求和响应之间的通信状体进行保存。也就是说在HTTP这个级别,协议对于发送过的请求或响应都不做持久化处理。 这是为了更快处理大量事务,确保协议的可伸缩性,而特意把HTTP协议设计成如此简单的。
HTTP/1.1虽然是无状体协议,但为了实现期望的保存状体功能,于是引入了Cookie技术。有了Cookie再用HTTP协议通信,就可以管理状体了。
2.3 使用Cookie的状态管理
Cookie技术通过在请求和响应报文中写入Cookie信息来控制客户端的状态。Cookie会根据从服务器发送的响应报文内的一个叫Set-Cookie的首部字段信息,通知客户端保存Cookie。下次客户端再往该服务器发送请求时,客户端会自动在请求报文中加入Cookie值后发送出去。
2.4 持久连接节省通信量
HTTP协议的初始版本中,每进行一次HTTP通信就要断开一次TCP连接。在包含大量图片的情况下就不适用了,每次的请求都会造成无谓的TCP连接建立和断开,增加通信量的开销。
为了解决上述的TCP连接问题,HTTP/1.1和一部分的HTTP/1.0想出了持久连接的方法。持久连接的特点是,只要任意一端没有明确提出断开的连接,则保持TCP连接状态。持久连接的好处在于减少了TCP连接的重复建立和断开所造成的额外开销,减轻了服务器端的负载。另外,减少开销的那部分时间,使HTTP请求和响应能够更早地结束,这样Web页面的显示速度也就相应提供了。
2.4.1 管线化
持久连接使得多数请求以管线化方式发送成为可能。从前发送请求后需等待并收到响应,才能发送下一个请求。管线化技术出现后,不用等待响应亦可直接发送下一个请求。这样就能够做到同时并行发送多个请求,而不需要一个接一个地等待响应了。
2.5 返回结果的HTTP状态码
3 HTTPS协议
使用HTTP协议将存在以下几个主要的缺点
1、通信使用明文,内容可会被窃听
2、不验证通信方的身份,因此有可能遭遇伪装
3、无法证明报文的完整性,所以有可能已遭篡改
HTTP+加密+认证+完整性保护 = HTTPS
HTTPS并非是应用层的一种新协议。只是HTTP通信接口部分用SSL和TLS协议代替而已。通常,HTTP直接和TCP通信,当使用SSL时,则演变成先和SSL通信,在由SSL和TCP通信了。简言之,所谓HTTPS,其实就是身披SSL协议这层外壳的HTTP。
3.1 HTTPS采用混合加密机制
HTTPS采用共享密钥加密和公开秘钥加密两者并用的混合加密机制。若密钥能够实现安全交换,那么有可能会考虑仅使用公开密钥加密来通信,但是公开密钥加密与共享密钥加密相比,其处理速度要慢。所以应充分利用两者各自的优势,将多种方法组合起来用于通信,在交换密钥环节使用公开密钥加密方式,之后的建立通信交换报文阶段则使用共享密钥加密方式。