简介
超文本传输协议(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客户端向代理服务器发送请求。代理服务器检查本机的高速缓存。如果高速缓存中不存在响应报文,代理服务器就向相应的服务器发送请求。返回的响应会发送到代理服务器中,并且进行存储,以用于其他客户端将来的请求。
代理服务器降低了原服务器的负载,减少了通信量并降低了延迟。但是,使用代理服务器,客户端必须配置为访问代理服务器而不是目标服务器。