HTTP 协议 什么是HTTP 协议
HTTP协议(Hypertext Transfer Protocol,超文本传输协议)是用于从WWW服务器传输超文本到本地浏览器的传送协议。它可以使浏览器更加高效,使网络传输减少。
我们在浏览器的地址栏里输入的网站地址叫做URL(UniformResourceLocator,统一资源定位符)。就像每家每户都有一个门牌地址一 样,每个网页也都有一个Internet地址。当你在浏览器的地址框中输入一个URL或是单击一个超级链接时,URL就确定了要浏览的地址。浏览器通过超 文本传输协议(HTTP),将Web服务器上站点的网页代码提取出来,并翻译成漂亮的网页。因此,在我们认识HTTP之前,有必要先弄清楚URL的组成, 例如:http://www.wenhq.com.cn/articleindex.htm 它的含义如下:
1.http:// : 代表超文本传输协议,通知服务器显示Web页,通常不用输入;
2.www.wenhq.com.cn/ : 这是装有网页的服务器的域名,或站点服务器的名称;
4.article/ : 为该服务器上的子目录,就好像我们的文件夹;
5.Index.htm: 是文件夹中的一个HTML文件(网页)。
Internet的基本协议是TCP/IP协议,然而在TCP/IP模型最上层的是应用层(Applicationlayer),它包含所有高层的协 议。高层协议有:文件传输协议FTP、电子邮件传输协议SMTP、域名系统服务DNS、网络新闻传输协议NNTP和HTTP协议等。
HTTP协议不仅保证计算机正确快速地传输超文本文档,还确定传输文档中的哪一部分,以及哪部分内容首先显示(如文本先于图形)等。这就是你为什么在浏览器中看到的网页地址都是以“http://”开头的原因。
HTTP协议如何工作?
大家都知道一般的通信流程:首先客户端发送一个请求(request) 给服务器,服务器在接收到这个请求后将生成一个响应(response) 返回给客户端。
在这个通信的过程中HTTP 协议在以下4 个方面做了规定:
1. Request 和 Response 的格式
Request 格式:
HTTP 请求行
(请求)头
空行
可选的消息体
注:请求行和标题必须以<CR><LF> 作为结尾(也就是,回车然后换行)。空行内必须只有<CR><LF> 而无其他空格。在HTTP/1.1 协议中,所有的请求头,除Host 外,都是可选的。
实例:
GET / HTTP/ 1.1
Host: gpcuster.cnblogs.com
User-Agent: Mozilla/5.0 (Windows; U; Windows NT 6.0 ; en-US; rv: 1.9 . 0.10 ) Gecko/ 2009042316 Firefox/ 3.0 . 10
Accept: text/html,application/xhtml+xml,application/xml;q=0.9 ,*/*;q= 0.8
Accept-Language: en-us,en;q=0.5
Accept-Encoding: gzip,deflate
Accept-Charset: ISO-8859-1 ,utf -8 ;q= 0.7 ,*;q= 0.7
Keep-Alive: 300
Connection: keep-alive
If-Modified-Since: Mon, 25 May 2009 03: 19:18 GMT
GET / HTTP/1.1 Host: gpcuster.cnblogs.com User-Agent: Mozilla/5.0 (Windows; U; Windows NT 6.0; en-US; rv:1.9.0.10) Gecko/2009042316 Firefox/3.0.10 Accept: text/html,application/xhtml+xml,application/xml;q=0.9,*/*;q=0.8 Accept-Language: en-us,en;q=0.5 Accept-Encoding: gzip,deflate Accept-Charset: ISO-8859-1,utf-8;q=0.7,*;q=0.7 Keep-Alive: 300 Connection: keep-alive If-Modified-Since: Mon, 25 May 2009 03:19:18 GMT
Response 格式:
HTTP 状态行
(应答)头
空行
可选的消息体
实例:
HTTP/ 1.1 200 OK
Cache-Control: private, max-age=30
Content-Type: text/html; charset=utf-8
Content-Encoding: gzip
Expires: Mon, 25 May 2009 03: 20:33 GMT
Last-Modified: Mon, 25 May 2009 03: 20:03 GMT
Vary: Accept-Encoding
Server: Microsoft-IIS/7.0
X-AspNet-Version: 2.0 . 50727
X-Powered-By: ASP.NET
Date: Mon, 25 May 2009 03: 20:02 GMT
Content-Length: 12173
HTTP/1.1 200 OK Cache-Control: private, max-age=30 Content-Type: text/html; charset=utf-8 Content-Encoding: gzip Expires: Mon, 25 May 2009 03:20:33 GMT Last-Modified: Mon, 25 May 2009 03:20:03 GMT Vary: Accept-Encoding Server: Microsoft-IIS/7.0 X-AspNet-Version: 2.0.50727 X-Powered-By: ASP.NET Date: Mon, 25 May 2009 03:20:02 GMT Content-Length: 12173
消息体的内容(略)
2. 建立连接的方式
HTTP 支持2 中建立连接的方式:非持久连接和持久连接(HTTP1.1 默认的连接方式为持久连接) 。
1) 非持久连接
让我们查看一下非持久连接情况下从服务器到客户传送一个Web 页面的步骤。假设该贝面由1 个基本HTML 文件和10 个JPEG 图像构成,而且所有这些对象都存放在同一台服务器主机中。再假设该基本HTML 文件的URL 为:gpcuster.cnblogs.com/index.html 。
下面是具体步骡:
1.HTTP 客户初始化一个与服务器主机gpcuster.cnblogs.com 中的HTTP 服务器的TCP 连接。HTTP 服务器使用默认端口号80 监听来自HTTP 客户的连接建立请求。
2.HTTP 客户经由与TCP 连接相关联的本地套接字发出—个HTTP 请求消息。这个消息中包含路径名/somepath/index.html 。
3.HTTP 服务器经由与TCP 连接相关联的本地套接字接收这个请求消息,再从服务器主机的内存或硬盘中取出对象/somepath/index.html ,经由同一个套接字发出包含该对象的响应消息。
4.HTTP 服务器告知TCP 关闭这个TCP 连接( 不过TCP 要到客户收到刚才这个响应消息之后才会真正终止这个连接) 。
5.HTTP 客户经由同一个套接字接收这个响应消息。TCP 连接随后终止。该消息标明所封装的对象是一个HTML 文件。客户从中取出这个文件,加以分析后发现其中有10 个JPEG 对象的引用。
6. 给每一个引用到的JPEG 对象重复步骡1-4 。
上述步骤之所以称为使用非持久连接,原因是每次服务器发出一个对象后,相应的TCP 连接就被关闭,也就是说每个连接都没有持续到可用于传送其他对象。每个 TCP 连接只用于传输一个请求消息和一个响应消息。就上述例子而言,用户每请求一次那个web 页面,就产生11 个TCP 连接。
2) 持久连接
非持久连接有些缺点。首先,客户得为每个待请求的对象建立并维护一个新的连接。对于每个这样的连接,TCP 得在客户端和服务器端分配TCP 缓冲区,并维持TCP 变量。对于有可能同时为来自数百个不同客户的请求提供服务的web 服务器来说,这会严重增加其负担。其次,如前所述,每个对象都有2 个RTT 的响应延长——一个RTT 用于建立TCP 连接,另—个RTT 用于请求和接收对象。最后,每个对象都遭受TCP 缓启动,因为每个TCP 连接都起始于缓启动阶段。不过并行TCP 连接的使用能够部分减轻RTT 延迟和缓启动延迟的影响。
在持久连接情况下,服务器在发出响应后让TCP 连接继续打开着。同一对客户/ 服务器之间的后续请求和响应可以通过这个连接发送。整个Web 页面( 上例中为包含一个基本HTMLL 文件和10 个图像的页面) 自不用说可以通过单个持久TCP 连接发送: 甚至存放在同一个服务器中的多个web 页面也可以通过单个持久TCP 连接发送。通常,HTTP 服务器在某个连接闲置一段特定时间后关闭它,而这段时间通常是可以配置的。持久连接分为不带流水线(without pipelining) 和带流水线(with pipelining) 两个版本。如果是不带流水线的版本,那么客户只在收到前一个请求的响应后才发出新的请求。这种情况下,web 页面所引用的每个对象( 上例中的10 个图像) 都经历1 个RTT 的延迟,用于请求和接收该对象。与非持久连接2 个RTT 的延迟相比,不带流水线的持久连接已有所改善,不过带流水线的持久连接还能进一步降低响应延迟。不带流水线版本的另一个缺点是,服务器送出一个对象后开始等待下一个请求,而这个新请求却不能马上到达。这段时间服务器资源便闲置了。
HTTP/1.1 的默认模式使用带流水线的持久连接。这种情况下,HTTP 客户每碰到一个引用就立即发出一个请求,因而HTTP 客户可以一个接一个紧挨着发出各个引用对象的请求。服务器收到这些请求后,也可以一个接一个紧挨着发出各个对象。如果所有的请求和响应都是紧挨着发送的,那么所有引用到的对象一共只经历1 个RTT 的延迟( 而不是像不带流水线的版本那样,每个引用到的对象都各有1 个RTT 的延迟) 。另外,带流水线的持久连接中服务器空等请求的时间比较少。与非持久连接相比,持久连接( 不论是否带流水线) 除降低了1 个RTT 的响应延迟外,缓启动延迟也比较小。其原因在于既然各个对象使用同一个TCP 连接,服务器发出第一个对象后就不必再以一开始的缓慢速率发送后续对象。相反,服务器可以按照第一个对象发送完毕时的速率开始发送下一个对象。
3. 缓存的机制
HTTP/1.1 中缓存的目的是为了在很多情况下减少发送请求,同时在许多情况下可以不需要发送完整响应。前者减少了网络回路的数量;HTTP 利用一个“过期(expiration )”机制来为此目的。后者减少了网络应用的带宽;HTTP 用“验证(validation )”机制来为此目的。
HTTP 定义了3 种缓存机制:
Freshness allows a response to be used without re-checking it on the origin server, and can be controlled by both the server and the client. For example, the Expires response header gives a date when the document becomes stale, and the Cache-Control: max-age directive tells the cache how many seconds the response is fresh for.
Validation can be used to check whether a cached response is still good after it becomes stale. For example, if the response has a Last-Modified header, a cache can make a conditional request using the If-Modified-Since header to see if it has changed.
Invalidation is usually a side effect of another request that passes through the cache. For example, if URL associated with a cached response subsequently gets a POST, PUT or DELETE request, the cached response will be invalidated.
关于
web 缓存方面的内容可以参考:
Caching Tutorial for Web Authors and Webmasters (
英文版 )(
中文版 )
4. 响应授权激发机制
这些机制能被用于服务器激发客户端请求并且使客户端授权。