浏览器输入一个URL后,发生了什么?

本文涉及的产品
云解析 DNS,旗舰版 1个月
全局流量管理 GTM,标准版 1个月
公共DNS(含HTTPDNS解析),每月1000万次HTTP解析
简介: 浏览器输入一个URL后,发生了什么?

在浏览器中输入一个 URL 并按下回车键,这似乎是一个简单的操作,但实际上背后涉及了一系列复杂的过程,包括 DNS 解析、建立连接、请求资源、处理响应等多个环节。本篇文章将详细剖析浏览器处理 URL 的步骤,带领你一步步了解其背后的技术细节,并结合代码示例进行演示。


一、URL 基本结构


首先,我们来看一下什么是 URL(Uniform Resource Locator,统一资源定位符)。URL 是指向网络资源的地址,其基本结构如下:

scheme://host:port/path?query#fragment


scheme:协议,常见的有 http 和 https,用于定义如何传输数据。

host:主机地址,通常是域名或 IP 地址。

port:端口号,HTTP 的默认端口是 80,HTTPS 的默认端口是 443,通常省略。

path:资源路径,表示服务器上的特定资源位置。

query:查询参数,通常用于传递键值对数据。

fragment:片段标识符,通常用于定位页面内的具体位置。


示例 URL

https://www.example.com:443/path/to/resource?query=example#section1


该 URL 使用了 https 协议,主机为 www.example.com,端口是 443,路径为 /path/to/resource,并带有查询参数 query=example 和片段标识符 section1。


二、DNS 解析


当你在浏览器中输入 URL 时,第一步是通过 DNS 解析 获取服务器的 IP 地址。DNS(Domain Name System,域名系统)将人类可读的域名(例如 www.example.com)转换为机器可识别的 IP 地址(例如 93.184.216.34)。


DNS 解析过程


1.浏览器缓存:首先,浏览器会检查本地缓存是否存有该域名的解析记录。如果有缓存记录,则直接使用;否则进入下一步。

2.操作系统缓存:如果浏览器缓存中没有对应的记录,浏览器会向操作系统请求解析记录。

3.本地 DNS 服务器:如果操作系统也没有缓存,操作系统会向配置的本地 DNS 服务器(通常是 ISP 提供的 DNS 服务器)发起请求。

4.递归查询:本地 DNS 服务器如果无法直接解析,会进行递归查询,从根域名服务器(Root DNS)开始,逐级查询到顶级域名服务器(TLD DNS)和权威 DNS 服务器(Authoritative DNS),最终返回 IP 地址。


DNS 解析代码示例


通过 Python 的 socket 库可以模拟 DNS 查询过程。以下是一个简单的示例,展示如何将域名解析为 IP 地址:

import socket

def resolve_domain(domain):
    try:
        ip = socket.gethostbyname(domain)
        print(f"Domain {domain} resolved to IP {ip}")
    except socket.gaierror as e:
        print(f"Failed to resolve domain {domain}: {e}")
        
resolve_domain("www.example.com")


在这段代码中,socket.gethostbyname 用于进行域名到 IP 地址的解析。


三、建立 TCP 连接


DNS 解析完成后,浏览器已经获取到了目标服务器的 IP 地址。接下来,需要通过 TCP(三次握手)与服务器建立连接。


TCP 三次握手

TCP 是一种面向连接的协议,确保数据可靠传输。TCP 连接的建立分为三个步骤:

1.客户端发送 SYN:客户端向服务器发送一个带有 SYN 标志的数据包,表示请求建立连接。

2.服务器响应 SYN-ACK:服务器收到请求后,返回一个带有 SYN 和 ACK 标志的数据包,表示同意建立连接并确认客户端的请求。

3.客户端发送 ACK:客户端收到服务器的确认后,发送一个带有 ACK 标志的数据包,表示连接建立成功。

此时,TCP 连接已经建立,客户端和服务器可以开始传输数据。


TCP 三次握手示例


可以使用 Python 的 socket 库模拟 TCP 连接的建立:

import socket

def establish_tcp_connection(server, port):
    try:
        # 创建 socket 对象
        client_socket = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
       
        # 连接到服务器
        client_socket.connect((server, port))
        print(f"Successfully connected to {server}:{port}")
       
        # 关闭连接
        client_socket.close()
    except socket.error as e:
        print(f"Failed to connect to {server}:{port}: {e}")
        
establish_tcp_connection("93.184.216.34", 80)  # 连接到 example.com 的服务器


在这个示例中,我们创建了一个 TCP socket,并尝试与 93.184.216.34 服务器的 80 端口建立连接。


四、发送 HTTP 请求


连接建立之后,浏览器会向服务器发送 HTTP 请求,获取网页内容。HTTP 请求的基本格式如下:

GET /path HTTP/1.1
Host: www.example.com
User-Agent: Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 ...
Accept: text/html,application/xhtml+xml,application/xml;q=0.9,...


常见 HTTP 请求方法

GET:请求资源,通常用于

获取网页内容。

POST:向服务器提交数据,例如表单数据。

PUT:上传文件或资源。

DELETE:删除服务器上的资源。


HTTP 请求代码示例


通过 Python 的 requests 库,我们可以轻松发送 HTTP 请求。以下是一个 GET 请求的示例:

import requests
def fetch_page(url):

    try:
        response = requests.get(url)
        print(f"Status Code: {response.status_code}")
        print(f"Response Body: {response.text[:500]}...")  # 仅显示前 500 字符
    except requests.RequestException as e:
        print(f"Failed to fetch page {url}: {e}")
        
fetch_page("https://www.example.com")


此代码使用 requests.get 发送 HTTP GET 请求,并打印返回的状态码和部分响应内容。


五、服务器处理请求


服务器收到请求后,会根据请求路径和方法来决定如何处理。通常,服务器会做以下操作:

1.解析请求:服务器解析 HTTP 请求的头部和路径。

2.查找资源:根据请求的路径在服务器上查找对应的文件或数据。

3.处理动态请求:如果请求的是动态资源(例如 API 调用),服务器会执行相应的逻辑并生成响应内容。

4.生成 HTTP 响应:服务器根据请求生成 HTTP 响应,并将其返回给客户端。


HTTP 响应的基本结构


服务器返回的 HTTP 响应通常包含以下部分:

1.状态行:表示请求结果,例如 HTTP/1.1 200 OK。

2.响应头:包含关于响应的元数据,例如 Content-Type。

3.响应体服务器返回的具体内容,例如 HTML、JSON、图片等。


示例响应:

HTTP/1.1 200 OK
Date: Mon, 07 Sep 2024 12:34:56 GMT
Content-Type: text/html; charset=UTF-8
Content-Length: 1256

<html>
<head><title>Example Page</title></head>
<body>...</body>
</html>


六、浏览器渲染页面


浏览器接收到服务器返回的 HTML 内容后,开始渲染网页。这是一个复杂的过程,涉及解析 HTML、CSS 和 JavaScript,构建 DOM 树和 CSSOM 树,生成渲染树并最终绘制到屏幕上。


渲染过程详解


1.HTML 解析:浏览器解析 HTML 文档,构建 DOM 树(Document Object Model)。

2.CSS 解析:浏览器解析 CSS 文件,生成 CSSOM 树(CSS Object Model)。

3.生成渲染树:浏览器将 DOM 树和 CSSOM 树结合,生成渲染树,决定元素如何显示。

4.布局(Layout):计算每个元素在页面上的位置和大小。

5.绘制(Painting):将渲染树的内容绘制到屏幕上。


渲染优化示例


为了提高网页的渲染性能,开发者可以进行一些优化,例如减少 CSS 阻塞渲染、延迟加载 JavaScript 等。以下是一个简单的例子,展示如何使用 defer 属性延迟 JavaScript 的加载:

<!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="UTF-8">
    <meta name="viewport" content="width=device-width, initial-scale=1.0">
    <title>Optimized Page</title>
    <link rel="stylesheet" href="styles.css">
</head>
<body>
    <h1>Hello, World!</h1>
    <script src="script.js" defer></script>
</body>
</html>


defer 属性告诉浏览器在文档解析完成后再执行 JavaScript,避免阻塞页面的渲染。


七、总结


浏览器输入 URL 后的整个过程包括 DNS 解析、建立 TCP 连接、发送 HTTP 请求、服务器处理请求、浏览器渲染页面等多个环节。每个步骤都涉及复杂的网络和计算机技术,确保用户能够快速、安全地访问所需的资源。


通过本文的详细解析和代码示例,对这个过程有了更加深入的了解。在实际开发中,理解这些底层机制有助于我们优化网站的性能和用户体验。


相关实践学习
通过Ingress进行灰度发布
本场景您将运行一个简单的应用,部署一个新的应用用于新的发布,并通过Ingress能力实现灰度发布。
容器应用与集群管理
欢迎来到《容器应用与集群管理》课程,本课程是“云原生容器Clouder认证“系列中的第二阶段。课程将向您介绍与容器集群相关的概念和技术,这些概念和技术可以帮助您了解阿里云容器服务ACK/ACK Serverless的使用。同时,本课程也会向您介绍可以采取的工具、方法和可操作步骤,以帮助您了解如何基于容器服务ACK Serverless构建和管理企业级应用。 学习完本课程后,您将能够: 掌握容器集群、容器编排的基本概念 掌握Kubernetes的基础概念及核心思想 掌握阿里云容器服务ACK/ACK Serverless概念及使用方法 基于容器服务ACK Serverless搭建和管理企业级网站应用
目录
相关文章
|
7月前
|
缓存 网络协议 前端开发
当浏览器输入url的时候会发生什么?
当浏览器输入url的时候会发生什么?
108 0
|
5月前
|
缓存 网络协议 前端开发
一步步揭秘:浏览器输入URL后的那些事儿
大家好,我是小米!你有没有好奇过,当你在浏览器输入一个网址并按下回车键后,到底发生了什么神奇的过程?从DNS解析到TCP连接,从发送HTTP请求到浏览器渲染,本文将带你深入了解这个复杂而又迷人的过程,让我们一起探索吧!
65 2
|
4月前
|
缓存 JavaScript 前端开发
浏览器对地址栏中输入的URL的处理过程
【8月更文挑战第20天】
139 0
|
8天前
|
缓存 网络协议 JavaScript
第八问:在浏览器中输入URL后发生了什么?
当在浏览器中输入URL并按下回车键时,会经历一系列复杂的过程:1. 用户输入URL;2. DNS解析域名;3. 建立TCP连接;4. 发送HTTP/HTTPS请求;5. 服务器处理请求;6. 浏览器渲染页面;7. 页面展示。每个步骤涉及不同的技术和协议,确保数据的准确传输和页面的正确显示。
18 0
|
1月前
|
缓存 网络协议 JavaScript
浏览器输入url之后最后网页渲染出来经过了什么
【10月更文挑战第31天】从浏览器输入 URL 到网页渲染出来是一个涉及多个环节和技术的复杂过程,每个环节都对最终的网页显示效果和用户体验有着重要的影响。
31 3
|
1月前
|
存储 缓存 网络协议
计算机网络常见面试题(二):浏览器中输入URL返回页面过程、HTTP协议特点,GET、POST的区别,Cookie与Session
计算机网络常见面试题(二):浏览器中输入URL返回页面过程、HTTP协议特点、状态码、报文格式,GET、POST的区别,DNS的解析过程、数字证书、Cookie与Session,对称加密和非对称加密
|
1月前
|
域名解析 缓存 网络协议
浏览器中输入URL返回页面过程(超级详细)、DNS域名解析服务,TCP三次握手、四次挥手
浏览器中输入URL返回页面过程(超级详细)、DNS域名解析服务,TCP三次握手、四次挥手
|
7月前
|
缓存 负载均衡 网络协议
在浏览器地址栏中输入URL后发生了什么
这是一个关于网页加载过程的概述:首先,浏览器查询IP地址,通过DNS解析域名;接着,建立TCP连接,发起HTTP请求;服务器处理请求并返回HTTP响应;最后,浏览器解析和渲染网页内容。过程中涉及DNS缓存、TCP三次握手、HTTP请求与响应、HTML解析、CSS和JS加载,以及渲染树的构建。为了优化网站性能,可以减少DNS查询、合并文件、压缩资源、提前加载CSS和延迟加载JS。
|
2月前
|
域名解析 缓存 网络协议
浏览器输入 URL 回车后会经历哪些步骤?
本文首发于微信公众号“前端徐徐”,详细解析了从在浏览器中输入URL到页面完全呈现的全过程,涵盖检查缓存、URL解析、DNS解析、TCP连接、HTTP请求、服务器响应、浏览器处理响应、页面解析与渲染、关闭TCP连接等关键步骤。通过这些步骤,帮助读者深入了解互联网的工作原理,提升网站性能和用户体验。
38 0
|
4月前
|
网络协议 前端开发 JavaScript
浏览器加载网页的幕后之旅:从URL到页面展示详解
【8月更文挑战第31天】当在浏览器地址栏输入URL并回车后,一系列复杂过程随即启动,包括DNS解析、TCP连接建立、HTTP请求发送、服务器请求处理及响应返回,最后是浏览器页面渲染。这一流程涉及网络通信、服务器处理和客户端渲染等多个环节。通过示例代码,本文详细解释了每个步骤,帮助读者深入理解Web应用程序的工作机制,从而在开发过程中作出更优决策。
77 5