当前位置: 首页 > backend >正文

结合五层网络结构讲一下用户在浏览器输入一个网址并按下回车后到底发生了什么?

文章目录

  • 实际应用
    • 第一步:用户在浏览器输入 `www.baidu.com` 并按下回车
      • 1. 浏览器触发域名解析(DNS查询)
    • 第二步:DNS请求的逐层封装与传输
      • 1. 应用层(DNS协议)
      • 2. 传输层(UDP协议)
      • 3. 网络层(IP协议)
      • 4. 数据链路层(以太网/Wi-Fi协议)
      • 5. 物理层(比特流传输)
    • 第三步:数据包如何找到DNS服务器?
      • 1. 局域网内传输(数据链路层)
      • 2. 跨网络传输(网络层)
      • 3. 最终抵达DNS服务器
    • 第四步:浏览器发起HTTP请求
      • 1. 建立TCP连接(传输层)
      • 2. 封装HTTP请求(应用层)
      • 3. 逐层封装
    • 第五步:数据包穿越互联网到达百度服务器
      • 1. 路由器的逐跳转发(网络层)
      • 2. 服务器接收请求
    • 第六步:响应数据返回客户端
      • 1. 反向封装与传输
      • 2. 浏览器渲染页面
    • 关键协作点总结
    • 补充技术细节

上一篇文章对计算机网络的五层结构做了简单的介绍,需要的可以看这里

计算机网络的五层结构(物理层、数据链路层、网络层、传输层、应用层)到底是什么?

实际应用

看到这里的时候我相信大家会有和我一样的疑惑,这五层结构到底是干嘛用的,到底有什么用,我平时有用到这东西的机会吗?

那么下面我给大家准备了一个实际的例子来让大家对这五层机构可以更好的了解。
我下面的例子是用访问浏览器中的某一个网址来举例,在我访问一个网址,比如www.baidu.com的时候,让我们看看这五层结构都是怎么发挥作用的?

第一步:用户在浏览器输入 www.baidu.com 并按下回车

1. 浏览器触发域名解析(DNS查询)

  • 为什么需要DNS?
    计算机无法直接通过域名 www.baidu.com 通信,必须将其转换为 IP 地址(如 14.215.177.38)。这一过程称为 DNS解析

  • 具体流程

    • Step 1:检查本地缓存
      浏览器缓存 → 系统缓存(如Windows的hosts文件) → 路由器缓存 → 若命中,直接使用缓存的IP地址。
    • Step 2:未命中缓存 → 发起递归查询
      若本地无缓存,浏览器调用操作系统的 DNS解析器(应用层组件),生成一个 DNS请求报文,内容为:
      查询域名:www.baidu.com
      查询类型:A记录(IPv4地址)
      

第二步:DNS请求的逐层封装与传输

1. 应用层(DNS协议)

  • DNS协议使用 UDP(传输层协议),目标端口为 53,源端口随机(如 50001)。
  • 封装后的 DNS报文 交给传输层处理。

2. 传输层(UDP协议)

  • 添加 UDP头部:包含源端口(50001)、目标端口(53)、长度和校验和。
  • 此时数据变为:
    [UDP头部 | DNS请求报文]
    

3. 网络层(IP协议)

  • 添加 IP头部:包含源IP(你的设备私有IP,如 192.168.1.100)、目标IP(默认DNS服务器IP,如 8.8.8.8)。
  • 此时数据变为:
    [IP头部 | UDP头部 | DNS请求报文]
    

4. 数据链路层(以太网/Wi-Fi协议)

  • 添加 帧头部:包含源MAC地址(你的网卡MAC,如 AA:BB:CC:DD:EE:FF)和目标MAC地址(默认网关的MAC地址,如路由器的 11:22:33:44:55:66)。
  • 此时数据变为:
    [帧头 | IP头部 | UDP头部 | DNS请求报文 | 帧尾]
    

5. 物理层(比特流传输)

  • 将帧转换为 电信号(网线)无线电波(Wi-Fi),通过物理媒介发送到路由器(默认网关)。

第三步:数据包如何找到DNS服务器?

1. 局域网内传输(数据链路层)

  • 目标MAC地址是路由器:你的设备通过ARP协议(地址解析协议)提前获取了默认网关(路由器)的MAC地址。
  • 交换机的作用:如果设备通过网线连接到交换机,交换机会根据MAC地址表将帧转发到路由器对应的端口。

2. 跨网络传输(网络层)

  • 路由器收到数据包后,剥离帧头部,检查IP头部:
    • 目标IP是 8.8.8.8(DNS服务器),不属于本地局域网。
    • 路由器通过 NAT(网络地址转换) 将源IP(192.168.1.100)替换为路由器的公网IP(如 120.230.10.20)。
    • 路由器根据 路由表 选择下一跳(如ISP的核心路由器),重新封装帧头部(目标MAC变为下一跳设备的MAC),转发数据包。

3. 最终抵达DNS服务器

  • 数据包经过多个路由器的接力转发(每经过一个路由器,源/目标MAC地址会变化,但IP地址不变),最终到达DNS服务器 8.8.8.8
  • DNS服务器解析请求,查询 www.baidu.com 的IP地址,生成 DNS响应报文(包含 14.215.177.38),按原路返回给你的设备。

第四步:浏览器发起HTTP请求

1. 建立TCP连接(传输层)

  • 获取到百度服务器的IP地址后,浏览器通过 TCP协议 与目标IP(14.215.177.38)的 80 端口(HTTP)或 443 端口(HTTPS)建立连接。
  • TCP三次握手
    • 客户端发送 SYN 报文(序列号x)。
    • 服务器回复 SYN-ACK 报文(序列号y,确认号x+1)。
    • 客户端发送 ACK 报文(确认号y+1)。
  • 此时TCP连接建立完成,双方确认通信能力。

2. 封装HTTP请求(应用层)

  • 浏览器生成 HTTP请求报文,例如:
    GET / HTTP/1.1
    Host: www.baidu.com
    User-Agent: Chrome/120.0
    
  • 如果是HTTPS,还需进行 TLS握手(交换密钥、验证证书等)。

3. 逐层封装

  • 传输层:将HTTP报文拆分为多个 TCP段,添加TCP头部(源端口、目标端口、序列号、确认号)。
  • 网络层:添加IP头部(源IP为公网IP 120.230.10.20,目标IP 14.215.177.38)。
  • 数据链路层:添加帧头部(源MAC为路由器出口MAC,目标MAC为下一跳设备MAC)。
  • 物理层:转换为比特流传输。

第五步:数据包穿越互联网到达百度服务器

1. 路由器的逐跳转发(网络层)

  • 每个路由器根据目标IP 14.215.177.38 查询路由表,选择最优路径(如通过BGP协议判断)。
  • 数据包可能经过:
    • 家庭路由器 → ISP骨干网路由器 → 百度数据中心边缘路由器 → 百度内部核心路由器。

2. 服务器接收请求

  • 百度服务器接收到数据包后,反向解封装:
    • 物理层 → 数据链路层(剥离帧头) → 网络层(检查IP地址) → 传输层(重组TCP段) → 应用层(处理HTTP请求)。
  • 服务器生成 HTTP响应报文(状态码200,包含HTML、CSS、JS等资源)。

第六步:响应数据返回客户端

1. 反向封装与传输

  • 服务器将HTTP响应按相同流程封装(IP头部源/目标地址调换,TCP端口调换),通过互联网返回。
  • 客户端路由器接收后,通过NAT将目标IP从公网IP 120.230.10.20 转换为内网IP 192.168.1.100,再转发给你的设备。

2. 浏览器渲染页面

  • 浏览器接收HTTP响应后,解析HTML/CSS/JS,加载图片等资源(可能触发多次HTTP请求)。
  • 最终渲染出完整的百度首页。

关键协作点总结

  1. DNS解析
    • 应用层协议(DNS) → 传输层(UDP) → 网络层(IP路由) → 数据链路层(MAC寻址) → 物理层传输。
  2. HTTP请求
    • 应用层(HTTP) → 传输层(TCP连接) → 网络层(IP跨网) → 数据链路层(帧转发) → 物理层传输。
  3. 数据封装与解封装
    • 每经过一层设备(如路由器、交换机),数据包的外层封装会被修改(如MAC地址、IP NAT),但核心内容(如HTTP报文)保持不变。

补充技术细节

  • NAT(网络地址转换)
    家庭路由器将内网设备的私有IP(如 192.168.1.100)转换为公网IP(如 120.230.10.20),解决IPv4地址不足问题。
  • MTU与分片
    若数据包超过链路层最大传输单元(如1500字节),网络层会将其分片,目标端重组。
  • ARP协议
    设备通过ARP广播查询IP地址对应的MAC地址(如“谁是 192.168.1.1?请告诉我你的MAC!”)。

通过以上流程,你可以清晰看到:五层模型并非独立运作,而是像流水线一样协同工作,最终实现“输入网址 → 看到网页”的复杂过程。

http://www.xdnf.cn/news/2282.html

相关文章:

  • 机器学习基础理论 - 频率派 vs 贝叶斯派
  • Java 中 ConcurrentHashMap 1.7 和 1.8 之间有哪些区别?
  • 什么是Lua模块?你会如何使用NGINX的Lua模块来定制请求处理流程?
  • Spring 学习笔记之 @Transactional 异常不回滚汇总
  • 【机器学习-线性回归-3】深入浅出:简单线性回归的概念、原理与实现
  • 【VMware】虚拟机如何扩展存储
  • LLM基础之源码一
  • asammdf 库的依赖项和安装指南
  • 【数据结构】优先级队列
  • 【人工智能之大模型】详述大模型中流水线并行(Pipeline Parallelism)的​GPipe推理框架?
  • 【树莓派 PICO 2 测评】ADC 水位监测系统
  • ZBrush2025.1.3 中文版【ZBrush2025版下载】附安装教程
  • tkinter中Listbox列表框常用的操作方法
  • 单片机-89C51部分:4、固件烧录
  • Pygame多人游戏开发:本地双人对战实战
  • C++篇——继承
  • 详解Adobe Photoshop 2024 下载与安装教程
  • Adruino:人机界面及接口技术
  • SSE协议
  • 飞帆:自定义控件平台
  • 【CF】Day44——Codeforces Round 908 (Div. 2) C + Codeforces Round 1020 (Div. 3) DE
  • PyQt6实例_消息工具_使用与完整代码分享
  • 网络安全于应用服务web中间件服务 默认配置文件的关联(配置漏洞)(完成)
  • 理解计算机系统_网络编程(3)
  • Python循环结构深度解析与高效应用实践
  • 基于STM32定时器中断讲解(HAL库)
  • leetcode66.加一
  • Dubbo(79)Dubbo的监控机制是如何实现的?
  • Python部署Docker报错:curl: (56) Recv failure: Connection reset by peer
  • 零拷贝技术原理的详细解析与java实战方案