【Linux网络】传输层协议TCP(六)补充 - 面试题:HTTP 获取网页的完整过程

🎬 个人主页艾莉丝努力练剑
专栏传送门 :《C语言》《数据结构与算法》《C/C++干货分享&学习过程记录
Linux操作系统编程详解》《笔试/面试常见算法:从基础到进阶》《Python干货分享

⭐️为天地立心,为生民立命,为往圣继绝学,为万世开太平


🎬 艾莉丝的简介:


文章目录

  • 思维导图
  • [0 ~> 整体流程概述](#0 ~> 整体流程概述)
  • [1 ~> 阶段 1:用户输入 URL 与浏览器预处理](#1 ~> 阶段 1:用户输入 URL 与浏览器预处理)
    • [1.1 URL 解析](#1.1 URL 解析)
    • [1.2 HSTS 检查](#1.2 HSTS 检查)
    • [1.3 浏览器缓存检查](#1.3 浏览器缓存检查)
  • [2 ~> 阶段 2:DNS 域名解析](#2 ~> 阶段 2:DNS 域名解析)
  • [3 ~> 阶段 3:TCP 连接建立](#3 ~> 阶段 3:TCP 连接建立)
    • [3.1 HTTPS 额外步骤:TLS 握手](#3.1 HTTPS 额外步骤:TLS 握手)
      • [TLS 1.2 握手过程](#TLS 1.2 握手过程)
      • [TLS 1.3 握手过程](#TLS 1.3 握手过程)
  • [4 ~> 阶段 4:HTTP 请求构建与发送](#4 ~> 阶段 4:HTTP 请求构建与发送)
    • [4.1 HTTP 请求报文结构](#4.1 HTTP 请求报文结构)
      • [4.1.1 请求行](#4.1.1 请求行)
      • [4.1.2 请求头](#4.1.2 请求头)
      • [4.1.3 请求体](#4.1.3 请求体)
    • [4.2 HTTP 请求发送](#4.2 HTTP 请求发送)
  • [5 ~> 阶段 5:服务器处理与 HTTP 响应构建](#5 ~> 阶段 5:服务器处理与 HTTP 响应构建)
    • [5.1 服务器接收与解析请求](#5.1 服务器接收与解析请求)
    • [5.2 业务处理](#5.2 业务处理)
    • [5.3 HTTP 响应报文结构](#5.3 HTTP 响应报文结构)
      • [5.3.1 状态行](#5.3.1 状态行)
      • [5.3.2 响应头](#5.3.2 响应头)
      • [5.3.3 响应体](#5.3.3 响应体)
    • [5.4 HTTP 响应发送](#5.4 HTTP 响应发送)
  • [6 ~> 阶段 6:客户端接收与处理响应](#6 ~> 阶段 6:客户端接收与处理响应)
  • [7 ~> 阶段 7:TCP 连接关闭](#7 ~> 阶段 7:TCP 连接关闭)
    • [7.1 短连接与长连接](#7.1 短连接与长连接)
    • [7.2 TCP 四次挥手](#7.2 TCP 四次挥手)
  • [8 ~> 阶段 8:浏览器页面渲染](#8 ~> 阶段 8:浏览器页面渲染)
  • [9 ~> 面试高频考点总结](#9 ~> 面试高频考点总结)
  • 本文总结
  • 结尾


思维导图


0 ~> 整体流程概述

当用户在浏览器地址栏输入一个 URL(如https://www.example.com/index.html?name=test#top)并按下回车键后,整个过程会经历8 个核心阶段,从最底层的网络通信到最上层的页面渲染,涉及 DNS、TCP、HTTP、浏览器渲染引擎等多个技术栈。这是后端、前端、网络工程师岗位最经典的面试题之一,考察对整个网络协议栈和浏览器工作原理的综合理解。


1 ~> 阶段 1:用户输入 URL 与浏览器预处理

1.1 URL 解析

浏览器首先会对输入的 URL 进行严格解析,提取出以下核心组成部分:

  • 协议 (Protocol)https,决定了后续使用的传输协议和端口号(HTTPS 默认 443,HTTP 默认 80)
  • 域名 (Domain)www.example.com,需要通过 DNS 解析为 IP 地址
  • 端口 (Port) :可选,如https://www.example.com:8080中的 8080,未指定则使用协议默认端口
  • 路径 (Path)/index.html,服务器上资源的具体路径
  • 查询参数 (Query)?name=test,传递给服务器的键值对参数
  • 锚点 (Anchor)#top,浏览器内部使用,不会发送到服务器

1.2 HSTS 检查

浏览器会检查 HSTS(HTTP Strict Transport Security)列表,如果该域名在列表中,浏览器会强制使用 HTTPS 协议发送请求,而不是 HTTP,防止中间人攻击。

1.3 浏览器缓存检查

浏览器会首先检查自身的缓存机制,判断是否可以直接使用本地缓存的资源,而不需要向服务器发送请求:

  • 强缓存 :检查Cache-ControlExpires字段,如果缓存未过期,直接从本地缓存读取资源,不发送任何 HTTP 请求
  • 协商缓存 :如果强缓存过期,浏览器会发送带有If-Modified-SinceIf-None-Match头的请求到服务器,服务器判断资源是否有更新。如果没有更新,返回 304 Not Modified,浏览器继续使用本地缓存;如果有更新,返回 200 OK 和新的资源。

2 ~> 阶段 2:DNS 域名解析

如果缓存检查没有命中,浏览器需要将域名解析为服务器的 IP 地址。DNS 解析是一个分层的查询过程,按照以下顺序依次进行:

  1. 浏览器 DNS 缓存:浏览器会缓存最近解析过的域名和 IP 地址的映射关系,缓存时间通常为几分钟到几小时。
  2. 操作系统 DNS 缓存:如果浏览器缓存没有命中,浏览器会调用操作系统的 DNS 解析函数,查询操作系统的 DNS 缓存。
  3. 本地 hosts 文件 :如果操作系统缓存也没有命中,操作系统会检查本地的hosts文件(Linux:/etc/hosts,Windows:C:\Windows\System32\drivers\etc\hosts),查看是否有手动配置的域名映射。
  4. 递归查询本地 DNS 服务器:如果以上都没有命中,操作系统会向本地 DNS 服务器(通常由 ISP 提供)发送递归查询请求。本地 DNS 服务器会全权负责后续的查询过程,直到获取到 IP 地址并返回给客户端。
  5. 迭代查询根域名服务器:如果本地 DNS 服务器也没有缓存该域名的记录,它会向根域名服务器发送迭代查询请求。
  6. 迭代查询顶级域名服务器 :根域名服务器会返回该域名对应的顶级域名服务器(如.com服务器)的地址。
  7. 迭代查询权威域名服务器:顶级域名服务器会返回该域名对应的权威域名服务器的地址。
  8. 权威域名服务器返回 IP 地址:权威域名服务器会查询自己的数据库,返回该域名对应的 IP 地址给本地 DNS 服务器。
  9. 本地 DNS 服务器缓存并返回结果:本地 DNS 服务器会将解析结果缓存起来,然后返回给客户端操作系统,操作系统再返回给浏览器。

整个 DNS 解析过程使用 UDP 协议(少数情况下使用 TCP),端口号为 53。


3 ~> 阶段 3:TCP 连接建立

获取到服务器的 IP 地址后,浏览器会向服务器的对应端口(HTTPS 443,HTTP 80)发起 TCP 连接建立请求。TCP 连接建立通过三次握手完成:

  1. 第一次握手 :客户端向服务器发送一个 SYN 报文,报文的序号字段为客户端随机生成的初始序号ISN_c。此时客户端处于SYN_SENT状态。
  2. 第二次握手 :服务器收到 SYN 报文后,向客户端发送一个 SYN+ACK 报文。报文的确认号字段为ISN_c + 1,序号字段为服务器随机生成的初始序号ISN_s。此时服务器处于SYN_RCVD状态。
  3. 第三次握手 :客户端收到 SYN+ACK 报文后,向服务器发送一个 ACK 报文。报文的确认号字段为ISN_s + 1。此时客户端和服务器都进入ESTABLISHED状态,TCP 连接正式建立。

三次握手的目的是确认双方的发送能力和接收能力都正常,并同步双方的初始序号。

3.1 HTTPS 额外步骤:TLS 握手

如果使用的是 HTTPS 协议,在 TCP 连接建立后,还需要进行 TLS 握手过程,建立加密通道:

TLS 1.2 握手过程

  1. 客户端 Hello :客户端向服务器发送客户端 Hello 报文,包含客户端支持的 TLS 版本、加密套件列表、随机数Random_c
  2. 服务器 Hello :服务器向客户端发送服务器 Hello 报文,包含选择的 TLS 版本、加密套件、随机数Random_s
  3. 服务器证书:服务器向客户端发送自己的数字证书,证书包含服务器的公钥。
  4. 服务器 Hello Done:服务器发送服务器 Hello Done 报文,表示服务器 Hello 阶段结束。
  5. 客户端密钥交换 :客户端验证服务器证书的合法性后,生成一个预主密钥Pre-Master Secret,用服务器的公钥加密后发送给服务器。
  6. 客户端 Change Cipher Spec:客户端发送 Change Cipher Spec 报文,表示后续的数据将使用协商好的密钥和加密算法进行加密。
  7. 客户端 Finished:客户端发送 Finished 报文,包含之前所有握手报文的哈希值,供服务器验证。
  8. 服务器 Change Cipher Spec:服务器发送 Change Cipher Spec 报文。
  9. 服务器 Finished:服务器发送 Finished 报文,包含之前所有握手报文的哈希值,供客户端验证。

TLS 握手完成后,双方就可以使用对称加密算法进行加密通信了。

TLS 1.3 握手过程

TLS 1.3 对握手过程进行了优化,将原来的 2 个 RTT(往返时间)减少到 1 个 RTT,甚至 0 个 RTT(会话恢复),大大提高了连接建立的速度。


4 ~> 阶段 4:HTTP 请求构建与发送

TCP 连接建立后,浏览器会构建一个标准的 HTTP 请求报文,并通过 TCP 连接发送给服务器。

4.1 HTTP 请求报文结构

HTTP 请求报文由三部分组成:请求行请求头请求体,各部分之间用空行分隔。

4.1.1 请求行

请求行是 HTTP 请求的第一行,格式为:

bash 复制代码
<Method> <Request-URI> <HTTP-Version>
  • Method:HTTP 请求方法,常见的有 GET、POST、PUT、DELETE、HEAD、OPTIONS 等
  • Request-URI :请求的资源路径,如/index.html?name=test
  • HTTP-Version:HTTP 协议版本,常见的有 HTTP/1.1、HTTP/2、HTTP/3

示例:

bash 复制代码
GET /index.html?name=test HTTP/1.1

4.1.2 请求头

请求头由多个键值对组成,每个键值对占一行,格式为Key: Value。请求头包含了客户端的各种信息和对服务器的要求。

常见的核心请求头字段:

  • Host:服务器的域名和端口号,如Host: www.example.com,HTTP/1.1 协议要求必须包含此字段
  • User-Agent:客户端的浏览器信息,如User-Agent: Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/120.0.0.0 Safari/537.36
  • Accept:客户端能够接收的媒体类型,如Accept: text/html,application/xhtml+xml,application/xml;q=0.9,image/avif,image/webp,*/*;q=0.8
  • Accept-Language:客户端能够接收的语言,如Accept-Language: zh-CN,zh;q=0.9,en;q=0.8
  • Accept-Encoding:客户端能够接收的编码方式,如Accept-Encoding: gzip, deflate, br
  • Connection:连接管理,如Connection: keep-alive表示使用长连接
  • Cookie:客户端存储的 Cookie 信息,用于会话管理
  • Referer:当前请求的来源页面 URL
  • Cache-Control:缓存控制,如Cache-Control: max-age=0

4.1.3 请求体

请求体是 HTTP 请求的可选部分,只有 POST、PUT、PATCH 等方法才会携带请求体。请求体包含了要发送给服务器的数据,常见的格式有:

  • application/x-www-form-urlencoded:表单数据,如name=test&age=20
  • application/json:JSON 数据,如{"name":"test","age":20}
  • multipart/form-data:文件上传数据
  • text/plain:纯文本数据

4.2 HTTP 请求发送

HTTP 请求报文构建完成后,会被交给 TCP 协议栈进行传输。TCP 会将 HTTP 请求报文拆分成多个合适大小的 TCP 段,然后通过滑动窗口和拥塞控制机制,可靠地传输到服务器。


5 ~> 阶段 5:服务器处理与 HTTP 响应构建

服务器收到 TCP 段后,会按照序号将它们重组为完整的 HTTP 请求报文,然后进行处理,并构建 HTTP 响应报文返回给客户端。

5.1 服务器接收与解析请求

服务器的 TCP 协议栈会将收到的 TCP 段重组为完整的字节流,然后交给 HTTP 服务器(如 Nginx、Apache、Tomcat 等)。HTTP 服务器会解析 HTTP 请求报文,提取出请求方法、URL、请求头、请求体等信息。

5.2 业务处理

HTTP 服务器会根据请求的 URL 和方法,将请求路由到对应的业务处理程序。业务处理程序会执行相应的逻辑,可能包括:

  • 查询数据库获取数据
  • 调用其他微服务接口
  • 进行身份验证和授权
  • 生成动态 HTML 页面
  • 处理文件上传下载等

5.3 HTTP 响应报文结构

业务处理完成后,服务器会构建一个标准的 HTTP 响应报文。HTTP 响应报文也由三部分组成:状态行响应头响应体,各部分之间用空行分隔。

5.3.1 状态行

状态行是 HTTP 响应的第一行,格式为:

bash 复制代码
<HTTP-Version> <Status-Code> <Reason-Phrase>
  • HTTP-Version:HTTP 协议版本
  • Status-Code:HTTP 状态码,表示请求的处理结果
  • Reason-Phrase:状态码的文本描述

常见的 HTTP 状态码:

  • 1xx:信息性状态码,表示请求已接收,继续处理
  • 2xx:成功状态码,表示请求已成功处理
    • 200 OK:请求成功
    • 201 Created:资源创建成功
  • 3xx:重定向状态码,表示需要进一步操作才能完成请求
    • 301 Moved Permanently:永久重定向
    • 302 Found:临时重定向
    • 304 Not Modified:资源未修改,使用缓存
  • 4xx:客户端错误状态码,表示请求有错误
    • 400 Bad Request:请求参数错误
    • 401 Unauthorized:未授权
    • 403 Forbidden:禁止访问
    • 404 Not Found:资源不存在
  • 5xx:服务器错误状态码,表示服务器处理请求时发生错误
    • 500 Internal Server Error:服务器内部错误
    • 502 Bad Gateway:网关错误
    • 503 Service Unavailable:服务不可用

示例:

bash 复制代码
HTTP/1.1 200 OK

5.3.2 响应头

响应头和请求头类似,也是由多个键值对组成,包含了服务器的各种信息和对客户端的要求。

常见的核心响应头字段:

  • Server:服务器软件信息,如Server: nginx/1.24.0
  • Date:响应生成的时间,如Date: Sat, 30 May 2026 12:00:00 GMT
  • Content-Type:响应体的媒体类型,如Content-Type: text/html; charset=utf-8
  • Content-Length:响应体的长度,单位为字节
  • Content-Encoding:响应体的编码方式,如Content-Encoding: gzip
  • Cache-Control:缓存控制,如Cache-Control: max-age=3600表示缓存 1 小时
  • Set-Cookie:设置客户端的 Cookie
  • Location:重定向的目标 URL,用于 3xx 状态码
  • ETag:资源的实体标签,用于协商缓存
  • Last-Modified:资源的最后修改时间,用于协商缓存

5.3.3 响应体

响应体是 HTTP 响应的主体部分,包含了请求的资源内容。根据Content-Type的不同,响应体可以是 HTML 文本、JSON 数据、图片、视频、文件等。

5.4 HTTP 响应发送

HTTP 响应报文构建完成后,同样会被交给 TCP 协议栈,拆分成多个 TCP 段,可靠地传输到客户端。


6 ~> 阶段 6:客户端接收与处理响应

客户端收到 TCP 段后,会按照序号将它们重组为完整的 HTTP 响应报文,然后进行处理。

  1. TCP 重组:TCP 协议栈按照序号将收到的 TCP 段重组为完整的字节流。
  2. HTTP 响应解析:浏览器的 HTTP 解析器会解析 HTTP 响应报文,提取出状态码、响应头、响应体等信息。
  3. 状态码判断:浏览器根据状态码判断请求的处理结果。如果是 3xx 重定向,浏览器会自动向新的 URL 发送请求;如果是 4xx 或 5xx 错误,浏览器会显示错误页面。
  4. 响应头处理 :浏览器会根据响应头的信息进行相应的处理,例如根据Set-Cookie设置 Cookie,根据Content-Encoding对响应体进行解压,根据Cache-Control更新缓存等。
  5. 响应体解析 :浏览器会根据Content-Type解析响应体的内容。如果是 HTML 文本,会交给渲染引擎进行页面渲染;如果是 JSON 数据,会交给 JavaScript 进行处理;如果是图片、视频等资源,会直接显示或下载。

7 ~> 阶段 7:TCP 连接关闭

HTTP 请求和响应传输完成后,TCP 连接可以选择关闭或者保持长连接。

7.1 短连接与长连接

  • 短连接:HTTP/1.0 默认使用短连接,每次 HTTP 请求完成后,TCP 连接就会关闭。下一次请求需要重新建立 TCP 连接。
  • 长连接 :HTTP/1.1 默认使用长连接,通过Connection: keep-alive头字段实现。一个 TCP 连接可以传输多个 HTTP 请求和响应,减少了 TCP 连接建立和关闭的开销,提高了性能。

长连接不会一直保持,当连接空闲一段时间后(通常是 60 秒),服务器或客户端会主动关闭连接。

7.2 TCP 四次挥手

TCP 连接关闭通过四次挥手完成:

  1. 第一次挥手 :主动关闭方(可以是客户端或服务器)向对方发送一个 FIN 报文,表示自己没有数据要发送了,请求关闭连接。此时主动关闭方处于FIN_WAIT_1状态。
  2. 第二次挥手 :被动关闭方收到 FIN 报文后,向对方发送一个 ACK 报文,表示确认收到 FIN 报文。此时被动关闭方处于CLOSE_WAIT状态,主动关闭方处于FIN_WAIT_2状态。
  3. 第三次挥手 :被动关闭方处理完所有剩余数据后,向对方发送一个 FIN 报文,表示自己也没有数据要发送了,请求关闭连接。此时被动关闭方处于LAST_ACK状态。
  4. 第四次挥手 :主动关闭方收到 FIN 报文后,向对方发送一个 ACK 报文,表示确认收到 FIN 报文。此时主动关闭方处于TIME_WAIT状态,等待 2MSL(最长报文寿命,通常为 2 分钟)后,进入CLOSED状态。被动关闭方收到 ACK 报文后,立即进入CLOSED状态。

四次挥手的目的是确保双方所有的数据都已经传输完成,并且双方都同意关闭连接。


8 ~> 阶段 8:浏览器页面渲染

如果响应体是 HTML 文本,浏览器的渲染引擎会对其进行解析和渲染,最终将页面显示在屏幕上。页面渲染过程分为以下几个步骤:

  1. HTML 解析生成 DOM 树:渲染引擎会逐行解析 HTML 文本,将其转换为 DOM(文档对象模型)树。DOM 树是 HTML 文档的树形表示,每个节点代表一个 HTML 元素。
  2. CSS 解析生成 CSSOM 树:同时,渲染引擎会解析 CSS 代码,将其转换为 CSSOM(CSS 对象模型)树。CSSOM 树是 CSS 样式的树形表示,每个节点代表一个 CSS 规则。
  3. 合成渲染树:渲染引擎会将 DOM 树和 CSSOM 树合并,生成渲染树(Render Tree)。渲染树只包含需要显示的节点,并且每个节点都包含了对应的样式信息。
  4. 布局 (Layout):渲染引擎会计算渲染树中每个节点的大小和位置,这个过程叫做布局或重排。
  5. 绘制 (Paint):渲染引擎会根据布局结果,将每个节点绘制到屏幕上,这个过程叫做绘制或重绘。
  6. 合成 (Composite):现代浏览器会将页面分成多个图层,分别进行绘制,然后将多个图层合成在一起,形成最终的页面。这个过程叫做合成,可以大大提高渲染性能。

在页面渲染过程中,浏览器还会异步加载其他资源,如 JavaScript 文件、图片、字体、视频等。JavaScript 文件的加载和执行会阻塞页面的渲染,因为 JavaScript 可以修改 DOM 和 CSSOM。

9 ~> 面试高频考点总结

  1. DNS 解析的完整过程:递归查询和迭代查询的区别,各级 DNS 服务器的作用。
  2. TCP 三次握手和四次挥手的过程:为什么是三次握手而不是两次?为什么是四次挥手?TIME_WAIT 状态的作用是什么?
  3. HTTPS 的 TLS 握手过程:TLS 1.2 和 TLS 1.3 的区别,对称加密和非对称加密的作用。
  4. HTTP 请求和响应报文的结构:常见的请求头和响应头字段的含义。
  5. HTTP 状态码:常见状态码的含义和使用场景。
  6. HTTP 缓存机制 :强缓存和协商缓存的区别,Cache-ControlETagLast-Modified等字段的作用。
  7. HTTP 长连接和短连接的区别:长连接的优势和适用场景。
  8. 浏览器页面渲染过程:DOM 树、CSSOM 树、渲染树的生成过程,重排和重绘的区别。

本文总结

TCP 协议是计算机网络领域最伟大的发明之一。它用软件的方法解决了硬件网络不可靠的问题,为上层应用提供了一个简单、可靠、高效的端到端传输服务。TCP 协议的设计充满了智慧,它的很多思想和方法,如滑动窗口、拥塞控制、超时重传等,已经被广泛应用于其他分布式系统的设计中。

深入理解 TCP 协议,不仅是学习计算机网络的必经之路,也是成为一名优秀后端工程师的必备技能。希望本文能够帮助你全面、系统地掌握 TCP 协议的核心知识点,为你的学习和工作提供有力的支持。


结尾

uu们,本文的内容到这里就全部结束了,艾莉丝在这里再次感谢您的阅读!

|-----------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------|
| ### 艾莉丝努力练剑 C/C++ & Linux 底层探索者 | 一个正在努力练剑的技术博主 *** ** * ** *** 👀 【关注】 跟随我一起深耕技术领域,见证每一次成长。 ❤️ 【点赞】 让优质内容被更多人看见,让知识传递更有力量。 ⭐ 【收藏】 把核心知识点存好,在需要时随时查、随时用。 💬 【评论】 分享你的经验或疑问,评论区一起交流避坑! 不要忘记给博主"一键四连"哦! "今日练剑达成!" "技术之路难免有困惑,但同行的人会让前进更有方向。" |

结语:希望对学习Linux相关内容的uu有所帮助,不要忘记给博主"一键四连"哦!

往期回顾

【Linux网络】Linux 网络编程:传输层协议TCP(五)

🗡博主在这里放了一只小狗,大家看完了摸摸小狗放松一下吧!🗡 ૮₍ ˶ ˊ ᴥ ˋ˶₎ა

相关推荐
norsd1 小时前
CentOS Rocky Linux 设置 ip
linux·tcp/ip·centos
越甲八千1 小时前
本地验证http服务器拉取文件
服务器·网络协议·http
minji...1 小时前
Linux高级IO(六)基于ET模式、单reactor反应堆的epoll版本的TCP计算服务器
linux·服务器·网络·c++·epoll·socket套接字·reactor反应堆模式
jcbut2 小时前
在Linux上安装Kingbase 9
linux·kingbase·人大金仓·电科金仓
小此方3 小时前
Re:Linux系统篇(二十六)进程篇·十一:从底层原理到 exec* 家族:彻底搞懂 Linux 进程程序替换
linux·运维·服务器
码农小白AI11 小时前
AI报告审核加速融入自动化实验室:IACheck破解智能设备时代报告管理新挑战
运维·人工智能·自动化
utf8mb4安全女神11 小时前
克隆的虚拟机怎么更改ip地址
运维
赵民勇11 小时前
fuse-overlayfs命令详解
linux·容器
sulikey11 小时前
个人Linux操作系统学习笔记6 - 操作系统与进程初识
linux·笔记·学习·操作系统·进程