前言

本文是《图解HTTP》读书笔记系列的第二篇,其他章节可在这里查看:

《图解HTTP》读书笔记(零)

本篇简要介绍HTTP协议的大致结构和主要方法,主要使用HTTP/1.1版本,是为简单的HTTP协议基础。

HTTP协议的作用

HTTP是运用在客户端和服务端的协议内容,在通信的过程中,必定有一方是客户端,发起资源的请求访问,而做出资源响应的是服务端,一般情况下,仅就一条通信线路来说,客户端,服务端的角色不会变动,在客户端不住动发出请求的前提下,服务端不会发送响应。那么,客户端和服务端如何通信呢?

通过请求和响应达成通信

客户端向服务端发出一个请求:

1
2
GET / HTTP/1.1
HOST: www.baidu.com

请求报文(还记得什么是报文吗?)由:方法,URI,协议版本,请求首部字段及内容实体等组成。

服务端发送响应:

1
2
3
4
5
6
HTTP/1.1 200 OK
Date: Mon, 18 Dec 2017 13:30:59 GMT
Content-Type: text/html

<html>
....

响应报文同样以协议版本,状态码(200),原因短语(reason-phrase)等首部字段组成。然后,以一个空行分隔,接下来的是报文主体,返回所请求的资源。

HTTP是无状态协议

无状态(stateless)协议,是指在每次的请求–响应结束后,HTTP协议并没有规定客户端或服务端保存上次的通信信息,如此,使得HTTP协议可以快速处理大量请求。但对于需要”记住“上次通信内容的需求来说,可以通过引入Cookie技术来实现。

URI定位资源

客户端发起请求,请求资源的格式是什么呢?就是先前介绍过的URI(Uniform Resource Indentifier),统一资源定位符。URI格式如下:

协议方案名+登录信息(可选)+服务器地址+端口号(可选)+文件路径+查询字符串(可选)+标识符(可选)

eg: http://user:pass@www.example.com:80/dir/index.html?uid=1#ch1

HTTP协议的几个方法

需要注意,HTTP协议的方法是大小写敏感的,所以方法名不可随便改变大小写。

GET:获取资源

GET方法用来请求被URI标识的服务器上的资源,服务器解析后返回响应内容,若为文本资源,原样返回,若为类似CGI(Common Gateway Interface,通用网关接口)这样的程序,则返回执行后的结果。

POST:传输实体主体

与GET方法不同的是,POST方法主要目的是向服务器发送资源。

PUT:传输文件

PUT方法用于传输文件,类似FTP协议的文件上传,在请求报文中包含文件主体,保存至URI指定位置。但鉴于PUT方法不带身份验证,出于安全考虑,一般Web网站不开放该方法,除非引入其他安全机制来保障这一点。

HEAD 获得报文首部

类似GET方法,但仅返回报文主体部分,常用于确认URI正确性和资源更新的日期时间。

DELET:删除文件

和PUT方法相反,DELET方法向服务器发出请求,删除对于的URI指定的资源。同样的,出于安全考虑,在无身份验证机制的Web网站上不开放该方法。

OPTIONS:询问支持的方法

OPTIONS方法用于询问服务器针对请求URI指定资源的支持的方法。

TRACE:追踪路径

TRACE方法要求服务器将先前的请求通信环回给客户端,什么意思呢?客户端指定一个追踪的”长度“数值,要求所经过的每一个服务器节点,将这个数值减一后发送到下一个服务器节点,当次数值为0时,停止传输,最后一个服务器返回200 OK状态码。

TRACE方法主要用于查看客户端与服务端之间的请求操作,但因为不常用,且容易引起XST(Cross-Site Tracing,跨站追踪)攻击,一般不会用到

CONNECT:使用隧道协议连接代理

CONNECT方法指定客户端与服务端之间通信建立隧道。用于TCP通信,主要由SSL(Secure SocketLayer,安全套接字)和TLS(Transport Layer Secure,传输层安全)协议把通信内容加密后经隧道传输,相当于在客户端和服务端之间建立了一个隧道了。

如何持久连接

在第一篇[《图解HTTP》读书笔记中]()中,我们提到,TCP协议通过三次握手策略保证通信可靠。原先的HTTP协议版本,每进行一次HTTP请求–响应通信后就断开TCP连接,再进行下一次HTTP通信又进行一次TCP连接,如此这般,会极大增加通信开销。后续的HTTP/1.1协议和一部分HTTP/1.0协议提出了持久连接(HTTP Persistent Connection或HTTP keep-alive)方法,主要内容即为,建立连接以后,若通信双方没有主动提出断开连接,则保持TCP连接状态。

管线化

持久连接是管线化(pipelining)方法的前提,使得并行发送请求成为可能,而不必等着上一个请求得到响应才能发送下一个请求。能实现比持久化连接更快的速度。

前面说道,HTTP是无状态的连接,那么如何是服务端”记住“客户端呢?这就是Cookie技术引进的原因。简单来说,通过在服务端的HTTP响应报文首部添加一个Set-Cookie字段,通知客户端保存Cookie信息,如此,客户端在下一次请求中添加上Cookie信息,服务端便知道是谁发送的请求。在后续的笔记中会详细解释。