HTTP概述、报文传输以及持久连接
一、HTTP协议概述
HTTP(Hypertext TransferProtocol,超文本传输协议)是在万维网上进行通信时所用的协议方案。HTTP有很多应用,但最著名的是用于Web浏览器和Web服务器之间的双工(指两台通讯设备之间,允许有双向的资料传输)通信。
HTTP&&HTTPS:在Internet中所有的传输都是通过TCP/IP进行的。HTTP协议作为TCP/IP模型中应用层的协议也不例外。HTTP协议通常承载于TCP协议之上,有时也承载于TLS或SSL协议层之上,这个时候,就成了我们常说的HTTPS。如下图所示:
HTTP默认的端口是80,HTTPS的端口是443。
HTTP使用的可靠的数据传输协议,即使是长距离传输,也可以确保在传输的过程中数据不会损坏或产生混乱。这样,用户在访问信息的时候就可以不用担心其完整性了。
一次HTTP操作称为一个事务,其工作过程可分为四步:
1)首先客户机与服务器需要建立连接。只要单击某个超级链接,HTTP的工作开始。
2)建立连接后,客户机发送一个请求给服务器,请求方式的格式为:统一资源标识符(URL)、协议版本号,后边是MIME信息包括请求修饰符、客户机信息和可能的内容。
3)服务器接到请求后,给予相应的响应信息,其格式为一个状态行,包括信息的协议版本号、一个成功或错误的代码,后边是MIME信息包括服务器信息、实体信息和可能的内容。
4)客户端接收服务器所返回的信息通过浏览器显示在用户的显示屏上,然后客户机与服务器断开连接。
如果在以上过程中的某一步出现错误,那么产生错误的信息将返回到客户端,有显示屏输出。对于用户来说,这些过程是由HTTP自己完成的,用户只要用鼠标点击,等待信息显示就可以了。
二、Web代理和Web网关
2.1 Web代理(Proxy)服务器是网络的中间实体。
代理服务器位于客户端和服务器之间,扮演“中间人的角色”,在各端点之间来回传送HTTP报文。它既是Web服务器,又是Web客户端。
不使用代理服务器时,HTTP客户端就要直接与HTTP服务器进行对话,有了Web代理,客户端就可以与代理进行对话,然后由代理代表客户端与服务器进行交流。
2.2 Web网关(gateway)是一种特殊的服务器,作为其他服务器的中间实体使用。
HTTP扩展和接口的发明是由用户需求驱动的。要在Web上发布更复杂资源的需求出现时,人们很快就明确了一点:单个应用程序无法处理所有这些能想到的资源。为了解决这个问题,开发者提出了“网关”的概念,网关可以作为某种翻译器使用,它抽象出了一种能够到达资源的方法。就像一个门一样:进去一条请求,出来一个响应。
通常用于将HTTP流量转换成其他的协议。网关接受请求时就好像自己是资源的源端服务器一样。客户端可能并不知道自己正在与一个网关进行通信。
例如,一个HTTP/FTP网关会通过HTTP请求接收对FTP URI的请求,但通过FTP协议来获取文档。得到的文档就会被封装成一条HTTP报文,发送给客户端。如下图所示。
2.3 代理与网关的对比
严格来说,代理连接的是两个或多个使用相同协议的应用程序,而网关连接的则是两个或多个使用不同协议的端点。网关扮演的是“协议转化器”的角色,即使客户端和服务器使用的是不同的协议,客户端也可以通过它完成与服务器之间的事务处理。如下图所示。
实际上,代理和网关之间的区别很模糊。由于浏览器和服务器实现的是不同版本的HTTP,代理也经常要做一些协议转换的工作。而商业化的代理服务器也会实现网关的功能来支持SSL安全协议、SOCKS防火墙、FTP访问,以及基于Web的应用程序。
三、实体和编码(内容编码、传输编码以及分块编码)
每天都有数以亿计的各种媒体对象经由HTTP传送,如图像、文本、影片以及软件程序等等。只要你能叫得出名字,HTTP就可以传送。HTTP还会确保它的报文被正确传送、识别、提取以及适当处理。具体来说,HTTP要确保它所承载的“货物”满足以下条件:
1、可以被正确地识别(通过Content-Type首部说明媒体格式,Content-Language首部说明语言),以便浏览器和其他客户端能正确地处理内容。
2、可以被正确地解包(通过Content-Encoding首部和Content-Length首部)。
3、是最新的(通过实体验证码和缓存过期控制)。
4、符合用户的需要(基于Accept系列的内容协商首部)。
5、在网络上可以快速有效的传输(通过范围请求、差异编码以及其他数据压缩方法)。
6、完整到达、未被篡改(通过传输编码首部和Content-MD5校验和首部)。
如果把HTTP报文想象成因特网货运系统中的箱子,那么HTTP实体就是报文中实际的货物。下图展示了一个简单的实体,装在HTTP响应报文中:
实体主体中就是原始货物啦。任何描述性的信息都包含在首部中。因为货物(实体主体)只是原始数据,所以需要首部来描述数据的意义。例如Content-type告诉我们如何去解释数据(是图像,还是文本等),Content-Encoding告诉我们数据是不是已被压缩或者重编码。
下图展示了两个实际的HTTP报文的例子。一个携带着文本实体,另一个承载的是图像实体。十六进制的数值中展示的是报文的实际内容:
3.1 内容编码:
HTTP允许对实体
四、持久连接、无状态协议
4.1 HTTP协议的主要特点可概括如下:
1、支持客户/服务器模式。支持基本认证和安全认证。
2、简单快速:客户向服务器请求服务时,只需传送请求方法和路径。请求方法常用的有GET、HEAD、POST。每种方法规定了客户与服务器联系的类型不同。由于HTTP协议简单,使得HTTP服务器的程序规模小,因而通信速度很快。
3、灵活:HTTP允许传输任意类型的数据对象。正在传输的类型由Content-Type加以标记。
4、HTTP 0.9和1.0使用非持续连接:限制每次连接只处理一个请求,服务器处理完客户的请求,并收到客户的应答后,即断开连接。HTTP 1.1使用持续连接:不必为每个web对象创建一个新的连接,一个连接可以传送多个对象,采用这种方式可以节省传输时间。
5、无状态:HTTP协议是无状态协议。无状态是指协议对于事务处理没有记忆能力。缺少状态意味着如果后续处理需要前面的信息,则它必须重传,这样可能导致每次连接传送的数据量增大。
其他部分暂不赘述,此处针对最后两个特点先做个简单的解释:
所谓无状态协议,首先,协议的状态是指下一次传输可以“记住”这次传输信息的能力。HTTP是不会为了下一次连接而维护这次连接所传输的信息的,为了保证服务器内存。比如客户获得了一张网页之后关闭浏览器,然后再启动一次浏览器,再登录该网站,但服务器并不知道客户关闭了一次浏览器。
所谓持久连接,Web客户端经常会打开到同一个站点的连接,比如,一个Web页面上的大部分内嵌图片通常都来自同一个Web站点,而且相当一部分指向其他对象的超链接通常都指向同一个站点。因此,初始化了对某服务器HTTP请求的应用程序很可能会在不久的将来对那台服务器发起更多的请求(比如获取在线图片)。这种性质被称为本地性(site locality)。
因此,HTTP/1.1(以及HTTP/1.0的各种增强版本)允许HTTP设备在事务处理结束后将TCP连接保持在打开状态,以便为未来的HTTP请求重用现存的连接。在事务处理结束之后仍然保持在打开状态的TCP连接被称为持久连接。重用已对目标服务器打开的空闲连接,就可以避开缓慢的连接建立阶段。
HTTP协议是无状态的和Connection:keep-alive的区别:无状态是指协议对于事务处理没有记忆能力,服务器不知道客户端是什么状态。从另一方面讲,打开一个服务器上的网页和你之前打开这个服务器上的网页之间没有任何联系。
HTTP是一个无状态的面向连接的协议,无状态不代表HTTP不能保持TCP连接,更不能代表HTTP使用的是UDP协议(无连接)。
从HTTP/1.1起,默认都开启了Keep-Alive,保持连接特性,简单地说,当一个网页打开完成后,客户端和服务器之间用于传输HTTP数据的TCP连接不会关闭,如果客户端再次访问这个服务器上的网页,会继续使用这一条已经建立的连接。
Keep-Alive不会永久保持连接,它有一个保持时间,可以在不同的服务器软件(如Apache)中设定这个时间。
4.2通过上面的介绍,相信大家对HTTP协议都有了一定的了解,让我们进入正题:HTTP/1.0+keep-alive连接。
大约从1996年开始,很多HTTP/1.0浏览器和服务器都进行了扩展,以支持一种被称为keep-alive连接的早期实验型持久连接。这些早期的持久连接受到了一些互操作性设计方面问题的困扰,这些问题在后期的HTTP/1.1版本中都得到了修正,但很多客户端和服务器仍然在使用这些早期的keep-alive连接。
下图显示了keep-alive连接的一些性能优点,图中将在串行连接上实现4个HTTP事务的时间线与在一条持久连接上实现同样事务所需的时间线进行了比较。由于除去了进行连接和关闭连接的开销,所以时间线有所缩减。
keep-alive已经不再使用了,而且在当前的HTTP/1.1规范中也没有对它的说明了。(未完待续)