当前位置: 首页 > Web前端 > JavaScript

从输入网址到显示页面,中间发生了什么

时间:2023-03-27 13:44:16 JavaScript

《从浏览器地址栏输入网址到请求返回发生了什么?呃,这个面试题我不知道被问过多少遍了。考试题,我们需要总结。大体上分为以下几个过程:1.DNS解析2.TCP连接3.发送HTTP请求4.服务器处理请求并返回HTTP报文5.浏览器解析并渲染页面让我们来了解一下这5个过程。1、DNS解析DNS(DomainNameSystem)是“DomainNameSystem”的英文缩写。DNS解析的过程就是寻找哪台机器有你需要的资源的过程。当您在浏览器中输入地址时,如www.shanzhonglei.com,实际上并不是该网站真正意义上的地址。每台计算机在互联网上的唯一标识是其IP地址,但IP地址不易记忆,所以用URL代替IP地址。DNS域名解析过程1、浏览器缓存。首先会检查浏览器缓存中是否有该域名对应的IP地址。这个缓存有一个过期时间,通常是几分钟到几小时不等。2.本地主机文件。检查你本地的hosts文件是否有这个URL映射关系。Windows是C:\Windows\System32\drivers\etc\hosts文件,linux配置在/etc/hosts文件中。3.路由器缓存。可能还有一层路由器缓存。3.本地DNS服务器。如果要查询的域名在本地配置区资源中,则将解析结果返回给客户端。这个解析是权威的。4.根DNS服务器。如果不使用转发方式,本地DNS将请求发送给13个根DNS解析。如果是转发模式,DNS服务器会将请求转发给上级DNS服务器,由上级服务器解析。如果上层服务器无法解析,则要么寻找根DNS,要么将转发请求转发给上层,然后循环。5、另外还会查询顶级域名服务器和主域名服务器,所以解析过程大致是:浏览器缓存->本地hosts文件->路由器缓存->本地DNS服务器->根DNS服务器->顶级域名服务器->主域名服务器前端DNS优化可以在html页面头部写dns缓存地址。DNS负载均衡如果DNS返回的IP地址每次都相同,那么这台机器需要多少性能和存储来服务数亿个请求?实际上,DNS可以根据每台机器的负载,机器与用户地理位置的距离等,返回一个合适的机器的IP给用户。这个过程就是DNS负载均衡,也称为DNS重定向。众所周知的CDN(ContentDeliveryNetwork)就是使用了DNS重定向技术。DNS服务器会将离用户最近的点的IP地址返回给用户。CDN节点的服务器负责响应用户的请求,提供所需的内容。2、TCP连接用户数据报协议(UDP),简称UDP,是一种基于IP的可以处理应用程序的协议。UDP中最重要的信息之一是端口号。端口号实际上是一个数字。每个要访问网络的程序都需要绑定一个端口号。指定的数据包可以通过端口号UDP发送给指定的程序,所以数据包是通过IP地址信息发送给指定的计算机,UDP通过端口号将数据包分发给正确的程序。TCP(TransmissionControlProtocol,传输控制协议)是一种面向连接的、可靠的、基于字节流的传输层通信协议。与UDP相比,TCP有两个特点:针对数据包的丢失,建立了重传机制。TCP引入了数据包排序机制,保证乱序的数据包组合成一个完整的文件。三向握手是指在建立一个TCP连接时,客户端和服务器一共发送3个数据包来确认连接的建立。三次握手的主要作用:1、确认双方的接收和发送能力。2.指定自己的初始化序号,为后面的可靠性做准备。2.1在三次握手过程开始时,client处于Closed状态,server处于Listening状态。客户端发送到服务器。客户端向服务器发送SYN报文,指明客户端的初始化序号为ISN(c),即以SYN=1,seq=x的形式发送。此时客户端处于SYN_SEND状态。服务器发送给客户端。服务器收到客户端的SYN和ISN(c),也发回一个SYN,同时设置ACK=ISN(c)+1,表示服务器初始化序号为ISN(s),即即,SYN=1,ACK=x+1。以seq=y的形式发送给客户端。客户端发送到服务器。客户端收到服务器发送的报文后,设置ACK=ISN(s)+1,将自己的ISN(c)+1以ACK=y+1,seq=x+1的形式发送给服务器.此时客户端处于ESTABLISHED阶段,服务端收到消息,同样处于ESTABLISHED阶段,双方建立连接。2.2.握两次手不好吗?三次握手的目的:客户端向服务器发送数据,服务器确认可以接受客户端的请求。服务器向客户端发送数据,客户端确认可以向服务器发送数据,也可以接收来自服务器的请求。客户端向服务器发送数据,服务器确认可以向客户端发送数据。如果使用两次握手,客户端向服务器发送数据,服务器确认后开始连接:客户端向服务器发送请求,并在指定时间后发送另一个请求,服务器收到第二次连接建立请求first,andthen上一个请求建立连接,由于网络延迟等问题,在第二个之后到达。服务器认为第二次请求是最新的,于是向客户端发送确认报文段,同意建立连接,连接建立(两次握手),此时客户端还在等待最新的请求连接(第二次请求),自动忽略服务器发送的关于第一次请求连接的响应,不发送数据。服务器一直在等待客户端发送数据,服务器资源被占用2.3三次握手时是否可以携带数据?第三次握手时可以携带,但第一次和第二次握手时不能携带。在第三次握手期间,客户端处于ESTABLISHED状态。它可以建立连接,知道服务器的接收和发送能力是正常的,所以可以承载数据。2.3.客户端在四次挥手过程中向服务器发送消息。客户端以FIN=1,seq=u的形式发送给服务器,表示需要关闭客户端与服务器之间的数据传输。此时客户端处于FIN_WAIT状态。服务器发送给客户端。服务器收到信息后,首先向客户端返回ACK,即以ACK=1,seq=v,ack=u+1的形式返回给客户端,表示客户端消息已经收到。此时服务器处于CLOST_WAIT状态。服务器发送给客户端。服务器等待一段时间,看是否有来自客户端的数据。处理完数据后,它也想断开连接,所以它向客户端发送FIN,即FIN=1,ACK=1,seq=w,以ack=u+1的形式发送给客户端。此时服务器处于LAST_ACK状态。客户端发送给服务器。客户端收到FIN后,返回一个ACK报文作为响应,以ACK=1,seq=w+1的形式发送给服务器。此时客户端处于TIME_WAIT状态。2.4.为什么需要挥手四次,因为服务端收到了客户端的关闭请求。如果因为网络延迟等问题导致部分数据没有发送出去,那么会直接关闭,收不到数据;或者服务器端也有一些数据要发送给客户端,所以要确保数据被发送了。我们知道TCP是个靠谱的家伙,所以它在收到关闭连接的请求时会第一时间回复客户端,第二次回复客户端。你发的数据应该没有延迟,我也发了我要发的数据没了,可以关闭了。终于client收到了,回复告诉server也可以关闭了,过了一会,保证server收到自己发的ACK报文后也处于CLOSED状态。这可确保正常关闭连接。3、发送HTTP请求发送HTTP请求的过程就是构造一个HTTP请求报文,通过TCP协议发送到服务器指定的端口(HTTP协议默认端口为80/8080,默认HTTPS协议的端口是443)。HTTP请求消息由3部分组成:请求行、请求消息和请求文本。请求行:常用方法有:GET、POST、PUT、DELETE、OPTIONS、HEAD。请求头:允许客户端将请求的附加信息和客户端自己的信息传递给服务器。请求文本:在使用POST、PUT等方法时,客户端通常需要向服务器发送数据,这些数据都保存在请求文本中。注意,如果资源缓存在本地缓存中,则直接渲染页面。GET和POST方法之间到底有什么区别?如果没有前提条件,即没有任何规范限制,我们只考虑语法,GET请求和POST请求都可以拉取数据。这两种方法没有区别,只是名称不同。RFC是一种网络规范。如果是基于RFC规范,则不同:1、GET的数据在URL中对所有人可见。来自POST的数据不会显示在URL中。2.GET有数据长度限制。发送数据时,GET方法向URL添加数据;URL的长度有限制(URL的最大长度为2048个字符)。发布无限。3、GET可以收藏,POST不能收藏。4、GET返回键/刷新没有作用,POST数据会重新提交。5.GET编码类型application/x-www-form-url,POST编码类型encodedapplication/x-www-form-urlencoded或multipart/form-data。对二进制数据使用多种编码。6.GEThistory参数将保存在浏览器历史记录中。POST参数不会保存在浏览器历史记录中。7.GET只允许ASCII字符。POST没有限制。二进制数据也是允许的。8.与POST相比,GET安全性较低,因为发送的数据是URL的一部分。发送密码或其他敏感信息时切勿使用GET!POST比GET更安全,因为参数不会保存在浏览器历史记录或Web服务器日志中。9.例如,GET请求将只有一个TCP连接,而POST请求将有两个TCP连接。对于GET请求,浏览器会将http头和数据一起发送,服务器响应200(返回数据);对于POST,浏览器先发送header,服务器响应100continue,浏览器发送数据,服务器响应200ok(返回数据)。四种常见的POST数据提交方式:1.application/x-www-form-urlencoded(表单默认方式)2.multipart/form-data(表单上传文件)3.application/json4.text/xml4.服务端处理在在请求和返回HTTP消息的步骤中,将检查状态码。如果是301/302,则需要重定向,自动从Location中读取地址,重新发起请求。如果是200状态码,检查响应类型Content-Type,如果是字节流类型,将请求提交给下载管理器,导航流程结束,不再进行后续渲染。如果是html,则通知浏览器进程准备渲染进程准备渲染。HTTP响应消息也由3部分组成:状态码、响应头和响应消息。状态码:1xx:指示信息——表示请求已经收到,继续处理。2xx:成功——表示请求已被成功接收、理解、接受。3xx:重定向——需要进一步的操作来完成请求。4xx:客户端错误——请求有语法错误或请求无法完成。5xx:服务器端错误——服务器未能完成合法请求。平时遇到的比较常见的状态码有:200、204、301、302、304、400、401、403、404、422、500(请看分别代表什么)。响应头:常见的响应头字段Server、Connection等。响应消息:服务器返回给浏览器的文本信息,通常HTML、CSS、JS、图片等文件都放在这部分。状态码301和302有什么区别?301重定向是永久重定向,而302重定向是临时重定向。5.浏览器解析和渲染浏览器的渲染过程是:解析HTML,生成DOM树解析CSS,生成CSS规则树(CSSRuleTree)结合DOM树和CSS规则树生成渲染树(RenderTree))从根节点开始,计算每个元素的大小和位置,并给出每个节点应该出现的屏幕的精确坐标,从而根据rendertree得到rendertree的Layout。遍历渲染树,用UI渲染引擎绘制每个节点,从而在页面上绘制出整棵树,这一步称为绘制渲染树(Paintingtherendertree)。在解析过程中,如果浏览器遇到对外部资源的请求,比如图片、JS等,也会重新执行网络请求。这个请求过程是异步的,不会影响HTML文档的加载。但是在文档加载过程中遇到JS文件时,HTML文档会暂停渲染过程,不仅要等待文档中的JS文件加载完成,还要等待解析执行完成,HTML渲染过程将继续。原因是JS可能会修改DOM结构,这是JS阻塞后续资源下载的根本原因。CSS文件的加载不会影响JS文件的加载,但是会影响JS文件的执行。浏览器必须确保在执行JS代码之前已经下载并加载了CSS文件。建议将script标签放在body标签的底部,或者给script标签添加defer/async属性。页面渲染层优化1、HTML文档结构层级越少越好,最好不要超过六层。2.尽可能晚地放置脚本。尽量减少DOM操作,尽可能缓存访问DOM样式信息,避免过多触发reflow6.减少通过JavaScript代码修改元素样式,尽量使用修改类名的方式操作样式或动画7.尽可能在绝对或固定定位元素中使用动画扩展DNS域名和组织类型DNS域名组织类型com商业公司edu教育机构net网络公司gov非军事政府机构Mil军事政府机构TCP和UDPTCP的区别是面向连接的,UDP是无连接的,即发送数据不需要先建立链接。TCP提供可靠的服务。通过TCP连接传输的数据无差错、不丢失、不重复、有序到达;UDP在尽力而为的基础上进行传送,即不保证可靠传送。并且由于TCP可靠、面向连接、不会丢失数据,适合大量数据的交换。TCP只能是1对1,UDP支持1对1、1对多。TCP是面向连接的可靠传输,而UDP是不可靠的。感谢您的阅读,如果您觉得有帮助,请关注并收藏。欢迎关注前端技术站公众号,分享学习资料,技术总结!