HTTP 协议概述
HTTP 请求响应
HTTP 请求方法
HTTP 响应方法
HTTP 消息报文之请求报文
HTTP 消息报文之响应报文
HTTP 消息报文之通用报文
我们更熟悉 URL(U
niform R
esource L
ocator,统一资源定位符)。URL 正是使用 Web 浏览器等访问 Web 页面时需要输入的网页地址。比如,下图的 http://hackr.jp/ 就是 URL。
使用 http: 或 https: 等协议方案名获取访问资源时要指定协议类型。 不区分字母大小写,最后附一个冒号(:)
在两台计算机使用HTTP协议通信时,在一条通信线路上必定有一端是客户端,另一端是服务端
服务端和客户端的身份可能会转换,但是从一条信路上说是确定的。
HTTP协议规定,请求从客户端发出,最后服务器端响应请求并返回。
实例:
请求
GET
表示请求访问服务器的类型,称为方法(method)/index.htm
指明了请求的资源对象,也叫做请求的URL(request-URL)。HTTP/1.1
,是HTTP的版本号,用来提示客户端使用HTTP协议功能。综合:请求了HTTP服务器上的/index.htm页面
请求报文的构成 |
---|
请求方法 |
请求URL |
协议版本 |
可选的请求首部字段 |
内容实体构成 |
分析:
HTTP/1.1
表示服务器对应的HTTP版本200 ok
表示处理结果的状态码(status code)和原因短语(reason-phrase)Date: Tue, 10 Jul 2012 06:50:15 GMT
显示创建响应的日期时间,是首部字段(header field)内的一个属性。综合:响应成功返回页面:text/html
响应报文的构成 |
---|
协议版本 |
状态码(请求或失败的数字代码) |
解释状态码的原因短语 |
可选的响应首部字段 |
实体主题 |
HTTP是一种不保存状态,即无状态(stateless)协议。HTTP协议自身不对请求和响应之间的通信状态进行保存。也就是不做持久化处理。
HTTP协议每当有新的请求发送时,就会对应新响应产生。
协议本身不保留之前一切的请求或响应报文的信息。这是为了尽快的处理特大事务,确保协议可伸缩性。
HTTP协议使用URI定位资源,所以在互联网上任意位置的资源都能访问到。
完整请求URI
GET http://hackr.jp/index.htm HTTP/1.1
在首部字段Host中写明网络的域名或IP地址
GET /index.htm HTTP/1.1
Host: hackr.jp
如果不是访问特定资源而是对服务器本身发起请求
,可以用一个*
代替URI
下面这个例子是查询HTTP服务器支持的HTTP方法种类
OPTIONS * HTTP/1.1
下面是HTTP/1.1中可以使用的方法。
说明:GET方法用来请求访问已被URI识别的资源。指定资源经过服务器解析后返回响应内容。若为文本远洋返回,如果是程序执行输出。
例子:
请求:
GET /index.html HTTP/1.1 Host: www.hackr.jp
响应:返回 index.html 的页面资源
请求:
GET /index.html HTTP/1.1
Host: www.hackr.jp
If-Modified-Since: Thu, 12 Jul 2012 07:30:00 GMT
响应:仅返回2012年7月12日7点30分以后更新过的index.html页面资源。 如果未有内容更新,则以状态码304 Not Modified作为响应返回
说明:
POST方法用来传输实体主体。
例子:
请求:
POST /submit.cgi HTTP/1.1 Host: www.hackr.jp Content-Length: 1560(1560字节的数据)
响应:返回submit.cgi接收数据的处理结果
说明:
PUT方法用来传输文件。就像FTP协议的文件上传一样,要求在请求报文的主体中包含文件内容,然后保存到请求URI指定的位置。
因为HTTP/1.1没有验证机制,所以要配合其他验证机制进行验证
例子:
请求:
PUT /example.html HTTP/1.1 Host: www.hackr.jp Content-Type: text/html Content-Length: 1560(1560字节的数据)
响应:响应返回状态码204 No Content(比如 :该html已存在于服务器上)
说明:
HEAD方法和GET方法一样,只是不返回报文主体部分。用于确认URI的有效性及资源更新的时间日期
例子:
请求
HEAD /index.html HTTP/1.1 Host: www.hackr.jp
响应:返回index.html有关的响应首部
说明:
DELETE方法用来删除文件,是与PUT相反的方法。DELETE方法按请求URI删除指定资源。
HTTP/1.1的DELETE同样没有验证机制
例子:
请求
DELETE /example.html HTTP/1.1 Host: www.hackr.jp
响应:响应返回状态码204 No Content(比如 :该html已从该服务器上删除)
说明:
OPTION方法用来查询针对URI指定资源支持的方法。
例子:
请求
OPTIONS * HTTP/1.1 Host: www.hackr.jp
响应
HTTP/1.1 200 OK Allow: GET, POST, HEAD, OPTIONS (返回服务器支持的方法)
说明:
TRACE方法是让web服务器端将之前的请求通信环会给客户端的方法。
发送请求时,在 Max-Forwards 首部字段中填入数值,每经过一个 服务器端就将该数字减 1,当数值刚好减到 0 时,就停止继续传输,最 后接收到请求的服务器端则返回状态码 200 OK 的响应。 客户端通过 TRACE 方法可以查询发送出去的请求是怎样被加工修 改 / 篡改的。这是因为,请求想要连接到源目标服务器可能会通过代理 中转,TRACE 方法就是用来确认连接过程中发生的一系列操作。(容易引发跨站追踪攻击)
例子:
请求
TRACE / HTTP/1.1
Host: hackr.jp
Max-Forwards: 2
响应
HTTP/1.1 200 OK
Content-Type: message/http
Content-Length: 1024
TRACE / HTTP/1.1
Host: hackr.jp
Max-Forwards: 2(返回响应包含请求内容)
说明:
CONNECT 方法要求在与代理服务器通信时建立隧道,实现用隧道协议进行TCP通信。主要使用SSL和TLS协议把通信内容加密后经网络隧道传输。
CONNECT方法的格式如下图所示。
CONNECT 代理服务器名:端口号 HTTP版本
例子:
请求:
CONNECT proxy.hackr.jp:8080 HTTP/1.1 Host: proxy.hackr.jp
响应:
HTTP/1.1 200 OK(之后进入网络隧道)
向请求URI指定的资源发送请求报文时,采用称为方法的命令。
方法 | 说明 | 支持的HTTP版本协议 |
---|---|---|
GET | 获取资源 | 1.0、1.1 |
POST | 传输实体主体 | 1.0、1.1 |
PUT | 传输文件 | 1.0、1.1 |
HEAD | 获得报文首部 | 1.0、1.1 |
DELETE | 删除文件 | 1.0、1.1 |
OPTIONS | 询问支持的方法 | 1.1 |
TRACE | 最总路径 | 1.1 |
CONNECT | 要求用隧道协议连接代理 | 1.1 |
LINK | 建立和资源之间的联系 | 1.1 |
UNLINE | 断开连接关系 | 1.1 |
LINK和UNLINK已被HTTP/1.1废弃
HTTP协议的初始版本中,没进行一次HTTP通信就要断开一次TCP连接.
当年的传输内容都是很小的文本传输,所以不会有问题,随着HTTP的发展web页面中可能包含大量的图片,乃至视频。因此,每次请求都会应为多次断开TCP连接增加通信开销。
为了解决TCP连接问题,HTTP/1.1
和一部分HTTP/1.0
想出了持久连接。HTTP Persistent Connections
,也称为 HTTP keep-alive
或 HTTP connection reuse
)
在 HTTP/1.1 中,所有的连接默认都是持久连接,但在 HTTP/1.0 内 并未标准化。客户端和服务器端都要支持才可以。
特点:
只要任意一端没有明确断开连接,则保持TCP连接状态。需要请求断开。
优点:
持久连接使得管线化(pipeliing)
成为可能。
管线化技术的特点是不用等待响应就可以直接发送下一个请求,这样就可以同时发送多个请求而不需要一个接一个的等待响应了。
管线化技术比持久连接还要快,请求数量越多时间差越明显。
HTTP是无状态协议,由于不保存之前的状态和响应所以减少了资源消耗。可如果碰到需要身份验证的web页面岂不是要每一次都要重新验证,所以人们应用了Cokie技术。
Cookie技术通过在请求和响应报文中写入Cookie信息来控制客户端状态。
Cookie会根据响应报文内一个叫Set-Cookie的首部字段通知客户端保存Cookie。下次发送请求会携带Cookie值发送出去。
服务器发现cookie值后,会检查那个客户端发来的请求然会对比服务器的记录找到之前的状态。
例子:
以上就是一次Cookie请求的过程。