前言
如果有一定的计算机网络基础,这本书读起来会比较快,下文是我个人的一些收获和补充,之前博文里写过的内容这里不赘述。
一、HTTP各版本
- HTTP/0.9于90年问世,是HTTP协议的最初版本,请求方式只支持GET,并且只能请求HTML格式的资源。
- HTTP/1.0在96年公布,至今还被广泛使用着。新增了POST和HEAD请求方式。任何格式的内容都可以发送,包括图像、视频、二进制文件等。HTTP/1.0是短连接的,每次TCP连接只能发送一个请求,当服务器响应后就会关闭这次连接,下一个请求需要再次建立TCP连接。但是网页的内容越来越丰富,需要加载的资源越来越多,多次请求都重新建立TCP连接的成本比较高。为了解决这个问题,有些浏览器在请求时,用了一个非标准的Connection:keep-alive字段,要求服务器不要关闭TCP连接,服务器的响应也要包含这个字段。
- HTTP/1.1在97年公布,是目前主流的HTTP版本。新增了一些请求方法,引入了长连接,引入了管道机制,在同一个TCP连接里,客户端可以同时发生多个请求。
- HTTP/2.0的目标是改善用户的速度体验。它使用了多路复用的技术。在一个TCP连接里,客户端和服务端都可以同时发送多个请求或响应。增加了服务器推送,服务器可以对一个客户端的请求,发起多个响应,可以推送额外的资源,这样可以减少请求的次数。HTTP/2.0客户端和服务端都要维护一个首部字段表,记录见过的首部字段,如果下次发送报文首部没有变化就不发送首部,如果变化只发送变化了的那部分并且更新表,减少了重复发送。
二、URL、URI
URI是统一资源标识符,用来标识互联网某一资源,URL是统一资源定位符,URL是URI的一种(子集),具有标识功能的同时可以获取资源路径。
三、HTTP存在的问题
- 通信使用未加密的明文,内容容易被窃听
- 不验证对方身份,可能出现伪装
- 无法验证报文完整性,报文可能被篡改
解决方法:
使用HTTPS,在HTTP和TCP之间加一层SSL安全协议(HTTPS使用了SSL和TLS两个协议,有时候统一叫做SSL协议)。SSL协议具有加密、证书、完整性保护的功能。
报文采用对称加密,对称加密的密钥采用非对称加密
通过数字证书验证对方身份
通过消息摘要验证报文完整性
四、对称加密和非对称加密
对称加密:
对称加密指加密和解密使用相同密钥的加密算法。大多数的对称算法中,加密密钥和解密密钥是相同的。对称算法的安全性依赖于密钥,泄漏密钥就意味着任何人都可以对他们发送或接收的消息解密,所以密钥的保密性对通信的安全性至关重要。
非对称加密:
非对称加密算法中加密、解密的密钥不同,发送方使用接收方公开的公钥加密,接收方使用自己的私钥解密,除了接收方,其他人根据接收方的公钥计算出他的私钥是不可行的,通常非对称加密算法的设计建立在数学难题上。
SSL利用两者的优势,通信的报文用对称加密,为了防止对称加密密钥在传输过程中被窃听,采用非对称加密算法对对称加密密钥进行处理。
五、数字证书
只有加密算法还不够,因为服务器可能是别人伪装的,SSL使用数字证书验证对方的身份
六、SSL握手过程
- 客户端发送client_hello报文,服务端回应server_hello报文。
作用是:双方协商SSL协议的版本、加密算法、密钥长度。 - 服务端发送certificate报文,报文里包括服务端的公钥证书。
- 服务端发送server_hello_done报文给客户端,hello消息阶段就此结束。
- 客户端检查服务器证书的合法性,然后发送client_key_exchange报文,报文通过服务端的密钥进行加密,报文内容是之后会用到的对称加密的密钥。
- 客户端继续发送change_cipher_spec报文,作用是提示服务器之后的消息使用对称加密密钥加密。
- 客户端再发送一个finished报文,报文利用协商好的加密算法、对称密钥进行加密和摘要计算(MAC计算,保证报文完整性),会包含连接开始到现在全部报文的校验值。
- 如果服务端可以正确解密客户端发来的finished报文,服务端就也发送change_cipher_spec报文和finished报文给客户端,SSL握手完成。之后就可以进行HTTP请求了。