文章目录
网络面试题
输入url到页面加载发生了什么
- 输入地址浏览器
- 查找域名的 IP 地址 这一步包括 DNS 具体的查找过程,包括:浏览器缓存->系统缓存->路由器缓存…
- 浏览器向 web 服务器发送一个 HTTP 请求
- 服务器的永久重定向响应(从 http://example.com 到 http://www.example.com)
- 浏览器跟踪重定向地址
- 服务器处理请求服务器返回一个 HTTP 响应
- 浏览器显示 HTML
- 浏览器发送请求获取嵌入在 HTML 中的资源(如图片、音频、视频、CSS、JS等等)
- 浏览器发送异步请求
浏览器与服务器建立tcp连接后是否会在完成http请求后断开?什么情况情况下断开
在http/1.0协议中,服务器在发送完一个http响应后,会断开tcp连接,频繁的重新建立和断开连接,开销过大,某些服务器对Connection: keep-alive 的 Header 进行了支持。
在http/1.1协议中,默认开启持久连接,除非请求头中声明了Connection:close。那么浏览器与服务器之间是会维持一段事件的tcp连接的。
默认情况下建立tcp连接后不会断开,只有在请求头中声明Connection:close才会在请求完成后关闭连接
一个tcp连接可以对应几个http请求
多个
一个tcp连接中多个http请求可以一起发送吗
http/1.1协议中,单个tcp连接在同一时刻只能处理一个请求。规定了Pipelining 来试图解决这个问题,但是这个功能在浏览器中默认是关闭的。
Pipelining:一个支持持久连接的客户端可以在一个连接中发送多个请求(不需要等待任意请求的响应)。收到请求的服务器必须按照请求收到的顺序发送响应。
返回的内容并不能区分对应于哪个发送的请求,所以顺序必须保持一致。默认是不开启的,在实际开发过程中也会出现许多问题:
- 代理服务器不一定能正确处理Pipelining
- 实现方式是很复杂的
- 前面的请求阻塞了,会影响后面的请求响应
HTTP2 提供了 Multiplexing 多路传输特性,可以在一个 TCP 连接中同时完成多个 HTTP 请求。
总结: 在 HTTP/1.1 存在 Pipelining 技术可以完成这个多个请求同时发送,但是由于浏览器默认关闭,所以可以认为这是不可行的。在 HTTP2 中由于 Multiplexing 特点的存在,多个 HTTP 请求可以在同一个 TCP 连接中并行进行。
浏览器对同一host建立tcp连接的数量有没有限制
HTTP/1.1 时代,那个时候没有多路传输,Chrome 最多允许对同一个 Host 建立六个 TCP 连接。不同的浏览器有一些区别。
如果图片都是 HTTPS 连接并且在同一个域名下,那么浏览器在 SSL 握手之后会和服务器商量能不能用 HTTP2,如果能的话就使用 Multiplexing 功能在这个连接上进行多路传输。不过也未必会所有挂在这个域名的资源都会使用一个 TCP 连接去获取,但是可以确定的是 Multiplexing 很可能会被用到。如果发现用不了 HTTP2 呢?或者用不了 HTTPS(现实中的 HTTP2 都是在 HTTPS 上实现的,所以也就是只能使用 HTTP/1.1)。那浏览器就会在一个 HOST 上建立多个 TCP 连接,连接数量的最大限制取决于浏览器设置,这些连接会在空闲的时候被浏览器用来发送新的请求,如果所有的连接都正在发送请求呢?那其他的请求就只能等等了。