从url输入到页面渲染发生了哪些事
2024-01-19 00:52:31   0  举报             
     
         
 AI智能生成
  从输入URL到页面渲染,这个过程包含了以下几个核心步骤:首先,浏览器会解析URL,获取必要的信息,如协议、主机名、端口号和路径等。然后,浏览器会通过DNS解析服务获取对应主机的IP地址。接着,浏览器会建立一个TCP连接,向服务器发送HTTP请求。服务器接收到请求后,会根据请求信息处理相应的数据,并返回HTTP响应。浏览器接收到响应后,会根据响应内容进行解析,包括HTML、CSS和JavaScript等文件。最后,浏览器会根据解析的结果进行渲染,将页面呈现给用户。此外,这个过程还包括一些额外的步骤,如浏览器的缓存机制、安全检查等。
    作者其他创作
 大纲/内容
  DNS解析    
     首先url(uniform resource locator)统一资源定位符,俗称网址。    
     包括以下部分    
     scheme    
     协议类型如http, https, ftp,file  
     其中https是加密的网络传输  
     host    
     定义域主机www  
     domain    
     域名 baidu.com  
     port    
     端口号,http默认为80端口  
     filename    
     定义资源名称  
     将域名解析成ip地址    
     第一步要进行域名解析,浏览器不能通过主机名、域名直接找到对应的服务器,他需要IP地址    
     IP地址是分配给每个网络和每一台主机的一个逻辑地址  
     人们更容易记忆字母+数字组合的域名,域名是ip地址的另一种表示或者说一副面具  
     DNS协议通过域名查找ip地址,或逆向从IP查找域名的服务,DNS是一个网络服务器,我们的域名就是DNS上记录的一条线信息比如 baodu.com 220.114.23.56  80  
     如何通过域名查找ip地址    
     1. 浏览器会按照一定频率缓存DNS记录  
     2. 操作系统也可能会缓存DNS记录  
     3. 路由器缓存的DNS记录  
     4. ISP 互联网服务供应商缓存的DNS  
     5. 根服务器递归查询DNS。 baidu.com.cn为例它先询问.cn再循环com.cn再询问baidu.com.cn  
     DNS服务器把查询到的ip得知返回浏览器,浏览器把ip地址打在协议上再添加请求参数发送给对应的服务器  
     TCP连接    
     tcp三次握手    
     客户端发送数据之前,TCP三次握手用来同步客户端和服务端的序列号和确认号,并交换TCP窗口大小信息  
     1. 客户端发送SYN=1, Seq=x的数据包到服务器端口    
     SYN是同步位,1表示同步,0代表不是同步。seq是序列号  
     2. 服务器返回一个带SYN=1, ACK=1,ack=x+1, Seq=Y的相应包表示传达确认信息    
     ACK表示是确认报文,ack是应答,会把客户端的Seq+1返回,再返回一个服务端的序列号  
     3. 客户端回传ACK=1, ack=Y+1, Seq=z的数据包,代表握手结束    
     客户端ACK把服务端发送来的新序列号+1,再返回自己的序列号x+1  
     三次握手为了防止已经失效的连接请求报文突然又传送到了服务端,因而产生错误。场景:client先返送请求1,再发送请求2,但是请求1由于网络原因晚了很久才到达server,而是请求2先到,这时候实际上请求1已经失效了,如果是2次握手,那么服务端再之后又收到了请求1,就会断掉请求2的连接又重新建立了请求1的连接  
     发送http请求    
     请求报文由 请求行(request line) 请求头(request header) 请求体(body)组成  
     请求行    
     包含方法、url、协议版本  
     请求头    
     Host、keepalive,userAnget等  
     请求体    
     承载的请求参数  
     服务器处理请求并返回http报文    
     服务器是网络环境中的高新能计算机,它侦听其他计算机(客户机)提交的服务请求,并提供相应的服务如网页服务、文件下载。服务上可以安装web Server,常见的又apache、nginx等  
     web server担任管控角色,对于用户发送来的请求,结合配置文件,把不同的请求委托给不同的程序处理,然后返回后台程序处理产生的结果  
     http相应报文由响应行(response line)响应头(reponse header) 响应体(reponse body) 组成  
     响应行包括请求方法、状态码  
     响应头包含响应报文的附件信息  
     响应体包含响应数据  
     跨域问题    
     协议、域名、端口号有一个不同就会跨域,是一种安全策略    
     跨域之后允许发送,服务器也能收到请求并响应,但浏览器不允许数据返回到页面  
     解决跨域的方法    
     1. jsonp    
     利用script标签的src属性。浏览器遇到script的src属性就会下载对应的脚本。在脚本链接里面加上一个函数名称(前端对应函数已经存在),让后段使用这个函数把需要返回的值放到函数参数中。前端收到的脚本就是带有返回值参数的对应函数调用。  
     仅支持get方法  
     2. cors    
     服务器端设置Access-control-allow-origin就开启的cors跨域,它表示哪些域名可以访问这些资源,通配符表示都可以访问  
     3. postMessage    
     可以实现跨窗口之间的通信  
     4. websocket    
     全双工双向通信,简历链接时需要借助http协议,一旦链接建立完成,就喝http协议无关了  
     5. node中间件代理    
     同源策略时浏览器不让读,所以如果是服务器和服务器之间的通讯就没有问题了  
     所以使用一个中间服务器,代理发送过来的请求,当然这个中间件也要设置允许跨域(比如使用cors),它在把请求发送给真正的目标服务器,等待目标服务器返回数据,再由解决了跨域问题的中间件返回响应  
     6. ngix反向代理  
     7. iframe+window.name    
     window.name在加载不同窗口时只要不手动修改name值就不会变化,哪怕跨域  
     在A页面中可以先创建一个iframe链接为B,在B中设置window.name的值。监听B页面onload方法,加载完成就把iframe的连接指向一个同域页面,这样就可以再window.name中取到想要的值了  
     8. location.hash + iframe    
     同域名下的页面可以用js操作,不同域名下的时候可以吧数据放到url的hash上。  
     a和c通信,可以引入一个和a同域的页面b。a传入的c的数据放到c的url hash上,c中新建一个iframe,url为b,hash上有c中的数据,由于b和a同域,可以使用 window.parent.parent.location.hash = location.hash传递c中的数据到a  
     9. document.domain+iframe  
     http返回之后可以协议缓存    
     强缓存    
     expire 设置一个过期时间,在这个时间之前的都会走浏览器缓存,status code 为200。缺点是前端可以改时间  
     cache-control    
     max-agehe s-maxage这是过期的秒数,这个时间段之前都走缓存  
     优先级比expire高  
     no-cache 其实协商缓存,需要询问服务端数据有没有更新  
     no-store 不管有没有更新都使用服务器最新值  
     public 客户端和代理服务器都可以缓存  
     private 只有客户端能够缓存  
     协商缓存    
     last-modified&&if-modified-since    
     服务端带着更改时间到前端,前端再次访问相同接口时if-modified-since携带服务器返回的时间。如果时间小于服务器上新的更改时间,说明数据有改变,就是用服务器最新的数据,否则是用缓存  
     etag&&if-non-match    
     服务器第一次返回带有一个摘要,再次请求时摘要放到if-non-match中,如果摘要有变化说明数据有变化  
     service worker    
     和cacheControl一起可以实现编程式缓存,通过js来编写哪些接口需要缓存  
     浏览器解析渲染页面    
     浏览器拿到响应文本HTML之后,进行解析然后渲染  
     1. 解析html生成DOM树    
     把返回的html解析称二进制在解析称浏览器使用的标签,生成DOm树,深度优先遍历,先构建一个节点的所有子节点再构建下一个兄弟节点。遇到scriopt标签会暂停构建,知道脚本执行完毕  
     script 如果有defer或者async标志则不会阻塞,defer会等所有js加载完成,文档解析完成后再执行,async会在脚本下载完成就执行  
     2. 解析css生成css规则树    
     浏览器在css规则树生成之前不会渲染,因为css最后一天规则可能打乱整个布局  
     3. 结合DOm树和css树,生成一个渲染树  
     4. 布局,根据渲染树计算每个节点的位置等信息    
     计算每个渲染对象的位置和尺寸  
     重排(回流):布局完成后,发现某个部分发生变化影响了布局就需要重新排列布局,再重绘。    
     改变字体颜色、背景颜色不会重排,只会重绘    
     translate替代定位,不会重排,因为translate会进行GPU加速,这个元素单独作为一个绘图层交给GPU渲染,然后再composite混合不会引起重排  
     改变元素位置、大小引起布局变化就会重排    
     查询offsetWidth、offsetHeight会引起重排  
     5. 根据计算好的信息绘制页面    
     遍历呈现树,把内容显示再屏幕上  
     重绘:元素背景、文字颜色改变,不影响周围或内部元素布局的属性会引起重绘。重排一定重绘,重绘不一定重排  
     断开连接    
     TCP四次挥手    
     注意客户端和服务端都能主动发出挥手动作,结束连接需要发送一个Fin=1,表示这个方向上没有数据发送了  
     1. 发起方向被动方发送报文,Fin,ACK,Seq,表示已经没有数据传输了,进入FIN_wait_1状态  
     2. 服务器向浏览器发送ACK, Seq,表示同意关闭请求,进入FIn_WAIT_2状态  
     3. 服务请向客户端发送Fin, Ack, Seq,请求关闭连接。进入LAST_ACK状态  
     4. 发起方向被动方发送报文ACK,Seq,进入TIme-WAIT状态,被动方接受到报文段后关闭连接。发起方等待一段时间没有回复就正常关闭。  
    
 
 
 
 
  0 条评论
 下一页
  
   
   
   
   
  
  
  
  
  
  
  
  
  
  
 