键⼊⽹址到⽹⻚显示,期间发⽣了什么?

一、浏览器解析 URL,生成 HTTP 请求报文

  1. URL 解析 浏览器首先拆分输入的网址,提取核心元素:
    • 协议类型(如http:///https://
    • 服务器域名(如www.server.com
    • 资源路径与文件名(如/dir1/file1.html
    • 若省略路径名,默认请求服务器根目录的index.html/default.html文件
  2. 生成 HTTP 请求 根据解析结果构造标准 HTTP 请求报文,包含三部分:
    • 请求行 :方法(GET/POST 等)+ URL + HTTP 版本(如GET /dir1/file1.html HTTP/1.1
    • 请求头:Host(指定服务器域名)、User-Agent、Accept 等键值对
    • 请求体:GET 请求为空,POST 请求携带提交的数据(如表单信息)

二、DNS 域名解析:将域名转换为 IP 地址

操作系统无法直接通过域名通信,必须先通过 DNS 协议获取域名对应的服务器 IP 地址,过程类似 "层层问路":

  1. 本地缓存查询 (优先)
    • 浏览器先查自身 DNS 缓存,有则直接返回
    • 无则查操作系统 DNS 缓存
    • 仍无则读取本地hosts文件
  2. 递归查询本地 DNS 服务器 本地缓存未命中时,客户端向 TCP/IP 设置中指定的本地 DNS 服务器发起查询请求
  3. 迭代查询根 / 顶级 / 权威 DNS 服务器
    1. 本地 DNS 问根 DNS 服务器 :根返回.com顶级域服务器地址
    2. 本地 DNS 问.com顶级域服务器:返回server.com权威 DNS 服务器地址
    3. 本地 DNS 问server.com权威 DNS 服务器:最终返回目标 IP 地址
  4. 返回结果本地 DNS 将 IP 返回给客户端,同时缓存该结果供后续使用

三、TCP 三次握手:建立可靠传输连接

HTTP 基于 TCP 协议传输,因此在发送 HTTP 数据前,必须先通过三次握手建立 TCP 连接:

  1. 客户端发送SYN报文(序列号 = client_isn),进入SYN_SENT状态
  2. 服务端收到后返回SYN+ACK报文(序列号 = server_isn,确认号 = client_isn+1),进入SYN_RCVD状态
  3. 客户端收到后返回ACK报文(确认号 = server_isn+1),双方进入ESTABLISHED状态

三次握手的核心目的:确认双方都具备发送和接收数据的能力

四、TCP 层:分割数据并添加 TCP 头部

  1. 数据分段 若 HTTP 请求报文长度超过MSS(TCP 最大报文段长度),TCP 会将其拆分为多个数据块(TCP 段),确保每个段加上头部后不超过下层 MTU 限制
  2. 添加 TCP 头部 每个 TCP 段添加 20 字节(基础)头部,包含:
    • 源端口(浏览器随机端口)、目的端口(HTTP 默认 80,HTTPS 默认 443)
    • 序列号、确认号(解决乱序和丢包问题)
    • 窗口大小(流量控制)、校验和(数据完整性校验)
    • 状态位(ACK 等)

五、IP 层:添加 IP 头部并确定路由

  1. 添加 IP 头部 为每个 TCP 段添加 20 字节(基础)IP 头部,包含:
    • 源 IP 地址(客户端本机 IP)
    • 目标 IP 地址(DNS 解析得到的服务器 IP)
    • 协议号(06 表示 TCP)、TTL(生存时间)、首部校验和
  2. 路由选择 操作系统查询路由表 ,确定:
    • 发送数据包使用的本地网卡(源 IP)
    • 下一跳地址(若目标与本机同子网则直接发送,否则发送到默认网关)
  3. IP 分片 若 IP 报文长度超过MTU(以太网默认 1500 字节),IP 层会将其拆分为多个分片,到达目标后再重组

六、数据链路层:添加 MAC 头部

  1. 获取下一跳 MAC 地址 通过ARP 协议 查询下一跳 IP 对应的 MAC 地址:
    • 广播发送 ARP 请求:"XX IP 对应的 MAC 地址是什么?"
    • 目标设备单播返回自己的 MAC 地址
    • 结果会存入ARP 缓存(有效期几分钟)
  2. 添加 MAC 头部 为每个 IP 分片添加 14 字节 MAC 头部,包含:
    • 发送方 MAC 地址(本机网卡 MAC)
    • 接收方 MAC 地址(下一跳设备 MAC)
    • 协议类型(0800 表示 IP 协议)

七、物理传输:网卡→交换机→路由器→服务器

  1. 网卡发送网卡将二进制数据包转换为电信号,通过网线 / 无线发送出去
  2. 交换机转发(二层设备)
    • 接收电信号并转换为数字信号,校验 FCS(帧校验序列)
    • 查询自身MAC 地址表,将数据包转发到对应端口
    • 若找不到目标 MAC,则广播到除源端口外的所有端口
  3. 路由器转发(三层设备)
    • 接收数据包后,剥离 MAC 头部,检查 IP 头部
    • 查询自身路由表,确定下一跳地址
    • 重新封装 MAC 头部(源 MAC 改为当前路由器出口 MAC,目标 MAC 改为下一跳 MAC)
    • 重复此过程,直到数据包到达目标服务器所在子网

关键特性:传输全程源 IP 和目标 IP 始终不变,每一跳的 MAC 地址都会变化

八、服务器接收数据:层层解封装

数据包到达服务器后,从下到上逐层剥离头部,还原出原始 HTTP 请求:

  1. 数据链路层:检查 MAC 地址是否匹配本机,匹配则剥离 MAC 头部,交给 IP 层
  2. IP 层:检查 IP 地址是否匹配本机,匹配则剥离 IP 头部,根据协议号交给 TCP 层
  3. TCP 层 :检查端口号,根据四元组(源 IP、源端口、目标 IP、目标端口)找到对应 Socket
    • 校验序列号,确认数据完整有序
    • 将数据放入 Socket 的接收缓冲区,返回 ACK 确认
  4. 应用层:HTTP 服务器进程从 Socket 缓冲区读取数据,得到完整的 HTTP 请求报文

九、服务器处理请求并返回 HTTP 响应

  1. 处理 HTTP 请求 服务器根据请求方法、URL 和请求头,执行对应逻辑:
    • 静态资源:读取磁盘上的 HTML/CSS/JS/ 图片等文件
    • 动态资源:调用后端程序(如 Java/Python)处理,生成响应数据
  2. 生成 HTTP 响应报文 构造标准 HTTP 响应,包含:
    • 状态行 :HTTP 版本 + 状态码 + 状态短语(如HTTP/1.1 200 OK
    • 响应头:Content-Type(指定数据类型)、Content-Length(数据长度)、Cache-Control 等
    • 响应体:实际返回的资源数据(如 HTML 代码、图片二进制数据)
  3. 响应数据封装传输响应报文同样经过 TCP 分段、IP 封装、MAC 封装,通过物理网络原路返回客户端

十、浏览器渲染页面并断开连接

  1. 客户端接收响应客户端层层解封装后,得到完整的 HTTP 响应报文
  2. 页面渲染流程
    • 解析 HTML,构建DOM 树
    • 解析 CSS,构建CSSOM 树
    • 合并 DOM 树和 CSSOM 树,生成渲染树
    • 布局(Layout):计算元素的位置和大小
    • 绘制(Paint):将像素渲染到屏幕上
    • 若页面包含 JS、图片、视频等外部资源,浏览器会自动发起额外的 HTTP 请求重复上述流程
  3. TCP 四次挥手断开连接 数据传输完成后,双方通过四次挥手优雅断开 TCP 连接:
    1. 客户端发送FIN报文,进入FIN_WAIT_1状态
    2. 服务端返回ACK报文,进入CLOSE_WAIT状态
    3. 服务端发送完剩余数据后,发送FIN报文,进入LAST_ACK状态
    4. 客户端返回ACK报文,进入TIME_WAIT状态,等待 2MSL 后关闭连接;服务端收到 ACK 后直接关闭
相关推荐
云计算-Security2 小时前
计算机网络 7 个性能指标
网络·计算机网络
剑锋所指,所向披靡!4 小时前
计算机网络之应用层(HTTP)
计算机网络·http·asp.net
JZZC218 小时前
4.OSPF NBMA 网络类型
计算机网络·ensp·ospf·nbma
@encryption19 小时前
计算机网络 --- LSA
网络·计算机网络·智能路由器
Ether IC Verifier1 天前
TCP 状态机详解
网络·网络协议·tcp/ip·计算机网络
剑锋所指,所向披靡!1 天前
计算机网络的网络层
网络·计算机网络
落羽的落羽1 天前
【项目】C++实现JsonRpc框架——功能分析与模块划分
linux·服务器·开发语言·c++·人工智能·计算机网络·github
梦奇不是胖猫2 天前
[ 计算机网络 | 第三章 ] 数据链路层 02 PPP
网络·网络协议·计算机网络
梦奇不是胖猫2 天前
[ 计算机网络 | 第三章 ] 数据链路层03 CSMA/CD
运维·服务器·网络·计算机网络