HTTP如何变为无状态?


26

HTTP被认为是无状态的。意思是,它不需要为传输数据而存储信息。

但是HTTP使用TCP,它是面向状态的。

如果是这样,HTTP如何变为无状态?


6
超级用户推出5年后,这又不是重复吗?
彼得·莫滕森

因为大多数骗子都在StackOverflow上?我只是在猜。
trysis

8
仅仅因为它通过电缆(以及其他电缆)运行,也不使它成为电气协议
Hagen von Eitzen 2014年

Answers:


42

即使它本身是无状态的,HTTP也不关心并且独立于用于传输自身的任何较低级协议。

传输技术可以是TCP,Novell的旧SPX,SCTP或您可以想象的其他任何东西,HTTP仍然可以正常工作。HTTP确实需要流式或面向连接的协议,并且依赖于可解析的URL,但并不关心如何实现。

这是存在分层模型或网络堆栈的原因之一:应用程序层无需与较低层有关。

仅仅因为较低级别的协议是有状态的,并不意味着它之上的任何东西都会自动变成有状态的,或者被要求是有状态的。

HTTP本身是无状态的。因此,这意味着应用程序必须在HTTP之上实现另一层才能建立状态。这通常是通过会话cookie完成的。


1
路由发生在tcp / ip级别。
Fiasco Labs 2014年

3
此图像很好地说明了这一点。vichargrave.com/wp-content/uploads/2013/01/...
JakeGould

2
巧合的是,HTTP忽略了基础连接(几乎总是将是TCP)的状态充满性这一事实,是各种HTTP2方法试图解决的主要性能不足之一。
Skolima 2014年

2
@Fiasco:严格来说,路由发生在IP级别。路由基于Internet地址,基本路由中不使用来自TCP层的信息。
RedGrittyBrick 2014年

1
@skolima:另一方面,无状态是HTTP是广泛使用的最可扩展和最可靠协议的原因。HTTP一直都是为扩展性而不是性能而明确设计的(是的,它们是另一回事),因此,如果您认为需要低延迟,而不是使用错误的协议或使用协议不正确。虽然HTTP2旨在提高性能,但这样做仍然适用于无状态。当用于预定用途时,我从未见过无状态成为设计良好的HTTP应用程序的瓶颈。
Lie Ryan 2014年

10

“ HTTP是无状态的”意味着可以独立于先前请求-响应对的任何状态来处理每个HTTP事务(请求-响应对)。

为了传输特定的请求-响应对,您需要一个协议,该协议能够在其中携带任意大的块,然后任意携带大的块,并且要在具有有限数据包大小的层上进行此操作,TCP必须是有状态的。

但是跨交易边界,没有状态。客户端可以删除连接并为下一个请求建立新的连接。实际上,这是早期版本中的唯一选项,并且如果客户端不包含Connection: keep-alive标头,它仍然可以像这样工作。

下一个请求也可以轻松地由不同的服务器处理,并且客户端永远不会知道,因为服务器不需要维护任何状态(除非应用程序通常以会话的形式在HTTP之上添加自己的状态;因此很复杂负载平衡是其在HTTP上建立状态协议的惩罚。这在繁忙服务器的负载平衡中得到了利用。


can also easily be handled by different server and the client will never know尽管从技术上讲是正确的,但这是令人误解的,因为许多Web应用程序都使用粘性会话,这要求负载平衡器将将来的请求从同一浏览会话路由到同一服务器。从HTTP的角度来看,会话是无关紧要的,但是您的最后一句话暗示着最终用户的体验将不会受到影响,而对于粘性会话则是错误的。
布兰登2014年

1
@Brandon:此类应用程序在HTTP之上构建有状态协议,这是对它们的惩罚!
Jan Hudec

@Brandon:许多负载平衡的服务器(例如gmail)不会将请求发送回同一服务器。而是将会话存储在群集中所有服务器都可以访问的共享数据库中。因此,状态不是由服务器而是由数据库处理。
slebetman

@slebetman:是的,随便。HTTP本身没有这种状态,因此对于HTTP来说很简单。如果应用程序增加了自己的状态,那就是它的斗争。
Jan Hudec

是的,我没有说全部。我说了一些。我个人更喜欢避免粘性会话,并且如果可能的话,完全避免会话。但是,存在不符合每个人理想的软件。
布兰登

2

HTTP的“无状态”性质意味着在层上,不会创建或使用任何状态信息。

您可以在几个实例中看到这一点,例如在HTTP身份验证中,凭据随每个请求一起发送,而持久连接实际上只是一种优化(即,即使我发送凭据,服务器也会在请求之后忘记这些凭据,即使它离开连接打开)。

相反,基于cookie的登录机制是有状态的,但不是HTTP的一部分。


1

您必须将其理解为一组俄罗斯玩偶(或盒子,如果需要的话),每个俄罗斯玩偶内部都装有另一个玩偶,这就是它的工作原理:TCP带有HTTP“内部”功能,但它并不关心它或它的功能。

为了获得完整的图片,我建议阅读有关OSI模型的内容,因为它使内容更加清晰。

TCP在OSI模型中位于HTTP下方几层,实际上每一层确实对应于一个不同的协议。

在我们的案例中,HTTP位于表示层和应用程序层,而TCP位于传输层。或者,如果您使用TCP / IP模型,则TCP和IP协议都位于“网络链接”层中,而HTTP位于应用程序和表示层中。


1
OSI模型的问题在于它现在是理论上的(确实有实现的尝试,但由于其复杂性,它们在市场上失败了)。实际上,TCP和HTTP之间没有层。此外,表示层将是HTML,而不是HTTP。
MSalters 2014年

在TCP / IP模型中,TCP不在网络层中。它位于IP之上的传输层中,而IP在稍后的网络中。谷歌针对“ TCP模型”的首次命中证明了这一点:technet.microsoft.com/en-us/library/cc786900(v=ws.10).aspx
布兰登(Brandon)

@MSalters:TLS不是层吗?
grawity 2014年

1
@MSalters:您确实意识到HTTPS仅仅是由TLS隧道传输的HTTP给定的名称吗?因此,TLS是HTTP之下的一层,位于TCP和TLS / SSL + HTTP组合之上,称为HTTPS。
slebetman

1
此外,TLS / HTTP组合还有另一个新名称。如果承载HTTP流量的TLS实现了虚拟套接字/流多路复用,则称为SPDY(但浏览器中的URL仍然是HTTPS)。
slebetman
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.