面试知识准备-HTTP

浏览器输入域名后发生了什么?

  1. 域名解析,通过DNS查询域名对应的ip地址

    1. 当DNS服务器返回的ip地址与网站不对应时,发生DNS劫持
    2. <meta http-equiv="x-dns-prefetch-control" content="on"> DNS预获取
  2. 发送http请求

    1. http数据包含header和body,发送时每通过一层增加一层首部,接收时每通过一层减少一层首部
    2. 经过传输层时会先建立tcp3次握手(http1.0通过keep-alive开启长连接,http1.1默认支持长连接,允许一个tcp发送多个http请求。同时1.1规范还包含http并行发起,但是默认不启用)
      • Syn泛洪攻击(ddos分布式拒绝服务攻击的一种)
      • tcp慢启动算法: tcp不知道当前环境的网络状况如何,内部维护了一个“拥塞窗口”表示传输数据的大小。一开始是传输较少的数据量,当这个请求完成时没有发送拥塞现象,那么拥塞窗口的值增加(指数级增长);当发生拥塞时在减小
  3. 服务器接受请求

    1. 服务器(apache, iis, nginx) 监听请求,开启子进程处理请求
    2. 服务器将http请求数据封装成request提供给内部程序处理,处理完后返回一个response
  4. 浏览器接收响应

    1. 浏览器根据状态码进行不同行为的处理,比如301会进行重定向
    2. 根据MIME(eg:text/html,image/jpeg)类型解析资源,如果请求的是网页html文本,那么会触发浏览器的绘制工作,如果是ajax请求,那么会把相应的js回调函数放入事件队列等待被执行
  5. 浏览器的渲染

    1. 解析html
    2. 根据解析内容,加载css,js文件,同时构建dom树
    3. 解析css,渲染dom树并行执行
    4. <script>标签回阻塞dom解析,会等到script加载执行后再继续
  6. javascript编译执行
    1. c8编译器进行语法分析,词法分析,生成AST(抽象语法树),转化为机器指令

http

  • http/1.0
    1. HTTP最初的目的是为了提供一种发布和接收HTML页面的方法
    2. HTTP/1.0最被诟病的2个点:不支持长连接(tcp无法复用); 头部阻塞
  • http/1.1
    1. HTTP 1.1支持持久连接,浏览器默认支持,可以通过header的connection:close/keep-alive指定
    2. 增加更多的请求头和响应头对http做了扩展:身份认证、状态管理和Cache缓存等机制相关的请求头和响应头
    3. 新增host头,用于处理在一台物理服务器上可以存在多个虚拟主机
    4. 支持断点续传
    5. 执行pipelineing,允许同时发起多个http请求,但是头部阻塞仍然存在
  • http/2
    1. 多路复用
      • http/1.1中 一个tcp通道上可以承载多个http连接,但是必须是顺序执行,一个请求完成后,下一个请求才能开始。http/2中通过二进制分帧将请求的数据切割并且打上顺序标签后,直接复用tcp的通道传输数据,到了服务器在按照顺序进行合并,这样,一个tcp通道里实际上包含了多个请求的数据(帧),这样就避免了头部阻塞
    2. 服务器推送
      • 当客户端请求index.html时,服务器可以主动将index.css/index.js推送给客户端
    3. 头部压缩
      • header的可选内容非常多,压缩之后可以显著
      • header的压缩是基于动态字典和静态字典的,静态字典:header都有相同的key值,比如method; host,这些可以使用某个不重复的字符指代。动态字典
面试知识准备
JSRUN前端笔记, 是针对前端工程师开放的一个笔记分享平台,是前端工程师记录重点、分享经验的一个笔记本。JSRUN前端采用的 MarkDown 语法 (极客专用语法), 这里属于IT工程师。