0%

TCP连接和HTTP请求的关系

通信过程

  • 客户端发起一个与服务器的TCP连接,建立连接之后,A中的浏览器进程就可以通过Socket访问该TCP连接。
  • 客户端A进程通过该TCP连接向服务端B发送一个HTTP请求报文(ASCII码),报文中包含(百度首页为例)

HTTP/1.0

在 HTTP/1.0 中,规定浏览器与服务器只保持短暂的连接,一个服务器在发送完一个 HTTP 响应后,会断开 TCP 链接服务器不跟踪每个客户也不记录过去的请求。但是这样每次请求都会重新建立和断开 TCP 连接,代价过大。

HTTP/1.1

在HTTP/1.1开始,HTTP开始支持长连接和请求的流水线处理,在一个TCP连接上可以传送多个HTTP请求和响应,减少了建立和关闭连接的消耗和延迟,在HTTP1.1中默认开启Connection: keep-alive,一定程度上弥补了HTTP1.0每次请求都要创建连接的缺点,通俗的说,就是一个TCP连接后可以发送多个HTTP请求。

HTTP/2.0

HTTP2.0开始支持多路复用请求,也就是Multiplexing,意味着可以在一个TCP连接时同时传输多路请求,虽然在HTTP/1.1支持Pipelining技术,但是HTTP/1.1 Pipelining需要按照请求的顺序返回请求,也就是必须响应TCP连接上的每个HTTP请求,然后才能发出下一个请求。

关于页面加载

当我们访问的HTML页面如果包含几十个图片标签,如果图片都是 HTTPS 连接并且在同一个域名下,请求步骤

  • 首先浏览器在 SSL 握手之后会和服务器商量能不能用 HTTP2,如果能的话就使用Multiplexing 功能在这个连接上进行多路传输。不过也未必会所有挂在这个域名的资源都会使用一个 TCP 连接去获取,但是可以确定的是 Multiplexing 很可能会被用到。
  • 如果不能使用HTTP/2.0或者用不了HTTPS(现实中的 HTTP2 都是在HTTPS上实现的,所以也就是只能使用 HTTP/1.1)
    那浏览器就会在一个 HOST 上建立多个 TCP 连接,连接数量的最大限制取决于浏览器设置,这些连接会在空闲的时候被浏览器用来发送新的请求。
  • 如果所有的连接都正在发送请求,那其他的请求就只能等等了。