三代HTTP协议间的差异与优化

版权声明:本文为博主原创文章,转载请注明原地址,谢谢 https://blog.csdn.net/QuinnNorris/article/details/81905756

目前我们使用的HTTP协议是HTTP1.1,对于现在的网络来说这个版本的协议足够好用和稳定。HTTP2相比较HTTP1.x进行了更多的优化,大幅度的提升了web的性能,让网络足够优秀,进一步减少了网络的延迟。这里我们探讨一下HTTP的1.0、1.1、2.0这三个版本的差异和升级后对前一代的优化情况。

HTTP1.0 与 HTTP1.1 的区别

增加方法

增加了很多请求方法,1.0中只有POST、GET,增加了DELETE、PUT、HEAD等,完善了restful风格的编写问题。其中HEAD可以不获取响应体,比如我们要下载一个资源,我们可以先通过HEAD在响应头查看一下具体下载的内容有多大,做一些空间的分配等操作。

keep-alive

加入了keep-alive的概念,在TCP连接完成后不会立刻释放连接,而是维持一段时间,这段时间中如果出现新的请求则复用之前的通道,节省资源。HTTP 1.0需要使用keep-alive参数来告知服务器端要建立一个长连接,而HTTP1.1默认支持长连接。HTTP是基于TCP/IP协议的,创建一个TCP连接是需要经过三次握手的,有一定的开销,如果每次通讯都要重新建立连接的话,对性能有影响。因此最好能维持一个长连接,可以用个长连接来发多个请求。

请求头增加host站点

由于HTTP 1.0不支持Host请求头字段,WEB浏览器无法使用主机头名来明确表示要访问服务器上的哪个WEB站点,这样就无法使用WEB服务器在同一个IP地址和端口号上配置多个虚拟WEB站点。在HTTP 1.1中增加Host请求头字段后,WEB浏览器可以使用主机头名来明确表示要访问服务器上的哪个WEB站点,这才实现了在一台WEB服务器上可以在同一个IP地址和端口号上使用不同的主机名来创建多个虚拟WEB站点。

HTTP1.1 与 HTTP2.0 的区别

服务器推送

意思是说,当我们对支持HTTP2.0的web server请求数据的时候,服务器会顺便把一些客户端需要的资源一起推送到客户端,免得客户端再次创建连接发送请求到服务器端获取。这种方式非常合适加载静态资源。服务器端推送的这些资源其实存在客户端的某处地方,客户端直接从本地加载这些资源就可以了,不用走网络,速度自然是快很多的。

二进制协议

HTTP1.1不支持header数据的压缩,HTTP2.0使用HPACK算法对header的数据进行压缩,这样数据体积小了,在网络上传输就会更快。HTTP/1.1 版的头信息肯定是文本(ASCII编码),数据体可以是文本,也可以是二进制。HTTP/2 则是一个彻底的二进制协议,头信息和数据体都是二进制,并且统称为”帧”(frame):头信息帧和数据帧。二进制协议的一个好处是,可以定义额外的帧。HTTP/2 定义了近十种帧,为将来的高级应用打好了基础。如果使用文本实现这种功能,解析数据将会变得非常麻烦,二进制解析则方便得多。

多工/多路复用

在HTTP1.1协议中客户端在同一时间,针对同一域名下的请求有一定数量限制。超过限制数目的请求会被阻塞。这也是为何一些站点会有多个静态资源CDN域名的原因之一,目的就是变相的解决浏览器针对同一域名的请求限制阻塞问题。多路复用允许同时通过单一的HTTP2.0连接发起多重的请求-响应消息。

HTTP报文头

  • 请求报文请求行:请求方法、url、版本
  • 应答报文应答行:版本、状态、描述
  • 请求头、应答头:kv的n个参数
  • 请求体、应答体:存放数据
请求报文
----------------------------------------------
请求行:
POST /index.html HTTP/1.1
请求头:
HOST: www.XXX.com
User-Agent: Mozilla/5.0(Windows NT 6.1;rv:15.0) Firefox/15.0
请求体:
Username=admin&password=admin
 
响应报文
----------------------------------------------
应答行:
HTTP/1.1 200 OK
应答头:
Content-Encoding: gzip
Content-Type: text/html;charset=utf-8
应答体:
<!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="UTF-8" />
    <title>Document</title>
</head>
<body>
    <p>this is http response</p>
</body>

响应码

  • 1XX:信息提示。表示请求已被服务器接受,但需要继续处理,范围为100~101。
  • 2XX:请求成功。服务器成功处理了请求。范围为200~206。
  • 3XX:客户端重定向。重定向状态码用于告诉客户端浏览器,它们访问的资源已被移动,并告诉客户端新的资源位置。客户端收到重定向会重新对新资源发起请求。范围为300~305。
  • 4XX:客户端信息错误。客户端可能发送了服务器无法处理的东西,比如请求的格式错误,或者请求了一个不存在的资源。范围为400~415。
  • 5XX:服务器出错。客户端发送了有效的请求,但是服务器自身出现错误,比如Web程序运行出错。范围是500~505。

  • 200:客户端请求成功。

  • 302:重定向。
  • 404:请求资源不存在。
  • 400:请求语法错误,服务器无法理解。
  • 403:服务器收到请求,但拒绝提供服务。
  • 500:服务器内部错误。
  • 503:服务器当前不能处理客户端请求,可能需要一段时间后才能恢复正常。

cookie和session的区别

Cookie是一种存在的数据,session是一种概念。一般我们用cookie实现session。

Cookie技术是客户端认证的解决方案,Cookie就是由服务器发给客户端的特殊信息,而这些信息以文本文件的方式存放在客户端,然后客户端每次向服务器发送请求的时候都会带上这些特殊的信息。除了使用Cookie,Web应用程序中还经常使用Session来记录客户端状态。Session是服务器端使用的一种记录客户端状态的机制,使用上比Cookie简单一些,相应的也增加了服务器的存储压力。

POST和GET的请求差别

从本质上来讲POST和GET都是http请求,底层都是TCP连接。他们的不同是在语义上定义的。POST用来更新信息,是动作操作,GET是获取资源是类似于搜索select的操作。

get:

  • GET 方法请求的数据会直接存放在URL里,会看到的很明显
  • GET 请求可被缓存
  • GET 请求保留在浏览器历史记录中、可被收藏为书签
  • GET 请求有长度限制
  • GET 请求只应当用于取回数据

post:

  • POST 将数据存放在请求体中
  • POST 请求不会被缓存
  • POST 请求不会保留在浏览器历史记录中、不能被收藏为书签
  • POST 请求对数据长度没有要求
  • POST 用来更新资源

head:

  • head和get很类似,但是head没有响应体,所以作用就是从相应的头部获取一些信息
  • 比如下载前先获取一下,预估下载的内容有多大

HTTP和HTTPS的差别

HTTP协议被用于在Web浏览器和网站服务器之间传递信息,HTTP协议以明文方式发送内容,不提供任何方式的数据加密,如果攻击者截取了Web浏览器和网站服务器之间的传输报文,就可以直接读懂其中的信息,因此,HTTP协议不适合传输一些敏感信息,比如:信用卡号、密码等支付信息。为了解决HTTP协议的这一缺陷,需要使用另一种协议:安全套接字层超文本传输协议HTTPS,为了数据传输的安全,HTTPS在HTTP的基础上加入了SSL协议,SSL依靠证书来验证服务器的身份,并为浏览器和服务器之间的通信加密。

猜你喜欢

转载自blog.csdn.net/QuinnNorris/article/details/81905756
今日推荐