本文内容
- HTTP 协议的设计目标
- HTTP 协议的无状态特性
ASP.NET 的 Web Forms 模型的关键是要有一种好的策略来处理廉价 Web 交互中的强大而且不断增长的需求。HTTP 内在的简明性是其获得广泛采用并且有效应用的关键,HTTP 是网络中使用最为广泛的一种协议,属于应用的层面向对象的协议,适用于分布式超媒体信息系统,是 WWW 服务器的基础。它先后经历了 HTTP 0.9、HTTP 1.0、HTTP 1.1 三个版本。
HTTP 协议的设计目标
HTTP 协议的设计目标是通过网络来支持客户端和服务器端之间的事务处理——客户端向服务器端发出请求,连接(TCP)成功后,通过 GET 或 POST 访问服务器端的对象(普通网页或动态页面等资源),服务器端将请求的对象和状态信息返回给客户端,最后断开连接。
每一个事务都独立地进行处理。当一个事务开始时,就在客户端与服务器端之间建立一个 TCP 连接,当事务结束时就释放这个 TCP 连接。HTTP 协议简单、灵活、快速、无连接,尤其它的无状态特性很适合 Web 应用,但也阻碍了 Web 的发展,不过可以通过程序来弥补。
HTTP 协议采用 TCP 来建立客户端和服务器端的连接。TCP 是面向连接的,而 HTTP 是无连接的,看似矛盾,其实再合理不过。这两个协议在网络中所处的层不一样——TCP 在传输层,而 HTTP 在应用层。HTTP 协议产生于互联网,服务器需要同时处理全世界客户端与它的数据交换,网页访问,这种数据交换是突发的、瞬时的,间歇性较大,而且,客户端浏览网页的联想性、发散性导致两次传送的数据关联性很低。如果服务器端采用了面向连接去维护进程和句柄,那是完全不可想象的。因此,HTTP 的设计者将协议设计为请求时建立连接,完成后完释放,尽快将服务器资源释放,供其他客户端使用。而选择 UDP 显然不合适,UDP 虽然不像 TCP 那样占用资源,但它不能保证数据的完整性、有序性,还没有流量控制。占用了宝贵的服务器资源,获得了网页或是文件,却是错误的,无论是人,还是机器都无法接受。
HTTP 协议的无状态特性
HTTP 协议的“无状态”特性很重要,应该如何理解?先想想 FTP、Telnet 这些有状态的协议,“有状态”的特征之一就是上下文(Context)。FTP 服务器必须维护你当前所在目录等信息,才能够理解你的 DEL 或 RETR 等命令到底是什么,而其他大多数协议还要把用户验证作为必需的内容。
那么究竟如何理解 HTTP 的无状态?
比如,某个周末,我和女朋友闲来无事,在家上淘宝,一起挑选内衣。在上边点击类型、品牌、钢圈、杯型、肩带和颜色后,会在下边不断显示令人眼花缭乱的产品。我先是点击“摸胸文胸”,接着点击了“黛安芬”,“粉红色”,“超薄”……因为,HTTP 是无状态的,不会为我保存最近一次点击时,所选择的条件,所以我的每次点击都得重传,重传可能造成较大的数据量。如果我的网速慢或是不稳定,点击又快了,那么下边可能一时半会都显示不出相应的产品。
择日,女朋友出差了,而我在家上淘宝,在输入各种条件,仔细查看,一顿点击,花了整个下午的时间,终于发现几款不错的内衣,女朋友穿上一定很 hot,但我是非常喜欢,可不确定女朋友是否也喜欢,是否能接受。于是,我把网址复制下来发到她 QQ 上,打算试探一下。她把我发给她的网址直接粘贴到浏览器上,就可以看到我花了整个下午精心挑选的内衣了。
可如果是 FTP,她还要设置一下 ASCII 或是 Binary;如果是 Telnet,那么她要设置 Terminal Type、回显等。总之,如果她要看到我希望她看到的东西,估计要经历很多。可正是 HTTP 协议的无状态才使我能让女朋友直接看到我的最终选择。因为,我的事务和她的事务是独立的。
因此,所谓的“无状态”是指协议对于事务处理没有记忆能力。缺少状态意味着如果后续处理需要前面的信息,则它必须重传,这样可能导致每次连接传送的数据量增大。另一方面,在服务器不需要先前信息时它的应答就较快。
说了这么多,希望你现在能领会 HTTP 协议,领会HTTP协议,会对 Web Forms 编程有很大的帮助。
在接下来的文章中,将详细介绍一下 HTTP。