HTTP是基于TCP的,为什么是无状态?
2019-01-18 15:31:15    2739    0    0
pop6

首先对于标准的HTTP来说,是无状态的。而Cookie、Session则是为了方便数据的处理,从而维护服务器和用户的状态,它们不是标准的HTTP协议的一部分,使用Cookie和Session的HTTP可以被认为是有状态的。

这个无状态,每一次请求之间是没有联系的,都是独立的,因此服务器不知道请求两次之间是否是同一个用户。

 

例如一个购物网站的例子:

对于标准的HTTP,用户登录一个购物网站,第一次请求携带账号密码登录,服务器验证后响应服务。第二次请求也需要携带账号密码,才能进行服务。但是有了Session、Cookie这些手段,可以在B-S之间维护会话状态,从而无需每次携带密码登录。

Session、Cookie分别是服务器和浏览器上的一小块缓存,Session和Cookie通过SessionId进行匹配,在Cookie以及Session之中存储信息可以维护用户和服务器之间的状态,这样可以将HTTP请求联系起来。这样的HTTP存在很多方便性,但是它们不属于HTTP的标准,仅仅会话技术。


理解了HTTP无状态的含义。就需要理解为什么HTTP是基于TCP的,但是HTTP是无状态

首先TCP是有状态的,在一次TCP连接之中,每一次的数据交换都和上一次紧密相关的,TCP报文存在ACK字段用于确认上次接收的报文,并且TCP在建立连接时交换了很多的连接配置信息,例如收、发缓存大小,报文序号等。所以,每一次TCP数据交换两方都是能够确切知道对方的信息的。

 

为什么基于TCP的HTTP是无状态呢?

因为HTTP是短连接,即每次“请求-响应”都是一次TCP连接。比如用户一次请求就是一次TCP连接,服务器响应结束后断开连接。而每次TCP连接是没有关联的,因此HTTP是无状态的。如果想要使得每次TCP连接之间有关联,服务器和浏览器就得存储相关的信息,这个就是Cookie和Session的作用。

 

但是又出现新的问题,HTTP 1.1后支持了keep-alive,即长连接,那么每次HTTP请求还是无状态吗?

答案是是的。虽然HTTP 1.1为了效率,支持了keep-alive,但是这个keep-alive是有时间限制的。这个时间可以通过设置HTTP进程的配置文件来修改,这个时间很短,是以秒来计算的,例如10秒。因此在这10秒内的HTTP请求是使用同一个TCP连接,但是10秒后又重新进行连接。这个时间可以被认为是无状态的。例如那个购物的例子,不可能10s内的HTTP请求无需密码来验证,首先这个时间很短,并且还得记录每次HTTP请求的时间是否在10秒内,这样记录的方式和Session又有什么区别。

 

还有一个误区,有些人说TCP是长连接、有状态的?

这个“长连接”不够准确,因为TCP是传输层协议,它没有“长、短”的区分,“长、短”的区别仅仅是看上层协议的使用。例如HTTP使用的TCP就是短连接,而FTP使用的TCP就是长连接。虽然TCP有个“keep-alive”的概念,但是这和HTTP的“keep-alive”没有一点关系,TCP的“keep-alive”仅仅是为了维持连接的正常,保证连接不被断开,因此TCP会间隔的发送数据包检测是否连接正常,这个间隔的时间就是“keep-alive”的作用。

 

上一篇: Spring Boot进行文件上传下载

下一篇: Spring Boot简单笔记(基于1.5)

2739 人读过
立即登录, 发表评论.
没有帐号? 立即注册
0 条评论
文档导航