HTTP无状态协议的理解

HTTP无状态协议,是指协议对于事务处理没有记忆能力(浏览器对于事物的处理没有记忆功能)。缺少状态意味着如果后续处理需要前面的信息,则它必须重传,这样可能导致每次连接传送的数据量增大

为什么说HTTP是无状态的协议呢?
因为它的每个请求都是完全独立的,每个请求包含了处理这个请求所需的完整的数据,发送请求不涉及到状态变更。
即使在HTTP/1.1上,同一个连接允许传输多个HTTP请求的情况下,如果第一个请求出错了,后面的请求一般也能够继续处理(当然,如果导致协议解析失败、消息分片错误之类的自然是要除外的)可以看出,这种协议的结构是要比有状态的协议更简单的,一般来说实现起来也更简单,不需要使用状态机,一个循环就行了

优点
HTTP这样的无状态协议,使用元数据(如Cookies头)来维护会话,使得会话与连接本身独立起来,这样即使连接断开了,会话状态也不会受到严重伤害,保持会话也不需要保持连接本身。
另外,无状态的优点还在于对中间件友好,中间件无需完全理解通信双方的交互过程,只需要能正确分片消息即可,而且中间件可以很方便地将消息在不同的连接上传输而不影响正确性,这就方便了负载均衡等组件的设计

缺点
单个请求需要的所有信息都必须要包含在请求中一次发送到服务端,这导致单个消息的结构需要比较复杂,必须能够支持大量元数据,因此HTTP消息的解析要比其他许多协议都要复杂得多。
同时,这也导致了相同的数据在多个请求上往往需要反复传输,例如同一个连接上的每个请求都需要传输Host、Authentication、Cookies、Server等往往是完全重复的元数据,一定程度上降低了协议的效率。

解决

HTTP就是一种无状态协议,它对用户的操作没有记忆功能。为了解决这种情况,引出了Cookie&Session机制,让浏览器具备了记忆功能

1. Cookie&Session机制

  1. 当服务器第一次收到请求时,会主动开辟一块session空间(即创建了session对象),同时生成一个sessionid
  2. 服务器在给浏览器回复响应时,会在响应头添加set-cookie: JSESSIONID=XXXXX,将sessionid回复给浏览器
  3. 客户端收到响应后,在本地设置一个对应JSESSIONID=XXXXX的cookie信息

在此之后,客户端每次再向同一个网站发送请求时,请求头部都会带上cookie信息(包含了sessionid)

服务端在收到请求后,读取cookie信息,获取sessionid,在session空间中找到对应的信息进行比对

浏览器获得了记忆功能

2. JWT机制

JWT(JSON Web Token)

token:令牌

JWT的功能也是让浏览器具有了记忆功能

JWT是保存在客户端的,广泛应用于单点登录

JWT特点:

  • JWT的cookie信息是保存在客户端的

JWT直接进行本地校验即可,验证完毕后,这个token就会在session中随请求一起发送给服务端。这样节省了服务端资源,并且token可以进行多次验证

  • JWT可以实现跨域认证

cookies只能用于单个节点的域/子域。如果需要通过第三个节点访问,就会被禁止。JWT可以通过多个节点进行用户认证

补充

HTTP协议是无状态协议,这句话本身到底对不对?

实际上,并不全对。HTTP/1.1中有一个Expect: 100-Continue的功能,它是这么工作的:

  1. 在发送大量数据的时候,考虑到服务端有可能直接拒收数据,客户端发出请求头并附带Expect: 100-Continue的HTTP头,不发送请求体,先等待服务器响应
  2. 服务器收到Expect: 100-Continue的请求,如果允许上传,发送100 Continue的HTTP响应(同一个请求可以有任意个1xx的响应,均不是最后的Response,只起到提示性作用);如果不允许,例如不允许上传数据,或者数据大小超出限制,直接返回4xx/5xx的错误
  3. 客户端收到100 Continue的响应之后,继续上传数据

可以看出,这实际上很明显是一个有状态协议的套路,它需要先进行一次握手,然后再真正发送数据。不过,HTTP协议也规定,如果服务端不进行100 Continue的响应,建议客户端在等待较短的时间之后仍然上传数据,以达成与不支持Expect: 100-Continue功能的服务器的兼容,这样可以算是“能有状态则有状态,否则回到无状态的路上”,这样说HTTP 1.x是无状态的协议也是没错的。

至于HTTP/2,它应该算是一个有状态的协议了(有握手和GOAWAY消息,有类似于TCP的流控),所以以后说“HTTP是无状态的协议”就不太对了,最好说“HTTP 1.x是无状态的协议”

参考:https://baike.baidu.com/item/HTTP%E6%97%A0%E7%8A%B6%E6%80%81%E5%8D%8F%E8%AE%AE/5808645?fr=aladdin
https://www.zhihu.com/question/23202402
https://blog.csdn.net/weixin_44478378/article/details/107719498

你可能感兴趣的:(HTTP无状态协议的理解)