HTTP协议用于客户端和服务器端之间的通信
在两台计算机之间使用HTTP
协议通信时,在一条通信线路上必定有一端是客户端,另一端是服务器端。有时候,两台计算机作为客户端和服务器端的角色有可能互换,但仅从一条通信路线来说,服务器端和客户端的角色是确定的,而用HTTP
协议能够明确区分哪段是客户端,哪段是服务器端。
HTTP
协议规定,请求从客户端发出,最后服务器端响应请求并返回。换句话说,肯定是先从客户端开始建立通信,服务器端在没有收到请求之前不会发送响应。
请求报文是由请求方法、请求URI
,协议版本、可选请求首部字段和内容实体构成的。
HTTP是不保存状态的协议
HTTP
是一种不保存状态,即无状态(stateless
)协议。HTTP
自身不对请求和响应之间的通信状态进行保存,也就是说,在HTTP
这个级别,协议对于发送过的请求或响应不做持久化处理。这是为了更快地处理大量事务,确保协议的可伸缩性。
为了实现保持状态的功能,引入了cookie
技术。
HTTP请求方法
GET
:获取资源POST
:传输实体主体GET
也可以传输实体主体,但一般不用。POST
与GET
相似,但POST
的主要目的不是获取响应的主体内容PUT
:传输文件
就像FTP
的文件上传一样,要求在请求报文的主体中包含文件内容,然后保存到请求URI
指定位置HEAD
:获得报文首部
用于确认URI
有效性及资源更新的日期时间等DELETE
:删除文件OPTIONS
:询问支持的方法TRACE
:追踪路径
让Web
服务器端将之前的请求通信返回给客户端的方法。容易引发XST
(Cross-Site Tracing
,跨站追踪)攻击,通常不会用到CONNECT
:要求用隧道协议连接代理
主要使用SSL
(Secure Sockets Layer
,安全套接层)和TLS
(Transport Layer Security
,传输层安全)协议将通信内容加密后经网络隧道传输
持久连接节省通信量
HTTP
协议的初始版本中,每进行一次HTTP
通信就要断开一次TCP
连接。发送请求一份包含多张图片的HTML
文档对应的Web
页面,会产生大量的通信开销。
持久连接
持久连接(HTTP Persistent Connections
,也称为HTTP keep-alive
或HTTP connection reuse
)特点是:只要任意一端没有明确提出断开连接,则保持TCP
连接状态。
在HTTP1.1
中,所有连接默认都是持久连接。服务器和客户端都需要支持持久连接。
管线化
从前发送请求后需等待并受到响应才能发送下一个请求。管线化技术出现后,不用等待响应亦可直接发送下一个请求。
管线化技术比持久连接更快,请求数越多,时间差就越明显。
使用Cookie的状态管理
Cookie
技术通过在请求和响应报文中写入Cookie
信息来控制客户端的状态。
Cookie
会根据从服务器发送的响应报文中的set-cookie
首部字段信息,通知客户端保存Cookie
。当下次客户端再往该服务器发送请求时,客户端会自动在请求报文中加入Cookie
值后发送出去。
服务器端发现客户端发送过来的Cookie
后,会去检查究竟是从哪一个客户端发来的连接请求,然后比对服务器上的记录,最后得到之前的状态信息。
HTTP报文
用于HTTP
协议交互的信息称为HTTP
报文。HTTP
报文大致可分为报文首部和报文主体两块。通常,并不一定要有报文主体。
请求报文和响应报文的首部内容由以下数据组成。
- 请求行
包含请求的方法,请求URI
和HTTP
版本。 - 状态行
包含表明响应结果的状态码,原因短语和HTTP
版本。 - 首部字段
包含请求和响应的各种条件和属性的各类首部,一般有4种首部:通用首部、请求首部、响应首部和实体首部。 - 其他
可能包含HTTP
的RFC
里未定义的首部(Cookie
等)。
编码提升传输速率
HTTP
在传输数据时可以按照数据原貌直接传输,也可以在传输过程中通过编码提升传输速率。通过在传输时编码,能有效处理大量的访问请求。但是,编码的操作需要计算机来完成,因此会消耗更多的CPU
等资源。
报文主体和实体主体的差异
- 报文(
message
)
是HTTP
通信中的基本单位,由8位组字节流(octet sequence
,其中octet
为8个比特)组成,通过HTTP
通信传输。 - 实体(
entity
)
作为请求或响应的有效载荷数据(补充项)被传输,其内容由实体首部和实体主体组成。
HTTP
报文的主体用于传输请求或响应的实体主体。
通常,报文主体等于实体主体。只有当传输中进行编码操作时,实体主体的内容发生变化,才导致它和报文主体产生差异。
分割发送的分块传输编码
在HTTP
通信过程中,请求的编号实体资源尚未传输完成之前,浏览器无法显示请求页面。在传输大容量数据时,通过把数据分割成多块,能够让浏览器逐步显示页面。这种把实体主体分块的功能称为分块传输编码(Chunked Transfer Coding
)。
分块传输编码会将实体主体分成多个部分(块),每一块都会用十六进制来标记块的大小,而实体主体的最后一块会使用“0(CR+LF)
”来标记。
常见的内容编码有以下几种:
gzip
(GNU zip
)compress
(UNIX
系统的标准压缩)deflate
(zlib
)identity
(不进行编码)
发送多种数据的多部分对象集合
发送邮件时,我们可以在邮件里写入文字并添加多份附件,这是因为采用了MIME
(Multipurpose Internet Mail Extensions
, 多用途因特网邮件扩展)机制,它允许邮件处理文本、图片、视频等多个不同类型的数据。
在MIME
扩展中会使用一种称为多部份对象集合(Multipart
)的方法,来容纳多份不同类型的数据。相应地,HTTP
协议中也采纳了多部份对象集合,发送的一份报文主体内可含有多类型实体。通常是在图片或文本文件等上传时使用。
多部分对象集合包含的对象如下:
multipart/form-data
在Web
表单文件上传时使用。multipart/byteranges
状态码206(Partial Content
,部分内容)响应报文包含了多个范围的内容时使用。
获取部分内容的范围请求
指定范围发送的请求叫做范围请求(Range Request
),如对一份10 000字节大小的资源,可以只请求5001 – 10 000字节内的资源。
执行范围请求时,会用到首部字段Range
来指定资源的byte
范围。
// 指定范围5001-10000 Range: bytes=5001-10000 // 从5001字节之后全部 Range: bytes=5001- // 多个部分 Range: bytes=0-5000, 5000-7000
针对范围请求,响应会返回状态码206 Partial Content
的响应报文。另外,对于多重范围的范围请求,响应会在首部字段Content-Type
标明multipart/byteranges
后返回响应报文。
如果服务器端无法响应范围请求,则会返回状态码200OK
和完整的实体内容。
内容协商返回最合适的内容
当浏览器的默认语言为英语或中文,访问相同URI
的Web
页面时,则会显示对应的语言版本的页面,这样的机制称为内容协商(Content Negotiation
)。
内容协商机制是指客户端和服务器端就响应的资源内容进行交涉,然后提供给客户端最为适合的资源。内容协商会以语言、字符集、编码方式等为基准判断响应的资源。
包含在请求报文中的某些首部字段(如下)就是判断的基准:
Accept
Accept-Charset
Accept-Encoding
Accept-Language
Content-Language
状态码告知从服务器端返回的请求结果
状态码的职责是当客户端向服务器端发送请求时,描述返回的请求结果。
类别 | 原因短语 | |
1XX | Informational(信息性状态码) | 接收的请求正在处理 |
2XX | Success(成功状态码) | 请求正常处理完毕 |
3XX | Redirection(重定向状态码) | 需要进行附加操作以完成请求 |
4XX | Client Error(客户端错误状态码) | 服务器无法处理请求 |
5XX | Server Error(服务器错误状态码) | 服务器处理请求出错 |
2XX 成功
200 OK
204 No Content
206 Partial Content
3XX 重定向
301 Moved Permanently
永久性重定向,该状态码表示请求的资源已被分配了新的URI
,以后应使用资源现在所指的URI
。302 Found
临时性重定向,该状态码表示请求的资源已被分配了新的URI
,希望用户本次能使用新的URI
访问。与301相似,但302状态码代表的资源不是被永久移动,只是临时性质的。303 See Other
该状态码表示由于请求对应的资源存在着另一个URI
,应使用GET
方法定向获取请求的资源。304 Not Modified
该状态码表示客户端发送附带条件的请求时,服务器端允许请求访问资源,但因发生请求未满足条件的情况后,直接返回304Not Modified
(服务器资源未改变,可直接使用客户端未过期的缓存)。304虽然被划分在3XX类别中,但和重定向没关系。
附带条件的请求是指采用GET方法的请求报文中包含If-Match
,If-Modified-Since
,If-None-Match
,If-Range
,If-UnModified-Since
中任一首部。307 Temporary Redirect
临时重定向,与302有着相同的含义,尽管302禁止POST
变换成GET
,但实际使用时大家并不遵守。307会遵守浏览器标准,不会从POST
变成GET
。
4XX 客户端错误
400 Bad Request
表示请求报文中存在语法错误。401 Unauthorized
表示发送的请求需要有通过HTTP
认证的认证信息。403 Forbidden
表示请求资源的访问被服务器拒绝了。404 Not Found
服务器上无法找到请求的资源,也可以在服务器拒绝请求且不想说明理由时使用。
5XX 服务器错误
500 Internal Server Error
表明服务器端在执行请求时发生了错误,也可能是Web应用存在的bug或某些临时的故障。503 Service Unavailable
表明服务器暂时处于超负载或正在进行停机维护,现在无法处理请求。