HTTP被认为是无状态的。意思是,它不需要为传输数据而存储信息。
但是HTTP使用TCP,它是面向状态的。
如果是这样,HTTP如何变为无状态?
HTTP被认为是无状态的。意思是,它不需要为传输数据而存储信息。
但是HTTP使用TCP,它是面向状态的。
如果是这样,HTTP如何变为无状态?
Answers:
即使它本身是无状态的,HTTP也不关心并且独立于用于传输自身的任何较低级协议。
传输技术可以是TCP,Novell的旧SPX,SCTP或您可以想象的其他任何东西,HTTP仍然可以正常工作。HTTP确实需要流式或面向连接的协议,并且依赖于可解析的URL,但并不关心如何实现。
这是存在分层模型或网络堆栈的原因之一:应用程序层无需与较低层有关。
仅仅因为较低级别的协议是有状态的,并不意味着它之上的任何东西都会自动变成有状态的,或者被要求是有状态的。
HTTP本身是无状态的。因此,这意味着应用程序必须在HTTP之上实现另一层才能建立状态。这通常是通过会话cookie完成的。
“ HTTP是无状态的”意味着可以独立于先前请求-响应对的任何状态来处理每个HTTP事务(请求-响应对)。
为了传输特定的请求-响应对,您需要一个协议,该协议能够在其中携带任意大的块,然后任意携带大的块,并且要在具有有限数据包大小的层上进行此操作,TCP必须是有状态的。
但是跨交易边界,没有状态。客户端可以删除连接并为下一个请求建立新的连接。实际上,这是早期版本中的唯一选项,并且如果客户端不包含Connection: keep-alive
标头,它仍然可以像这样工作。
下一个请求也可以轻松地由不同的服务器处理,并且客户端永远不会知道,因为服务器不需要维护任何状态(除非应用程序通常以会话的形式在HTTP之上添加自己的状态;因此很复杂负载平衡是其在HTTP上建立状态协议的惩罚。这在繁忙服务器的负载平衡中得到了利用。
can also easily be handled by different server and the client will never know
尽管从技术上讲是正确的,但这是令人误解的,因为许多Web应用程序都使用粘性会话,这要求负载平衡器将将来的请求从同一浏览会话路由到同一服务器。从HTTP的角度来看,会话是无关紧要的,但是您的最后一句话暗示着最终用户的体验将不会受到影响,而对于粘性会话则是错误的。
您必须将其理解为一组俄罗斯玩偶(或盒子,如果需要的话),每个俄罗斯玩偶内部都装有另一个玩偶,这就是它的工作原理:TCP带有HTTP“内部”功能,但它并不关心它或它的功能。
为了获得完整的图片,我建议阅读有关OSI模型的内容,因为它使内容更加清晰。
TCP在OSI模型中位于HTTP下方几层,实际上每一层确实对应于一个不同的协议。
在我们的案例中,HTTP位于表示层和应用程序层,而TCP位于传输层。或者,如果您使用TCP / IP模型,则TCP和IP协议都位于“网络链接”层中,而HTTP位于应用程序和表示层中。