wangning0/Autumn_Ning_Blog

网络

Opened this issue · 0 comments

网络

网络访问过程

  • DNS解析

    在用户在浏览器中输入了url(www.qq.com)之后,dns的解析步骤:

    • 首先会查看本地的host文件,有没有url和ip地址的对应关系,如果有,则直接用该映射关系

    • 如果没有映射关系,那么会去查找本地DNS解析器的缓存,如果有,则走缓存

    • 如果DNS解析器没有缓存,则会根据TCP/IP参数中设置的DNS首选服务器去请求,称之为本地DNS服务器,如果本地DNS服务器中有的话,则会返回ip地址

    • 如果本地DNS服务器中没有缓存

      • 如果不是转发模式,则会由本地的DNS服务器向根DNS服务器发送请求,根DNS服务器将会判断是由哪一台来管理,并会返回本地DNS服务器负责顶级DNS服务器的地址(qq.com),然后本地DNS服务器在会发送请求刀顶级DNS服务器,如果没有,则会返回一个下一级DNS服务器,直至找到url主机
      • 如果是转发模式,此DNS服务器就会把请求转发至上一级DNS服务器,由上一级服务器进行解析,上一级服务器如果不能解析,或找根DNS或把转请求转至上上级,以此循环
  • TCP连接

tcp

**TCP慢启动**

初始化的窗口数目一般为10个(运营商经验之谈),10个TCP包的大小,单个RTT内传输数据上限是14KB,所以说,如果第一次创造连接的时候如果资源大小小于14KB,那么就只需要单个RTT时间 就可以得到数据

tcp_1

慢启动会有阀值

tcp_2

**链路复用!!**

tcp_3

但是会给Server端带来影响,因为要有一个等待时间,会导致负载的上升,因为不能及时的释放socket,所以考虑扩容
  • HTTP Request
  • HTTP Response

HTML5的网络测速方法

  • navigation Timeing

    获得主页相关的性能数据

tcp_4

  • Resource Timing

    获得主页相关资源的性能数据(stylesheet image script audio video)

优化方向

  • 减少网络时间

    • DNS预解析

      <meta content="on" http-equiv="x-dns-prefetch-control" />
      <link rel="dns-prefetch" href="xxxx">
      
    • 资源内联

      如果html和css的资源都会比较小的话,是可以利用资源内联的方法,可以利用构建工具进行内联,大小最好小于14KB(gulp-embed)

    • 资源加载优化

      • 可以利用按需加载
      • 服务端渲染 Node直出
      • 图片懒加载
    • 缓存

      • 网络缓存

        • HTML 304 Cache

          一般就是协商缓存,通过服务器响应头和请求头去比较是否可以使用缓存,可以的话 则直接从浏览器本地缓存去使用

        • 静态资源Long Cache (max-age)

          非常高效,但是服务器进了更新了,那么客户端怎么更新呢?

          利用md5的hash值

        • 文件MD5命名

        • 背后的考虑: RTT影响和CDN刷新问题

    • 疑难杂症

      • DNS劫持

        • PC端可以通过ping
        • 移动端可以通过比对dns服务器的路径,然后比对返回的ip是不是我们真实的ip地址
      • HTTPS 加载HTTP资源会出现问题

    • 一些相关的首部

      • Access-Control-Allow-Origin

        主要解决跨域问题

      • Timing-allow-origin

        resoure timing

      • vary

        作用是解决域名切换的问题

      • Cookie

        Cookie过多会导致头部的信息会过多,所以有一些不需要cookie的资源加载 那么就不需要携带Cookie

  • TLS握手

    在TCP三次握手之外,还多2个RTT

    HTTPS的原理和介绍

    加密,中间人攻击概率下降,而且与HTTP2有关系

  • HTTP2

    HTTP2的设计都是基于HTTPS之上

    HTTP2在客户端和服务端之间使用"手部表"来跟踪和存储之前发送的键值对,对于相同的数据,不再通过每次请求和响应发送

    首部表在HTTP2的连接存续期内始终存在,由客户端和服务器共同渐进地更新

    • 二进制分帧层

      HTTP 1.x以换行符作为纯文本的分隔符,而HTTP2将所有传输的信息分割成更小的消息和帧,并对他们采用二进制格式的编码

      因为使用二进制,解析速度会加快,首部压缩更加高效

    • 多路复用

      可以并行交错地发送请求/响应,请求/响应之间互不影响

    • 服务端推送

      针对页面已知的逻辑,优先推送首屏渲染资源

    • 优化建议

      • 每个来源是用一个连接
      • 去掉不必要的文件合并和图片拼接
      • 利用服务端推送