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

本文详细解析了用户在浏览器输入URL后发生的一系列步骤,包括DNS域名解析、利用IP、ARP等协议传输数据、TCP连接的建立与断开、HTTP请求与响应,以及浏览器如何渲染页面内容。通过此过程,读者可以全面了解网络通信的基础流程。

在浏览器中输入URL后,执行的全部过程、也就是一次http请求的过程

DNS域名解析

1.DNS域名解析协议
DNS协议的产生主要是IP地址不便记忆,在TCP/IP协议中、起初有一个叫做主机识别码的机制,这种的识别的方式指的是为每一台计算机都赋予唯一的主机名,再进行网络通信的时候可以直接使用主机名来代替IP地址,主机往往维护一个叫做hosts的数据库文件,这个数据库文件存放的就是主机名和IP地址的映射,也就是说,如果IP地址增加或者更新的话,中心的hosts数据库文件就得更新,也就是其它的计算机都要定期的更新这个hosts数据库文件、才能正确的使用网络.网络规模的扩大使这种方式的可行性降低.
所以就有了DNS系统、可以有效地管理主机名和IP之间的对应的关系,
因特网的域名系统被设计成一个联机分布式的数据库系统,并采用客户/服务器模式。域名到IP地址的解析是在域名服务器上进行的,一个服务器所负责(或者说是有权限的)的管辖范围称为区(不是以“域”为单位),各单位根据具体情况来划分自己管辖范围的区,但在一个区中的所有节点必须是能够连通的,每一个区设置相应的权限域名服务器,用来保护该区中的所有主机的域名IP地址的映射。每一个域名服务器不但能够进行一些域名到IP地址的解析,而且还必须具有连向其他域名服务器的信息,当自己不能进行域名到IP地址的转换时,能够知道什么地方去找别的域名服务器。
1、浏览器搜索自己的DNS缓存(维护一张域名与IP地址的对应表);
2、若没有,则搜索操作系统中的DNS缓存(维护一张域名与IP地址的对应表);
3、若没有,则搜索操作系统的hosts文件(Windows环境下,维护一张域名与IP地址的对应表);
4、若没有,则操作系统将域名发送至本地域名服务器—(递归查询方式),本地域名服务器查询自己的DNS缓存,查找成功则返回结果,否则,(以下是迭代查询方式)
4.1. 本地域名服务器向根域名服务器(其虽然没有每个域名的具体信息,但存储了负责每个域,如com、net、org等解析的顶级域名服务器的地址)发起请求,此处,根域名服务器返回com域的顶级域名服务器的地址;

当你在浏览器输入一个 URL(如 `https://www.example.com`)并按下回车后,**浏览器与服务器之间会进行一系列复杂的网络通信过程**,最终将网页内容渲染展示出来。这个过程涉及多个协议、组件和步骤。 --- ## 一、整个过程的详细流程 ### 1. **输入 URL 并解析** 浏览器首先解析你输入URL,提取出: - 协议类型:如 `https://` - 域名:如 `www.example.com` - 端口号(可选,默认为 80 或 443) - 路径(如 `/index.html`) ### 2. **DNS 解析(域名解析成 IP 地址)** #### 流程如下: 1. **检查本地 Hosts 文件** 2. **查找本地 DNS 缓存** 3. **查询操作系统缓存** 4. **发送请求到 Local DNS Server(递归查询)** 5. **Local DNS 向根 DNS、顶级域(TLD)、权威 DNS 查询获取 IP** 最终获取目标服务器的 IP 地址。 #### 示例 Java 代码模拟 DNS 查询: ```java import java.net.InetAddress; public class DnsLookup { public static void main(String[] args) { try { InetAddress address = InetAddress.getByName("www.example.com"); System.out.println("IP Address: " + address.getHostAddress()); } catch (Exception e) { e.printStackTrace(); } } } ``` --- ### 3. **建立 TCP 连接(三次握手)** 使用 TCP 协议建立连接: 1. 客户端 → 服务端:SYN(同步) 2. 服务端 → 客户端:SYN-ACK(同步-确认) 3. 客户端 → 服务端:ACK(确认) > 如果是 HTTPS,还会在此阶段进行 TLS/SSL 握手加密通信。 --- ### 4. **发送 HTTP/HTTPS 请求** 建立连接后,浏览器发送 HTTP 请求报文,例如: ``` GET /index.html HTTP/1.1 Host: www.example.com User-Agent: Mozilla/5.0 ... Accept: text/html Connection: keep-alive ``` --- ### 5. **服务器接收请求并处理** 服务器接收到请求后,根据路径、方法等信息进行处理,可能包括: - 静态资源直接返回 - 动态请求由 Web 框架(如 Spring Boot)处理 - 数据库查询、业务逻辑执行等 #### 示例 Java Servlet 处理 GET 请求: ```java @WebServlet("/index.html") public class HelloServlet extends HttpServlet { protected void doGet(HttpServletRequest request, HttpServletResponse response) throws IOException { response.setContentType("text/html"); PrintWriter out = response.getWriter(); out.println("<h1>Hello, World!</h1>"); } } ``` --- ### 6. **服务器返回响应** 服务器将响应返回给浏览器,包含状态码、响应头和响应体: ``` HTTP/1.1 200 OK Content-Type: text/html Content-Length: 137 <h1>Hello, World!</h1> ``` --- ### 7. **浏览器解析并渲染页面** 1. **HTML 解析器**解析 HTML 文档,构建 DOM 树。 2. **CSS 解析器**解析样式表,构建 CSSOM。 3. **JavaScript 引擎**执行脚本(可能会修改 DOM 和 CSSOM)。 4. **布局引擎**结合 DOM 和 CSSOM 构建渲染树。 5. **绘制页面**:将渲染树转换为屏幕上的像素。 --- ### 8. **关闭连接(四次挥手)** 如果连接不是 Keep-Alive,浏览器和服务端会通过四次挥手断开连接。 --- ## 二、总结图示 ``` URL 输入 → DNS 解析 → 建立 TCP 连接 → 发送 HTTP 请求 → 服务器处理 → 返回响应 → 渲染页面 → 断开连接 ``` --- ## 三、性能优化相关技术 | 技术 | 作用 | |------|------| | DNS 缓存 | 减少 DNS 查询时间 | | CDN 加速 | 接近用户节点,提高访问速度 | | HTTP/2 | 多路复用,减少延迟 | | 前端懒加载 | 提高首屏加载速度 | | 服务端缓存 | 减少数据库压力 | --- ###
评论 27
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值