http和https请求以及http1.1/2/3

230 阅读5分钟

http和https在计算机网络体系中都是属于应用层,他们规定了请求报文和响应报文的格式,两种不同的应用进程使用不同的端口号,http是80,https是443。两者都是经过TCP添加首部的。

前端的话常见于首次url的访问web和向服务器端请求各种数据

持久化和非持久化连接

非持久化连接:每条请求报文只能写一个URL,一次请求只能获取一个文件,获取完就断开连接

持久化连接:http1.1 默认连接时持久化连接,可以持续发请求,直到客户端发Connection:close结束连接,有时间限制

http的无状态:很多主机都访问服务器,服务器不会把状态记录下来

为了记录状态就产生了cookie

http缓存

http缓存:http协议规定了缓存如何工作,如何存储,也可以理解为http请求产生的缓存,web缓存

http有两个控制缓存操作的首部 Pragma(逐渐被抛弃)和Cache-Control

响应头部

Cache-Control:max-age=30000000 资源保存为缓存的最长时间

Cache-Control:no-cache 可以进行缓存,当每次使用前都要和服务器确认,同时代理服务器也不能对资源进行缓存,适合长期不变

Cache-Control:no-store 直接让服务不要缓存

Cache-Control:private 表示该资源只能给我这个浏览器缓存,其他代理服务器都不能进行缓存

Cache-Control:public 表示该资源浏览、代理服务器都能进行缓存

etag 标记资源,每次资源更新,etag值也会被服务器更新

expires 缓存的过期时间,没到时间都代表资源没过期

last-modified 资源最后的修改时间

强缓存和协商缓存

  1. 强缓存:浏览器在请求资源之前会先检查本地缓存,如果缓存有效,则直接从缓存中获取资源,而不发送请求到服务器。常见的强缓存策略是使用Cache-ControlExpires响应头来设置资源的过期时间。
  2. 协商缓存:如果资源的缓存已过期或者浏览器没有强制缓存,浏览器会发送一个带有If-Modified-SinceIf-None-Match等条件的请求到服务器。服务器会根据这些条件判断资源是否有更新,如果没有更新,则返回一个304 Not Modified的响应,告诉浏览器可以使用缓存的副本。

HTTP缓存的优势是可以减少网络流量和提高网页加载速度,因为浏览器可以直接从本地缓存获取资源而不需要再次请求服务器。然而,缓存的有效性取决于服务器正确设置缓存策略和资源的更新频率。

https请求

http请求都是明文的,为了增加安全性所以有了https。是在http的基础上用SSL/TLS进行加密

SSL/TLS

SSL先,TLS后, 大部分浏览器不支持ssl,而是支持tls

对称加密

加密解密都用同一个规则,同一把钥匙

非对称加密(公钥加密)

拿对方公钥加密,然后发给对方,对方拿独一无二的私钥解密

TLS握手过程

前面是非对称加密,后面生成会话密钥就变成了对称加密

网络12.PNG

https申请

要https请求需要申请SSL证书(保存在源服务器的数据文件),要让SSL证书生效要向CA(Certificate Authority证书授权中小)申请,里面包括了服务器域名的归属和公钥私钥

http1.1

一次请求一次数据,一次完了才能下一次,默认持续化连接,不同浏览器拥有不同个数的持久化连接。谷歌6个。报文压缩,首部没压缩

http2

性能好

多路复用,解决http1.1队头阻塞问题,把帧拆成首部帧和数据帧(把http报文的首部和实体拆成两部分),因为有流标识符,所以帧可以不按顺序抵达,还可以设置帧类型的优先级。首部和报文都利用HPACK算法压缩了。 HPACK算法要求浏览器和服务器保存一张静态只读的表(如:state :200,:method :GET,:method :post). Cookli作为动态信息加入动态表。http2的帧不是ASCILL编码的报文而是提取转换为二进制的帧。

还有服务器推送,点击一个html请求,把后续用到的css,image都给你(但是也有问题,误点一下多了很多缓存,还有可能造成DDos非对称攻击)

对比http1.1安全上是二进制的帧,没那么看的懂保护了安全。

http3

http2只解决了应用层的传输阻塞,链路层依旧会TCP队头阻塞,因为不能对所有操作系统进行大升级出现了

http3 整合,把TCP和TLS的握手过程整合在一起,减少来回的开销,如果是恢复会话还可以不用握手,实 现0-RTT

网络13.PNG

QUIC整合了TCP和TLS,让http3默认就是要加密传输(可以不严谨的说是TCP2.0,但不能说是UDP2.0)

应用层的数据会封装成QUIC帧,和http2的帧很像,也是加了流标识符,但是http3应用层没有帧的概念,把帧移到了QUIC,相当于传输层就有了数据帧,从源头解决队头阻塞问题实现多路复用