http小谈

前言

在跟着视屏学习了http的相关知识后,觉得有必要写一篇文章记录一下,加深印象并且方便日后查阅

http起源

说到http的起源不得不说万维网之父Tim Berners-Lee,在1990年10月提出http协议这个概念,并且在1991年Tim发表了一篇文章来描述之前提出的http协议,解释之前提出的实现过程,虽然不是某个机构发布,但是他已经被作为http的最开始版本http0.9版本

http0.9版本

http0.9版本实现的功能非常简单,只支持简单的GET请求,并且只传输纯文本,没有请求头和响应头,因为当时简单的使用场景,这些已经可以满足学术交流

http1.0

然后随着互联网的推动,显然http0.9已经不满足需要,我们需要一个功能更多的http版本来满足日常的使用场景,那么http1.0就呼之欲出了,http1.0新增功能如下

  • 增加了请求头和响应头
  • 支持多种类型的文件传输,不仅仅限制于纯文本
  • 新增POST, HEAD请求方法
  • 增加缓存机制和身份认证
缺点

虽然http1.0比http0.9更加的灵活,但还是有一些缺点如下

  • http1.0是短连接的,也就是说每一次请求的连接都是需要建立三次握手和四次分手,这样就很消耗性能,增加延迟性
  • http1.0没有host属性,如果一台物理机绑定了多台虚拟机之后,无法区分对应的虚拟机从而做出相应的逻辑

http1.1

由于以上的缺点和随着互联网进一步的发展我们需要一个更完善的http版本,此时http1.1就应运而生,http的灵活性如下

  • 增加长连接机制Connect:keep-alive,这样每一次的TCP连接之后,并不会马上断开,可以设置在固定时间或者并发量时候断开,这样的话多个请求就会复用同一个TCP连接,减少RTT数量,减少了延迟,RTT表示客户端发送数据包到接收服务器返回数据的往返时间,也就是说一个TCP的三次连接就是1.5个RTT。
  • 增加了host字段,可以区分不同虚拟机域名,从而实现了不同的逻辑
  • 增加range字段,允许了范围请求
  • 完善了缓存机制,增加了etag, last-modified等字段
缺点

虽然http1.1已经很优秀了,但是还是存在一些问题主要如下

  • 带宽不会被充分利用

带宽指的是网络可以发送或者接受最大字节数

由于http1.1可以开启多个TCP连接,chrome最多是6个,那么每一个TCP都会争取带宽资源,如果带宽资源不足时候,请求或者响应的速度就会变慢,一旦这个请求是重要文本的话比如js,css那么就会导致首页渲染延迟,并且TCP有一个特点就是慢启动,TCP的传输速度不是一下子就稳定,他是一个缓慢的过程,就像车子启动一样速度是慢慢增加的一段时间后速度才会稳定,100M宽带实际的传输速度是12.5M/s,但是最开始的几个请求的速度可能只有2.5M/s,带宽没有被充分利用。

  • 虽然有长连接但是服务端的返回还是有顺序的,这样如果一个请求的响应因为一些原因没有返回就会阻塞后面的响应,造成队头阻塞
  • 请求只能是客户端发起的,服务端不能推送消息
  • 请求头和响应头重复字段较多,浪费流量
  • 请求头和响应头不经过压缩就发送
  • 请求都是明文,不安全

http2.0

上面所说的http1.1虽然很灵活了,但是还是有很多的缺点,为了解决上面的问题,互联网技术的推动者们,又推出了http2.0(http2.0是建立在SPDY协议基础之上的,他是由goole推出解决http1.1缺点的新协议),但是后来放弃了,全身投入了http2.0的建设,下面看看http2.0解决的问题

  • http1.1的一个问题是TCP连接过多,带宽抢占和利用率不充分,所以http2.0采用的是一个域名下面,只建立一个TCP连接,域名下面的所有请求和响应都在这个TCP下面完成,很好的解决了上面的问题
  • http1.1最大的问题是队头阻塞,所以http2.0为了解决这个问题,推出了多路复用,就是一个TCP连接内并行发送请求和并行的接受响应,那么如何保证不乱序是一个关键问题,为了解决这个问题,也是http2.0最核心技术二进制分帧应运而生,二进制分帧率大致的原理如下:
    1:在TCP层确切的说在TSL层上面建立一个二进制分针帧层
    2:并行的请求通过二进制分帧层处理之后,生成一个个很小的数据流,这个数据流已经被二进制处理生成了0,1字节,并且会为每一个数据流生成一个帧ID,发送给服务器
    3:服务器拿到这个数据流根据帧ID组合起来,生成完整的信息,处理之后并行的发送响应数据
    4:响应数据经过二进制分帧层,又会被处理生成对应的帧ID,浏览器拿到这些数据继续根据帧ID组合完整的响应信息
  • http2.0支持头部压缩,减少了流量的浪费
  • http2.0强制开启加密传输,保障了传输的安全性
  • 可以设置优先级,这样在并行发送的时候,可以设置优先返回的数据
缺点

http2.0已经做的很好了,是互联网推动者的智慧的实现,然而还是存在问题,存在什么问题了还是阻塞问题,因为http2.0是建立一个TCP连接的,所以并行的请求数据包都在这一个TCP内,由于TCP的安全可靠机制,一旦一个请求的数据包丢失,响应就会停止,需要浏览器重新传入新的数据包,这样所有的请求都会阻塞,如果数据丢失的比较多的话,经过测试甚至还不如HTTP1.1。因为HTTP1.1的TCP是多个,一个阻塞了不会影响其他的TCP,http2.0的TCP是一个,一旦多个请求的数据包丢失,需要多个请求重新传包,其他请求的响应会被阻塞

http3.0

http3.0是一个还在计划的协议,想要推广还是需要一些时间的,上面我们说了无论http1.1还是http2.0都会有TCP协议的问题,如果去改TCP的话显然不现实,因为改变可能会引起其他的问题,那么http3.0就有了不同的思路,放弃了传统的TCP协议改为UDP的协议,这样就能够避开TCP的缺点,但是仅仅是用UDP还不够,因为UDP是有缺点的,所以我们需要在使用UDP的情况下,还要满足传入数据的可靠性,安全性等问题。下面是一个张http3.0的概念图

image.png

在UDP层上面增加了QUIC层,在这一层里面做了很多逻辑,目的是解决UDP本身自带的缺点,可以说http3.0是一个很完美的协议版本,这里有一篇文章介绍http3.0的文章,大家可以深入学习

参考文章

http 发展史 (http0.9、http1.0、http1.1、http2、http3) 梳理笔记

你可能感兴趣的:(http小谈)