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

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

文章目录

  • 实际应用
    • 第一步:用户在浏览器输入 `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!”)。

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

相关文章:

  • Eclipse 插件开发 1
  • 面试新收获-大模型学习
  • Python编程中的基本语句
  • 长短板理论——AI与思维模型【83】
  • 【C++11】右值引用和移动语义:万字总结
  • Docker Compose--在Ubuntu中安装Docker compose
  • 嵌入式C设计模式---策略模式
  • unity bug
  • SpringBoot程序的创建以及特点,配置文件,LogBack记录日志,配置过滤器、拦截器、全局异常
  • JAVA服务内存缓慢上涨,年轻代GC正常但Full GC频繁,如何定位?
  • [ACTF2020 新生赛]BackupFile题解
  • 用Podman Desktop创建自用的WSL-Fedora Linux子系统
  • LeetCode100题
  • linux blueZ 第五篇:高阶优化与性能调优——蓝牙吞吐、延迟与功耗全攻略
  • 编译语言、半编译语言(混合型)和非编译语言(解释型)的差异
  • ROS 快速入门教程05
  • Ardunio学习
  • 高中数学联赛模拟试题精选第16套几何题
  • 子网掩码的学习
  • MyBatis 官方子项目详细说明及表格总结
  • 我国核电总体规模首次跃居世界第一,发电量持续增长
  • 魔都眼·上海车展⑥|周六客流超13.5万人次,创开展新高
  • 五粮液一季度净利增长5.8%,今年营收与宏观经济指标保持一致
  • 一年吸引30多万人次打卡,江苏这个渔村是怎么做到的?
  • 广州多条BRT相关线路将停运,全市BRT客运量较高峰时大幅下降
  • 健康社区“免疫行动”促进计划启动,发布成人预防“保典”