HTTP协议用于客户端和服务器之间的通信
客户端与服务器之间通过请求和响应达成通信
- 请求报文:大体可分为三个部分
//方法 URI 协议版本
POST /index.html HTTP/1.1
Host:hacker.jp //请求首部字段
Connection:keep-alive
Content-Type:application/x-www-form-urlencoded
Content-Length:16
//空一行
name=gx&age=24 //内容实体
- 响应报文
//协议版本 状态码 状态码的原因短语
HTTP/1.1 200 OK
Date: Tue, 10 Jul 2012 06:50:15 GMT //响应首部字段
Content-Length:362
Content-Type:text/html
//空一行
<html>//主体
.......
无状态协议
HTTP协议自身不对请求和响应之间的通信状态进行保存。每当有新的请求发送时,就会有新的响应 产生,协议本身不保留之前的请求或响应报文的信息。
URI的两种请求方式:
- URI为完整请求的URI
GET http://hackr.jp/index.html HTTP/1.1
- 在首部字段Host中写明域名或IP地址
GET /index.html HTTP/1.1
Host: hackr.jp
HTTP方法
- GET:获取资源
用来请求访问已被URI识别的资源,指定的资源经服务器解析后返回响应的内容。 - POST:传输实体主体
//---请求
POST /index.html HTTP/1.1
Host: www.hackr.jp
Content-Length:1560
//---响应
//返回index.html接收数据处理后的结果
- PUT:传输文件
在请求报文的主体中包含文件内容,然后保存到请求URI指定的位置; - HEAD:获得报文首部
HEAD方法和GET方法一样,只是不返回报文主体部分。用于确认URI的有效性及资源更新的日期时间等; - DELETE:删除文件
与PUT相反,按请求URI删除指定的资源; - OPTIONS:询问支持的方法:
//---请求
OPTIONS * HTTP/1.1
Host: www.hackr.jp
//---响应
HTTP/1.1 200 OK
Allow:GET,POST,HEAD,OPTIONS//返回服务器支持的方法
- TRACE:追踪路径:
发送请求时,在Max-Forwards首部字段中填入数值,每经过一个服务器端就将该数字减1,当数值刚好减到0时,就停止传输,最后接收到请求的服务器则返回状态码200 OK 的响应(而且返回的响应包含请求的内容) - CONNECT:要求用隧道协议连接代理:
要求在与代理服务器通信时建立隧道,实现用隧道协议进行TCP通信。主要使用SSL(安全套层)和TLS(传输层安全)协议把通信内容加密后经网络隧道传输。
//格式 CONNECT 代理服务器名:端口号 HTTP版本
//--- 请求
CONNECT proxy.hackr.jp:8888 HTTP/1.1
Host:proxy.hackr.jp
//---响应
HTTP/1.1 200 OK //之后进入网络隧道
持久连接节省通信量
持久连接
在HTTP/1.1中,所有的连接默认都是持久连接。
特点:只要任意一端没有明确提出断开连接,则保持TCP连接状态;
优点:减少TCP连接的重复建立和断开造成的额外开销,减轻了服务器端的负载。使http请求与响应能更早的结束;
管线化
优点:并行发送多个请求,不再需要等待响应回来后才发送下一个请求
使用Cookie的状态管理
HTTP是无状态协议,无法根据之前的状态进行本次请求的处理。因此若要对登录状态进行管理,那么每次跳转新页面不是要再次登录就是要在每次请求报文中增加参数来管理登录状态。
Cookie技术通过在请求和响应报文中写入Cookie信息来控制客户端的状态。
1.请求报文(没有Cookie信息的状态)
GET /reader/ HTTP/1.1
Host:hackr.jp
* //首部字段中没有Cookie的相关信息
2. 响应报文(服务器端生成Cookie的信息)
HTTP/1.1 200 OK
Date:Tue, 10 Jul 2012 06:50:15 GMT
Server:Apache
<Set-Cookie:sid=1234567890;path=/;expires=Wed,10-Oct-12 07:12:12 GMT>
Content-Type:text/plain; charset=UTF-8
3.请求报文(自动添加保存着的Cookie信息)
GET /reader/ HTTP/1.1
Host:hackr.jp
Cookie:sid=1234567890
HTTP报文
http报文大致可以分为报文首部和报文主体(可省略)两部分,中间由空行(CR+LF)隔开。
报文首部结构
- 请求行:请求的方法,请求URI和HTTP版本;
- 状态行:HTTP版本,响应结果的状态码和原因短语;
- 首部字段:请求和响应的各种条件和属性的各种首部。一般有四种首部,通用首部、请求首部、响应首部和实体首部;
- 其他:HTTP的RFC中为定义的首部(如Cookie)
编码提升传输效率
HTTP在传输数据时可以按照数据原貌进行传输,但也可以做在传输时通过编码提升传输效率,而同时编码操作会消耗更多得CPU等资源。
报文主体和实体主体
报文是HTTP通信中得基本单位,由8位组字节流组成,通过HTTP通信传输;
实体作为请求或响应得有效载荷数据(补充项)被传输,其内容由实体首部和实体主体组成。
一个空白行(CRLF)把首部字段同主体的开始部分分隔开来。
通常,报文主体等于实体主体,只有当传输中进行编码操作时,实体主体的内容发生变化时,才导致它和报文主体产生差异;
- 压缩传输的内容编码
内容编码指明应用在实体内容上的编码格式,并保持实体信息原样压缩。内容编码后的实体由客户端接收并负责解码。常用内容编码方式:gzip,compress,deflate,identity; - 分块传输编码
将实体主体分割成多个部分(块),每一块用一个十六进制来标记块的大小。分块后的实体主体由客户端接收并解码,恢复到编码前的实体主体。
发送多种数据的多部分对象集合
MIME机制允许客户端/服务器处理文本、图片、视频等多个不同类型的数据;
在HTTP报文中使用多部分对象集合时,需要在首部字段里加上Content-type。
内容协商返回最合适的内容(如中英文界面)
内容协商主要有以下3种类型:
- 服务器驱动协商:以客户端请求的字段作为参考,在服务器端自行处理;
- 客户端驱动协商:用户从浏览器显示的可选项列表中手动选择。或者利用js在web页面上自动进行选择
- 透明协商:是服务器驱动和客户端驱动的结合体,由服务器和客户端各自进行内容协商的方法