「前端面试」在浏览器输入URL,点击回车之后发生了什么?
在浏览器中输入的URL地址,是找不到服务器地址的。由字母组成的URL只是用户方便记忆,只有通过IP地址才能找到对应的服务器,但IP地址是由数字组成,不方便用户记忆。
解析过程:首先,浏览器会先在本地 DNS 缓存中查找域名对应的 IP 地址,如果找不到,就会向 DNS 服务器发送 DNS 请求,获取域名对应的 IP 地址。这个过程涉及到 DNS 服务器的层层查询,可能会影响到整个请求的速度。(先找缓存,找不到就请求服务器)
找到服务器之后需要就建立TCP连接,也就是,使客户端与服务端在这个通道中进行数据传输。但在建立通道需要TCP三次握手
客户端发送 SYN 数据包,表示请求连接服务器接收到请求后,返回 SYN 和 ACK 数据包,表示同意连接并告知客户端自己的序列号客户端再次返回 ACK 数据包,表示连接成功,并告知服务器自己的序列号发送请求头部和请求数据,此外还可以包含其他的字段,比如 Cookie、Referer、Authorization 等。
请求行:HTTP版本协议,请求方法GET/POST,请求地址:https://juejin.cn/
请求头部:浏览器信息user-agent:Mozilla/5.0,由键值对组成,一行一对
空行: 表示请求头部内容结束
响应头部包含的信息除了 content-type 之外,还有状态码、响应时间、服务器类型等。
状态行:如404资源没找到,200请求成功
响应头部:由键值对组成的浏览器信息content-type:text/html;charser=utf-8
空行: 表示响应头部内容结束
浏览器在接收到 HTML、CSS、JS 文件之后,会根据文件的类型解析内容,并渲染页面。具体的渲染过程包括构建 DOM 树、解析 CSS 样式、执行 JS 代码等。
客户端发送 FIN 数据包,表示不再发送数据;服务器接收到 FIN 后,返回 ACK 数据包;服务器也会发送 FIN 数据包,表示不再接收数据;客户端接收到 FIN 后,返回 ACK 数据包,最终断开连接。这个过程可以确保客户端和服务器之间的数据传输完成,并释放资源。
其他:DNS(Domain Name System)是一种分布式的命名系统,它将域名(比如www.google.com)转换为 IP 地址(比如172.217.6.68),使得人们可以使用容易记忆的域名访问互联网上的各种资源,而不必记住它们的 IP 地址。
DNS 在互联网中的作用类似于电话簿,它将人们能够记忆的域名映射到对应的 IP 地址,使得计算机可以通过域名找到对应的服务器并获取所需的资源。在 DNS 中,域名和 IP 地址之间的映射关系保存在 DNS 服务器中,当客户端需要解析一个域名时,它会向本地 DNS 缓存或者其他 DNS 服务器发出查询请求,获取域名对应的 IP 地址。
DNS 的设计采用了分布式的架构,因为互联网上的域名非常多,单一的 DNS 服务器无法承载所有的查询请求。因此,DNS 将域名空间分为多个区域,每个区域由一个或多个 DNS 服务器负责管理。这些 DNS 服务器之间通过区域传送协议(AXFR)或域名系统转发协议(DNS Forwarder)进行数据交换,使得整个 DNS 系统可以高效、可靠地运行。
TCP(Transmission Control Protocol)是一种重要的传输协议,它在不可靠的IP网络上提供可靠的数据传输。TCP通过一系列机制,如序号、确认、重传、流量控制和拥塞控制等,保证数据在网络中正确传输,不丢失、不重复、不损坏,按照正确的顺序到达。TCP采用面向连接的通信模式,通信双方需要建立连接后才能进行数据传输。TCP还有流量控制和拥塞控制的机制,用于避免网络拥塞和资源浪费。
SYN 是指“同步信号”(Synchronize),它是 TCP 建立连接的第一步。当一台计算机向另一台计算机发起连接请求时,它会发送一个 SYN 数据包,这个数据包包含了一个初始序列号(ISN),表示数据传输的起始位置。SYN 数据包通常携带有连接请求的相关信息,如请求连接的端口号、请求的连接状态等。
ACK 是指“确认信号”(Acknowledgement),它是 TCP 建立连接的第二步。当另一台计算机受到 SYN 数据包后,它会回应一个 ACK 数据包,表示已经接收到了 SYN 数据包,并确认建立连接。ACK 数据包通常也包含了一个序列号,表示它已经准备好接收数据。
FIN是TCP协议中用于关闭连接的一种数据包,它表示发送方不再发送数据。当TCP连接的一方想要关闭连接时,它会发送一个FIN数据包给另一方,告诉它不再发送数据了。
FIN数据包就像是双方的告别信,当其中一方准备关闭连接时,它会发出FIN数据包表示自己不再发送数据了,等待对方的回复,直到双方都发出了FIN数据包后,连接才会真正关闭。