HTTP协议用于客户端和服务端之间的通信,在两台计算机之间使用HTTP协议通信时,在一条通信线路上,必定有一端是客户端,另一端是服务器端。
HTTP通过请求和响应的交换达成通信:
请求报文:请求方法+请求URI+协议版本+请求首部字段(可选)+内容实体(可选)
响应报文:协议版本+状态码+解释状态码的原因短语+响应首部字段(可选)+内容实体(可选)
HTTP是一种无状态协议,其不对请求和响应之间的通信状态进行保存。这是为了更快地处理大量业务而特意设计的。Cookie技术可以弥补这一特点,实现保持状态功能。
请求URI定位资源
- URI为完整的请求URI
GET http://hackr.jp/index.htm HTTP/1.1
- 在首部字段Host中写明网络域名或IP地址
GET /index.htm HTTP/1.1
Host:hackr.jp
HTTP方法:
-
GET:请求访问已被URI识别的资源,如果请求的资源是文本,则原样返回,如果是CGI(通用网关接口)程序,则返回执行后的输出结果
-
POST:用于传输实体主体,虽然GET方法也能传输实体,但POST方法更安全
-
PUT:用于传输文件,要求在请求报文的主体中包含文件内容,然后保存到请求URI指定的位置
-
DELETE:用于删除文件,是与PUT方法相反的方法,按请求URI删除指定的资源
-
HEAD:与GET方法类似,但只返回报文首部,而不返回实体
-
OPTIONS:询问针对请求URI指定资源支持的HTTP方法,当URI为“*”号时,代表询问服务器本身支持的HTTP方法
-
TRACE:让web服务端将之前的请求通信返回给客户端。在请求过程中,可能会经过代理中转,客户端使用该方法可以查询发送出去的请求是怎样被加工修改的。
使用该方法发送请求时,在MAX-Forwards首部字段填入数值,每经过一个服务端就将此数值减1,数值减到0时,就停止传输,最后接收到请求的服务端则返回状态码200 OK的响应
如果请求成功,响应实体包括整个请求信息,对应Content-type为“message/http”,该方法的响应不能被缓存。 -
CONNECT:要求与代理服务器通信时建立隧道,实现用隧道协议(SSL、TLS)进行通信,通信内容被加密后经网络隧道传输
持久连接(HTTP Persistent Connections、Keep-alive、Connect reuse):只要任意一端没有明确提出断开连接,则保持TCP连接状态。此种技术减少了TCP重复建立和断开所造成的额外开销及服务器负载,在HTTP/1.1中默认连接为持久连接
管线化(Pipelining):同时并行发送多个请求,无需等待。
Cookie状态管理:通过在请求和响应中写入Cookie信息来控制客户端的状态
Cookie会根据从服务端发送的响应报文内的Set-Cookie首部字段信息,通知客户端保存Cookie。客户端保存后,会在下次请求自动加入Cookie值,服务端收到Cookie值后,经匹配记录,得到之前的状态信息。
1.请求报文(无Cookie):
Get /reader/ HTTP/1.1
Host:hackr.jp
2.响应报文(服务端生成Cookie)
HTTP/1.1 200 OK
Date: Thu,12 Jul 2012 07:12:00 GMT
Server:Apache
<Set-Cookie:sid=1342077140226724; path=/; expires=Wed, 10-OCT-12 07:12:00 GMT>
Content-Type:text/plain; charset=UTF-8
3.请求报文(自动发送带有Cookie的请求)
Get /reader/ HTTP/1.1
Host:hackr.jp
Cookie:sid=1342077140226724