`
Bridgen.Li28
  • 浏览: 2981 次
社区版块
存档分类
最新评论

http协议和web应用有状态和无状态浅析

阅读更多
http协议和web应用有状态和无状态浅析 [此博文包含图片] (2013-10-14 10:38:06)

我们通常说的web应用程序的无状态性的含义是什么呢?

直观的说,“每次的请求都是独立的,它的执行情况和结果与前面的请求和之后的请求是无直接关系的,它不会受前面的请求应答情况直接影响,也不会直接影响后面的请求应答情况”

要明白,这句话的含义是指在说明,http协议作为技术背景的web应用程序请求——应答模式是无状态的,这个事实基本不会发生改变,也不会因为加入cookies、session机制而变成有状态的。要明白,这种前后因果关系:“我们要实现的是一种web应用,实现这种应用的协议我们选择了http这种本质上是无状态的通信协议。但是事实上,我们需要我们的web应用是有状态的。所以我们加入了cookies、session等机制去实现由状态的web应用”。所以我们可以这么理解:

Web应用=http协议+session、cookies等状态机制+其他辅助的机制。

其实,应用程序(软件通信)的有状态与否是一个非常通用的概念。我们可知,在网络协议中,我们称TCP为一个有状态的传输层通信协议,而UDP则不是;IP是无状态的。要明白这种有状态与否的判定,是指你这一协议栈层次所要实现的功能——是否由上下文决定——来判定的(是否受之前的通信过程直接影响、是否直接影响之后的通信过程)

http协议和web应用有状态和无状态辨析

见图1

IP层以下的我们就不思考了。我们做一个网络应用,需要使用网络协议。其实按照原理上讲,标准的TCP/IP协议族提供给我们的应用层协议(FTP, HTTP)不能直接的被称为应用,因为在实现某种可用的、直接面向用户的应用的时候(如web应用,人们可以上网),只有http协议还是不够的。所以我们可以这么理解。网络标准协议分层中提供给我们的应用层协议,它更像是一种分类。自然界的应用可能是无穷尽的种类,但是根据他们的特点、传输的特色,标准的网络协议在传输层(通用网络协议)的基础上封装出若干种面向不同种类网络应用的协议。

某种角度上讲,我们想要实现某种可用的网络应用,直接使用网络协议的传输层给我们提供的接口就可以了(也就是socket接口),但是有时候,这种方式是有些麻烦的,所以我们还是根据你要实现的web应用,在已有的标准协议中提供的面向应用分类的协议中进行选择。这样可以免去那些繁琐的、通用的工作。

见图2

可以看到,我们实际生活中的有关网络的应用程序,与标准的网络通信协议提供给我们的应用层协议是没有绝对的对应关系。所以标准的网络通信协议给我们提供的应用层协议,只是提供给我的一种“建议的”分类。建议你:“如果你要实现这样的应用,你可以直接使用这个封装协议,而不是socket接口”。

我们再看看,前面一副图中,所给我们的关于网络应用层次中的各层次的有无状态情况。可以知道,支持协议(下层)的有无状态,消费协议(上层)的有无状态,没有直接的关系。还是那句话,每层协议的有无状态与它的本身功能执行的时候的有无状态的特点有关。

(1)IP是无状态的,它只负责将一个IP包发送到指定的IP地址上去。它不会考虑这个包与前面已经发送的包和后面的包的联系。(可能是重发包、可能是不连续包,它不管)。

(2)TCP是有状态的,它通过包头中的一些控制字段(序列编码等)来表明各个包之间的关系(前后关系,重包与否等等)。所以,通过这个协议你可以做到一个可靠的传输。那么TCP是面向连接的协议是什么意思呢?其实这里的面向连接其实就是“三次握手”。三次握手,首先可以保证对方的存在,其次握手的所交换的内容是为将来进行有状态的传输做准备。

(3) UDP是无状态的,它仅仅是在IP上加了Port,其他的事情什么也不干。这样它不可能做到可靠的传输,同样也不需要连接。

(4) HTTP是无状态的,它的底层协议是由状态的TCP,但是HTTP的一次完整协议动作,里面是使用有状态的TCP协议来完成的。而每次协议动作之间没有任何关系。例如:第7次请求HTTP协议包,并不知道,这个包是为了什么?它或许是因为上次没有请求成功而重传,或许是上次的后续请求,或许是其他的,这些HTTP自身都不知道。

(5) www应用,很多时候,www应用是需要每个HTTP请求或应答动作之间是有关联的,那就是使应用有状态。这样才能提供给用户最好的用户体验。

于是,问题就来了,为什么当初HTTP会设计成无状态的,既然现在我们所需要的www应用是有状态的,为什么给他提供的这样的底层协议是无状态的。我想这个问题,可以从历史的角度去思考。在www应用还很简单的时候,这个应用只是被用来浏览内容。如果只是浏览内容的话,无状态的协议已经够了,这样实现可以减轻实现的负担,因为有状态的协议实现起来代价相对来说是很高的(要维护状态,根据状态来处理情况,这就是为什么建议你可以不用session的时候就不用,因为服务器要给你负担起很多的东西,例如内存空间啊)。好,现在看来,似乎www 应用是大部分需要状态了,那么是否我们就应该改变这个协议来让他变成一个有状态的协议呢?从这个角度上讲,我认为是不应该的。

首先,web应用与文件传输是不同的,文件传输,从开始到结束是一个“尽可能做完”的动作,所以这类动作不会在资源占有上,浪费它不该浪费的东西。而web应用中,用户可能访问一个页面后,在那个页面上逗留很久才跳转到另外一个页面,如果你需要我们在这两个页面(两个http请求应答)之间维持状态,是非常代价高的。

其次,历史让http无状态,而应用需求对http提出有状态的要求,按照软件领域的通常做法是,保持历史遗留的经验(不在http协议本质上作太大的改动),兼容过去的软件。在http上再加上一层来实现我们的目的( “再加上一层,你能做任何事”)。这一层,就是cookies,就是 session等。

最后总结,http协议仍然保持无状态,其充分的理由,并且,想要基于http协议的web应用变得有状态,实现起来并不麻烦。

web应用都有哪些方法来让应用有状态

于是就引出了,在http协议的基础上,web应用引入cookies, session, application。这样的东西来保持web应用之间的状态。

可知,cookies, session,application都不是标准协议,但是各种网络应用提供商,实现语言、web容器等,都默认支持它。当然这种支持与对网络标准协议的支持是不同的,标准协议规定的接口,而这种机制,只是规定了思想。就告诉你,大的概念上,jsp和ASP的session机制所要实现的功能和实现的方法不会有太大的出入。

有人将web应用中有无状态的情况,比着顾客逛商店的情景。

顾客:浏览器访问方;

商店:web服务器;

一次购买:一次http访问

我们知道,上一次顾客购买,并不代表顾客下一个小时一定会买(当然也不能代表不会)。也就是说同一个顾客的不同购买之间的关系是不定的。所以说实在的,这种情况下,让商店保存所有的顾客购买的信息,等到下一次购买可以知道这个顾客以前购买的内容代价非常大的。所以商店为了避免这个代价,索性就认为每次的购买都是一次独立的新的购买。浅台词:商店不区分对待老顾客和新过客。这就是无状态的。

但是,商店为了提高收益。她是想鼓励顾客购买的。所以告诉你,只要你在一个月内购买了5瓶以上的啤酒,就送你一个酒杯。

我们看看这种情况我们怎么去实现呢?

A,给顾客发放一个磁卡,里面放有顾客过去的购买信息。

这样商店就可以知道了。这就是cookie.

B,给顾客发放一个唯一号码,号码制定的顾客的消费信息,存储在商店的服务器中。这就是session。

最后,商店可以全局的决定,是5瓶为送酒杯还是6瓶。这就是application。

其实,这些机制都是在无状态的传统购买过程中加入了一点东西,使整个过程变得有状态。Web应用就是这样的。

注意,viewstate

其实从我们上面的分析看来,application不应该被视为这种意义上出现的维护状态的机制。它是决定怎么应用程序的“配制文件”。但是如果你从这种状态维持机制所覆盖的范围来推导,你会发现,application好像也算得上。

Session所控制的范围是一个session。一个会话,会话从第一次访问服务器开始存在,到服务器调用session.invalidator()(可能是超时,可能是其它原因)。

Cookies所控制的范围有它自己的定义(与session没有直接的关系),可以长可以短。只要服务器放在用户文件系统中的cookies没有被删除,至少服务器还识别它。它的控制范围就是还在的。

这个角度上讲,Session和Cookies都可以归为跨页面的状态。但是session跨不出一次会话,Cookies跨不出两端的限制。

Application,则是关联这个网络应用程序的。

除了这三种状态机制,有些网络应用的特别实现还各自特殊的东西。像ASP.net的viewstate。这个东西,其实就是使用input type=”hiden”的东西来实现的。再加上web服务器那边辅助,就可以实现,一个页面在“回传”的时候还能保持上一次的页面状态。

其实,这里要说明的就是“回传”的意思,事实上,无状态的http协议下,是没有所谓的回传的概念的。这里的回传,情景可以这么理解。

我在客户端填写一定的数据(在文本框中、密码框中、下拉列表中)。然后触发一个访问服务器的动作,例如:提交。这个时候服务器接受到我的请求然后又返回刚才这个页面给我们。这种情景我们很常见(输入用户名密码,点击“登陆”,服务器端判断密码不对,就返回登陆页面,但是之前我们填写的内容并没有被擦出。)这种情景就好像实现了一种回传(你传给我,我传还给你)。当然,如果你了解web服务的工作模式,这种回传只会是一种假象。前后两个页面根本不是一个页面。其实我们可以实现这种情景(不考虑Ajax)。页面上的数据全部通过request的方式传到服务器,服务器返回页面的时候,将数据由注入到页面中。

而viewstate就可以让用户很容易的实现这种功能。但是它有一个问题就是它附属于页面上的hide控件。虽然前后是两个不同的页面,但是来自一个ASPX模板,页面上的状态数据就在这些同模板页面的hide空间之间进行传播(由服务器控制),不可能,也不应该传递到别的ASP.new的页面上去。所以我们称他为页面级的状态维持机制。

转载自http://blog.sina.com.cn/s/blog_5a15b7d10101h4sk.html
  • 大小: 19.3 KB
  • 大小: 32.3 KB
分享到:
评论

相关推荐

    浅析Java_web程序之客户端和服务器端交互原理.doc

    在本文中,我们将深入探讨这两个主要方面:协议和HTTP报文接口,以及它们如何在Java Web应用程序中实现。 首先,我们要了解的是协议。TCP/IP协议栈是互联网通信的核心,它不完全符合OSI的七层模型,而是采用四层...

    浅析http协议、cookies和session机制、浏览器缓存.docx

    总的来说,理解HTTP协议的头部信息、Cookies和Session的工作原理,以及如何利用浏览器缓存,对于开发高效、安全的Web应用至关重要。这些知识点涉及到网络通信、用户认证、性能优化等多个方面,是每个Web开发者必备的...

    HTTP协议/IIS 原理及ASP.NET运行机制浅析【图解】

    HTTP(超文本传输协议)是Web应用程序的基础,它定义了...总之,理解HTTP协议和ASP.NET运行机制是构建Web应用的关键。深入学习这些基础知识,能帮助开发者更好地应对不断变化的技术趋势,提升开发效率和应用质量。

    浅析易语言web服务器html协议头

    浅析易语言web服务器html协议头 易语言web服务器html协议头是指在易语言...易语言web服务器html协议头是一个非常重要的web开发技术,广泛应用于各种web开发场景,对提高web应用程序的性能和灵活性产生了重要的影响。

    HTTP协议浅析-Request&Response.doc

    HTTP(Hypertext Transfer Protocol)协议是互联网上应用最为广泛的一种网络协议,它定义了客户端(通常是浏览器)和服务器之间交换数据的格式和交互规则。本文将深入浅出地解析HTTP协议中的请求(Request)和响应...

    浅析Comet技术在Java Web实时系统开发中的应用.pdf

    总的来说,Comet技术在Java Web实时系统开发中扮演着关键角色,通过克服HTTP协议的限制,实现了高效的服务器推送功能,为实时Web应用提供了强大的支持。开发者应根据具体项目需求和技术环境,灵活运用Comet技术,以...

    浅析comet技术在java web实时系统开发中的应用.doc

    Comet技术的核心在于克服了HTTP协议的无状态和单向通信限制。传统的HTTP交互模式下,服务器只能对客户端的请求做出响应,无法主动推送信息。Comet技术通过延长HTTP连接的生命周期,使得服务器可以在适当的时候将数据...

    HCSCP1203 Web安全防护 ISSUE 3.0.pptx

    * HTTP(Hypertext Transfer Protocol)是一种无状态的协议,基于简单的请求 - 响应模式(requests/responses)。 * HTTP有两类报文:请求报文和响应报文。 知识点三:HTTP工作过程 ------------------------- * ...

    基于Java的web服务器课程设计

    HTTP(超文本传输协议)是用于在Web上传输数据的应用层协议。理解HTTP的工作原理至关重要,包括HTTP请求方法(GET、POST等)、状态码(200、400、500等)以及请求头和响应头的格式。在Java中,我们可以通过读取...

    变压器智能运维管理平台技术浅析.docx

    3. 应用平台技术分析:应用平台实现数据展示、故障诊断和状态评估、检修策略等服务功能。 4. 显示平台技术分析:显示平台提供人机交互的操作界面,包括基于 Web 的后臺数据管理系统和移动端 APP。 变压器智能运维...

    浅析智能分布式能源管理系统的研究与应用.pdf

    2.5 **表现层**:基于B/S架构,通过Web Service服务和地理信息系统,形成可视化界面,直观展示设备状态、能源消耗和预警信息,以图表报告形式呈现分析结果,实现集中控制。 **3. 结论** 智能分布式能源管理系统...

    ASP.NET中Session实现原理浅析

    ASP.NET中的Session是用于在无状态HTTP协议下保持用户会话状态的一种机制。HTTP协议的无状态特性意味着每次客户端向服务器发送请求时,服务器不会记住之前的交互信息。为了解决这个问题,Session应运而生,它允许...

    WebSocket浅析(一):实现群聊功能

    WebSocket是Web应用中一种实时通信协议,它在HTTP的基础上提供了全双工的通信方式,使得服务器和客户端可以双向传输数据,极大地改善了Web应用的实时性。本篇将浅析WebSocket,特别是如何利用WebSocket实现群聊功能...

    浅析DRS调度录音在电力系统中的应用.pdf

    DRS系统采用数字接口,减少了录音失真,增强了抗干扰性,并支持多种启动方式,如压控、键控和声控,能自动识别电话状态来控制录音。 【DRS系统的优势】相较于模拟设备,DRS系统提供更高质量的录音,避免了音频数据...

    浅析基于STM32的洗衣机远程自动提醒系统.zip

    5. **用户界面**:简单提及手机应用程序或Web平台的设计,如何接收和显示洗衣机的状态信息,以及如何向用户发送提醒。 6. **安全与隐私**:讨论系统可能面临的安全挑战,如数据加密、防止未经授权的访问,以及用户...

    HTML5实现WebSocket协议原理浅析

    在WebSocket出现之前,Web应用依赖于HTTP协议进行客户端和服务器之间的通信,但HTTP协议的设计并不适合频繁的双向交互,因为它是基于请求-响应模型的。 WebSocket协议的设计原则之一是兼容现有的网络基础设施,因此...

    Web数据存储浅析 Cookie、UserData、SessionStorage、WebSqlDatabase

    HTTP协议是无状态的,意味着每次用户发起请求时,服务器无法识别用户身份,因此无法追踪用户的状态。Cookie通过在客户端存储小段文本数据来解决这个问题。服务器在发送响应时可以设置Cookie,之后每次客户端请求都会...

    网络安全态势感知浅析.pdf

    - 数据分析层:通过流量识别、协议分析等技术手段,结合人工智能、深度学习等技术进行数据分析,从海量数据中挖掘出有价值的信息。 - 监测预警层:对采集数据进行统计分析、能力评估、关联分析和数据挖掘,生成安全...

    浅析异步调用的ppt

    【异步调用】是指在程序执行过程...总结来说,异步调用是提高系统响应性和可扩展性的关键技术,Ajax、WebService和Remoting则是实现异步通信的常用手段,它们各自有其适用的场景和优势,需要根据实际需求来选择和应用。

Global site tag (gtag.js) - Google Analytics