面试知识准备-HTTP
浏览器输入域名后发生了什么?
域名解析,通过DNS查询域名对应的ip地址
- 当DNS服务器返回的ip地址与网站不对应时,发生DNS劫持
<meta http-equiv="x-dns-prefetch-control" content="on">
DNS预获取
发送http请求
- http数据包含header和body,发送时每通过一层增加一层首部,接收时每通过一层减少一层首部
- 经过传输层时会先建立tcp3次握手(http1.0通过keep-alive开启长连接,http1.1默认支持长连接,允许一个tcp发送多个http请求。同时1.1规范还包含http并行发起,但是默认不启用)
- Syn泛洪攻击(ddos分布式拒绝服务攻击的一种)
- tcp慢启动算法: tcp不知道当前环境的网络状况如何,内部维护了一个“拥塞窗口”表示传输数据的大小。一开始是传输较少的数据量,当这个请求完成时没有发送拥塞现象,那么拥塞窗口的值增加(指数级增长);当发生拥塞时在减小
服务器接受请求
- 服务器(apache, iis, nginx) 监听请求,开启子进程处理请求
- 服务器将http请求数据封装成request提供给内部程序处理,处理完后返回一个response
浏览器接收响应
- 浏览器根据状态码进行不同行为的处理,比如301会进行重定向
- 根据MIME(eg:text/html,image/jpeg)类型解析资源,如果请求的是网页html文本,那么会触发浏览器的绘制工作,如果是ajax请求,那么会把相应的js回调函数放入事件队列等待被执行
浏览器的渲染
- 解析html
- 根据解析内容,加载css,js文件,同时构建dom树
- 解析css,渲染dom树并行执行
<script>
标签回阻塞dom解析,会等到script加载执行后再继续
- javascript编译执行
- c8编译器进行语法分析,词法分析,生成AST(抽象语法树),转化为机器指令
http
- http/1.0
- HTTP最初的目的是为了提供一种发布和接收HTML页面的方法
- HTTP/1.0最被诟病的2个点:不支持长连接(tcp无法复用); 头部阻塞
- http/1.1
- HTTP 1.1支持持久连接,浏览器默认支持,可以通过header的connection:close/keep-alive指定
- 增加更多的请求头和响应头对http做了扩展:身份认证、状态管理和Cache缓存等机制相关的请求头和响应头
- 新增host头,用于处理在一台物理服务器上可以存在多个虚拟主机
- 支持断点续传
- 执行pipelineing,允许同时发起多个http请求,但是头部阻塞仍然存在
- http/2
- 多路复用
- http/1.1中 一个tcp通道上可以承载多个http连接,但是必须是顺序执行,一个请求完成后,下一个请求才能开始。http/2中通过二进制分帧将请求的数据切割并且打上顺序标签后,直接复用tcp的通道传输数据,到了服务器在按照顺序进行合并,这样,一个tcp通道里实际上包含了多个请求的数据(帧),这样就避免了头部阻塞
- 服务器推送
- 当客户端请求index.html时,服务器可以主动将index.css/index.js推送给客户端
- 头部压缩
- header的可选内容非常多,压缩之后可以显著
- header的压缩是基于动态字典和静态字典的,静态字典:header都有相同的key值,比如method; host,这些可以使用某个不重复的字符指代。动态字典