HTTP 概况
HTTP:HyperText Transfer Protocal 超文本传输协议
HTTP由两个程序实现:一个客户端程序和一个服务器程序,运行在不同的端系统中,通过交换HTTP报文进行会话。HTTP定义了报文结构和报文交换的方式。
一些术语
- Web页面:由对象组成
- 对象:一个文件,且可以通过一个URL地址寻址。
- 多数Web页面含有一个HTML基本文件和几个引用对象。HTML基本文件通过对象的URL地址引用页面中的其他对象。
- URL地址:
- 存放对象的服务器主机名
- 对象的路径名
- Web浏览器:实现了HTTP的客户端
- Web服务器:实现了HTTP的服务端,存储Web对象,对象由URL寻址
HTTP使用TCP作为支撑运输协议。不需要担心数据丢失的问题。
HTTP服务器不保存关于客户的任何信息 ,是一个无状态协议
非持续连接和持续连接
非持续连接:每个请求/响应式经一个单独的TCP连接发送
持续连接:所有的请求及其相应经相同的TCP连接发送
HTTP默认使用持续连接,可以配置为非持续连接
采用非持续连接的HTTP
每个TCP连接在服务器发送一个对象后关闭,连接不为其他对象而持续。
用户可以自己配置浏览器以控制并行度。
往返时间:一个短分组从客户到服务器然后再返回客户所花费的时间。包括分组时延、分组在中间路由器和交换机上的排队时延以及分组处理时延。
总的响应时间:两个RTT+服务器传输HTML文件的时间
- 第一个RTT:TCP三次握手的前两个部分
- 第二个RTT:HTTP请求/响应时间
采用持续连接的HTTP
非持续连接的缺点:
- 需要维护多个连接,每个连接在客户和服务器中都要分配TCP的缓冲区和保持TCP变量
- 每个对象经受两倍RTT的交付时延
持续连接时,服务器在发送响应后保持该TCP连接打开。如果一条连接经过一定时间间隔仍未被使用,HTTP服务器关闭该连接。
HTTP报文格式
HTTP请求报文
GET /somedir/page.heml HTTP/1.1
Host: www.someschool.edu
Connection: close
User-agent: Mozilla/5.0
Accept-language: fr
使用ASCII文本完成。
第一行为请求行,后继的行为首部行。
- 请求行:三个字段
- 方法字段:可以取GET、POST、HEAD、PUT、DELETE
- URL字段:使用GET方法,在URL字段带有请求对象的标识
- HTTP版本字段:自解释
- 首部行:提供的信息是Web代理高速缓存所要求的
- Host:指明主机
- Connection:close代表浏览器告诉服务器不希望使用持续连接,要求服务器在发送完被请求的对象后关闭这条连接
- User-agent:用来指明用户代理,即向服务器发送请求的浏览器的类型,服务器可以有效地为不同类型的用户代理实际发送相同对象的不同版本
-
在首部行后有entity body,在使用GET方法的时候,entity body为空,只有使用POST方法的时候才使用该实体。
-
几种方法的说明:
- GET:从指定的资源请求数据,查询字符串(名称/值对)是在 GET 请求的 URL 中发送的
- GET 请求可被缓存
- GET 请求保留在浏览器历史记录中
- GET 请求可被收藏为书签
- GET 请求不应在处理敏感数据时使用
- GET 请求有长度限制
- GET 请求只应当用于取回数据
- POST:向指定的资源提交要被处理的数据,查询字符串(名称/值对)是在 POST 请求的 HTTP 消息主体中发送的
- POST 请求不会被缓存
- POST 请求不会保留在浏览器历史记录中
- POST 不能被收藏为书签
- POST 请求对数据长度没有要求
- HEAD:类似于GET,服务器收到使用HEAD方法的请求时,会用一个HTTP报文响应,但是并不返回请求对象
- PUT:允许用户上传对象到指定的Web服务器上指定的路径
- DELETE:允许用户或者应用程序删除Web服务器上的对象
HTTP响应报文
HTTP/1.1 200 OK
Connection: close
Date: Tue, 09 Aug 2011 15:44:04 GMT
Server: Apache/2.2.3 (CentOS)
Last-Modified: Tue, 09 Aug 2011 15:11:03 GMT
Content-Length: 6821
Content-Type: text/html
(data data data data data …)
HTTP 响应报文由三个部分组成,初始状态行,6个首部行,然后是实体体(报文的主要部分)
- 初始状态行:包括三个部分,协议版本字段,状态码和相应状态信息
- 首部行:
- Connection:close告诉客户,发送完报文后关闭该TCP连接
- Date:指示服务器产生并发送该响应报文的日期和时间,是服务器从其文件系统中检索到该对象,插入到响应报文,并发送该响应报文的时间
- Server:类似于User-agent,指明产生报文的服务器的类型
- Last-Modified:指示了对象创建或者最后修改的日期和时间。对既可能在本地客户也可能在网络缓存服务器上的对象缓存来说非常重要。
- Content-Length:指示了被发送对象中的字节数
- Content-Type:指示了实体体中的对象是HTML文本
- 常见的状态码和相关的短语
- 200 OK:请求成功,信息在返回的响应报文中
- 301 Moved Permanently:请求的对象已经被永久转移了,新的URL定义在响应报文的Location:首部行中。客户软件将自动获取新的URL。
- 400 Bad Request:一个通用差错代码,指示该请求不能被服务器理解。
- 404 Not Found:被请求的文档不在服务器上
- 505 HTTP Version Not Supported:服务器不支持请求报文使用的HTTP协议版本
用户与服务器的交互:Cookie
cookie允许站点对用户进行跟踪。cookie技术有四个组件:
- 在HTTP响应报文中的一个cookie首部行
- 在HTTP请求报文中的一个cookie首部行
- 在用户端系统中保留有一个cookie文件,并由用户的浏览器进行管理:收到服务器的响应报文后,客户端浏览器在管理的cookie文件中添加一行,该行包括服务器的主机名和首部中的识别码
- 位于Web站点的一个后端数据库:第一次请求这个Web服务的时候,产生一个唯一识别码
每一次HTTP请求报文中都包含客户对应于这个服务器的唯一识别码(相应的Cookie的首部行),可以根据这个信息来跟踪用户在站点的活动。
cookie可以用于标识一个用户。用户首次访问一个站点时,可能需要提供一个用户标识。在后续会话中,浏览器向服务器传递一个cookie首部,从而向该服务器标识了用户。因此cookie可以在无状态的HTTP上建立一个用户会话层。
Web缓存
Web 缓存器(Web Cache)也叫代理服务器(proxy server),是能够代表初始 Web 服务器来满足 HTTP 请求的网络实体。
Web缓存器有自己的磁盘存储空间,并在存储空间中保存最近请求过的对象的副本。可以配置用户的浏览器,使得用户的所有HTTP请求首先指向Web缓存器。
Web缓存器是服务器同时又是客户。当它接收浏览器的请求并返回响应时,他是一个服务器,当它向初始服务器发出请求并接收响应时,它是一个客户。
部署Web缓存器的原因:可以大大减少对客户请求的响应时间,特别是当客户与初始服务器之间的瓶颈带宽远低于客户与Web缓存器之间的瓶颈带宽时。
CDN(Content Distribution Network)内容分发网络,CDN在Internet上安装了许多地理上分散的缓存器,因而使大量流量实现了本地化。
条件GET方法
存放在缓存器中的对象副本可能是陈旧的。
条件GET方法允许缓存器证实它的对象是最新的,满足以下条件:
- 请求报文使用GET方法
- 请求报文中包含一个
If-Modified-Since
的首部行,这个首部行的值和之前发送的响应报文的Last-Modified
的值是一样的
对于条件GET方法,仍然发送响应报文:
- 响应报文中没有包含所请求的对象
- 响应报文状态行为304 Not Modified,告诉缓冲器可以使用该对象