键⼊⽹址到⽹⻚显示,期间发⽣了什么?
摘要:本文详细解析了从浏览器输入URL到页面渲染的完整网络通信流程。首先浏览器解析URL生成HTTP请求报文,通过DNS将域名转换为IP地址。随后通过TCP三次握手建立连接,数据经TCP/IP分层封装后传输。服务器接收数据后层层解包处理请求,返回HTTP响应。浏览器解析响应内容渲染页面,最终通过四次挥手断开连接。整个过程涉及DNS解析、TCP/IP协议栈、路由转发等核心技术,展现了互联网通信的完整
·
一、浏览器解析 URL,生成 HTTP 请求报文
- URL 解析浏览器首先拆分输入的网址,提取核心元素:
- 协议类型(如
http:///https://) - 服务器域名(如
www.server.com) - 资源路径与文件名(如
/dir1/file1.html) - 若省略路径名,默认请求服务器根目录的
index.html/default.html文件
- 协议类型(如
- 生成 HTTP 请求根据解析结果构造标准 HTTP 请求报文,包含三部分:
- 请求行:方法(GET/POST 等)+ URL + HTTP 版本(如
GET /dir1/file1.html HTTP/1.1) - 请求头:Host(指定服务器域名)、User-Agent、Accept 等键值对
- 请求体:GET 请求为空,POST 请求携带提交的数据(如表单信息)
- 请求行:方法(GET/POST 等)+ URL + HTTP 版本(如
二、DNS 域名解析:将域名转换为 IP 地址
操作系统无法直接通过域名通信,必须先通过 DNS 协议获取域名对应的服务器 IP 地址,过程类似 "层层问路":
- 本地缓存查询(优先)
- 浏览器先查自身 DNS 缓存,有则直接返回
- 无则查操作系统 DNS 缓存
- 仍无则读取本地
hosts文件
- 递归查询本地 DNS 服务器本地缓存未命中时,客户端向 TCP/IP 设置中指定的本地 DNS 服务器发起查询请求
- 迭代查询根 / 顶级 / 权威 DNS 服务器
- 本地 DNS 问根 DNS 服务器:根返回
.com顶级域服务器地址 - 本地 DNS 问
.com顶级域服务器:返回server.com权威 DNS 服务器地址 - 本地 DNS 问
server.com权威 DNS 服务器:最终返回目标 IP 地址
- 本地 DNS 问根 DNS 服务器:根返回
- 返回结果本地 DNS 将 IP 返回给客户端,同时缓存该结果供后续使用
三、TCP 三次握手:建立可靠传输连接
HTTP 基于 TCP 协议传输,因此在发送 HTTP 数据前,必须先通过三次握手建立 TCP 连接:
- 客户端发送
SYN报文(序列号 = client_isn),进入SYN_SENT状态 - 服务端收到后返回
SYN+ACK报文(序列号 = server_isn,确认号 = client_isn+1),进入SYN_RCVD状态 - 客户端收到后返回
ACK报文(确认号 = server_isn+1),双方进入ESTABLISHED状态
三次握手的核心目的:确认双方都具备发送和接收数据的能力
四、TCP 层:分割数据并添加 TCP 头部
- 数据分段若 HTTP 请求报文长度超过MSS(TCP 最大报文段长度),TCP 会将其拆分为多个数据块(TCP 段),确保每个段加上头部后不超过下层 MTU 限制
- 添加 TCP 头部每个 TCP 段添加 20 字节(基础)头部,包含:
- 源端口(浏览器随机端口)、目的端口(HTTP 默认 80,HTTPS 默认 443)
- 序列号、确认号(解决乱序和丢包问题)
- 窗口大小(流量控制)、校验和(数据完整性校验)
- 状态位(ACK 等)
五、IP 层:添加 IP 头部并确定路由
- 添加 IP 头部为每个 TCP 段添加 20 字节(基础)IP 头部,包含:
- 源 IP 地址(客户端本机 IP)
- 目标 IP 地址(DNS 解析得到的服务器 IP)
- 协议号(06 表示 TCP)、TTL(生存时间)、首部校验和
- 路由选择操作系统查询路由表,确定:
- 发送数据包使用的本地网卡(源 IP)
- 下一跳地址(若目标与本机同子网则直接发送,否则发送到默认网关)
- IP 分片若 IP 报文长度超过MTU(以太网默认 1500 字节),IP 层会将其拆分为多个分片,到达目标后再重组
六、数据链路层:添加 MAC 头部
- 获取下一跳 MAC 地址通过ARP 协议查询下一跳 IP 对应的 MAC 地址:
- 广播发送 ARP 请求:"XX IP 对应的 MAC 地址是什么?"
- 目标设备单播返回自己的 MAC 地址
- 结果会存入ARP 缓存(有效期几分钟)
- 添加 MAC 头部为每个 IP 分片添加 14 字节 MAC 头部,包含:
- 发送方 MAC 地址(本机网卡 MAC)
- 接收方 MAC 地址(下一跳设备 MAC)
- 协议类型(0800 表示 IP 协议)
七、物理传输:网卡→交换机→路由器→服务器
- 网卡发送网卡将二进制数据包转换为电信号,通过网线 / 无线发送出去
- 交换机转发(二层设备)
- 接收电信号并转换为数字信号,校验 FCS(帧校验序列)
- 查询自身MAC 地址表,将数据包转发到对应端口
- 若找不到目标 MAC,则广播到除源端口外的所有端口
- 路由器转发(三层设备)
- 接收数据包后,剥离 MAC 头部,检查 IP 头部
- 查询自身路由表,确定下一跳地址
- 重新封装 MAC 头部(源 MAC 改为当前路由器出口 MAC,目标 MAC 改为下一跳 MAC)
- 重复此过程,直到数据包到达目标服务器所在子网
关键特性:传输全程源 IP 和目标 IP 始终不变,每一跳的 MAC 地址都会变化
八、服务器接收数据:层层解封装
数据包到达服务器后,从下到上逐层剥离头部,还原出原始 HTTP 请求:
- 数据链路层:检查 MAC 地址是否匹配本机,匹配则剥离 MAC 头部,交给 IP 层
- IP 层:检查 IP 地址是否匹配本机,匹配则剥离 IP 头部,根据协议号交给 TCP 层
- TCP 层:检查端口号,根据四元组(源 IP、源端口、目标 IP、目标端口)找到对应 Socket
- 校验序列号,确认数据完整有序
- 将数据放入 Socket 的接收缓冲区,返回 ACK 确认
- 应用层:HTTP 服务器进程从 Socket 缓冲区读取数据,得到完整的 HTTP 请求报文
九、服务器处理请求并返回 HTTP 响应
- 处理 HTTP 请求服务器根据请求方法、URL 和请求头,执行对应逻辑:
- 静态资源:读取磁盘上的 HTML/CSS/JS/ 图片等文件
- 动态资源:调用后端程序(如 Java/Python)处理,生成响应数据
- 生成 HTTP 响应报文构造标准 HTTP 响应,包含:
- 状态行:HTTP 版本 + 状态码 + 状态短语(如
HTTP/1.1 200 OK) - 响应头:Content-Type(指定数据类型)、Content-Length(数据长度)、Cache-Control 等
- 响应体:实际返回的资源数据(如 HTML 代码、图片二进制数据)
- 状态行:HTTP 版本 + 状态码 + 状态短语(如
- 响应数据封装传输响应报文同样经过 TCP 分段、IP 封装、MAC 封装,通过物理网络原路返回客户端
十、浏览器渲染页面并断开连接
- 客户端接收响应客户端层层解封装后,得到完整的 HTTP 响应报文
- 页面渲染流程
- 解析 HTML,构建DOM 树
- 解析 CSS,构建CSSOM 树
- 合并 DOM 树和 CSSOM 树,生成渲染树
- 布局(Layout):计算元素的位置和大小
- 绘制(Paint):将像素渲染到屏幕上
- 若页面包含 JS、图片、视频等外部资源,浏览器会自动发起额外的 HTTP 请求重复上述流程
- TCP 四次挥手断开连接数据传输完成后,双方通过四次挥手优雅断开 TCP 连接:
- 客户端发送
FIN报文,进入FIN_WAIT_1状态 - 服务端返回
ACK报文,进入CLOSE_WAIT状态 - 服务端发送完剩余数据后,发送
FIN报文,进入LAST_ACK状态 - 客户端返回
ACK报文,进入TIME_WAIT状态,等待 2MSL 后关闭连接;服务端收到 ACK 后直接关闭
- 客户端发送
openEuler 是由开放原子开源基金会孵化的全场景开源操作系统项目,面向数字基础设施四大核心场景(服务器、云计算、边缘计算、嵌入式),全面支持 ARM、x86、RISC-V、loongArch、PowerPC、SW-64 等多样性计算架构
更多推荐

所有评论(0)