HTTP(超文本传输协议)
超文本传输协议(HyperText Transfer Protocol,HTTP)
是一种用来定义客户服务器程序如何编写和如何从万维网获取网页的协议。
- 一个HTTP 客户发送一个请求;HTTP 服务器返回响应。
- 服务器使用80 端口号;客户使用一个临时端口号。
- HTTP 使用TCP 服务。这意味着,在客户和服务器进行任何事务之前,它们之间必须建立连接。
- 在事务之后,连接应当终止。然而,客户和服务器不需要担心交换报文中的差错以及报文的丢失,因为TCP 是可靠的而且将处理这个问题。
非持续与持续连接
嵌入到网页中的超文本概念可能需要多个请求和应答。
- 如果网页,这个被获取的对象,位于不同的服务器,那么我们没有其他选择只能每获取一个对象就要创建一个新的TCP 连接。
- 然而,如果某些对象是位于同一台服务器的,我们可以有两种选择:
- 一是每次使用一个新的TCP 连接获取一个对象。
非持续连接(nonpersistent connection)
- 二是创建一个TCP 连接获取全部对象。
持续连接(persistent connection)
- 在HTTP1.1 版之前指定的是非持续连接,持续连接在1.1 版中是默认的,但是可以被用户改变。
非持续连接
在非持续连接中,一个TCP 连接被每一组请求/应答所创建。下面是这个策略的步骤:
1.客户开启一个TCP 连接并发送请求。
2.服务器发送响应并关闭连接。
3.客户读取数据直到它遇到了文件结束标记,然后关闭连接。
在这种策略中,如果文件包含了N 个位于不同文件的图片连接(全都位于同一台服务器),那么必须开启和关闭连接N+1 (?)次。非持续策略给服务器带来了高额开销,因为每次连接被开启时服器都需要N+1个不同的缓冲区。
下图展示了一个非持续连接的例子。客户需要访问一个包含图片链接的文件。文本文件和图片位于同一台服务器上。这里我们需要两个连接。对于每一个连接,TCP 需要至少三个握手报文来建立连接,但是请求可以和第三个报文一起发送。在连接建立之后,请求对象可以被发送。在接收到一个对象之后,需要另外三次握手报文来结束连接
持续连接
- 在持续连接中服务器在发送一个响应后,为响应更多的请求而将连接置为打开状态。
- 服务器可以在客户的请求下或者在超时情况下将连接关闭。
- 文档发送方(通常是服务器)通常在每次响应中发送数据长度。然而,偶尔情况下发送方不知道数据的长度。这是创建动态文档或活动文档时的情形。在这种情形下,服务器通知客户长度未知并在发送数据后关闭连接,因此客户知道数据已接收完毕。
- 通过使用持续连接,可以节省时间和资源。每个站点只需要为连接设定一组缓冲区和变量。同时节省了连接建立和终止的往返时间。
报文格式
HTTP 协议定义了请求报文和响应报文的格式。每一种报文由四个部分组成。
请求报文
中的第一部分称为请求行;
响应报文
的第一部分称为状态行。
- 其他三部分在请求报文和响应报文中有相同的名称。然而,这三部分只是名称相似,它们可能含有不同的内容。
请求报文
- 请求报文的第一行称为请求行。如图所示,这一行有三部分由空格分隔开并且被两个字符(回车和换行)终止。这些字段称为方法、URL 和版本。
- 第一个字段:方法字段定义了请求类型。如下所示,在HTTP1.1 版中定义了若干种方法。
- 第二个字段:URL,在本章的前面部分已经讨论过了。它定义了相关网页的地址和名称。
- 第三个字段:版本,给出了协议的版本,HTTP 最常用的版本是1.1。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19
| HTTP请求报文中的方法 -------------------------------------------------------------------------------------------- GET 向服务器请求文档。 绝大多数情况下,客户使用GET 方法发送一个请求。在这种情况下,报文的主体是空的。 -------------------------------------------------------------------------------------------- HEAD 请求关于文档的信息,而不是文档本身。 当客户仅需要从服务器获得关于网页的信息,如上次修改的时间,这时使用HEAD 方法。 它也可以用来检测URL 的有效性。这种情况下的响应报文只有头部;主体是空的。 -------------------------------------------------------------------------------------------- PUT 从客户端向服务器发送文档。 PUT 方法与GET 方法是相反的;它允许客户将一个新的页面发送到服务器上(如果允许的话)。 -------------------------------------------------------------------------------------------- POST 从客户端向服务器发送一些信息。 POST 方法与PUT 方法类似,但是它用来发送一些信息到服务器上,这些信息被加入网页或用来修改网页 -------------------------------------------------------------------------------------------- TRACE 回送输入的请求。用来调试;客户要求服务器回送请求来检查服务器是否正在获得请求。 DELETE 删除网页。如果客户获得许可,DELETE 方法允许客户删除一个服务器上的网页。 CONNECT 预留。原先作为预留方法;后文会讨论到,这个方法可能被代理服务器使用。 OPTIONS 询问有关可用的选项。允许客户询问网页属性。
|
- 在请求行之后我们可以有一个或多个
请求头部(request header)
行。
- 每一个头部行都从客户端向服务器发送额外的信息。
- 例如,客户可以请求以某种特定格式发送文档。每个头部行有头部名字、一个冒号、一个空格和一个头部值(见图3)。下面列出了一些请求中常用的头部名字。
- 值字段定义了与每个头部名字相关的值。
- 值列表可以在相应的RFC 中查找到。
- 主体可以出现在请求报文中。通常,当使用POST 或PUT 方法时,它包含要发送的评论或要发布到网站上的文档。
1 2 3 4 5 6 7 8 9 10 11 12 13
| 请求头部名称 ----------------------------------------------------------- User-agent 标识客户端程序 Accept 给出客户端能够接受的媒体格式 Accept-charset 给出客户端可以处理的字符集 Accept-encoding 给出客户端可以处理的编码方案 Accept-language 给出客户端可以接受的语言 Authorization 给出客户端有哪些许可 Host 给出主机及客户端的端口号 Date 给出当前日期 Upgrade 确定首选的通信协议 Cookie 返回cookie 给服务器(稍后解释) If-Modified-Since 如果文档在指定的日期之后被更新,则发送文档
|
响应报文
图3给出了响应报文的格式。响应报文包含状态行
、头部行
并且有时包含主体
。
- 响应报文的第一行称为
状态行
。这一行有三个字段,它们由空格分隔开并且被两个字符(回车和换行)终止。
- 第一个字段:
版本字段
,定义了HTTP 协议的版本,通常为1.1。
- 第二个字段:
状态码字段
,定义了请求的状态。
- 它包含三个数字。在100 范围内的代码只代表一个报告
- 在200 范围内的代码表示这是一个成功的请求。
- 在300范围内的代码表示把客户端重定向到另一个URL
- 在400 范围内的代码表示在客户端发生错误。
- 最后,在500 范围内的代码表示错误发生在服务器端。
- 第二个字段:
状态短语字段
,以文本格式解释了状态码。
在状态行之后,我们可以有一个或多个响应头部行
。每一个头部行都从服务器向客户端发送额外的信息。例如,发送方可以发送关于文档的额外信息。
每个头部行都有一个头部名称、一个冒号、一个空格和一个头部值。
下面列出了一些常用的头部名称。
1 2 3 4 5 6 7 8 9 10 11 12 13
| 响应头部名称 ------------------------------------------------------ Date 给出当前日期 Upgrade 确定首选的通信协议 Server 给出服务器信息 Set-Cookie 服务器要求客户存储 Content-Encoding 指定编码方案 Content-Language 指定语言 Content-Length 给出文档长度 Content-Type 指定媒体类型 Location 指明新建或移动后文档的位置 cookie Accept-Ranges 服务器将会接收的被请求的字节范围 Last-modified 给出上次改变的日期和时间
|
主体包含了从服务器发送给客户的文档。除非响应是一个错误报文,否则主体是存在的。
示例
客户要向服务器发送一个网页
在这个例子中,客户要向服务器发送一个网页。我们使用PUT 方法。
- 请求行给出方法(PUT)、URL 以及HTTP 版本(1.1)。其头部有四行。请求主体包含要发送的网页。
- 响应报文包含状态行和四个头部行。被创建的文档是一个CGI 文档,它包含在响应报文的主体中
客户要向服务器获取一个文档
使用GET 方法来获取一个路径为/usr/bin/image1 的图片。
- 请求行给出了使用的方法(GET)、URL 以及HTTP 版本(1.1)。
- 头部有两行,它们表示客户可以接收GIF 或JPEG 格式的图片。请求是没有主体的。
- 响应报文包含了状态行以及四个头部行。头部行定义了日期、服务器、内容编码(MIME 版本,在电子邮件部分将会描述)以及文档长度。文档主体在头部之后。
条件请求
客户可以在请求中加入条件。在这种情况下,如果条件满足,服务器将会发送被请求的网页或者通知用户。
- 客户加入的最常见的一种条件是网页被修改的时间和日期。
- 客户可以在发送请求时附带头部行If-Modified-Since,这样来告知服务器客户只需要在指定日期之后更新的页面。
一个客户在请求中加入了修改日期和时间的条件。
1 2 3
| GET http://www.commonServer.com/information/file1 HTTP/1.1 请求行 If-Modified-Since: Thu, Sept 04 00:00:00 GMT 头部行 空行
|
响应中的状态行表示在指定日期之后文档没有修改。所以响应报文的主体是空的。
1 2 3 4 5
| HTTP/1.1 304 Not Modified 状态行 Date: Sat, Sept 06 08 16:22:46 GMT 头部第一行 Server: commonServer.com 头部第二行 空行 (Empty Body) 空主体
|
HTTP 安全
HTTP 本质上并不提供安全。然而,,HTTP 可以在安全套接层(SSL)上运行。在这种情况下,HTTP 称为HTTPS。
HTTPS 提供保密性、客户和服务器鉴别,以及数据完整性。
HTTPS 端口号443
状态码(Status-Code)
1xx:表示通知信息,如请求收到了或正在进行处理
- 100 Continue:继续,客户端应继续其请求
- 101 Switching Protocols 切换协议。服务器根据客户端的请求切换协议。只能切换到更高级的协议,例如,切换到 HTTP 的新版本协议
2xx:表示成功,如接收或知道了
3xx:表示重定向,如要完成请求还必须采取进一步的行动
- 301 Moved Permanently: 永久移动。请求的资源已被永久的移动到新 URL,返回信息会包括新的 URL,浏览器会自动定向到新 URL。今后任何新的请求都应使用新的 URL 代替
4xx:表示客户的差错,如请求中有错误的语法或不能完成
- 400 Bad Request: 客户端请求的语法错误,服务器无法理解
- 401 Unauthorized: 请求要求用户的身份认证
- 403 Forbidden: 服务器理解请求客户端的请求,但是拒绝执行此请求(权限不够)
- 404 Not Found: 服务器无法根据客户端的请求找到资源(网页)。通过此代码,网站设计人员可设置 “您所请求的资源无法找到” 的个性页面
- 408 Request Timeout: 服务器等待客户端发送的请求时间过长,超时
5xx:表示服务器的差错,如服务器失效无法完成请求
- 500 Internal Server Error: 服务器内部错误,无法完成请求
- 503 Service Unavailable: 由于超载或系统维护,服务器暂时的无法处理客户端的请求。延时的长度可包含在服务器的 Retry-After 头信息中
- 504 Gateway Timeout: 充当网关或代理的服务器,未及时从远端服务器获取请求
参考资料
HTTP状态码-菜鸟教程
HTTP 教程-菜鸟教程
浅谈HTTP中GET、POST用法以及它们的区别
计算机网络教程-自顶向下方法