用户输入网址(URL):
用户在浏览器地址栏中输入网址,例如:https://www.example.com。
dns解析
计算机尝试解析一个域名时,首先会检查本地 hosts 文件,看是否存在相应的映射。如果存在映射,计算机将直接使用 hosts 文件中的 IP 地址,而不进行 DNS 查询。如果本地host没有对应的域名解析就会进行dns解析:
1. 计算机向本地 DNS 缓存查询是否有域名的映射记录。
2. 如果本地缓存中没有,计算机将向本地网络中配置的 DNS 服务器发送查询请求。
3. 如果本地 DNS 服务器也没有相应的记录,它将递归地向根域名服务器、顶级域名服务器、权威域名服务器等发起查询,直到找到域名对应的 IP 地址。
4. DNS 服务器将获取到的 IP 地址返回给计算机,并将结果缓存,以便将来的查询。
建立TCP连接:
三次握手(建立连接):
-
客户端发送请求 (SYN):
客户端发送一个 TCP 报文,设置 SYN(同步)标志位,表示请求建立连接。同时,客户端选择一个初始序列号(ISN)。
-
服务器响应请求 (SYN + ACK):
服务器收到客户端的 SYN 请求后,会回复一个带有 SYN 和 ACK(确认)标志位的 TCP 报文。服务器也选择一个初始序列号。
-
客户端确认响应 (ACK):
客户端收到服务器的 SYN + ACK 后,发送一个带有 ACK 标志位的报文,表示对服务器的响应已经收到。至此,连接建立。
SSL/TLS握手
1.下发数字证书并进行签名验证
在握手的初始阶段,服务器会提供一个数字证书,数字证书是由受信任的证书颁发机构(CA)签发的。数字签名是通过 CA 对数字证书进行签名的过程,用于确保证书的真实性和完整性。客户端在握手过程中验证服务器提供的数字证书的签名,以确保证书是由受信任的 CA 签发的。数字签名是一种使用 CA 的私钥签署数据的非对称加密过程。
2.使用非对称加密交换密钥
数字证书包含了服务器的公钥。客户端使用服务器的公钥来加密一个称为"Pre-Master Secret"的随机值,并将其发送给服务器。服务器收到加密的"Pre-Master Secret"后,使用自己的私钥进行解密。这个步骤使用了非对称加密,其中公钥用于加密,私钥用于解密。
3.生成会话密钥:
通过协商生成的"Pre-Master Secret"是安全地通过非对称加密传递的。然后,客户端和服务器使用"Pre-Master Secret"生成"Master Secret",再从"Master Secret"派生出用于对称加密的会话密钥。
4.使用对称加密进行实际请求:
双方使用协商好的加密算法和生成的会话密钥来加密通信。从此时开始,客户端和服务器之间的数据传输都是加密的。
发起HTTP/HTPPS请求:
浏览器向服务器发起一个 HTTP/HTPPS 请求。这个请求包含了用户请求的资源、请求头(例如浏览器的信息、所需的资源类型等)等信息。
服务器处理请求:
服务器收到浏览器的请求后,根据请求的内容和服务器上的配置,分发到相关的服务(Web Server -> Web Application)。
例如:
Apache/Nginx + FastCGI + PHP-FPM(+PHP-CGI)
Nginx + Go
Tomcat+Java
后端处理:
在服务器端,可能会涉及到多个服务,例如应用服务器、数据库服务器、缓存服务器等。这些服务协同工作,生成或获取需要的数据。
HTTP响应:
服务器将处理结果封装成 HTTP 响应,包括状态码、响应头和响应体。响应体中可能包含 HTML、CSS、JavaScript 等文件,或者其他数据格式,如 JSON。
浏览器接收响应:
浏览器接收到服务器的 HTTP 响应后,根据响应头中的信息处理数据。如果响应体包含了 HTML,浏览器开始解析和渲染页面。
四次挥手
-
客户端发送终止请求 (FIN):
客户端想要关闭连接时,发送一个带有 FIN(结束)标志位的报文,表示不再发送数据。
-
服务器确认关闭 (ACK):
服务器收到客户端的 FIN 后,发送一个带有 ACK 标志位的报文,表示收到了关闭请求。
-
服务器发送终止请求 (FIN):
服务器关闭自己的发送通道,并发送一个带有 FIN 标志位的报文给客户端,表示服务器不再发送数据。
-
客户端确认关闭 (ACK):
客户端收到服务器的 FIN 后,发送一个带有 ACK 标志位的报文,表示收到了服务器的关闭请求。此时,客户端和服务器之间的连接彻底关闭。
解析HTML和构建DOM树:
浏览器解析 HTML,并构建 Document Object Model(DOM)树,表示页面的结构。
加载CSS和JavaScript:
浏览器开始加载页面中引用的 CSS 和 JavaScript 文件,并执行相应的脚本。这些文件可能会修改 DOM 树、向服务器发起额外的请求等。
渲染页面:
浏览器根据 DOM 树和 CSS 样式信息,开始渲染页面。这包括计算元素的大小和位置、绘制页面的各个部分等。
页面展示:
最终,渲染后的页面在用户的浏览器中显示出来,用户可以与页面进行交互。