【HTTP】聊聊 http 的那些事

聊聊【HTTP】的那些事

前言

HTTP,Hypertext Transfer Protocol,翻译过来就叫超文本传输协议。

HTTP在建立之初,是为了将超文本标记语言(html)文档从web服务器传送到客户端浏览器的。

随着互联网的发展,html也变得越来越复杂,不仅仅有文字和图片,同时还有了css,JavaScript等用来来丰富页面的展示。

这使得我们不得不对 HTTP 进行深入理解并不断优化。

下面进入正题,我们来看下HTTP的发展历程,以及它们在各个版本中做的优化。

发展历程

HTTP/0.9

HTTP/0.9是HTTP的第一个版本,这个版本仅适用于文本传输,并且只接受GET这一种请求方式,并且不支持请求头,因此,敏感信息的交换并不安全,对于每个请求都是串行处理。

HTTP/1.0

HTTP/1.0相对于HTTP/0.9,改动还是相当大的:

  • 引入POST请求和HEAD命令,在一定程度上保障了数据的传输安全
  • 使用MIME的消息标题((Header))和消息体(Body)格式来描述访问对象的数据类型和附加在后面的元信息。扩大了处理的数据类型,支持对多媒体流信息的处理
  • 增加了代理支持功能,在HTTP0.9中,规定了Client和Server只能直接交互,而1.0版可以通过代理等中间实体实现间接连接

另外,HTTP/1.0协议使用非持久连接,在非持久连接下,一个TCP连接只能传输一个对象

HTTP/1.1

我们先来看下它相比于HTTP/1.0做了哪些优化:

  • 支持使用持久连接(长连接 Connection: keep-alive),并且是默认使用的。长连接即在一个TCP连接上可以传送多个HTTP请求和响应。这减少了建立和关闭连接的消耗和延迟
  • 新增了几种请求方式:PUT、PATCH、OPTIONS、DELETE
  • 缓存处理,HTTP1.1引入了更多的缓存控制策略例如Entity tag,If-Unmodified-Since, If-Match, If-None-Match等缓存头来控制缓存策略。
  • 支持断点续传,HTTP1.0中,如果客户端只是需要某个对象的一部分,而服务器却会把整个对象送过来了,而HTTP1.1允许只请求资源的某个部分,这样就方便了开发者自由的选择以便于充分利用带宽和连接。

HTTP/1.1使用长连接在一定程度上弥补了HTTP1.0每次请求都要创建连接的缺点,但是Head-of-line blocking(队头阻塞)问题仍没有得到优化。

那么什么是队头阻塞呢?

即在同一个TCP连接里,所有通信按次序进行,服务器只能顺序处理回应,如果前面处理过慢,会有许多请求排队等待,这就是队头阻塞。

HTTP/1.x(SPDY)

HTTP/1.x也叫SPDY,是Google公司开发的一种协议,SPDY并不是一种用于替代HTTP的协议,而是对HTTP协议的增强。可以说,SPDY是HTTP/2.0的前身,相比于HTTP/1.1,优化程度还是挺大的:

它的几个优化包括:

  • 采用多路复用机制降低延迟,同时避免了队头阻塞问题
  • 支持设置请求优先级,比如浏览器的首页这些请求,可以设置有限展示
  • 头部压缩,采用的是DEFLATE
  • 基于HTTPS的加密协议传输,提高了传输数据的可靠性(强制使用HTTPS
  • 支持服务端推送

HTTP/2.0

HTTP/2.0是SPDY的升级版,SPDY包含的优化,在HTTP/2.0中都有。

但相较于HTTP/1.x,还是有一些区别有优化点的,如下:

  • 使用二进制格式,头信息和数据体都是二进制,称为头信息帧和数据帧
  • 头部压缩算法使用HPACK而非DEFLATE
  • 支持明文传输和加密传输,不像SPDY会强制使用HTTPS

好了,HTTP的发展历程以及它们的介绍和优化点就讲到这,下面我们对以上的一些常见且重要的名词进行解释。

HTTPS与HTTP

HTTPS,HyperText Transfer Protocol over Secure Socket Layer,一般可以理解为HTTP+SSL/TLS通过 SSL证书来验证服务器的身份并为浏览器和服务器之间的通信进行加密

那么SSL和TLS又是什么?

SSL,Secure Socket Layer,安全套接字层,SSL协议位于TCP/IP协议与各种应用层协议之间,为数据通讯提供安全支持

TLS,Transport Layer Security,传输层安全,它的前身是 SSL,目前使用最广泛的是TLS 1.1、TLS 1.2。

HTTP和HTTPS的区别是什么呢?

  • HTTPS需要申请证书
  • HTTP是明文传输,HTTPS运行在SSL/TLS之上,SSL/TLS运行在TCP之上,所有传输的内容都经过加密的
  • HTTP和HTTPS使用的是完全不同的连接方式,用的端口也不一样,前者是80,后者是443
  • HTTPS可以有效的防止运营商劫持,解决了防劫持的一个大问题

我们来看下HTTPS协议的通信过程是怎样的:

头部压缩

HTTP/1.x和HTTP/2.0,它们都支持头部压缩,什么是头部压缩呢,为什么需要头部压缩呢?

我们知道,HTTP请求和响应的消息都是报文,而报文的组成有状态行、请求/响应头部、消息主体三部分组成的。

一般而言,消息主体都会经过gzip压缩,或者本身传输的就是压缩过后的二进制文件,例如如图片和音频等,

在HTTP/1.1及以前,状态行和头部多是没有经过任何压缩的,而是直接以纯文本的方式进行传输

随着web功能越来越复杂,请求数量越来越多,随之而来的就是头部的流量越来越多。假定一个页面有100个资源需要加载,而每次请求都有1kb的消息头,则至少需要多消耗100kb来获取这个消息头。

因此,HTTP/2.0提出了对请求和响应的头部进行压缩,即不再只是压缩主体部分,在HTTP/1.x中,头部压缩算法DEFLATE,在HTTP/2.0中,头部压缩算法改用HPACK。通过压缩,头部大小可以减少一半之多,如果后面重复发送请求,那么可能压缩后的头部大小只有原始大小的 1/10。

多路复用

多路复用是HTTP/2.0引入的技术(事实上可以追溯到SPDY协议),多路复用允许单一的HTTP连接同时发起多重HTTP事务,下面看一张比较经典的图,左边是单路(长连接),右边是多路复用。可以看出,

单路长连接的情况下一段时间内只能处理一个HTTP事务,即一次请求和响应。一旦有某请求超时,后续请求只能被阻塞,毫无办法,也就是常说的队头阻塞。

多路复用的情况下一段时间内能处理多个HTTP事务,并且如果某个请求任务耗时严重,不会影响到其它连接的正常执行。另外从图中也可以明显看出,同样多的请求,多路复用耗时更短。

服务器推送

HTTP/1.x和HTTP/2.0,它们都支持服务器推送,那么服务器推送到底是什么呢?
服务端推送能把客户端所需要的资源伴随着index.html一起发送到客户端,省去了客户端重复请求的步骤。正因为没有发起请求,建立连接等操作,所以静态资源通过服务端推送的方式可以极大地提升速度。

我们来看下普通的客户端请求过程:

再来看下服务端推送的过程:

可以看出,服务端推送的过程,如果客户端只请求了index.html,但是如果服务端认为客户端需要这次请求可能需要用到main.js这些资源,那么服务器就会主动将main.js资源发送给客户端,省去了客户端再去主动请求main.js的步骤。

  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

一场雪ycx

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值