HTTP协议是Hyper Text Transfer Protocol(超文本传输协议)的缩写,是用于从万维网服务器传输超文本到本地浏览器的传送协议。HTTP 是基于 TCP/IP 协议通讯协议来传递数据(HTML 文件, 图片文件, 查询结果等)。它不涉及数据包(packet)传输,主要规定了客户端和服务器之间的通讯格式,默认使用80端口。html
1.简单快速:客户向服务器请求服务时,只需传送请求方法和路径。请求方法经常使用的有GET、HEAD、PUT、DELETE、POST。每种方法规定了客户与服务器联系的类型不一样。因为HTTP协议简单,使得HTTP服务器的程序规模小,于是通讯速度很快。浏览器
2.灵活:HTTP容许传输任意类型的数据对象。缓存
3.无链接:无链接的含义是限制每次链接只处理一个请求。服务器处理完客户的请求,并收到客户的应答后,即断开链接。采用这种方式能够节省传输时间。服务器
4.无状态:HTTP协议是无状态的,HTTP 协议自身不对请求和响应之间的通讯状态进行保存。任何两次请求之间都没有依赖关系。直观地说,就是每一个请求都是独立的,与前面的请求和后面的请求都是没有直接联系的。协议自己并不保留以前一切的请求或 响应报文的信息。这是为了更快地处理大量事务,确保协议的可伸缩性,而特地把 HTTP 协议设计成如此简单的。框架
Http报文包括请求报文和响应报文两大部分,其中请求报文由请求行(request line)、请求头(header)、空行和请求体四个部分组成。而响应报文由状态行、响应头部、空行和响应体四个部分组成。接下来咱们详细介绍下请求报文的各个部分及其做用。spa
POST /chapter17/user.html HTTP/1.1
以上代码中“POST ”表明请求方法,“/chapter17/user.html”表示URI,“HTTP/1.1”表明协议和协议的版本。如今比较流行的是Http1.1版本设计
请求头部通知服务器有关于客户端请求的信息。它包含许多有关的客户端环境和请求正文的有用信息。其中好比:
**Host,表示主机名,虚拟主机;
Connection,HTTP/1.1增长的,使用keepalive,即持久链接,一个链接能够发多个请求;
User-Agent,请求发出者,兼容性以及定制化需求。**3d
name=tom&password=1234&realName=tomson
上面代码,承载着name、password、realName三个请求参数。code
状态代码有三位数字组成,第一个数字定义了响应的类别,共分五种类别:htm
好比咱们平时常见两种出错的状态码:
403 Forbidden //对被请求页面的访问被禁止 404 Not Found //请求资源不存在,好比:输入了错误的URL
HTTP协议的初始版本中,每进行一次HTTP通讯就要断开一次TCP链接。以当年的通讯状况来讲,由于都是些容量很小的文本传输,因此即便这样也没有多大问题。可随着 HTTP 的 普及,文档中包含大量图片的状况多了起来。好比,使用浏览器浏览一个包含多张图片的 HTML 页面时,在发送请求访问 HTML 页面资源的同时,也会请 求该 HTML 页面里包含的其余资源。所以,每次的请求都会形成无谓的 TCP 链接创建和断开,增长通讯量的 开销。
为解决上述 TCP 链接的问题,HTTP/1.1 和一部分的 HTTP/1.0 想出了持久链接(HTTP Persistent Connections,也称为 HTTP keep-alive 或 HTTP connection reuse)的方法。持久链接的特色是,只要任意一端没有明确提出断开链接,则保持TCP链接状态。
持久链接的好处在于减小了 TCP 链接的重复创建和断开所形成的额外开销,减轻了服务器端的负载。另外, 减小开销的那部分时间,使 HTTP 请求和响应可以更早地结束,这样 Web 页面的显示速度也就相应提升了。
在 HTTP/1.1 中,全部的链接默认都是持久链接,但在 HTTP/1.0 内并未标准化。虽然有一部分服务器经过非 标准的手段实现了持久链接,但服务器端不必定可以支持持久链接。毫无疑问,除了服务器端,客户端也需 要支持持久链接。
持久链接使得多数请求以管线化(pipelining)方式发送成为可能。从前发送请求后需等待并收到响应,才能 发送下一个请求。管线化技术出现后,不用等待响应亦可直接发送下一个请求。
这样就可以作到同时并行发送多个请求,而不须要一个接一个地等待响应了。通俗地讲,请求打包一次传输过去,响应打包一次传递回来。管线化的前提是在持久链接下。
假如当请求一个包含 10 张图片的 HTML Web 页面,与挨个链接相比,用持久链接可让请求更快结束。 而管线化技术则比持久链接还要快。请求数越多,时间差就越明显。客户端须要请求这十个资源。之前的作法是,在同一个TCP链接里面,先发送A请求,而后等待服务器作出回应,收到后再发出B请求,以此类推,而管道机制则是容许浏览器同时发出这十个请求,可是服务器仍是按照顺序,先回应A请求,完成后再回应B请求。
因而在使用持久链接的状况下,某个链接上消息的传递相似于
请求1->响应1->请求2->响应2->请求3->响应3
管线化方式发送变成了相似这样:
请求1->请求2->请求3->响应1->响应2->响应3
《图解HTTP》[日] 上野宣 著