一、HTTP概念
1、HTTP是超文本传输协议的缩写,是应用层上的一种客户端/服务端模型的通信协议。
2、HTTP是一个基于TCP/IP通信协议来传递数据(如HTML 文件, 图片文件, 查询结果等)。
二、HTTP的特点
1、简单快速:客户向服务器请求服务时,只需传送请求方法和路径。
2、灵活:HTTP允许传输任意类型的数据对象。
3、无连接:无连接的含义是限制每次连接只处理一个请求。服务器处理完客户的请求,并收到客户的应答后,即断开连接。采用这种方式可以节省传输时间。
4、无状态:HTTP协议是无状态协议。无状态是指协议对于事务处理没有记忆能力,后续处理需要前面的信息,则它必须重传。
二、HTTP1.0和HTTP1.1的区别
长链接
HTTP 1.0需要使用keep-alive参数来告知服务器端要建立一个长连接。
HTTP1.1默认支持长连接,从而减少多次建立TCP链接的花销,提高性能。
节约带宽
HTTP 1.1支持只发送header信息(不带任何body信息),如果服务器认为客户端有权限请求服务器,则返回100,否则返回401。
客户端如果接受到100,才开始把请求body发送到服务器。
当服务器返回401的时候,客户端就可以不用发送请求body了,节约了带宽。
HOST头处理
HTTP1.0没有host域。
HTTP1.1新增Host请求头,主要用来实现虚拟主机技术。
虚拟主机可以利用虚拟技术把一台完整的服务器分成若干个主机,因此可以在单一主机上运行多个网站或服务。比如我们访问 https://www.google.com 时,看到的是 Google 的首页而不是百度或者淘宝的首页?原因就是 Host 请求头决定着访问哪个虚拟主机。
缓存处理
在HTTP1.0中主要使用header里的If-Modified-Since,Expires来做为缓存判断的标准。
HTTP1.1引入了更多的缓存控制策略例如Entity tag,If-Unmodified-Since, If-Match, If-None-Match等更多可供选择的缓存头来控制缓存策略。
三、HTTP1.1和HTTP2.0的区别
二进制格式
HTTP1.x的解析是基于文本。文本的表现形式多样性,解析起来很复杂。
HTTP2.0采用二进制,只认0和1的组合,提升了解析的精度和速率。
多路复用
HTTP2.0使用了多路复用的技术,做到同一个连接并发处理多个请求,而且并发请求的数量比HTTP1.1大了好几个数量级。
HTTP1.1也可以多建立几个TCP连接,来支持处理更多并发的请求,但是创建TCP连接本身也是有开销的。
TCP连接有一个预热和保护的过程,先检查数据是否传送成功,一旦成功过,则慢慢加大传输速度。因此对应瞬时并发的连接,服务器的响应就会变慢。所以最好能使用一个建立好的连接,并且这个连接可以支持瞬时并发的请求。
数据压缩
HTTP1.1不支持header数据的压缩
HTTP2.0使用HPACK算法对header的数据进行压缩,这样数据体积小了,传输速度更快。
服务器推送
当我们对支持HTTP2.0的web server请求数据的时候,服务器会顺便把一些客户端需要的资源一起推送到客户端,免得客户端再次创建连接发送请求到服务器端获取。这种方式非常合适加载静态资源。
四、HTTP请求报文
一个HTTP请求报文由请求行(request line)、请求头部(header)、空行和请求数据4个部分组成,下图给出了请求报文的一般格式。
1、请求行
请求行分为三个部分:请求方法、请求地址和协议版本
- 请求方法
HTTP/1.1 定义的请求方法有8种:GET、POST、PUT、DELETE、PATCH、HEAD、OPTIONS、TRACE。
- 请求地址
URL:统一资源定位符,是一种自愿位置的抽象唯一识别方法。
组成:<协议>://<主机>:<端口>/<路径>
- 协议版本
协议版本的格式为:HTTP/主版本号.次版本号,常用的有HTTP/1.0和HTTP/1.1
2、请求头部
请求头部为请求报文添加了一些附加信息,由“名/值”对组成,每行一对,名和值之间使用冒号分隔。
常见请求头如下:
3、空行
请求头部的最后会有一个空行,表示请求头部结束,接下来为请求数据,这一行非常重要,必不可少。
4、请求数据
可选部分,比如GET请求就没有请求数据,POST方法会有请求数据。
五、HTTP响应报文
HTTP响应报文主要由状态行、响应头部、空行以及响应数据 4个部分组成。
1、状态行
由3部分组成,分别为:协议版本,状态码,状态码描述。
其中协议版本与请求报文一致,状态码描述是对状态码的简单描述。
常见的状态码:
1xx:指示信息–表示请求已接收,继续处理。
2xx:成功–表示请求已被成功接收、理解、接受。
3xx:重定向–要完成请求必须进行更进一步的操作。
4xx:客户端错误–请求有语法错误或请求无法实现。
5xx:服务器端错误–服务器未能实现合法的请求。
2、响应头部
与请求头部类似,为响应报文添加了一些附加信息。
3、响应数据
用于存放需要返回给客户端的数据信息。