web开发,对http有所了解是很重要的。

这里是我对几个概念的讲解。

http

http是一种数据传输的协议,它工作在应用层,基于网络层的tcp协议,中文全称叫“超文本传输协议”,最开始的用途就是为了传输超文本(html)。

http协议是无状态的,也就是前后两次请求,没有必然联系,不会保存上一次请求的相关信息和状态,每一次请求都是独立的,服务器和浏览器都只知道这次请求的信息。也正是因为“无状态”,浏览器和服务器需要通过cookie和session来保存一些状态和标识,比如是否已登录。

http是以一个请求对应一个响应的形式设计的,也就是说,基于http的话,服务器只有接收到请求后才能响应。

http和tcp

http之所以采用tcp(传输控制协议)在网络层上传输数据,主要因为它可能传输很多数据,而tcp支持按顺序组织数据并保证数据完整性。

也正因为http采用了tcp作为网络层的支持,其本身也就具备了tcp必然的特性,比如握手机制、新建tcp连接的慢启动问题等。

慢启动:当tcp连接被建立时,它会先进行一次握手,以确保数据能够到达另一方,然后再开始传输数据,刚开始传输数据的时候,不会以最大速率进行传输,而是慢慢加大传输速率,慢启动主要是为了保证数据完整性和tcp所追求的稳定性。

http1.0

最先广泛使用的版本。

主要采用短连接的设计,一次请求,就建立一个tcp连接,响应结束,就立刻关闭。

这导致一个网页的资源一旦很复杂,比如需要请求很多数据,就会开启大量的tcp连接,而因此,tcp慢启动的特性严重影响了http的效率,同样因为多个tcp开启需要经历多个三次握手,也是浪费。

http1.1

目前最流行的版本。

  • 效率优化(tcp长连接)

    它改进了1.0的效率问题,将之前采用tcp短连接的形式优化到了tcp长连接,也就是一个tcp连接,可以处理多次http传输(请求)。我们可以在请求头或者响应头中看到一个connection参数,它等于close的时候,可以使http请求使用tcp短连接,默认情况下它是keep-alive(长连接)。

  • 并发请求

    因为改成了长连接,http1.1支持针对统一域名同时发起多个http请求(并发处理),但针对同一域名的并发处理有数量限制,超过数量后会被阻塞,具体的限定数量,由浏览器决定,现代浏览器一般是6个。
    在http1.1这个机制下,如果想要并发处理超过限制数量的请求,则可以通过使用不同域名的方式来绕过去,因为http1.1的并发请求限制是针对域名的。

  • 其他
    另外,http1.1还增加了一些请求头,比如host,用于让服务器确定是哪个虚拟空间(网站)。这让一台服务器能够支持运行多个网站。
    http1.1还增加了身份认证、状态管理、cache相关的请求响应头、断点续传等。

http2.0

已经有一定普及率的版本

这个版本主要增加了多路复用、二进制分帧、首部压缩、服务器推送等。

  • 多路复用
    多路复用对性能提升最为显著, 1.1的时候,多个http请求是通过开启多个tcp连接来实现并发的,但在2.0中,多个http请求的并发,是在一个tcp连接中实现。
    多路指的是多条通路,复用指重复使用tcp连接,说白了就是一个tcp可以处理多个并发http请求

  • 二进制分帧

    1.1时,数据直接以文本传输,是没有顺序的,服务器和浏览器双方都是按接收顺序来组装数据的,这导致一个tcp必须传输一份数据,如果多份数据传输,双方接收的数据就混乱了。
    2.0因为将数据拆分成了更小的帧和流,也就是二进制分帧,在应用层和网络层中间又加了二进制分帧层,帧是有顺序的,这样传输数据的双方就可以根据流来分类、再按帧的顺序来组装数据

https

https实际上不适合放在http1.0、1.1、2.0中间来讨论,因为完全是两回事。

但在这里,还是总结一下。

https实际上就是http协议和tls(ssl)协议的组合。
http负责传输,tls负责加解密(现在一般都用tls,ssl已经很老了)
http传输的时候,数据是没有经过加密的,这不安全,所以引入了tls协议来对数据加解密,先处理成密文,再放到下层去工作,http拿到要传输的数据时,这个数据已经经过tls协议的加密,所以http本身也不知道这个数据原本是什么样子。而http从下层拿到数据时,也不知道这个数据是什么内容,需要传给上面的tls层来解密,才能显示出来。
这就是https大致的意思。
从速度上,https因为多了加解密的步骤,且比http多几次握手(用于双方确定加密方式和证书),所以会慢一些。
另外,https采用非对称加密技术。