1.dns解析
为什么需要dns解析?
TCP/IP协议只认识ip地址,不认识域名,域名的设计为了方便记忆,让你记住一个baidu.com远比记录一个180.101.49.12靠谱.
具体什么是dns解析?
d=domain n=name s=system
域名系统解析,就是把名字转换成ip
怎么做dns解析(dns解析的过程)
如果你输入的是一个ip,那么显而易见,你不需要dns解析。
- 把输入的url中的域名(主机名)抽离出来
- 判断host文件是否有这个主机名
- 去查本地dns解析缓存
- 问老大的老大根服务器(TLD顶级域名服务器)是否能查出来
- 返回一个小老大的ip,你去问这个人试试
- 这个人不知道,但是他知道A知道,返回A的地址
- … 最后返回了一个ip给你
如果是转发模式,会一级一级往上查找
什么是dns负载均衡
在地理位置不同的地方访问同样的baidu.com,ip地址不一样。会返回一个你所在的位置适合的ip给你
dns优化策略
使用meta告诉浏览器dns预取
<meta http-equiv="x-dns-prefetch-control" content="on" />
可以让域名不需要点击就在后台解析
因为静态资源一般都是使用其他域名来存放(为了解决一个域名只能同时创建6个左右的tcp连接),所以需要dns预解析来性能优化
浏览器缓存、系统缓存、路由器缓存、…进行dns优化
dns一般用tcp还是udp,哪个端口
udp传输效率高,传输字节数小于512字节的报文
因为一次dns解析可能需要查询多次,一次两次tcp连接与udp还差距不大,但是多次就差距很大。
tcp传输大于512字节的报文
tcp可以传输证书,签名,比较可靠
53端口
2.tcp协议
简单介绍一下osi七层协议
应用层、表示层、会话层、传输层、网络层、数据链路层、物理层
tcp、udp在传输层 ip协议在网络层 http在应用层 arp在数据链路层
三次握手与四次挥手
SYN(建立连接) ACK(确认) seq(序列号) FIN(结束)
三次握手:
-
第一次客户端发送 SYN=1 seq=x
-
服务器收到,返回 SYN=1 SEQ=y ACK=1 ACKnumber=x+1
-
客户端收到,返回ACK=1 ACKnumber=y+1
-
在每个阶段丢包:在第三次丢包,服务器会超时重传第二个包,直到收到相应或者超时
四次挥手:
- FIN=1 SEQ=x 自己处于可以接受数据状态
- ACK=1,ACKnumber=x+1 收到了,但是我没准备好
- 还是服务端 FIN=1,seq=y
- 客户端ACK=1 ACKnumber=y+1 进入TIME_WAIT状态
- 这个状态是主动关闭的一方保持的
- 为了解决最后一个包丢包重传
- 为了之前发的包不影响下一次连接
3.https
通俗易懂:https=http+ssl/tls(鉴权/认证)
为了解决http窃听
、篡改
、冒充
基本流程:公钥(非对称)加密算法:加密和解密的key不一致
客户端要一个公钥,加密完成发给你。你收到了,拿自己的私钥解密
- 怎么保证公钥是你发的公钥
- 使用证书
- 公钥加密整个信息太耗时。
- 使用对话密钥(对称加密)加密信息,公钥加密对话秘钥本身
-
客户端向服务器要公钥并验证
-
双方生成对话密钥
-
通信
-
ClientHello 我支持A、B、C、D·····加密方法,支持协议版本是1.0,再带一个随机数给你
-
那我们用C方法吧,带一个随机数,我的证书包裹着我的公钥给你。
-
收到证书,看一下是不是你,是的话拿出公钥,再公钥把一个随机数加密传给服务器,并且告诉对方我们要加密说话了
- 证书是B带着公钥去机构C申请,然后发给A。A确认是不是B,是B则用这个公钥
- 为什么要再生成一个随机数。因为前两次的随机数是公开的,这一次的随机数是加密的,不容易被猜出
- 收到,组成一个对话密钥,然后告诉对方接下来要开始加密说话了。
4.浏览器解析和渲染
浏览器通过前面铺垫这么多次终于拿到了html
浏览器开始解析html,并将元素转换成一个个dom,构建成dom树和css树
- 构建dom树
- 构建cssom树
- 加载js(遇到script标签,阻塞dom树的创建)等js运行完成,才会继续创建dom树
- 主要是因为js有可能会对dom操作,浏览器无法知道dom节点最后的内容,为了不造成无意义的操作,阻塞dom树
- 构建渲染树
- 由dom和cssom树合并,(三者一边加载一边解析一边渲染),根据选人数计算可见元素布局,绘制到屏幕上
- 重排和重绘
- 重绘就是重新绘制,比如把颜色改了一下
- 重排就是重新排列,树节点改变,需要重新布局,生成渲染树