网络
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慢启动**
初始化的窗口数目一般为10个(运营商经验之谈),10个TCP包的大小,单个RTT内传输数据上限是14KB,所以说,如果第一次创造连接的时候如果资源大小小于14KB,那么就只需要单个RTT时间 就可以得到数据
慢启动会有阀值
**链路复用!!**
但是会给Server端带来影响,因为要有一个等待时间,会导致负载的上升,因为不能及时的释放socket,所以考虑扩容
- HTTP Request
- HTTP Response
HTML5的网络测速方法
-
navigation Timeing
获得主页相关的性能数据
-
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
加密,中间人攻击概率下降,而且与HTTP2有关系
-
HTTP2
HTTP2的设计都是基于HTTPS之上
HTTP2在客户端和服务端之间使用"手部表"来跟踪和存储之前发送的键值对,对于相同的数据,不再通过每次请求和响应发送
首部表在HTTP2的连接存续期内始终存在,由客户端和服务器共同渐进地更新
-
二进制分帧层
HTTP 1.x以换行符作为纯文本的分隔符,而HTTP2将所有传输的信息分割成更小的消息和帧,并对他们采用二进制格式的编码
因为使用二进制,解析速度会加快,首部压缩更加高效
-
多路复用
可以并行交错地发送请求/响应,请求/响应之间互不影响
-
服务端推送
针对页面已知的逻辑,优先推送首屏渲染资源
-
优化建议
- 每个来源是用一个连接
- 去掉不必要的文件合并和图片拼接
- 利用服务端推送
-