http超文本传输协议(HTTP,HyperText Transfer Protocol)是互联网上应用最为广泛的一种网络协议。所有的WWW文件都必须遵守这个标准。设计HTTP最初的目的是为了提供一种发布和接收HTML页面的方法。1960年美国人Ted Nelson构思了一种通过计算机处理文本信息的方法,并称之为超文本(hypertext),这成为了HTTP超文本传输协议标准架构的发展根基。Ted Nelson组织协调万维网协会(World Wide Web Consortium)和互联网工程工作小组(Internet Engineering Task Force )共同合作研究,最终发布了一系列的RFC,其中著名的RFC 2616定义了HTTP 1.1。
http下层的协议经常使用的是tcp,其实只要能提供稳定的连接,什么协议对于http都是可以的,这是网络协议的分层意义.
HTTP 1.0规定浏览器与服务器只保持短暂的连接,浏览器的每次请求都需要与服务器建立一个TCP连接,服务器完成请求处理后立即断开TCP连接,服务器不跟踪每个客户也不记录过去的请求。每次浏览器获得一个静态网页时,解析网页时总是和服务器一次次的建立连接,释放连接,获取页面中的每个url
这样做只是初期web不发达时制定的,现在web页面中包含了大量的图片,video,等网络文件,这样做显然不合理,例如一个包含有许多图像的网页文件中并没有包含真正的图像数据内容,而只是指明了这些图像的URL地址,当WEB浏览器访问这个网页文件时,浏览器首先要发出针对该网页文件的请求,当浏览器解析WEB服务器返回的该网页文档中的HTML内容时,发现其中的图像标签后,浏览器将根据标签中的src属性所指定的URL地址再次向服务器发出下载图像数据的请求.
而http1.1以后,支持了持久性的会话连接,在一个TCP连接上可以传送多个HTTP请求和响应,减少了建立和关闭连接的消耗和延迟。一个包含有许多图像的网页文件的多个请求和应答可以在一个连接中传输,但每个单独的网页文件的请求和应答仍然需要使用各自的连接。HTTP 1.1还允许客户端不用等待上一次请求结果返回,就可以发出下一次请求,但服务器端必须按照接收到客户端请求的先后顺序依次回送响应结果,以保证客户端能够区分出每次请求的响应内容,这样也显著地减少了整个下载过程所需要的时间。
两者对比,以浏览器解析网页为例子:
可见,HTTP 1.1在继承了HTTP 1.0优点的基础上,也克服了HTTP 1.0的性能问题。不仅如此,HTTP 1.1还通过增加更多的请求头和响应头来改进和扩充HTTP 1.0的功能。例如,由于HTTP 1.0不支持Host请求头字段,WEB浏览器无法使用主机头名来明确表示要访问服务器上的哪个WEB站点,这样就无法使用WEB服务器在同一个IP地址和端口号上配置多个虚拟WEB站点。在HTTP 1.1中增加Host请求头字段后,WEB浏览器可以使用主机头名来明确表示要访问服务器上的哪个WEB站点,这才实现了在一台WEB服务器上可以在同一个IP地址和端口号上使用不同的主机名来创建多个虚拟WEB站点。HTTP 1.1的持续连接,也需要增加新的请求头来帮助实现,例如,Connection请求头的值为Keep-Alive时,客户端通知服务器返回本次请求结果后保持连接;Connection请求头的值为close时,客户端通知服务器返回本次请求结果后关闭连接。HTTP 1.1还提供了与身份认证、状态管理和Cache缓存等机制相关的请求头和响应头。
在http我们可以实现http1.0时代无法实现的功能如:文件断点续传
现在的http1.0协议虽然较http1.0有了很大的改变,但是还是无法满足我们对于逐渐丰富的网络资源的要求,所以我们迫切的需要下一代http协议来满足我们的要求:
由于http协议使一个 无状态的协议,一旦关闭连接,再次打开,服务器不会记得我们做过了什么操作,或者我们下一步该做些什么,虽然我们可以同cookie来实现标示用户,但是也还是很麻烦啊,另外http协议使被动的,一次请求,一次回复,无法一次请求多次回复,比如说,我们的网页中包含了多个连接,为什么服务器不能在我们的第一次请求后,就把所有的资源多次回复,发给我们呢,虽然这样的机制很好,但是现在的http1.1无法实现,
所以我们需要下一代http协议来实现,虽然现在目前的html5
标准中websoket协议可以实现客户端和服务端,双工通信,WebSocket protocol 是HTML5一种新的协议。它是实现了浏览器与服务器全双工通信(full-duplex),但是有好多浏览器还没有支持,普遍应用也很困难.所以现很多网站为了实现即时通讯,所用的技术都是轮询(polling)。轮询是在特定的的时间间隔(如每1秒),由浏览器对服务器发出HTTP request,然后由服务器返回最新的数据给客服端的浏览器。这种传统的HTTP request 的模式带来很明显的缺点 – 浏览器需要不断的向服务器发出请求,然而HTTP request 的header是非常长的,里面包含的数据可能只是一个很小的值,这样会占用很多的带宽。
而最比较新的技术去做轮询的效果是Comet – 用了AJAX。但这种技术虽然可达到全双工通信,但依然需要发出请求。
具体的Websocket 协议解析可以参考这篇文章:
http://www.myexception.cn/web/2047919.html
和这篇:http://www.51edu.com/it/bckf/76471.html
WWW取得了巨大成功,HTTP是取得成功的核心,它用于在Web上交换信息。当前Web遵循的HTTP/1.X,但它缺乏模块化的特点,性能也因而较差。
HTTP/1.X包括三层,但它并没有清楚地区分开来:消息传输、通用远程方法调用和一系列用于文档处理的方法。缺乏模块化使得HTTP的发展非常困难,并且为其它应用带来问题,应用位于HTTP之上,因而不管技术是否合适都必须包括许多HTTP的设计。其它一些通用调用系统(如CORBA、DCOM、JAVA
RMI)也位于HTTP之上。HTTP/1.X缺乏模块化引起的问题包括:
。HTTP/1.1中,消息界限的划分不是在一个单独的层中进行,而是与其它功能混在一起,导致有五种不同方法划分消息的界限,非常复杂。
。一般的应用利用隧道(Tunneling)技术通过HTTP文档获取和表格处理方法(GET和POST)完成,这对于防火墙来说很难发现给定通信的语义内容,因而很难实施安全政策。
。HTTP的调用层与文档处理应用很难区分开来,其它应用的设计者在理解如何为自己的应用使用调用层功能方面要做很多工作。
另一方面HTTP协议在每次HTTP会话(一个请求和回应的过程)都打开一个新的TCP连接,这是对系统和网络资源的浪费。
为了克服这些问题,W3C(World Wide Web consortium)从1997年开始研究制定下一代HTTP协议桯TTP-NG。
HTTP-NG的结构是一个三层系统如图1所示,最上层是应用层,中间是消息层,最下面是传输层。应用层和消息层的接口被称为撓⒔涌跀,消息层与传输层的接口被称为“传输接口”
HTTP 1.1中定义的应用包括获取WEB页面,处理代理和缓存,使用CGI描述提交表格。它使用GET、HEAD、POST和PUT等方法。在HTTP-NG中,这些应用被抽象为传统WEB应用揟he
Classic Web
Application?TCWA)。系统使用一种机制决定哪种方法适用于哪种资源。一种支持TCWA的WEB资源支持TCWA对象,只接受由TCWA
API指定的方法。
定义新方法的机制既支持静态类型又支持动态类型,动态类型支持当参数类型在将来需要扩展或者参数具有多个类型时非常有用。一个动态类型参数的实际类型,可以在运行时才确定。HTTP-NG的类型系统与Java
RMI,CORBA和DCOM协议的类型系统合作,使得这些系统中的API不需要使用隧道(Tunneling)技术,直接映射到HTTP-NG。它提供了与其它类型系统的功能兼容性。
HTTP-NG的应用层是基于特定应用的,不同的应用具有不同的界面。它允许多个应用能共同存在,支持添加新的应用而不妨碍原有的应用。HTTP-NG将现存应用转换到一个更好的技术基础之上。
消息系统描述了一种对应用层中类型系统可表示类型的值的编组(Marshaling)方法。编组方法是直接的,它独立于调用方法或当前支持的应用。编组方法是基于IETF的外部数据表示XDR,XDR在分布式系统中广泛被实现。所有方法的参数和结果在系统中被表达,因而不管有多少应用或者应用系统中定义了多少方法,都没有增加编组一个请求或应答消息的复杂性。
消息层主要是一个请求应答消息协议,就像HTTP
1.1一样,但它在几个方面提高了性能,比如说它使用缓存和二进制消息格式来减少实际传输的字节数,同时也减少了编组消息所需的CPU时间,HTTP-NG消息层使用附加的控制信息,通过建立会话特征更进一步减少带宽要求。另一个性能提高来源于利用应用层的类型系统,消除每个头之间的依赖性,从而减少了实现的复杂性。
消息格式现在被称为W3NG,它利用了会话缓存的技术,已经用于DCE RPC、JAVA
RMI中。举例来说,当一个方法或资源第一次被调用时,整个标识在应答消息中传输,此时连接双方都将它缓存。在后来的方法调用中,只需要一个很小的对应特定连接的整数值在传输中用来代替原来的标识。更进一步,这些缓存可被连接双方在建立连接时加载,这对于一些标准应用特别有用。
一个方法调用的目标资源的传递是相对于前一个目标的。系统并不是传递整个资源的标识,而是传递与连接上一次资源标识中的不同部分。接受方通过在上次接受的标识中修改这些不同之处重新构建标识。
HTTP-NG的消息格式是二进制的,不像HTTP-1.1中基于文本的格式,二进制格式在两个方面提高了性能。第一,非字符串值不需要由发送方转换为串,然后接受方解码。相反,可以使用有效的操作如memcpy直接从这些值的内存表示中进行拷贝。第二,这些值使用二进制表示要比用串表示所花字节数要少。
与现存协议相比,HTTP-NG消息层所用技术能显著地减少开销。
HTTP-NG支持由传输栈构成的特定应用,这些传输栈能操作那些通过它们的消息。传输层允许传输栈组成成分以多种顺序安排,它可以在一个可靠的字节流如TCP/IP之上提供多个虚拟连接,同时它还可以提供一个单一字节流的双向使用,这样服务器不需要打开附加的字节流就可以对客户进行回叫。它也提供在一个底层字节流之上的消息界限的标记,这可以用来支持高层基于消息的系统。它允许消息成块或分片传输,既可以复用同时发生的消息,又可以快速发送一个数据段开始部分的数据值(如GIF文件开始的文件大小信息)。
用于HTTP-NG的WEBMUX栈是传输成分的非常有用的合成。它直接位于TCP/IP之上而位于编组层之下,但它也可以和其它传输成分如压缩和安全成分连接。WEBMUX层进行记录标记,并且支持消息的分片。它提供可选的传输流控制,所以接受者能控制发送方的传输率。它支持在一个单一的底层连接上复用最多252个虚拟连接。每个虚拟连接允许在WEBMUX层上有不同的传输栈。除此之外,WEBMUX层为连接双方提供端点(Endpoint)标识,这使得服务器使用同样的连接回叫客户更加容易。既然传递端点标识方法已经定义,防火墙也可以在必要时插入其中。
3 WEB浏览器和服务器结构
在WEB中应用到至少两种参与者:WEB浏览器及WEB服务器。在HTTP-NG协议中的WEB浏览器和WEB服务器的可能结构如图2、3所示。WEB服务器为了处理许多类型的客户具有更多种类的协议和传输组成成分。图2中服务器即支持HTTP又支持HTTP-NG协议,而图3中WEB浏览器只支持HTTP-NG。服务器能在一个普通TCP/IP传输上支持HTTP-NG消息,而浏览器希望每个服务器上具有MUX协议。图中的浏览器可以支持数字符签名文档处理,而服务器不能。浏览器和服务器都在消息流中使用压缩。当然也可以应用许多其它可能的传输协议。一个代理服务器既具有客户端功能又具有服务器端的功能。