
🎬 个人主页 :艾莉丝努力练剑
❄专栏传送门 :《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-Control和Expires字段,如果缓存未过期,直接从本地缓存读取资源,不发送任何 HTTP 请求 - 协商缓存 :如果强缓存过期,浏览器会发送带有
If-Modified-Since或If-None-Match头的请求到服务器,服务器判断资源是否有更新。如果没有更新,返回 304 Not Modified,浏览器继续使用本地缓存;如果有更新,返回 200 OK 和新的资源。
2 ~> 阶段 2:DNS 域名解析
如果缓存检查没有命中,浏览器需要将域名解析为服务器的 IP 地址。DNS 解析是一个分层的查询过程,按照以下顺序依次进行:
- 浏览器 DNS 缓存:浏览器会缓存最近解析过的域名和 IP 地址的映射关系,缓存时间通常为几分钟到几小时。
- 操作系统 DNS 缓存:如果浏览器缓存没有命中,浏览器会调用操作系统的 DNS 解析函数,查询操作系统的 DNS 缓存。
- 本地 hosts 文件 :如果操作系统缓存也没有命中,操作系统会检查本地的
hosts文件(Linux:/etc/hosts,Windows:C:\Windows\System32\drivers\etc\hosts),查看是否有手动配置的域名映射。 - 递归查询本地 DNS 服务器:如果以上都没有命中,操作系统会向本地 DNS 服务器(通常由 ISP 提供)发送递归查询请求。本地 DNS 服务器会全权负责后续的查询过程,直到获取到 IP 地址并返回给客户端。
- 迭代查询根域名服务器:如果本地 DNS 服务器也没有缓存该域名的记录,它会向根域名服务器发送迭代查询请求。
- 迭代查询顶级域名服务器 :根域名服务器会返回该域名对应的顶级域名服务器(如
.com服务器)的地址。 - 迭代查询权威域名服务器:顶级域名服务器会返回该域名对应的权威域名服务器的地址。
- 权威域名服务器返回 IP 地址:权威域名服务器会查询自己的数据库,返回该域名对应的 IP 地址给本地 DNS 服务器。
- 本地 DNS 服务器缓存并返回结果:本地 DNS 服务器会将解析结果缓存起来,然后返回给客户端操作系统,操作系统再返回给浏览器。
整个 DNS 解析过程使用 UDP 协议(少数情况下使用 TCP),端口号为 53。
3 ~> 阶段 3:TCP 连接建立
获取到服务器的 IP 地址后,浏览器会向服务器的对应端口(HTTPS 443,HTTP 80)发起 TCP 连接建立请求。TCP 连接建立通过三次握手完成:
- 第一次握手 :客户端向服务器发送一个 SYN 报文,报文的序号字段为客户端随机生成的初始序号
ISN_c。此时客户端处于SYN_SENT状态。 - 第二次握手 :服务器收到 SYN 报文后,向客户端发送一个 SYN+ACK 报文。报文的确认号字段为
ISN_c + 1,序号字段为服务器随机生成的初始序号ISN_s。此时服务器处于SYN_RCVD状态。 - 第三次握手 :客户端收到 SYN+ACK 报文后,向服务器发送一个 ACK 报文。报文的确认号字段为
ISN_s + 1。此时客户端和服务器都进入ESTABLISHED状态,TCP 连接正式建立。
三次握手的目的是确认双方的发送能力和接收能力都正常,并同步双方的初始序号。
3.1 HTTPS 额外步骤:TLS 握手
如果使用的是 HTTPS 协议,在 TCP 连接建立后,还需要进行 TLS 握手过程,建立加密通道:
TLS 1.2 握手过程
- 客户端 Hello :客户端向服务器发送客户端 Hello 报文,包含客户端支持的 TLS 版本、加密套件列表、随机数
Random_c。 - 服务器 Hello :服务器向客户端发送服务器 Hello 报文,包含选择的 TLS 版本、加密套件、随机数
Random_s。 - 服务器证书:服务器向客户端发送自己的数字证书,证书包含服务器的公钥。
- 服务器 Hello Done:服务器发送服务器 Hello Done 报文,表示服务器 Hello 阶段结束。
- 客户端密钥交换 :客户端验证服务器证书的合法性后,生成一个预主密钥
Pre-Master Secret,用服务器的公钥加密后发送给服务器。 - 客户端 Change Cipher Spec:客户端发送 Change Cipher Spec 报文,表示后续的数据将使用协商好的密钥和加密算法进行加密。
- 客户端 Finished:客户端发送 Finished 报文,包含之前所有握手报文的哈希值,供服务器验证。
- 服务器 Change Cipher Spec:服务器发送 Change Cipher Spec 报文。
- 服务器 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.36Accept:客户端能够接收的媒体类型,如Accept: text/html,application/xhtml+xml,application/xml;q=0.9,image/avif,image/webp,*/*;q=0.8Accept-Language:客户端能够接收的语言,如Accept-Language: zh-CN,zh;q=0.9,en;q=0.8Accept-Encoding:客户端能够接收的编码方式,如Accept-Encoding: gzip, deflate, brConnection:连接管理,如Connection: keep-alive表示使用长连接Cookie:客户端存储的 Cookie 信息,用于会话管理Referer:当前请求的来源页面 URLCache-Control:缓存控制,如Cache-Control: max-age=0
4.1.3 请求体
请求体是 HTTP 请求的可选部分,只有 POST、PUT、PATCH 等方法才会携带请求体。请求体包含了要发送给服务器的数据,常见的格式有:
application/x-www-form-urlencoded:表单数据,如name=test&age=20application/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.0Date:响应生成的时间,如Date: Sat, 30 May 2026 12:00:00 GMTContent-Type:响应体的媒体类型,如Content-Type: text/html; charset=utf-8Content-Length:响应体的长度,单位为字节Content-Encoding:响应体的编码方式,如Content-Encoding: gzipCache-Control:缓存控制,如Cache-Control: max-age=3600表示缓存 1 小时Set-Cookie:设置客户端的 CookieLocation:重定向的目标 URL,用于 3xx 状态码ETag:资源的实体标签,用于协商缓存Last-Modified:资源的最后修改时间,用于协商缓存
5.3.3 响应体
响应体是 HTTP 响应的主体部分,包含了请求的资源内容。根据Content-Type的不同,响应体可以是 HTML 文本、JSON 数据、图片、视频、文件等。
5.4 HTTP 响应发送
HTTP 响应报文构建完成后,同样会被交给 TCP 协议栈,拆分成多个 TCP 段,可靠地传输到客户端。
6 ~> 阶段 6:客户端接收与处理响应
客户端收到 TCP 段后,会按照序号将它们重组为完整的 HTTP 响应报文,然后进行处理。
- TCP 重组:TCP 协议栈按照序号将收到的 TCP 段重组为完整的字节流。
- HTTP 响应解析:浏览器的 HTTP 解析器会解析 HTTP 响应报文,提取出状态码、响应头、响应体等信息。
- 状态码判断:浏览器根据状态码判断请求的处理结果。如果是 3xx 重定向,浏览器会自动向新的 URL 发送请求;如果是 4xx 或 5xx 错误,浏览器会显示错误页面。
- 响应头处理 :浏览器会根据响应头的信息进行相应的处理,例如根据
Set-Cookie设置 Cookie,根据Content-Encoding对响应体进行解压,根据Cache-Control更新缓存等。 - 响应体解析 :浏览器会根据
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 连接关闭通过四次挥手完成:
- 第一次挥手 :主动关闭方(可以是客户端或服务器)向对方发送一个 FIN 报文,表示自己没有数据要发送了,请求关闭连接。此时主动关闭方处于
FIN_WAIT_1状态。 - 第二次挥手 :被动关闭方收到 FIN 报文后,向对方发送一个 ACK 报文,表示确认收到 FIN 报文。此时被动关闭方处于
CLOSE_WAIT状态,主动关闭方处于FIN_WAIT_2状态。 - 第三次挥手 :被动关闭方处理完所有剩余数据后,向对方发送一个 FIN 报文,表示自己也没有数据要发送了,请求关闭连接。此时被动关闭方处于
LAST_ACK状态。 - 第四次挥手 :主动关闭方收到 FIN 报文后,向对方发送一个 ACK 报文,表示确认收到 FIN 报文。此时主动关闭方处于
TIME_WAIT状态,等待 2MSL(最长报文寿命,通常为 2 分钟)后,进入CLOSED状态。被动关闭方收到 ACK 报文后,立即进入CLOSED状态。
四次挥手的目的是确保双方所有的数据都已经传输完成,并且双方都同意关闭连接。
8 ~> 阶段 8:浏览器页面渲染
如果响应体是 HTML 文本,浏览器的渲染引擎会对其进行解析和渲染,最终将页面显示在屏幕上。页面渲染过程分为以下几个步骤:
- HTML 解析生成 DOM 树:渲染引擎会逐行解析 HTML 文本,将其转换为 DOM(文档对象模型)树。DOM 树是 HTML 文档的树形表示,每个节点代表一个 HTML 元素。
- CSS 解析生成 CSSOM 树:同时,渲染引擎会解析 CSS 代码,将其转换为 CSSOM(CSS 对象模型)树。CSSOM 树是 CSS 样式的树形表示,每个节点代表一个 CSS 规则。
- 合成渲染树:渲染引擎会将 DOM 树和 CSSOM 树合并,生成渲染树(Render Tree)。渲染树只包含需要显示的节点,并且每个节点都包含了对应的样式信息。
- 布局 (Layout):渲染引擎会计算渲染树中每个节点的大小和位置,这个过程叫做布局或重排。
- 绘制 (Paint):渲染引擎会根据布局结果,将每个节点绘制到屏幕上,这个过程叫做绘制或重绘。
- 合成 (Composite):现代浏览器会将页面分成多个图层,分别进行绘制,然后将多个图层合成在一起,形成最终的页面。这个过程叫做合成,可以大大提高渲染性能。
在页面渲染过程中,浏览器还会异步加载其他资源,如 JavaScript 文件、图片、字体、视频等。JavaScript 文件的加载和执行会阻塞页面的渲染,因为 JavaScript 可以修改 DOM 和 CSSOM。
9 ~> 面试高频考点总结
- DNS 解析的完整过程:递归查询和迭代查询的区别,各级 DNS 服务器的作用。
- TCP 三次握手和四次挥手的过程:为什么是三次握手而不是两次?为什么是四次挥手?TIME_WAIT 状态的作用是什么?
- HTTPS 的 TLS 握手过程:TLS 1.2 和 TLS 1.3 的区别,对称加密和非对称加密的作用。
- HTTP 请求和响应报文的结构:常见的请求头和响应头字段的含义。
- HTTP 状态码:常见状态码的含义和使用场景。
- HTTP 缓存机制 :强缓存和协商缓存的区别,
Cache-Control、ETag、Last-Modified等字段的作用。 - HTTP 长连接和短连接的区别:长连接的优势和适用场景。
- 浏览器页面渲染过程:DOM 树、CSSOM 树、渲染树的生成过程,重排和重绘的区别。
本文总结
TCP 协议是计算机网络领域最伟大的发明之一。它用软件的方法解决了硬件网络不可靠的问题,为上层应用提供了一个简单、可靠、高效的端到端传输服务。TCP 协议的设计充满了智慧,它的很多思想和方法,如滑动窗口、拥塞控制、超时重传等,已经被广泛应用于其他分布式系统的设计中。
深入理解 TCP 协议,不仅是学习计算机网络的必经之路,也是成为一名优秀后端工程师的必备技能。希望本文能够帮助你全面、系统地掌握 TCP 协议的核心知识点,为你的学习和工作提供有力的支持。
结尾
uu们,本文的内容到这里就全部结束了,艾莉丝在这里再次感谢您的阅读!
|-----------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------|
| ### 艾莉丝努力练剑 C/C++ & Linux 底层探索者 | 一个正在努力练剑的技术博主 *** ** * ** *** 👀 【关注】 跟随我一起深耕技术领域,见证每一次成长。 ❤️ 【点赞】 让优质内容被更多人看见,让知识传递更有力量。 ⭐ 【收藏】 把核心知识点存好,在需要时随时查、随时用。 💬 【评论】 分享你的经验或疑问,评论区一起交流避坑! 不要忘记给博主"一键四连"哦! "今日练剑达成!"
"技术之路难免有困惑,但同行的人会让前进更有方向。" |
结语:希望对学习Linux相关内容的uu有所帮助,不要忘记给博主"一键四连"哦!
往期回顾:
【Linux网络】Linux 网络编程:传输层协议TCP(五)
🗡博主在这里放了一只小狗,大家看完了摸摸小狗放松一下吧!🗡 ૮₍ ˶ ˊ ᴥ ˋ˶₎ა
