揭秘浏览器键入URI到页面显示的过程: 浏览器键入URI,到页面显示,中间发生什么?

🌷🍁 博主猫头虎 带您 Go to New World.✨🍁
🦄 博客首页——猫头虎的博客🎐
🐳《面试题大全专栏》 文章图文并茂🦕生动形象🦖简单易学!欢迎大家来踩踩~🌺
🌊 《IDEA开发秘籍专栏》学会IDEA常用操作,工作效率翻倍~💐
🌊 《100天精通Golang(基础入门篇)》学会Golang语言,畅玩云原生,走遍大小厂~💐

🪁🍁 希望本文能够给您带来一定的帮助🌸文章粗浅,敬请批评指正!🍁🐥

文章目录

      • 第一阶段:解析URI
      • 第二阶段:域名解析
      • 第三阶段:建立TCP连接
      • 第四阶段:发起HTTP请求
      • 第五阶段:服务器处理请求并返回数据
      • 第六阶段:浏览器渲染页面
    • 代码案例
      • Go语言示例:
      • Java语言示例:
      • Python语言示例:
      • 总结
  • 原创声明

在日常使用互联网的过程中,我们经常会使用浏览器访问各种网页,但你是否曾经好奇,当我们在浏览器中键入一个网址(也称为URI),到页面最终显示出来的背后究竟发生了什么?本篇博客将带你深入了解这个过程的各个阶段。

在这里插入图片描述

第一阶段:解析URI

一切从用户在浏览器地址栏键入网址开始。这个网址实际上是一个统一资源标识符(URI),它可以是一个网页的地址、一个文件的路径,甚至是一个在线应用的链接。浏览器首先会将这个URI进行解析,分解出其中的协议、域名、路径以及可能的查询参数等信息。

第二阶段:域名解析

在浏览器解析出域名后,接下来的步骤是将域名转换为IP地址,这个过程称为域名解析。浏览器会首先查询本地的DNS缓存,如果找不到,就会向本地DNS服务器发起查询。如果本地DNS服务器也没有缓存该域名的IP地址,它会依次向更高级别的DNS服务器发起查询,直到找到对应的IP地址为止。

第三阶段:建立TCP连接

有了目标服务器的IP地址后,浏览器会与服务器建立TCP连接。TCP(传输控制协议)是一种可靠的通信协议,它确保数据在客户端和服务器之间的可靠传输。在这个阶段,浏览器和服务器之间会进行“三次握手”来建立连接,确保双方都准备好进行数据传输。

第四阶段:发起HTTP请求

一旦TCP连接建立,浏览器会发起实际的HTTP请求。HTTP请求中包含了浏览器想要获取的资源信息,例如网页的HTML文件、CSS样式表、JavaScript脚本等。服务器在接收到请求后,会根据请求的资源类型和路径返回相应的数据。

第五阶段:服务器处理请求并返回数据

服务器收到HTTP请求后,会根据请求的内容和参数,从文件系统或数据库中获取相应的数据。这可能涉及到后端编程、数据库查询等一系列复杂的操作。一旦服务器准备好数据,它会将数据以HTTP响应的形式返回给浏览器。

第六阶段:浏览器渲染页面

浏览器收到服务器返回的数据后,开始进行页面渲染。这包括解析HTML结构、加载CSS样式、执行JavaScript代码等。浏览器会按照解析到的顺序逐步构建页面,最终在用户的屏幕上显示出完整的页面内容。

代码案例

当我们访问一个网页时,浏览器将展示一个丰富的页面内容,但背后却隐藏着一个复杂的过程。通过具体的代码示例,分别使用Go语言、Java语言和Python语言来展示从浏览器键入URI到页面显示的完整过程。

Go语言示例:

package mainimport ("fmt""net""net/http""time"
)func main() {// 用户输入的URIuri := "https://www.example.com"// 解析URI获取主机名和端口host, port, err := net.SplitHostPort(uri)if err != nil {fmt.Println("Error:", err)return}// 建立TCP连接conn, err := net.DialTimeout("tcp", net.JoinHostPort(host, port), 5*time.Second)if err != nil {fmt.Println("Error:", err)return}defer conn.Close()// 发起HTTP请求request, err := http.NewRequest("GET", uri, nil)if err != nil {fmt.Println("Error:", err)return}client := &http.Client{}response, err := client.Do(request)if err != nil {fmt.Println("Error:", err)return}defer response.Body.Close()// 读取和处理响应数据// 这里可以根据实际需要对响应数据进行处理,比如解析HTML内容等// ...
}

Java语言示例:

import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStreamReader;
import java.net.HttpURLConnection;
import java.net.URL;
import java.net.URLConnection;public class Main {public static void main(String[] args) throws IOException {// 用户输入的URIString uri = "https://www.example.com";// 创建URL对象URL url = new URL(uri);// 打开HTTP连接HttpURLConnection connection = (HttpURLConnection) url.openConnection();// 配置连接属性connection.setRequestMethod("GET");connection.setConnectTimeout(5000);connection.setReadTimeout(5000);// 发起请求int responseCode = connection.getResponseCode();if (responseCode == HttpURLConnection.HTTP_OK) {BufferedReader reader = new BufferedReader(new InputStreamReader(connection.getInputStream()));String line;StringBuilder content = new StringBuilder();while ((line = reader.readLine()) != null) {content.append(line);}reader.close();// 处理响应数据// 这里可以根据实际需要对响应数据进行处理,比如解析HTML内容等// ...} else {System.out.println("HTTP Request failed with response code: " + responseCode);}}
}

Python语言示例:

import socket
import ssl
import requestsdef main():# 用户输入的URIuri = "https://www.example.com"# 解析URI获取主机名和路径parsed_uri = requests.utils.urlparse(uri)host = parsed_uri.netlocpath = parsed_uri.path if parsed_uri.path else "/"# 建立TCP连接并进行SSL握手context = ssl.create_default_context()with socket.create_connection((host, 443)) as sock:with context.wrap_socket(sock, server_hostname=host) as ssock:request = f"GET {path} HTTP/1.1\r\nHost: {host}\r\n\r\n"ssock.sendall(request.encode())response = ssock.recv(4096)response = response.decode("utf-8")# 处理响应数据# 这里可以根据实际需要对响应数据进行处理,比如解析HTML内容等# ...if __name__ == "__main__":main()

上述代码示例分别展示了在不同编程语言中,从用户输入URI到页面显示的完整过程。这些示例包括了解析URI、建立TCP连接、发起HTTP请求、处理响应数据等步骤,帮助你更深入地理解浏览器加载页面的背后工作原理。

总结

从用户输入URI到页面最终显示,涉及了诸多复杂的过程。浏览器的背后有着域名解析、TCP连接、HTTP请求和服务器处理等多个环节。了解这些过程有助于我们更好地理解网络访问的原理,也有助于开发人员优化网站性能,提供更快速、更稳定的用户体验。无论是普通用户还是开发者,对于这个过程的了解都能让我们在互联网世界中更加游刃有余。

原创声明

======= ·

  • 原创作者: 猫头虎

作者wx: [ libin9iOak ]

学习复习

本文为原创文章,版权归作者所有。未经许可,禁止转载、复制或引用。

作者保证信息真实可靠,但不对准确性和完整性承担责任

未经许可,禁止商业用途。

如有疑问或建议,请联系作者。

感谢您的支持与尊重。

点击下方名片,加入IT技术核心学习团队。一起探索科技的未来,共同成长。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/30235.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

TypeScript学习笔记

1.ts和js的区别 2. ts的优势 3. ts下载后报错解决方法 报错: PS C:\Users\\Desktop> tsc -v tsc : 无法加载文件 C:\Users\32173\AppData\Roaming\npm\tsc.ps1,因为在此系统上禁止运行脚本。有关详细信息,请参阅 https:/ go.microsoft.com/fwlink/?…

【LeetCode每日一题】——205.同构字符串

文章目录 一【题目类别】二【题目难度】三【题目编号】四【题目描述】五【题目示例】六【题目提示】七【解题思路】八【时间频度】九【代码实现】十【提交结果】 一【题目类别】 哈希表 二【题目难度】 简单 三【题目编号】 205.同构字符串 四【题目描述】 给定两个字符…

资深媒体人宋繁银加入《数据猿》任总编辑,全面负责公司整体内容工作

大数据产业创新服务媒体 ——聚焦数据 改变商业 2023年7月北京,《数据猿》宣布正式任命宋繁银为总编辑,全面负责公司整体内容工作。此次重要的人事任命标志着《数据猿》的发展迈上了一个新的台阶,对于《数据猿》团队而言,不仅是一…

redis的事务和watch机制

这里写目录标题 第一章、redis事务和watch机制1.1)redis事务,事务的三大命令语法:开启事务 multi语法:执行事务 exec语法:取消事务 discard 1.2)redis事务的错误和回滚的情况1.3)watch机制语法&…

VS Code安装使用教程

目录 1. VS Code是什么? 2. VS Code的下载和安装 下载: 安装: 2.2 环境的介绍 3. VS Code配置C/C开发环境 3.1 下载和配置MinGW-w64编译器套件 下载: 配置: 3.2 安装C/C插件 3.3 重启VSCode 4. 在VSCode上编…

06-3_Qt 5.9 C++开发指南_多窗体应用程序的设计(主要的窗体类及其用途;窗体类重要特性设置;多窗口应用程序设计)

文章目录 1. 主要的窗体类及其用途2. 窗体类重要特性的设置2.1 setAttribute()函数2.2 setWindowFlags()函数2.3 setWindowState()函数2.4 setWindowModality()函数2.5 setWindowOpacity()函数 3. 多窗口应用程序设计3.1 主窗口设计3.2 QFormDoc类的设计3.3 QFormDoc类的使用3.…

linux自定义网络访问规则

1.更改防火墙默认区域为trusted firewall-cmd --set-default-zonetrusted 2.新建一个zone,将想要访问本机80端口的ip,如:192.168.3.99 ,添加的这个zone中,同时在这个zone中放行80端口。 firewall-cmd --permanent --ne…

node配置Web 服务器

1、什么是 Web 服务器 Web服务器一般指网站服务器,是指驻留于因特网上某种类型计算机的程序,Web服务器的基本功能就是提供Web信息浏览服务。 它只需支持HTTP协议、HTML文档格式及URL,与客户端的网络浏览器配合。 大多数 web 服务器都支持服…

Javascript 正则

基本语法 定义 JavaScript种正则表达式有两种定义方式 构造函数 var regnew RegExp(<%[^%>]%>,g);字面量 var reg/<%[^%>]%>/g;g&#xff1a; global&#xff0c;全文搜索&#xff0c;默认搜索到第一个结果接停止i&#xff1a;ingore case&#xff0c;忽略…

接口自动化测试框架及接口测试自动化主要知识点

接口自动化测试框架&#xff1a; 接口测试框架&#xff1a;使用最流行的Requests进行接口测试接口请求构造&#xff1a;常见的GET/POST/PUT/HEAD等HTTP请求构造 接口测试断言&#xff1a;状态码、返回内容等断言JSON/XML请求&#xff1a;发送json\xml请求JSON/XML响应断言&…

绝了!工业配电柜看这篇就够了!

随着工业自动化的不断发展&#xff0c;电力作为生产的重要支撑&#xff0c;其稳定性、安全性和高效性变得尤为重要。 配电柜作为电力系统的核心组成部分&#xff0c;其监控不仅关乎生产的连续性&#xff0c;也涉及员工和设备的安全。通过实时监测、数据采集和分析&#xff0c;工…

Linux 上安装部署Nacos

标题&#xff1a;在Linux上安装和部署Nacos Nacos是一个开源的分布式服务发现和配置管理平台&#xff0c;它可以帮助开发人员实现微服务架构中的服务注册、发现和动态配置管理。 步骤1&#xff1a;准备工作 在开始安装Nacos之前&#xff0c;确保您已经具备以下条件&#xff1…

Mongoose http server 例子

今天抽了点时间看了一下 mongoose的源码&#xff0c; github 地址&#xff0c;发现跟以前公司内部使用的不太一样&#xff0c;这里正好利用其 http server 例子来看一下。以前的 http message 结构体是这样的&#xff1a; /* HTTP message */ struct http_message {struct mg_…

css的transform样式计算-第一节

本文作者为 360 奇舞团前端开发工程师 引言 在使用 css 样式进行样式的缩放、旋转等设置时&#xff0c;思考了一下它的较浅层的原理&#xff0c;恩&#xff0c;这个阶段都 是一些初高的数学计算&#xff0c;从新看这里的时候顺便捡了捡初高中的数学&#xff0c;比如三角函数之类…

CSS:盒子模型 与 多种横向布局方法

目录 盒子模型块级盒子内联级盒子内联块级盒子弹性盒子display 改变模型区域划分text 内容区padding 填充区border 边框区margin 外边距直接设置盒子大小 布局横向布局方法一 float 浮起来方法二 内联块级元素实现方法三 弹性盒子模型 盒子模型 块级盒子 独占一行&#xff0c…

React中使用mobx管理状态数据使用样例

MobX 是一个身经百战的库&#xff0c;它通过运用透明的函数式响应编程&#xff08;Transparent Functional Reactive Programming&#xff0c;TFRP&#xff09;使状态管理变得简单和可扩展。官网地址&#xff1a;关于 MobX | MobX中文文档 | MobX中文网 安装依赖 mobx-react-…

QT的信号槽的四种写法和五种链接方式

目录 四种信号槽写法&#xff1a; 五种连接方式&#xff1a; 实例&#xff1a; 常见错误及改正&#xff1a; 错误1: 未连接信号与槽 错误2: 信号和槽参数不匹配 错误3: 未使用Q_OBJECT宏 错误4: 跨线程连接未处理 在Qt中&#xff0c;信号&#xff08;Signal&#xff09…

openEuler-OECA考试报名火热开启,尊享半价优惠 作者:HopeInfra 发布时间:2023-08-10

近日&#xff0c;润和软件人才评定报名系统已成功上线运行&#xff0c;现openEuler-OECA人才评定考试报名优惠活动火热开启&#xff0c;欢迎大家报名咨询&#xff01; 关于openEuler人才评定 随着openEuler及其发行版本在各个行业使用量逐年增多&#xff0c;相关人才的评定诉求…

突破笔试:力扣129. 求根节点到叶节点数字之和

1. 题目链接&#xff1a;129. 求根节点到叶节点数字之和 给你一个二叉树的根节点 root &#xff0c;树中每个节点都存放有一个 0 到 9 之间的数字。每条从根节点到叶节点的路径都代表一个数字&#xff1a;例如&#xff0c;从根节点到叶节点的路径 1 -> 2 -> 3 表示数字 …

http相关知识点

文章目录 长链接http周边会话保持方案1方案2 基本工具postmanFiddlerFiddler的原理 长链接 一张网页实际上可能会有多种元素组成&#xff0c;这也就说明了网页需要多次的http请求。可由于http是基于TCP的&#xff0c;而TCP创建链接是有代价的&#xff0c;因此频繁的创建链接会…