? ? ? ? 记得大学学网络课程的时候,学的都是OSI/RM七层协议,应用层 -> 表示层 -> 会话层 -> 传输层->网络层->数据链路层->物理层,当时学的时候,感觉太抽象了,学得个一知半解。大脑在接收新东西时,需要有个具体实物或模型对应,将知识具像化,再高深的知识都容易理解。
? ? ? ? 言归正传,本文主要是总结一下HTTP通信过程,以及HTTPS是在HTTP基础上干了什么,而HTTP2.0又是对HTTP1.1做了啥大刀阔斧的改进。在讲这些之前,先讲讲TCP/IP四层协议。虽然OSI/RM七层协议是理论标准,TPC/IP四层协议是事实标准,多少层都无所谓,只是计算机/网络科学家按一定规则分的,便于理解和传播。
? ? ? ? TCP/IP四层协议:应用层 -> 传输层 -> 网络层 -> 数据链路层,此处“应用层”对应OSI/RM的“应用层 -> 表示层 -> 会议层”,此处“数据链路层”对应OSI/RM的“数据链路层->物理层”(后续笔者再补个映射图吧)。
举例:HTTP、FTP、SMTP、POP3......
作用:应用层负责为用户提供网络服务,例如电子邮件、文件传输和远程登录
举例:TCP、UDP
作用:传输层负责在网络中建立端到端的连接,提供可靠的数据传输。注:
举例:IP、ARP、ICMP、IGMP......
作用:网络层负责将数据包从一个节点传输到另一个节点,并提供寻址和路由功能
举例:Ethernet、Wi-Fi、PPP(Point-to-Point Procotol)、ATM(Asynchronous Transfer Mode)
作用:数据链路层负责将数据包从一个节点传输到另一个节点,并提供错误检测和修复功能
应用层:上层数据(HTTP头部 + HTTP body)
传输层:TCP头 + 上层数据
网络层:IP头 + TCP头 + 上层数据
数据链路层:LLC头 +?IP头 + TCP头 + 上层数据 + FCS
MAC头 + LLC头 +?IP头 + TCP头 + 上层数据 + FCS
SYN seq=x(client -> sever)
SYN seq=y?ACK=x+1(server -> client)
ACK=y+1(client -> server)
FIN seq=x+2 ACK=y+1(client -> server)
ACK=x+3(server -> client)
FIN seq=y+1(server -> client)
ACK=y+2(client -> server)
????????HTTP数据是未加密的,别有用心者在网络某个节点上抓包,可以很容易知道传了什么数据。为了数据安全的传输,提出来超文本传输安全协议HTTPS(Hyper Text Transfer Protocol over SecureSocket Layer)。HTTPS涉及对称加密和非对称加密:
即加密和解密是用同一个密钥,需要保障密钥的安全。
即私钥加密公钥解密,公钥加密私钥解密。
由于公钥是公开的,也即私钥加密的数据,没有安全性,因此需要结果对称加密一起使用。例如:对称加密的密钥Key,通过非对称加密的公钥PublicKey加密,传给对端;对端使用私钥PrivateKey解密拿到对称加密的密钥Key,后续二者就通过对称加密来交换数据即可。
(PS:对称和非对称加密,是一种比较有趣的二进制数学运算,有兴趣的同学可以了解一下,笔者后续推出详细介绍加解密的文章)
两个问题:
TLS握手过程:明文 -> 非对称加密 -> 对称加密
Step 1:TCP三次握手
Step 2:浏览器给出TLS协议版本号、客户端生成随机数1、客户端支持的加密方法(明文通信)?
Step 3:服务器确认双方使用的加密方法,给出数字证书、服务器生成随机数2(明文通信)
Step 4:浏览器确认证书有效,生成随机数3,使用数字证书的公钥加密随机数3,发给服务器
Step 5:服务器使用私钥解密出随机数3(Premaster secret)
Step 6:客户端和服务器根据约定的加密方法,使用随机数1(Client random)、随机数2(Pre-mastersecret)、随机数3(Pre-mastersecret),经过特定算法生成对话密钥(session key),用来加密接下来的对话过程
Step 7:客户端和服务器都会第一次使用会话密钥加密一个消息发送给对方
简单一点说,HTTPS就是在在HTTP和TCP之间,多了一层TLS/SSL层,在TCP三次握手之后,TLS再和服务器交换加密信息,得到加密密钥
(PS:握草,在浏览器F12 network只看到一条HTTPS请求,底层程序已经干了这么多事情)。
这里参考深入理解http2.0协议,看这篇就够了! - 知乎 (zhihu.com)整理。
????????HTTP2.0更牛逼一些,在原来HTTP基础,对HTTP报文进行分帧,即新增了Binary Framing层(PS:不是四层协议么?怎么又多了TLS层、多了BinaryFraming层?笔者:别再提层不层的,科学家们都是为了技术的传播和理解呐)。
????????在http1.1中,浏览器客户端在同一时间,针对同一域名下的请求有一定数量的限制,超过限制数目的请求会被阻塞。这也是为何一些站点会有多个静态资源 CDN 域名的原因之一。
?????????而http2.0中的多路复用优化了这一性能。多路复用允许同时通过单一的http/2 连接发起多重的请求-响应消息。有了新的分帧机制后,http/2 不再依赖多个TCP连接去实现多流并行了。每个数据流都拆分成很多互不依赖的帧,而这些帧可以交错(乱序发送),还可以分优先级,最后再在另一端把它们重新组合起来。
????????http1.x的头带有大量信息,而且每次都要重复发送。http/2使用encoder来减少需要传输的header大小,通讯双方各自缓存一份头部字段表,既避免了重复header的传输,又减小了需要传输的大小。
????????对于相同的数据,不再通过每次请求和响应发送,通信期间几乎不会改变通用键-值对(用户代理、可接受的媒体类型,等等)只需发送一次。
????????把http消息分为很多独立帧之后,就可以通过优化这些帧的交错和传输顺序进一步优化性能。每个流都可以带有一个31比特的优先值:0 表示最高优先级;2的31次方-1 表示最低优先级。
????????服务器可以根据流的优先级,控制资源分配(CPU、内存、带宽),而在响应数据准备好之后,优先将最高优先级的帧发送给客户端。高优先级的流都应该优先发送,但又不会绝对的。绝对地准守,可能又会引入首队阻塞的问题:高优先级的请求慢导致阻塞其他资源交付。
????????服务器可以对一个客户端请求发送多个响应,服务器向客户端推送资源无需客户端明确地请求。并且,服务端推送能把客户端所需要的资源伴随着index.html一起发送到客户端,省去了客户端重复请求的步骤。
? ? ? ? 知识点真的很多很多,如果不是长时间从事或使用相关技术的人员,真心记不住,有个大概印象就好。
注:本篇仅为学习笔记,如有不合理之处,还请帮忙指出,大家一起交流学习~