草莓加冰 / 前端学习 / 前端相关问题

分享

   

前端相关问题

2018-12-10  草莓加冰
1、理解下从 域名 -> DNS -> IP -> TCP -> HTTP 的过程

步骤:
1、在浏览器输入URL,URL解析
2、DNS解析这个域名,并返回IP;
3、根据IP建立TCP连接(三次握手);
4、HTTP发起请求;
5、服务器处理请求,浏览器接收HTTP的响应;
6、关闭TCP连接(四次挥手),浏览器解析文档;
7、渲染页面;


详细描述:
1、URL解析
    通过URL解析出主机名

2、域名解析
    1)首先浏览器会先查找本地hosts文件是否有这个网址映射关系,如果有就调用这个IP地址映射,完成域名解析。
    2)如果没有找到则会查找本地的DNS解析器缓存,如果找到则返回。
    3)如果还是没有找到则会查找本地DNS服务器,如果找到则返回。
    4)最后迭代查询,按根域服务器->顶级域名.cn->第二层域名->子域名的顺序找到IP地址。

以chrome为例查看缓存,使用chrome://net-internals/#dns进行查看。

3、TCP的三次握手
    第一次握手:建立连接时,客户端发送syn包(syn=j)到服务器,并进入SYN_SENT状态,等待服务器确认;
    第二层握手:服务器接收到syn包,必须确认客户端的SYN(ack=j+1),同时自己也发送一个SYN包(syn=k),即SYN+ACK包,此时服务器进入SYN_RECV状态;
    第三次握手:客户端收到服务器的SYN_ACK包,向服务器发送确认包ACK(ack=k+1),此包发送完毕,客户端和服务器进入ESTABLISHED(TCP连接成功)状态,完成三次握手。

4、发起http请求
    
        完整的HTTP请求包含请求行,请求头部,请求主体三个部分。

5、服务器响应请求,浏览器接收响应
    服务器在收到浏览器发送的HTTP请求之后,会收到HTTP报文封装成HTTP的Request对象,并通过不同的web服务器进行处理,处理完的结果以HTTP的Response对象返回,主要包括状态码,响应头,响应报文三个部分。
状态码主要包括以下部分:
    1xx:指示信息-表示请求已接收,继续处理
    2xx:成功-表示请求已被成功接收,理解,接收
    3xx:重定向-要完成请求必须进行更进一步的操作
    4xx:客户端错误-请求语法错误或请求无法实现
    5xx:服务器端错误:服务器未能合法实现请求
响应头主要由:cache-control、connection、date、pragma等组成。

6、关闭TCP连接
    
7、渲染页面
  • HTML解析出DOM Tree
  • CSS解析出Style Rules
  • 将二者关联生成Render Tree
  • Layout 根据Render Tree计算每个节点的信息
  • Painting 根据计算好的信息绘制整个页面


以Chrome为例,分析域名是如何解析的(譬如输入www.linux178.com):
1.Chrome浏览器会首先搜索浏览器自身的DNS缓存(缓存时间比较短,大概只有一分钟,且只能容纳1000条缓存),看自身的缓存中有没有www.linux178.com对应的条目,而且有没有过期,如果有且没有过期则解析到此结束。
    注:可以使用chrome://net-internals/#dns 来进行查看
2.如果第一步没成功,那么Chrome会搜索操作系统自身的DNS缓存,如果找到且没有过期则解析到此结束。
    注:以Windows为例查看操作系统自身DNS缓存,在命令行下使用ipconfig /displaydns进行查看。
3.如果第二步没成功,那么尝试读取host文件(位于C:\Windows\System32\drivers\etc),查看有没有该域名对应的额IP地址,如果有则解析成功。
4.如果第三步没成功,浏览器会发起一个DNS的系统调用,就会向本地配置的首选DNS服务器(一般是电信运营商提供,也可以是Google提供的DNS服务器)发起域名解析请求(通过的是UDP协议向DNS的53端口发起请求,这个请求是递归的请求,也就是运营商的DNS服务器必须得提供给我们该域名的IP地址),运营商的DNS服务器首先查找自身的缓存,找到对应的条目,且没有过期,则解析成功。如果没有找到对应的条目,则有运营商的DNS代我们的浏览器发起迭代DNS解析请求,它首先是会找根域的DNS的IP地址(这个DNS服务器都内置13台根域的DNS的IP地址),就会向其发起请求,根域发现这是一个顶级域com域的一个域名,于是就告诉运营商的DNS我不知道这个域名的IP地址,但是我知道com域的IP地址,你去找它去,于是运营商的DNNS又向linux178.com这个域名的DNS地址(这个一般就是由域名注册商提供的,像万网,新网等)发起请求,这个时候linux178.com域的DNS服务器一查,诶,果真在我这里,于是就把找到的结果发送给运营商的DNS服务器,这个时候运营商的DNS服务器就拿到了www.linux178.com这个域名对应的IP地址,并返回给Windows系统内核,内核又把结果返回给浏览器,终于浏览器拿到了www.linux178.com对应的IP地址。
注:一般情况下是不会进行以下步骤的
5.  操作系统就会查找NetBIOS name Cache(NetBIOS名称缓存,就存在客户端电脑中的),那这个缓存有什么东西呢?凡是最近一段时间内和我成功通讯的计算机的计算机名和Ip地址,就都会存在这个缓存里面。什么情况下该步能解析成功呢?就是该名称正好是几分钟前和我成功通信过,那么这一步就可以成功解析。
6.  如果第5步也没有成功,那会查询WINS 服务器(是NETBIOS名称和IP地址对应的服务器)。
7.  如果第6步也没有查询成功,那么客户端就要进行广播查找。
8.  如果第7也没有成功,那么客户端就读取LMHOSTS文件(和HOSTS文件同一个目录下,写法也一样)。



2、  HTTP1.0 HTTP1.1 HTTP2.0的性能区别
    
    HTTP1.0
  • 无状态、有连接

    HTTP1.1
  • 持久连接
        增加connection字段,通过设置Keep-Alive可以保持HTTP连接不断开。

  • 请求管道化
        管道化使得请求能够“并行”传输。
        也就是说,管道化可以把先进先出的队列从客户端(请求队列)迁移到服务端(响应队列)。

  • 增加缓存处理
        强缓存和协商缓存
        
  • 增加Host字段、支持断点传输
        使得服务器能够创建多个Web站点
    
    HTTP2.0
  •  二进制分帧
        在应用层和传输层增加一个二进制分帧层,改进传输性能。

  • 多路复用(连接共享)
        实现真正的并行传输,能够在一个TCP上进行任意数量的HTTP请求。

  • 头部压缩
           使用encoder来减少传输的header大小,搞笑的压缩算法很大的压缩了header。

  • 服务器推送
         服务器除了对最初请求的响应外,服务器还可以额外的向客户端推送资源,而无需客户端明确的请求。


3、 websocket连接的建立过程
    websocket 基于TCP传输协议,并复用HTTP的握手通道。

(1)客户端发送请求报文

    发送请求的要求:

  • 请求的WebSocket URI必须要是定义的有效的URI。
  • 如果客户端已经有一个WebSocket连接到远程服务器端,不论是否是同一个服务器,客户端必须要等待上一个连接关闭后才能发送新的连接请求,也就是同一客户端一次只能存在一个WebSocket连接。如果想同一个服务器有多个连接,客户端必须要串行化进行。如果客户端检测到多个到不同服务器的连接,应该限制一个最大连接数,在web浏览器中应该设定最多可以打开的标签页的数目。这样可以防止到远程服务器的DDOS攻击,但这是对到多个服务器的连接,如果是到同一个服务器连接,并没有数目限制。
  • 如果使用了代理服务器,那么客户端建立连接的时候需要告知代理服务器向目标服务器打开TCP连接。
  • 如果连接没有打开,一定是某一方出现错误,此时客户端必须要关闭再次连接的尝试。
  • 连接建立后,握手必须要是一个有效的HTTP请求
  • 请求的方式必须是GET,HTTP协议的版本至少是1.1
  • Upgrade字段必须包含而且必须是"websocket",Connection字段必须内容必须是“Upgrade”
  • Sec-Websocket-Version必须,而且必须是13

(2)服务器发送响应报文
  • 解析握手请求头:获取握手依据Key并进行处理,检测HTTP的GET请求和版本是否准确,Host字段是否有权限,Upgrade字段中websocket是一个与大小写无关的ASCII字符串,Connection字段是一个大小写无关的"Upgrade"ASCII字符串,Websocket协议版本必须为13,其他的关于Origin、Protocol和Extensions可选。
  • 发送握手响应头:检测是否是wss协议连接,如果是就是用TLS握手连接,否则就是普通连接。服务器可以添加额外的验证信息到客户端进行验证。当进行一系列验证之后,服务器必须返回一个有效的HTTP响应头。响应头中每一行一个字段,结束必须为“\r\n”,使用的ABNF语法。

    本站是提供个人知识管理的网络存储空间,所有内容均由用户发布,不代表本站观点。请注意甄别内容中的联系方式、诱导购买等信息,谨防诈骗。如发现有害或侵权内容,请点击一键举报。

    0条评论

    发表

    请遵守用户 评论公约

    类似文章 更多
    喜欢该文的人也喜欢 更多

    ×
    ×

    ¥.00

    微信或支付宝扫码支付:

    开通即同意《个图VIP服务协议》

    全部>>