你不知道的HTTP协议
1.HTTP有哪些方法
在HTTP 1.0标准中,定义了3种请求方法:GET,POST,HEAD
在HTTP 1.1标准中,新增了请求方法:PUT,PATCH,DELETE,OPTIONS,TRACE,CONNECT
我们常用的方法有以下五种:GET,PUT,DELETE,POST,PATCH
2.各个HTTP方法的具体作用是什么?
GET
: 通常用于服务器发送某些资源
POST
: 发送数据给服务器
HEAD
: 请求资源的头部信息,并且这些头部与HTTP GET方法请求时返回的一致。该请求方法的一个使用场景是在下载一个大文件前先获取其大小再决定是否要下载,以此可以节约宽带资源
PUT
: 用于全量修改目标资源(看接口,也可以用于添加)
DELETE
: 用于删除指定的资源
OPTIONS
: 用于获取目的资源所支持的通信选项(跨域请求前,预检请求,判断目标是否安全)
TRACE
: 该方法会让服务器原因返回任意客户端请求的信息内容,用于诊断和判断
CONNECT
: HTTP/1.1协议中预留给能够将连接改为管道方式的代理服务器
PATCH
: 用于对资源进行部分修改
3.GET和POST请求的区别
关于重复提交表单,以前可能会,现在基本都不提交表单了,都是选择直接发ajax,了解即可
4.HTTP请求报文和响应报文是怎样的
HTTP的请求报文(请求报文)的组成:请求行,请求头,(空行),请求体
实际请求报文实例
请求行: 包含了请求方法,URL,HTTP协议版本,他们之间用空格进行分割.例如:
GET HTTP://www.abc.com/articles HTTP/1.1
请求头: 请求头由键值对组成,每行一对,键值之间用英文冒号:
进行分割.例如:
Content-Type: application/json
Host:www.abc.com
请求体:请求体中放置POST,PUT,PATCH等请求方法所需要携带的数据(GET请求的数据在URL中,不在请求体中)
(响应报文和请求报文类似,由响应行,响应头,(空行),响应体)
5.HTTP的keep-alive是什么作用?
作用:使客户端到服务器端的连接持续有效(长链接),当出现对服务器的后继请求时,keep-alive功能避免了建立或者重新建立链接
早期HTTP/1.0在每次请求的时候,都要创建一个新的连接,而创建连接的过程需要耗费资源和时间,为了减少资源消耗,缩短响应时间,就需要复用已有连接.
在后来的HTTP/1.0以及HTTP/1.1中引入了复用链接的机制,也就是在请求头中加入Connection:keep-alive,以此告诉对方这个请求响应完成后不要关闭连接,下一次还用这个请求进行后续交流
协议规定,如果想要保持连接,则需要在请求头中加上Connection:keep-alive
keep-alive的优点(复用连接)
- 较少的CPU和内存的占用(因为要打开的连接数变少了,复用了连接)
- 减少了后续请求的延迟(无需再进行握手)
- ... 缺点: 因为在处理暂停期间,本来可以释放的资源仍旧被占用.请求已经都结束了,但是还一直连接这也不合适
解决:Keep-Alive:timeout=5,max=100
- timeout: 过期事件5秒 (对应httpd.conf里的参数是:KeepAliveTimeout)
- max就是最多一百次请求,强制断掉连接.就是在timeout时间内又有新的连接过来,同时max会自动减1,直到为0,强制断掉
6.HTTP状态码有哪些
成功 2xx系列
重定向 3xx系列
客户端错误 4xx系列
服务端错误 5xx系列
7.为什么需要HTTPS
HTTP协议是网络通信的基石,基于HTTP协议,完成了很多的网页应用功能,但是HTTP协议是明文传输数据的!因此,一些敏感信息的传输就变得很不安全.而HTTPS就是为了解决HTTP的不安全而产生的
8.HTTPS是如何保证安全的?
HTTPS在传输数据的过程中会对数据进行加密处理,保证安全性.
目前常见的加密算法可以分为三类: 对称加密算法
,非对称加密算法
和Hash算法
- 1.对称加密算法:相同密钥加密解密,可逆的!可以用于加密解密传输数据.想使用对称加密算法,一定要保证密钥不被泄漏(且进行密钥的传输约定时,一定要保证安全)
- 2.非对称加密算法:有两把钥匙,公钥,私钥,可逆的,可以用于https的初步交换密钥
- 3.Hash算法:不可逆的,根据一段内容,生成一段唯一标识,一般用于验证数据是否是被修改!(md5)
8.1 什么是对称加密
- 对称加密的特点是文件加密和解密使用相同的密钥,即加密秘钥也可以用作解密密钥
- 这种方法在密码学中叫做对称加密算法,对称加密算法使用起来简单快捷,密钥较短,且破译困难
- 通信的双方都使用同一个密钥进行加密,解密.比如,两个人事先约定的暗号,就属于对称加密.
对称加密的特点是:
- 优点 1.计算量小,加密速度快,加密效率高
- 缺点 1.在数据传送前,发送方和接收方必须商定好密钥,然后双方保存好密钥.
2.如果一方的密钥被泄漏,那么加密信息也就不安全了
使用场景:本地数据加密,https通信,网络传输等
常见算法:AES,DES,3DES,DESX,Blowfish,IDEA,RC4,Rc5,RC6(公开)
8.2 什么是非对称加密
加密和解密其实可以使用不同的规则,只要这两种规则存在某种对应关系即可,这样就避免了直接传送密钥.这种新的加密模式被称为非对称加密算法
.
通信的双方使用不同的密钥进行加密解密,即密钥对(私钥 + 公钥)
特征:私钥可以解密公钥加密的内容,公钥可以解密私钥加密的内容
非对称加密的特点是:
- 优点:非对称加密与对称加密相比其安全性更好
- 缺点:加密和解密花费事件长,速度慢,只适合对少量数据进行加密.
使用场景:https会话前期,CA数字证书,信息加密,登录认证等
常见算法:RSA,ECC(移动设备用).Diffie-Hellman,ElGamal,DSA(数字签名用)
8.3 HTTPS加密解决方案
结合了两种加密方式:
- 将
对称加密的密钥(一串约定的字符串)
用非对称加密的公钥,进行加密并发送出去,接收方使用私钥解密得到对称加密密钥
- 双方沟通时使用
对称加密密钥
进行
可以看到,只有在发送密钥阶段才使用对称加密,而后续的通信都使用对称加密,这样就解决了性能问题.
HTTPS目前所使用的TLS或SSL协议,就是目前采用的加密通道的规范协议
它利用对称加密,非对称加密,以及其密钥交换算法,可完成可信任的信息传输
- 利用 非对称加密 加密传输 对称加密所约定的密钥(保证了密钥传输的安全)
- 后续,利用对称加密,有效便捷的进行数据传输!!
8.4数字证书
为了安全性,一般还需要签发数字证书!
客户端 和 服务器端要初步互通消息时,客户端发送请求可以拿到公开的公钥信息,进而进行非对称加密,使用公钥,加密对称加密密钥
,传递给服务器,后续通信都使用对称加密!
问题是:初步互通消息时,如果请求拿到的公钥信息,就是假的,或者不安全的!那么后续的所有操作,都将是不安全的!如何保证公钥的安全性呢??说白了,就是需要证明公钥是安全可靠的!
所以,就需要有数字证书(CA证书),一般是CA机构(互联网的机构,登记网站和公钥的)颁发的,证明这个公钥是安全可靠的!
CA证书中心会对你网站的公钥,网站的域名地址,证书到期时间,等一些相关信息一起加密签发数字证书,保证你网站的安全性
当公司申请了CA证书后,就应该在响应时,将数字证书一起发送给客户端
而客户端,接收到消息后,就可以查看证书
- 如果正在访问的网站和证书记载的网址不一致,说明不安全,可能被冒用,游览器就会发出警告!!!
- 如果签发证书的机构,不权威,发出警告
- 如果证书过期了,游览器也会发出警告
8.5数字签名
但这还是有问题:如果证书被篡改了怎么办?
这时就需要用一个技术:数字签名
.(根据证书内容,生成的一个唯一标识)
数字签名就是先用CA自带的Hash算法
来计算出证书内容的一个摘要,然后使用CA私钥进行加密,组成数字签名.
当别人把他的证书发过来是,接收方用同样的算法再次生成摘要,用CA公钥解密后得到CA生成的摘要,两者进行对比后,就能确定中间是否被人篡改.这样就能最大程度的保证通信的安全了.
9. HTTP2和HTTP1.x比,有什么优势和特点?(了解)
HTTP2的升级,对于用户来说,是跨时代的!基于HTTP2,用户访问网页的速度会非常快!!!(充分利用带宽)
- HTTP/2采用
二进制格式
来传输数据,而非HTTP1.x的文本格式,二进制协议解析起来更高效
- HTTP/2采用一些
头部压缩技术
,减少在请求和响应头中重复携带的数据,降低网络负担
- HTTP/2采用
服务器推送
方式,主动向客户端推送资源,提高页面加载效率 - HTTP/2采用
多路复用机制
,减少需要创建的连接数量,降低资源占用和性能消耗(早期只能并发建立6-8个链接,一个链接只能发一个请求)
10.缓存控制
10.1 基本认知
WEB服务缓存大致可以分为:数据库缓存,服务器端缓存(代理服务器缓存,CDN服务器缓存),游览器缓存.
游览器缓存也可以包含很多内容:HTTP缓存,indexDB,cookie,localstorage等等.这里我们值讨论HTTP缓存相关内容
.
HTTP缓存:(优化页面加载的效率,如果没有缓存策略,每次重新加载页面,会非常慢!)
- 强缓存
- 协商缓存
在具体了解HTTP缓存之前先来明确几个属于:
- 缓存命中率:从缓存中得到数据的请求数 与 所有请求数的比率.理想状态是越高越好.
- 过期内容:超过设置的有效事件,被标记为"陈旧"的内容.
- 验证:验证缓存中的过期内容是否仍然有效,验证通过的话刷新过期时间.
- 失效:失效就是把内容从缓存中移除.
游览器缓存主要是HTTP协议定义的缓存机制
游览器缓存绯闻强缓存
和协商缓存
,游览器加载一个页面的简单流程如下:
- 游览器先根据这个资源的http头信息来判断是否命中强缓存.如果命中则直接加载在缓存中的资源,并不会将请求发送到服务器.(强缓存)
- 如果未命中强缓存,则游览器会将资源加载请求发送到服务器.服务器来判断游览器本地缓存是否失效.若可以使用,则服务器不会返回资源信息,游览器继续从缓存加载资源.(协商缓存)
- 如果未命中协商缓存,则服务器会将完整的资源返回给游览器,游览器加载新资源,并更新缓存.(新的请求)
10.2强缓存
(进行判断缓存是否有效,就是判断资源是否过期,如果未过期,直接用缓存)
命中强缓存时,游览器并不会将请求发送给服务器.
在Chrome的开发者工具中看到http的返回码是200,但是在Size列会显示为(from cache).
强缓存时利用http的返回的响应头中的Expries或者Cache-Control(优先级更高)两个字段来控制的,用来表示资源的缓存事件.
Expries:指定一个具体时间(2021年12月26日21:18:51),到了这个时间了,缓存过期了,在时间内,都是有效的,可以直接读
Cache-Control:指定一个过期时间(3600s),这个资源你加载到后,可以用3600s
Expries
缓存过期时间,用来指定资源到期的时间,是服务器端的具体的时间点,也就是说,Expries=max-age + 请求时间,需要和Last-modified结合使用.但是cache-control优先级更高
Expries是Web服务器响应消息头字段,在响应http请求时告诉游览器在过期时间前游览器可以直接从游览器缓存取数据,而无需再次请求
该字段会返回一个时间,比如Expries:Wed,23Nov 2050 16:00:01 GMT.这个时间代表着这个资源的失效时间,也就是说再xx年xx月xx日之前都是有效的,即命中缓存.
这个方式有一个明显的缺点,由于失效时间是一个绝对时间,所以当服务器与客户端时间偏差很大以后,就会导致缓存混乱.于是发展出了Cache-Control
Cache-Control
Cache-Control是一个相对时间,例如Cache-Control:max-age 3600,代表着资源的有效期是3600秒。由于是相对时间,并且都是与客户端时间比较,所以服务器与客户端时间偏差也不会导致问题。
Cache-Control与Expires可以在服务端配置同时启用或者启用任意一个,同时启用的时候Cache-Control优先级高。Cache-Control可以由多个字段组合而成,主要有以下几个取值:
- max-age指定一个时间长度,在这个时间段内缓存是有效的,单位是s。 例如设置Cache-Control:max-age=31536000,也就是说缓存有效期为(31536000 / 24/ 60 / 60)天,第一次访问这个资源的时候,服务器端也返回了Expires字段,并且过期时间是一年后。
在没有禁用缓存并且没有超过有效时间的情况下,再次访问这个资源就命中了缓存,不会向服务器请求资源而是直接从浏览器缓存中取.
- no-cache强制所有缓存了该响应的用户,在使用已缓存的数据前,发送带验证的请求到服务器,问服务器是否可以读缓存。不是字面意思上的不缓存。
- no-store禁止缓存,每次请求都要向服务器重新获取数据。
10.3 协商缓存(找供货商专家协商)
看看过期时间,食品没过期,直接吃(直接读缓存,不发请求)强缓存
食品过期时间过了,能不能吃呢?问问专家(服务器),专家瞅了一眼,没过期(响应304,不返回内容),直接吃(协商缓存)
如果问过专家(服务器),专家瞅了一眼,呀真过期了,原来的不要了,我重新给你发一个(响应200,并返回内容)
协商缓存
若未命中强缓存(强缓存过期了),则浏览器会将请求发送至服务器。
服务器根据http头信息中的Last-Modify/lf-Modify-Since
或 Etag/lf-None-Match
来判断是否命中协商缓存。如果命中,则http返回码为304(你本地之前加载的资源是有效的),浏览器从缓存中加载资源。
Last-Modify/lf-Modify-Since
浏览器第一次请求一个资源的时候,服务器返回的header中会加上Last-Modify,
Last-modify是一个时间标识该资源的最后修改时间,例如Last-Modify: Thu,31 Dec 203723:59:59 GMT.
当浏览器再次请求该资源时(进行协商请求时),发送的请求头中会包含lf-Modify-Since,该值为缓存之前返回的Last-Modify。服务器收到lIf-Modify-Since后,根据实际服务器的资源的最后修改时间,进行判断是否命中缓存。
如果命中缓存,则返回http304,并且不会返回资源内容,并且不会返回Last-Modify
由于对比的是服务端时间,所以客户端与服务端时间差距不会导致问题。
但是有时候通过最后修改时间来判断资源是否修改还是不太准确(资源变化了最后修改时间也可以一致)。
ETag/lf-None-Match 与Last-Modify/lf-Modify-Since (最后修改时间)不同的是,Etag/f-None-Match返回的是一个校验码(ETag: entity tag) .ETag可以保证每一个资源是唯一的,资源变化都会导致ETag变化。
ETag值的变更则说明资源状态已经被修改。
服务器根据浏览器上发送的If-None-Match值来判断是否命中缓存。
ETag生成靠以下几种因子
- 文件的i-node编号,是Linux/Unix用来识别文件的编号。
- 文件最后修改时间
- 文件大小
生成Etag的时候,可以使用其中一种或几种因子,使用抗碰撞散列函数来生成。生成一个标记文件的唯一值
既生Last-Mqdified何生Etag ?
你可能会觉得使用Last-Modified已经足以让浏览器知道本地的缓存副本是否足够新,为什么还需要Etag (实体标识)呢?Etag的出现主要是为了解决几个Last-Modified比较难解决的问题:
- Last-Modified标注的最后修改只能精确到秒级
- 如果某些文件在1秒钟以内,被修改多次的话,它将不能准确标注文件的修改时间,有可能存在服务器没有准确获取文件修改时间,或者与代理服务器时间不一致等情形
Etag是服务器自动生成或者由开发者生成的对应资源在服务器端的唯一标识符,能够更加准确的控制缓存。不会仅仅只根据最后的修改时间判断是否进行使用缓存
Last-Modified与ETag是可以一起使用的,服务器会优先验证ETag,一致的情况下,才会继续比对Last-Modified,最后才决定是否返回304
小结:
- 强缓存:大大的减少了服务器的请求次数,在过期时间内,直接从客户端内存中读
- 协商缓存:强缓存命中失效了,超过过期时间了,拿着标识(最后的修改时间,唯一标识Etag),去问服务器,是否真的过期了如果验证通过,服务器会直接响应304,且不会返回资源
10.4 整体请求缓存流程
游览器第一次请求
游览器第二次请求
结语:关于http的知识点重要的就这么多吧,关于TCP/IP协议,我会在下一篇播客中提到.如果上面文章有什么错误的,欢迎个位大佬前来指正