访问域名全流程
本文最后更新于:2024年12月18日 下午
访问域名全流程
域名解析 --> 发起TCP的3次握手 --> 建立TCP连接后发起http请求 --> 服务器响应http请求,浏览器得到html代码 --> 浏览器解析html代码,并请求html代码中的资源(如js、css、图片等) --> 浏览器对页面进行渲染呈现给用户
- DNS解析
- 发起TCP请求
- 发起HTTP请求
- 负载均衡
- 浏览器渲染
- 网页静态资源加载
¶DNS解析(UDP)
访问目标地址有两种方式:
①使用目标IP地址访问。由于IP地址是一堆数字不方便记忆,于是有了域名这种字符型标识。
②使用域名访问。域名解析就是域名到IP地址的转换过程,域名的解析工作由DNS服务器完成。
DNS域名解析时用的是UDP协议。整个域名解析的过程如下:
- 浏览器向本机DNS模块发出DNS请求,DNS模块生成相关的DNS报文;
- DNS模块将生成的DNS报文传递给传输层的UDP协议单元;
- UDP协议单元将该数据封装成UDP数据报,传递给网络层的IP协议单元;
- IP协议单元将该数据封装成IP数据包,其目的IP地址为DNS服务器的IP地址;
- 封装好的IP数据包将传递给数据链路层的协议单元进行发送;
- 发送时在ARP缓存中查询相关数据,如果没有,就发送ARP广播(包含待查询的IP地址,收到广播的主机检查自己的IP,符合条件的主机将含有自己MAC地址的ARP包发送给ARP广播的主机)请求,等待ARP回应;
- 得到ARP回应后,将IP地址与路由的下一跳MAC地址对应的信息写入ARP缓存表;
- 写入缓存后,以路由下一跳的地址填充目的MAC地址,以数据帧形式转发;
- 转发可能进行多次;
- DNS请求到达DNS服务器的数据链路层协议单元;
- DNS服务器的数据链路层协议单元解析数据帧,将内部的IP数据包传递给网络层IP协议单元;
- DNS服务器的IP协议单元解析IP数据包,将内部的UDP数据报传递给传输层UDP协议单元;
- DNS服务器的UDP协议单元解析收到的UDP数据报,将内部的DNS报文传递给DNS服务单元;
- DNS服务单元将域名解析成对应IP地址,产生DNS回应报文;
- DNS回应报文->UDP->IP->MAC->我的主机;
- 我的主机收到数据帧,将数据帧->IP->UDP->浏览器;
- 将域名解析结果以域名和IP地址对应的形式写入DNS缓存表。
¶发起TCP请求(三次握手)结束(四次挥手)
第一次握手:客户端向服务端发送了一个同步报文段
1 | |
第二次握手:服务端收到了用户端的请求,同意建立连接,然后服务器发送确认报文段给客户端
1 | |
第三次握手:客户端收到了服务端同意连接的确认之后,开始发送第一个数据包
1 | |
(所有TCP报文通过IP(DNS)->MAC(ARP)->网关->目的主机/我的主机;)
第一次挥手:客户端向服务端发送连接释放的请求报文,并且停止发送数据
FIN=1:客户端主动释放客户端到服务端的TCP连接
第二次挥手:服务端收到了客户端的请求释放报文,给客户端发送确认报文。从客户端到服务端这个方向上的连接就释放了,TCP连接处于半关闭状态。此时客户端无法发送数据给服务端,但是服务端还可以发送数据给客户端,客户端仍可以接收。
ACK=1:表示同意客户端释放连接请求
第三次挥手:服务端没有数据再发给客户端数据,其应用进程就通知TCP释放连接,并向客户端发送确认报文
FIN=1 ACK=1:表示服务器释放服务器到客户端的TCP连接
第四次挥手:客户端收到服务端的释放报文段后,给服务端发送同意确认报文
¶发起HTTP请求
- 浏览器向域名发出GET方法报文(HTTP请求);
- 该GET方法报文通过TCP->IP(DNS)->MAC(ARP)->网关->目的主机;
- 目的主机收到数据帧,通过IP->TCP->HTTP,HTTP协议单元会回应HTTP协议格式封装好的HTML形式数据(HTTP响应);[
从请求信息中获得客户机想访问的主机名。从请求信息中获取客户机想要访问的web应用(web应用程序指提供浏览器访问的程序,简称web应用)。从请求信息中获取客户机要访问的web资源。(web资源,即各种文件,图片,视频,文本等)读取相应的主机下的web应用,web资源。用读取到的web资源数据,创建一个HTTP响应。] - 该HTML数据通过TCP->IP(DNS)->MAC(ARP)->网关->我的主机;
- 我的主机收到数据帧,通过IP->TCP->HTTP->浏览器,浏览器以网页形式显示HTML内容.
¶负载均衡
(1)如果我们的平台配备了负载均衡的话,前一步DNS解析获得的IP地址应该是我们Nginx负载均衡服务器的IP地址。所以,我们的浏览器将我们的网页请求发送到了Nginx负载均衡服务器上。
(2)Nginx根据我们设定的分配算法和规则,选择一台后端的真实Web服务器,与之建立TCP连接、并转发我们浏览器发出去的网页请求。
(3)Web服务器收到请求,产生响应,并将网页发送给Nginx负载均衡服务器。
(4)Nginx负载均衡服务器将网页传递给filters链处理,之后发回给我们的浏览器.
¶浏览器渲染
(1)浏览器根据页面内容,生成DOM Tree。根据CSS内容,生成CSS Rule Tree(规则树)。调用JS执行引擎执行JS代码。
(2)根据DOM Tree和CSS Rule Tree生成Render Tree(呈现树)。
(3)根据Render Tree渲染网页。
在浏览器解析页面内容的时候,发现页面引用了其他未加载的image、css文件、js文件等静态内容,因此开始了第二部分。