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

本文涉及的产品
全局流量管理 GTM,标准版 1个月
云解析 DNS,旗舰版 1个月
公共DNS(含HTTPDNS解析),每月1000万次HTTP解析
简介: 揭秘浏览器键入URI到页面显示的过程: 浏览器键入URI,到页面显示,中间发生什么?

🌷🍁 博主猫头虎 带您 Go to New World.✨🍁

🦄 博客首页——猫头虎的博客🎐

🐳《面试题大全专栏》 文章图文并茂🦕生动形象🦖简单易学!欢迎大家来踩踩~🌺

🌊 《IDEA开发秘籍专栏》学会IDEA常用操作,工作效率翻倍~💐

🌊 《100天精通Golang(基础入门篇)》学会Golang语言,畅玩云原生,走遍大小厂~💐

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

在日常使用互联网的过程中,我们经常会使用浏览器访问各种网页,但你是否曾经好奇,当我们在浏览器中键入一个网址(也称为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 main
import (
  "fmt"
  "net"
  "net/http"
  "time"
)
func main() {
  // 用户输入的URI
  uri := "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 {
        // 用户输入的URI
        String 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 requests
def main():
    # 用户输入的URI
    uri = "https://www.example.com"
    # 解析URI获取主机名和路径
    parsed_uri = requests.utils.urlparse(uri)
    host = parsed_uri.netloc
    path = 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技术核心学习团队。一起探索科技的未来,共同成长。

目录
相关文章
|
6月前
|
缓存 JavaScript
vue阻止浏览器刷新和关闭页面提示
使用场景:在使用vuex进行缓存管理时,页面的缓存会随着页面关闭而消失,如果缓存动作仍在进行中,关闭页面会导致数据丢失,此时需要阻止页面关闭
1141 3
|
6月前
|
数据采集 Web App开发 JSON
浏览器插件:WebScraper基本用法和抓取页面内容(不会编程也能爬取数据)
本文以百度为实战案例演示使用WebScraper插件抓取页面内容保存到文件中。以及WebScraper用法【2月更文挑战第1天】
433 2
浏览器插件:WebScraper基本用法和抓取页面内容(不会编程也能爬取数据)
|
17天前
|
存储 缓存 网络协议
计算机网络常见面试题(二):浏览器中输入URL返回页面过程、HTTP协议特点,GET、POST的区别,Cookie与Session
计算机网络常见面试题(二):浏览器中输入URL返回页面过程、HTTP协议特点、状态码、报文格式,GET、POST的区别,DNS的解析过程、数字证书、Cookie与Session,对称加密和非对称加密
|
19天前
|
域名解析 缓存 网络协议
浏览器中输入URL返回页面过程(超级详细)、DNS域名解析服务,TCP三次握手、四次挥手
浏览器中输入URL返回页面过程(超级详细)、DNS域名解析服务,TCP三次握手、四次挥手
|
5月前
|
前端开发 安全 UED
【项目实战】从终端到浏览器:实现 ANSI 字体在前端页面的彩色展示
在学习和工作中,我们经常需要使用日志来记录程序的运行状态和调试信息。而为了更好地区分不同的日志等级,我们可以使用不同的颜色来呈现,使其更加醒目和易于阅读。 在下图运行结果中,我们使用了 colorlog 库来实现彩色日志输出。通过定义不同日志等级对应的颜色,我们可以在控制台中以彩色的方式显示日志信息。例如,DEBUG 级别的日志使用白色,INFO 级别的日志使用绿色,WARNING 级别的日志使用黄色,ERROR 级别的日志使用红色,CRITICAL 级别的日志使用蓝色。
|
5月前
|
Web App开发 XML 开发框架
技术心得记录:在IE浏览器中的奇怪页面表现
技术心得记录:在IE浏览器中的奇怪页面表现
56 0
|
3月前
|
网络协议 前端开发 JavaScript
浏览器加载网页的幕后之旅:从URL到页面展示详解
【8月更文挑战第31天】当在浏览器地址栏输入URL并回车后,一系列复杂过程随即启动,包括DNS解析、TCP连接建立、HTTP请求发送、服务器请求处理及响应返回,最后是浏览器页面渲染。这一流程涉及网络通信、服务器处理和客户端渲染等多个环节。通过示例代码,本文详细解释了每个步骤,帮助读者深入理解Web应用程序的工作机制,从而在开发过程中作出更优决策。
62 5
|
6月前
【超实用】Angular如何修改当前页面网页浏览器url后面?param1=xxx&param2=xxx参数(多用于通过浏览器地址参数保存用户当前操作状态的需求),实现监听url路由切换、状态变化。
【超实用】Angular如何修改当前页面网页浏览器url后面?param1=xxx&param2=xxx参数(多用于通过浏览器地址参数保存用户当前操作状态的需求),实现监听url路由切换、状态变化。
【超实用】Angular如何修改当前页面网页浏览器url后面?param1=xxx&param2=xxx参数(多用于通过浏览器地址参数保存用户当前操作状态的需求),实现监听url路由切换、状态变化。
|
4月前
|
Web App开发 编解码
软件开发常见流程之兼容性和手机屏页面设计,PC端和移动端常见浏览器,国内的UC都是根据Webkit修改过来的内核,开发重点关注尺寸,常见移动端尺寸汇总,移动端,理想视口根据你设别的样式进行修改
软件开发常见流程之兼容性和手机屏页面设计,PC端和移动端常见浏览器,国内的UC都是根据Webkit修改过来的内核,开发重点关注尺寸,常见移动端尺寸汇总,移动端,理想视口根据你设别的样式进行修改
|
6月前
【超实用】Angular如何修改当前页面网页浏览器url后面?param1=xxx&param2=xxx参数(多用于通过浏览器地址参数保存用户当前操作状态的需求),实现监听url路由切换、状态变化。
【超实用】Angular如何修改当前页面网页浏览器url后面?param1=xxx&param2=xxx参数(多用于通过浏览器地址参数保存用户当前操作状态的需求),实现监听url路由切换、状态变化。