简介
超文本传输协议(Hypertext Transfer Protocol,HTTP)主要用于万维网上存取数据的协议,HTTP没有单独的控制连接,只使用了一个TCP连接。HTTP报文不是供人阅读的,它们是由HTTP服务器和HTTP客户端(浏览器)读取并解释。
报文
请求和响应报文的格式是相似的。请求报文由一个请求行、一个头部构成,有时还可能包含主体。响应报文由状态行、头部构成,有时还可能包含主体。如下图:
请求行和状态行
请求报文中第一行称为请求行,响应报文中第一行称为状态行,二者字段格式如下图:
请求类型
这个字段在请求报文中使用。其实请求类型就是常说的请求方法,在HTTP1.1版本中定义了几种请求方法,如下表所示:
| 方法 | 动作 |
|---|---|
| GET | 向服务器请求文档 |
| HEAD | 请求关于文档的信息,而不是文档本身 |
| POST | 从客户端向服务器发送信息 |
| PUT | 从服务器向客户端发送文档 |
| TRACE | 回显输入的请求 |
| CONNECT | 预留 |
| OPTION | 询问有关可用的选项 |
URL
统一资源定位符(uniform resource locator,URL)是说明因特网上信息类型的一种标准。URL格式包括4个部分:协议、主机、端口和路径。格式如下图:
版本
HTTP目前最常用的版本是1.1。
状态码
这个字段在响应报文中使用。状态码字段由三个数字组成。
在100系列的代码只代表一个报告;
在200系列的代码表示这是一个成功的请求;
在300系列的代码表示把客户端重定向到另一个URL;
在400系列的代码表示在客户端发生错误;
在500系列的代码表示错误发生在服务器端。
常用的代码如下表所示:
| 代码 | 短语 | 描述 |
|---|---|---|
| 提供信息 | ||
| 100 | Continue | 请求的初始部分已经收到,客户端可以继续它的请求 |
| 101 | Switching | 服务器同意客户端的请求,切换到更新头部所定义的协议 |
| 成功 | ||
| 200 | OK | 请求成功 |
| 201 | Created | 创建了一个新的URL |
| 202 | Accepted | 请求已经接受,但它不能立即响应 |
| 204 | No content | 主体中没有内容 |
| 重定向 | ||
| 301 | Moved permanently | 服务器已不再使用所请求的URL |
| 302 | Moved temporarily | 请求的URL已经暂时移开 |
| 304 | Not Modified | 文档还没有被修改 |
| 客户端错误 | ||
| 400 | Bad request | 在请求中有语法错误 |
| 401 | Unauthorized | 请求中缺乏合适的授权 |
| 403 | Forbidden | 服务被拒绝 |
| 404 | Not found | 没有找到文档 |
| 405 | Method not allowed | URL不支持该方法 |
| 406 | Not accept able | 不接受这种格式的请求 |
| 服务器错误 | ||
| 500 | Internaluserver error | 服务器有错误,例如系统崩溃 |
| 501 | Not implemented | 请求的动作不能完成 |
| 503 | Service unavailable | 服务暂时不可用,但将来可以被再次请求 |
头部
头部用于客户端与服务器之间交换附加的信息。头部由一行或者多行组成,每一行由一个头名字、一个冒号、一个空格和头值组成。如下图所示:
头部的各行属性属于下列四大类之一:通用头部(general header)、请求头部(request header)、响应头部(response header)和实体头部(entity header)。请求报文只能包含通用、请求和实体头部。响应报文只能包含通用、响应和实体头部。
通用头部
通用头部给出关于报文的通用信息,并可以在请求和响应报文中都存在。下表列出了一些通用头部及其说明。
| 头部 | 说明 |
|---|---|
| Cache-control | 定义了关于高速缓存的信息 |
| Connection | 说明连接是否应关闭 |
| Date | 给出现在的日期 |
| MIME-version | 说明MIME的使用版本 |
| Upgrade | 确定首选的通信协议 |
请求头部
请求头部只能在请求报文中存在。它确定客户端配置和客户端首选的文档格式。下表列出一些请求头部及其说明。
| 头部 | 说明 |
|---|---|
| Accept | 给出客户端能够接受的媒体格式 |
| Accept-charset | 给出客户端可以处理的字符集 |
| Accept-encoding | 给出客户端可以处理的编码方案 |
| Accept-language | 给出客户端可以接受的语言 |
| Authorization | 给出客户端有哪些许可 |
| From | 给出用户的电子邮件地址 |
| Host | 给出主机及服务器的端口号 |
| If-modified-since | 只在比指定的日期更新时才发送文档 |
| If-match | 只有与给定的标记匹配时才发送文档 |
| If-non-match | 只有与给定的标记不匹配时才发送文档 |
| If-range | 只发送丢失的那部分文档 |
| If-unmodified-since | 如在指定的日期之后未改变,则发送文档 |
| Referer | 指明被链接文档的URL |
| User-agent | 标识客户端程序 |
响应头部
响应头部只能出现在响应报文中。它确定了服务器的配置和关于请求的特定信息。下表列出了一些响应头部及其说明。
| 头部 | 说明 |
|---|---|
| Accept-range | 说明服务器是否接受客户端请求的范围 |
| Age | 给出文档的使用年限 |
| Public | 给出支持的方法列表 |
| Retry-after | 确定一个日期,在这个日期之后服务器是否可用 |
| Server | 给出服务器名及版本号 |
实体头部
实体头部提供了关于文档主体的有关信息。尽管多数情况下它只出现在响应报文中,但在有些请求报文中,如POST和PUT方法,也会包含一个主体且使用这种类型的头部,下表列出了一些实体头部及其说明。
| 头部 | 说明 |
|---|---|
| Allow | 列出URL可以使用的有效方法 |
| Content-encoding | 确定编码方案 |
| Content-language | 指定语言 |
| Content-length | 给出文档的长度 |
| Content-range | 指定文档的范围 |
| Content-type | 指定媒体类型 |
| Etag | 给出实体的标记 |
| Expires | 给出内容改变的日期和时间 |
| Last-modified | 给出上次改变的日期和时间 |
| Location | 指明新建或移动后文档的位置 |
主体
主体可以出现在请求和响应报文中。通常它包含要发送或接受到的文档。
持续与非持续连接
HTTP在版本1.1之前定义了非持续连接,而在版本1.1中默认的是持续连接。
非持续连接
在非持续连接(nonpersistent connection)中,每一次请求/响应都要建立TCP连接。所以非持续策略在服务器端增加了很大的开销。
持续连接
HTTP1.1定义了默认的持续连接(persistent connection)。在持续连接中,服务器在发送响应以后会保持连接处于开启状态,以等待更多的连接请求。如果客户请求关闭或者超时时,服务器会关闭连接。发送方通常在每次响应时会发送数据的长度。但是,在一些特殊情况下,发送方不能确定数据的长度。如果文档是动态创建的或者属于活动文件,就会发生这种情况。这种情况下,服务器会通知客户端,文件长度未知,发送数据结束后关闭连接,这样客户端就能确定到达的数据是否已经结束。
代理服务器
HTTP支持代理服务器(proxy server)。代理服务器是一台计算机,能够保存最近请求的响应的副本。HTTP客户端向代理服务器发送请求。代理服务器检查本机的高速缓存。如果高速缓存中不存在响应报文,代理服务器就向相应的服务器发送请求。返回的响应会发送到代理服务器中,并且进行存储,以用于其他客户端将来的请求。
代理服务器降低了原服务器的负载,减少了通信量并降低了延迟。但是,使用代理服务器,客户端必须配置为访问代理服务器而不是目标服务器。