客户端和服务器
- HTTP协议用于客户端和服务器之间的通信。
- 客户端:请求资源。
- 服务器:提供资源响应。
使用HTTP协议进行通信时,一条通信线路上必定有一端是客户端,另一端是服务器端(角色是确定的)
请求和响应
- 请求必定由客户端发出,而服务器回复响应。
通信的建立一定是从客户端开始的,服务器在没有接收到请求之前不会发送响应。
HTTP是不保存状态的协议
- HTTP协议自身不对请求和响应之间的通信状态进行保存。
- 每当有新的请求发送时,就会产生新的响应
HTTP/1.1 虽然是无状态(stateless)协议,但是为了实现期望的保存状态的功能,于是引入了cookie技术。
请求报文与响应报文
- 我们来看一个请求报文和响应报文的示例
请求报文
- 方法(method):请求访问服务器的类型。
- 请求URL:请求访问的资源对象。
- 协议版本:提示协议版本号。
- 请求首部字段
- 内容实体
响应报文
- 协议版本:服务器对应的HTTP版本。
- 状态码(status code):处理结果的状态码,表示请求成功或失败等等的数字代码。
- 状态码原因短语(reason-phrase):处理结果的原因短语,用于解释状态码。
- 响应首部字段
- 主体
请求URL
作用
- HTTP协议使用URL定位资源
关于URI和URL的区别参见What’s the difference between a URI and a URL?
指定URL的方式
- 这里以 http://hackr.jp/index.html 为例
- 第一种: GET http://hackr.jp/index.html HTTP/1.1 (URL为完整的请求URL)
第二种: GET /index.htm HTTP/1.1
Host: hackr.jp (在首部写明网络域名或IP地址)
如果不是对特定资源而是服务器本身发起请求,可以用
*
代替请求URL,例如: OPTIONS * HTTP/1.1
HTTP方法
GET(获取资源)
- GET 方法用来请求资源,指定的资源经过服务器解析后返回响应内容。
- 举个例子 🌰
POST(传输实体主体)
- POST 方法用来传输实体的主体。
- 举个例子 🌰
PUT(传输文件)
- PUT 方法用来传输文件。
- 在请求报文主体中包含文件内容,保存到请求URL指定的位置。
PUT方法不带验证机制,任何人都可以上传文件,存在安全性问题,一般Web网站不使用该方法。
- 举个例子 🌰
HEAD(获得报文首部)
- HEAD 方法与GET方法一样,只是不返回报文主体部分。
- 用于确认URL的有效性及资源更新的日期时间等。
- 举个例子 🌰
DELETE(删除文件)
- DELETE 方法用来删除文件,是与PUT相反的方法。
- DELETE 方法按照请求URL删除指定的资源。
与PUT一样不带验证机制,一般Web网站不使用。
OPTIONS(询问支持的方法)
- OPTIONS 方法用来查询针对请求URL指定的资源支持的方法。
- 举个例子 🌰
TRACE (追踪路径)
- TRACE 方法用于发起回环诊断。
- 客户端发起一个请求时,这个请求可能要穿过防火墙、代理、网关或其他一些应用程序。每个中间节点都可能会修改原始的 HTTP 请求。
- TRACE 请求会在目的服务器端发起一个环回诊断。行程最后一站的服务器会弹回一条 TRACE 响应,并在响应主体中携带它收到的原始请求报文。这样客户端就可以查看在所有中间 HTTP 应用程序组成的请求 / 响应链上,原始报文是否、以及如何被毁坏或修改过。
不太常用,且容易引发XST(跨站追踪)攻击。
- 举个例子 🌰
CONNECT(要求用隧道协议连接代理)
- CONNECT 方法要求在与代理服务器通信时建立隧道,实现用隧道协议进行TCP通信。
- 主要使用SSL和TLS协议把通讯内容加密后经网络隧道传输。
- 格式:
CONNECT 代理服务器名: 端口号 HTTP版本
- 举个例子 🌰
使用方法下达命令
- 方法的作用:指定请求的资源按期望产生某种行为。
方法名区分大小写,注意要使用大写字母。
持久连接节省通信量
早期的HTTP通信
- 在HTTP协议的初始版本中,每进行一次HTTP通信就要断开一次TCP连接。
- 以当年情况来看无可厚非,但随着HTTP的普及,请求一个包含多个资源(例如图片)的HTML界面时,每次请求都会造成无谓的TCP连接建立和断开,影响通信量的开销。
持久连接
- 持久连接(HTTP Persistent Connections)特点是:只要任意一端没有明确提出断开连接,则保持TCP连接状态。
- 持久连接的好处在于:减少了TCP连接的重复建立和断开所造成的额外开销,减轻了服务器端负载。
- 在HTTP/1.1 中,所有的连接默认都是持久连接。
管线化
- 从前:发送请求后必须等待并收到响应后,才能发送下一个请求。
- 管线化技术出现后:不必等待响应,可直接发送下一个请求。
- 这样可以做到,并行发送多个请求。
使用cookie的状态管理
HTTP是无状态协议
- HTTP协议不对发生过的请求和响应的状态进行管理。
- 这样可以减少服务器的CPU及内存资源的消耗。
- 在要求登录的Web页面,如果不记录已登录的状态,每次跳转不是再次登录就是要在请求报文中附加参数来管理登录状态。
引入cookie技术
- cookie技术通过在请求和响应报文中写入cookie信息来控制客户端的状态。
- 第一次:客户端发出请求 —> 服务器生成cookie,在响应中添加cookie —> 客户端收到cookie并保存。
- 第二次之后:客户端添加cookie后发出请求 —> 服务器检查cookie并响应