http真的是阻塞的吗?

    今天总结我的一个错误,有个面试官问我优化的方法,然后我提到了以前在慕课网上有做的精灵小游戏,里面用到了css sprites。通过把多张小图合并成一张小图,利用position和background-image,就可以减少http的请求,从而减少页面加载时间。然后他问我,为啥可以减少页面加载的时间。我说因为http请求需要花费大量的事件,而且会在请求头里面包含很多不必要的信息,而且http是阻塞的,导致一个请求如果没有应答,就会导致后面的请求阻塞排队。然后这个时候棒棒的面试官又问我,http是阻塞的吗?我当时一直这么认为了好久,然后就肯定的说是的。后来他又问了我,说有没有注意到百度图片的时候是一张一张的加载还是一排一排的加载。我以前看过是一排一排的加载。这个时候面试官又说那为什么会是一排一排的加载的?你不是说是阻塞的吗?然后,,,后来他告诉了我,http是可以开多个线程的,可以并行加载。下面是我找的解释和我的理解。


    http1.0和http1.1的区别

    访问一个包含有许多图像的网页文件的整个过程包含了多次请求和响应,每次请求和响应都需要建立一个单独的连接,每次连接只是传输一个文档和图像,上一次和下一次请求完全分离。即使图像文件都很小,但是客户端和服务器端每次建立和关闭连接却是一个相对比较费时的过程,并且会严重影响客户机和服务器的性 能。

    比如一个网页它有10个资源,比如js文件,css文件,图片文件,在http1.0中这个是首先建立一次tcp链接,然后请求一个http,然后下载第二个文件又建立一次tcp链接,再请求一个http,这样下去,一直到第10个文件。这样tcp在每次连接和断开的时候都要进行三次握手和四次挥手。这当然是费时费性能。

    http1.0

    为了克服HTTP 1.0的这个缺陷,HTTP 1.1支持持久连接,在一个TCP连接上可以传送多个HTTP请求和响应,减少了建立和关闭连接的消耗和延迟。一个包含有许多图像的网页文件的多个请求和应答可以在一个连接中传输,但每个单独的网页文件的请求和应答仍然需要使用各自的连接。HTTP 1.1还允许客户端不用等待上一次请求结果返回就可以发出下一次请求,但服务器端必须按照接收到客户端请求的先后顺序依次回送响应结果,以保证客户端能够区分出每次请求的响应内容,这样也显著地减少了整个下载过程所需要的时间。

    http1.1

    上面提到的不用等待上次的请求结果,就可以发出下一次请求也就是http1.1的不阻塞现象了。
    总结上面两个特点一个是支持了持久长连接,还有一个是http可以并行请求不阻塞。

    另外:HTTP/1.1流水线只能部分地解决了并发的请求,并从线头的阻塞受到影响。 因此,需要进行多次请求客户端通常使用多个连接到服务器,以减少等待时间。

    还有,HTTP/1.1的报头字段经常重复和冗长,其中,除了产生更多或更大的网络数据包,可能会导致小的初始TCP拥塞窗口来快速填充。 这可能会导致过度的延迟,当多个请求在一个新的TCP连接进行。


    涨知识

    HTTP2.0的服务器推送

    HTTP 2.0 新增的一个强大的新功能,就是服务器可以对一个客户端请求发送多个响应。换句话说,除了对最初请求的响应外,服务器还可以额外向客户端推送资源,而无需客户端明确地请求。

    当浏览器请求一个html,服务器其实大概知道你是接下来要请求资源了,而不需要等待浏览器得到html后解析页面再发送资源请求

    所有的HTTP2.0的请求都在一个TCP链接上

    HTTP2.0所有通信都是在一个TCP连接上完成。HTTP 2.0 把 HTTP 协议通信的基本单位缩小为一个一个的帧,这些帧对应 着逻辑流中的消息。并行地在同一个 TCP 连接上双向交换消息。就好比,我请求一个页面http://www.qq.com。页面上所有的资源请求都是客户端与服务器上的一条TCP上请求和响应的!
    HTTP性能的关键在于低延迟而不是高带宽!大多数HTTP 连接的时间都很短,而且是突发性的,但TCP 只在长时间连接传输大块数据时效率才最高。HTTP 2.0 通过让所有数据流共用同一个连接,可以更有效地使用TCP 连接,让高带宽也能真正的服务于HTTP的性能提升。

    HTTP/2提供更多的加密支持
    现在,大多数普通用户的设备和网络服务器之间的网络通道并没有被加密,除非站点选择使用HTTP的升级版——HTTPS,后者包括一个名为“传输层安全”的加密步骤。银行、电子商务站点、谷歌等一般会使用这一协议(如果一个站点以“https://”开头,表示它已使用这一协议)。

    增加头压缩
    它增加了头压缩(header compression),因此即使非常小的请求,其请求和响应的header都只会占用很小比例的带宽。


    关于ICMP

    ICMP是(Internet Control Message Protocol)Internet控制报文协议。它是TCP/IP协议族的一个子协议,用于在IP主机、路由器之间传递控制消息。控制消息是指网络通不通、主机是否可达、路由是否可用等网络本身的消息。这些控制消息虽然并不传输用户数据,但是对于用户数据的传递起着重要的作用。

    ICMP是Internet 控制信息协议(ICMP)是 IP 组的一个整合部分。通过 IP 包传送的 ICMP 信息主要用于涉及网络操作或错误操作的不可达信息。 ICMP 包发送是不可靠的,所以主机不能依靠接收 ICMP 包解决任何网络问题。ICMP不象TCP或UDP有端口,但它确实含有两个域:类型(type)和代码(code)。而且这些域的作用和端口也完全不同。
    Ping用到的是ICMP协议。不是端口。