在浏览器中输入URL后发生了什么?

文章目录

在浏览器中输入URL后发生了什么?这是一个非常值得思考的问题,以这个标题在网上搜索可以看到很多相关的文章,这些文章会从作者自身的知识积累出发来阐述这样一个过程。有的文章会从键盘/触摸屏按下–>CPU中断–>操作系统内核响应–>TCP/IP协议–>服务端响应–>浏览器处理返回数据这样宏大的角度来说明这样的过程,作者的知识面令人佩服。

不过tennfy认为TCP/IP协议–>服务端响应–>浏览器处理返回数据这部分内容对我们来说更为有用,所以本文试图从以下几个方面来进行介绍:
1、解析URL,利用DNS查询得到URL对应的IP地址;

2、与目标IP建立TCP连接,通过socket发送数据;

3、服务器响应处理,浏览器解析及展示数据。

URL域名解析

1、检查URL是否在缓存及hosts中

(1)浏览器检查URL是否在缓存当中

(2)如果不在缓存中,则开始检查域名是否在本地 Hosts 里;若在,则直接返回域名对应的IP

2、查询DNS服务器

(1)如果该URL既不在缓存中,Hosts中也没有,则会向 DNS 服务器发送一条 DNS 查询请求。DNS 服务器是由网络通信栈提供的,通常是本地路由器或者 ISP 的缓存 DNS 服务器

(2)查询本地DNS,使用 53 端口向 DNS 服务器发送 UDP 请求包

(3)如果本地/ISP DNS 服务器没有找到结果,它会发送一个递归查询请求,一层一层向高层 DNS 服务器做查询,直到查询到起始授权机构,如果找到会把结果返回

建立TCP连接,通过socket发送数据

当浏览器得到了目标服务器的 IP 地址,以及 URL 中给出来端口号(http 协议默认端口号是 80, https 默认端口号是 443)后,通过 Socket API 请求一个 TCP流套接字,经过TCP三次握手,与目标服务器建立TCP连接。服务器与浏览器之间接收和发送HTTP数据。

HTTP服务器响应处理

1、负载均衡处理

请求在进入到真正的应用服务器前,可能还会先经过负责负载均衡的机器,它的作用是将请求合理地分配到多个服务器上,同时具备具备防攻击等功能。
负载均衡具体实现有很多种,有直接基于硬件的 F5,有操作系统传输层(TCP)上的 LVS,也有在应用层(HTTP)实现的反向代理(也叫七层代理)。

2、Web Server 中的处理

请求经过前面的负载均衡后,将进入到对应服务器上的 Web Server,比如 Apache、Tomcat、Node.JS 等。
以 Apache 为例,在接收到请求后会交给一个独立的进程来处理,然后调用 PHP 等脚本语言来进行处理,比如在 CGI 下就是将 HTTP 中的参数放到环境变量中,然后启动 PHP 进程来执行,或者使用 FastCGI 来预先启动进程。服务端处理完请求后,结果将通过网络发回客户端的浏览器。

浏览器解析及展示数据

浏览器渲染引擎从网络层取得请求的文档,一般情况下文档会分成8kB大小的分块传输。
(1)HTML 解析器对 HTML 文档进行解析,并生成解析树,解析树是以 DOM 元素以及属性为节点的树,整个 DOM 和 HTML 文档几乎是一对一的关系。
(2)解析结束后,浏览器开始加载网页的外部资源(CSS,图像,Javascript 文件等)。此时浏览器把文档标记为“可交互的”,浏览器开始解析处于“推迟”模式的脚本,也就是那些需要在文档解析完毕之后再执行的脚本。之后文档的状态会变为“完成”,浏览器会进行“加载”事件;
(3)执行同步 Javascript 代码;
(4)对CSS样式表进行解析;
(5)对页面进行渲染。

参考文章:

科学上网的一些原理
从输入 URL 到页面加载完成的过程中都发生了什么事情?
what-happens-when-zh_CN
what happens when you type in a URL in browser

本文出自 TENNFY博客,转载时请注明出处及相应链接。

本文永久链接: https://www.tennfy.com/3400.html

下一篇文章:

上一篇文章:

发表评论

电子邮件地址不会被公开。 必填项已用 * 标注

*

3 + 2 = ?


您可以使用这些 HTML 标签和属性: <a href="" title=""> <abbr title=""> <acronym title=""> <b> <blockquote cite=""> <cite> <code> <del datetime=""> <em> <i> <q cite=""> <strike> <strong>

返回顶部