桑海

  博客园  :: 首页  :: 新随笔  :: 联系 :: 订阅 订阅  :: 管理

https://segmentfault.com/q/1010000005167289

这里面的http/2连接是指tcp/ip层的连接还是http应用层(也就是我们平常在chrome F12 network面板看到的那些请求)的?

如果是前者,那么这个跟以前keep-alive 有什么区别吗?

上面这张图中,右边的情况是说到,客户端同时发起css和js的请求,然后服务端同时响应,这种方式难道在http1.x中没有吗?比如我同时放两个script标签在html中,并且加上async标识,chrome是会一并发起http请求的。

上面的图的情景跟和我说的情景有什么区别吗?

1个回答

4

已采纳

图上的连接就指的是TCP连接,HTTP连接本质也是TCP连接。keep-alive是指服务器和客户端的多个请求响应共用一个TCP连接,而不是每次请求响应都新建一个连接完了后关闭。

不知道题主有没有做过TCP相关的开发,认为同时发生两个请求响应好像很简单的样子。的确,同时发送两个请求响应是很简单,开两个线程开两个TCP连接就行了,但是,如果想在同一个TCP连接里面同时发生两个请求响应就不是那么简单了,注意是在同一个TCP连接里。

首先你要知道,TCP连接相当于两根管道(一个用于服务器到客户端,一个用于客户端到服务器),管道里面数据传输是通过字节码传输,传输是有序的,每个字节都是一个一个来传输。

例如客户端要向服务器发送Hello、World两个单词,只能是先发送Hello再发送World,没办法同时发送这两个单词。不然服务器收到的可能就是HWeolrllod(注意是穿插着发过去了,但是顺序还是不会乱)。这样服务器就懵b了,“发的这是啥玩意我不认识”。

所以在很长一段时间即HTTP/1.1,请求响应只能依次发送,而不能同时。

接上面的问题,能否同时发送Hello和World两个单词能,当然也是可以的,可以将数据拆成包,给每个包打上标签。发的时候是这样的①H ②W ①e ②o ①l ②r ①l ②l ①o ②d。这样到了服务器,服务器根据标签把两个单词区分开来。这样就强行将一个独木桥转换成多个队列,实际上还是独木桥,但是独木桥上的每个人举了个牌子,上面写着①②...。这就是HTTP/2.

逻辑上是这样的:

但实际上是这样的:

图来源于:http://www.blogjava.net/yongboy/archive/2015/03/19/423611.html

 

posted on 2018-01-12 17:38  桑海  阅读(971)  评论(0编辑  收藏  举报