简介

超文本传输协议(Hypertext Transfer Protocol,HTTP)主要用于万维网上存取数据的协议,HTTP没有单独的控制连接,只使用了一个TCP连接。HTTP报文不是供人阅读的,它们是由HTTP服务器和HTTP客户端(浏览器)读取并解释。

报文

请求和响应报文的格式是相似的。请求报文由一个请求行、一个头部构成,有时还可能包含主体。响应报文由状态行、头部构成,有时还可能包含主体。如下图:

http协议学习笔记

请求行和状态行

请求报文中第一行称为请求行,响应报文中第一行称为状态行,二者字段格式如下图:

http协议学习笔记

请求类型

这个字段在请求报文中使用。其实请求类型就是常说的请求方法,在HTTP1.1版本中定义了几种请求方法,如下表所示:

方法 动作
GET 向服务器请求文档
HEAD 请求关于文档的信息,而不是文档本身
POST 从客户端向服务器发送信息
PUT 从服务器向客户端发送文档
TRACE 回显输入的请求
CONNECT 预留
OPTION 询问有关可用的选项

URL

统一资源定位符(uniform resource locator,URL)是说明因特网上信息类型的一种标准。URL格式包括4个部分:协议、主机、端口和路径。格式如下图:

http协议学习笔记

版本

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 服务暂时不可用,但将来可以被再次请求

头部

头部用于客户端与服务器之间交换附加的信息。头部由一行或者多行组成,每一行由一个头名字、一个冒号、一个空格和头值组成。如下图所示:

http协议学习笔记

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

相关文章: