HTTP全称“超文本传输协议”,是一个应用层协议,对Web的请求应答格式进行了规定。HTTP由两个程序实现,一个客户端程序,一个服务端程序。两者通过交换HTTP报文进行通信,客户端发出请求报文,并从服务端收到响应报文。
请求报文由请求行、首部行和实体三部分组成,如下图所示:
请求行中包括三个部分。方法字段可以有几种不同的值,包括GET、POST、DELETE、HEAD和PUT。URL字段说明资源请求路径,版本字段说明该次请求使用的HTTP版本。首部行以键值对的方式为客户端和服务器进行交流提供了很多协商字段。使用GET进行请求时,实体为空(当然技术上也可以做到不为空,这是一个规范问题),常见的表单提交使用POST,实体中存放的是用户表单字段的输入值。
响应报文也由三部分组成:状态行、首部行和实体。
状态行包括三个部分:http协议版本、状态码和短语。常用出现的状态码有:200表示成功;301表示访问资源永久移动,以后访问新的url来获取资源;302表示访问资源临时移动,以后还使用此url来获取资源;304表示资源未发生修改,可使用缓存下来的资源(服务器不会返回任何资源);401表示需要认证;403表示拒绝提供服务;404表示找不到资源;500表示服务端未知异常。
HTTP是应用层协议,建立在TCP协议之上。每次进行数据传输,即进行请求报文发送以及应答报文的接收需要首先建立TCP连接。如果TCP连接进行复用,被称为持续连接,否则为非持续连接。HTTP默认采用持续连接,客户端和服务端也可以进行配置使用非持续连接。首部行增加一个Connection:close选项,可以告诉对方希望采用非持续连接。
HTTP是一个无状态协议,从客户端发出请求报文,到收到服务器的响应报文,即完成了一次交互。当客户端老王再次发出请求报文时,HTTP并没有提供机制让服务器识别出这是老王。但服务器需要识别每一个用户,于是出现了Cookie。Cookie技术有四个组件:①请求报文中的Cookie首部行。②响应报文中的Cookie首部行。③客户浏览器保存一个Cookie文件。④Web站点的Cookie标识生成组件。
如图所示,一个用户访问过京东,于是本地的cookie文件中存放有京东的cookie。第一次访问淘宝的时候,不会携带任何cookie,但是淘宝返回的响应报文中会含有set-cookie首部字段,提示用户将此信息存入本地cookie文件中,之后的访问都会带上此cookie,从而可以标识此用户,让服务端认识他。每个cookie文件都存在于特定的域中,这个域就是我们访问的网站。网站A写下的cookie存在于A的域下,但网站A也可以写下B域的cookie,这种cookie称为第三方cookie,一般是通过调用第三方的SDK来写下的。第三方Cookie有很多的用途,比如用户追踪、数据分析等。出于对用户隐私的保护,各大浏览器开始慢慢的禁用三方Cookie,但商业的力量总是一往无前的,使用第一方Cookie代替三方Cookie等新的方式也在慢慢的出现。
HTTP是一个使用明文进行数据传输的协议,存在被窃听、嗅探的危险,于是出现了HTTPS。HTTPS是一个由SSL/TLS+HTTP协议构建的可进行加密传输、身份认证的网络协议,同时采用了对称加密和非对称加密,具体过程如下: