从浏览器输入网址到页面显示:数据包的OSI模型之旅

题目:请你结合OSI模型,详细描述一下从你在浏览器输入一个网址到页面显示出来,这个过程中数据包都经历了哪些"旅程"?


TCP/IP模型自上而下

摘要:本文以TCP/IP模型自上而下的视角,系统梳理了应用层(HTTP、DNS)、传输层(TCP、UDP)、网络层(IP)和网络接口层(物理层)的核心协议、数据包在各层的封装与处理流程,以及各层的主要作用。同时补充了OSI自下而上的接收端处理流程,涵盖物理层信号恢复、数据链路层帧校验与MAC过滤、网络层路由决策、传输层协议分发与流量控制,以及会话层、表示层和应用层的完整处理链路。

应用层

主要协议:HTTP、DNS 协议

HTTP 协议:是客户端与服务器之间的通信规则与数据传输标准。

DNS 协议:是 HTTP 请求的前置步骤,是分布式的域名与 IP 地址映射数据库。其核心作用是将域名转化为 IP,同时也可以进行 IP 到域名的反向解析。

数据包在应用层的经历:DNS 协议通过域名解析将网址转化为 IP 地址,解析完成后通过 HTTP 构造请求报文进行请求。

作用:定义应用层的数据格式,DNS 实现域名到 IP 的映射,发起资源请求。

传输层

主要协议:TCP、UDP 协议

TCP 协议:在不可靠的网络中尽力为应用程序提供可靠的、面向连接的、有序的、基于字节流的端到端数据传输服务(优点:可靠传输;缺点:复杂、系统开销大、速度慢)。

UDP 协议:为程序提供一种简单的、无连接的、尽最大努力交付的、基于数据报的传输服务(优点:极低的延迟和极小的连接建立开销;缺点:无连接不可靠、面向数据报)。

以下是 TCP 与 UDP 的对比:

特性 TCP UDP
连接性 面向连接(三次握手) 无连接
可靠性 可靠传输(确认、重传、排序) 不可靠传输(无确认、无重传)
传输方式 字节流 数据报(保留报文边界)
流量控制 支持(滑动窗口) 不支持
拥塞控制 支持 不支持
适用场景 可靠传输(网页、文件、邮件) 实时传输(视频、语音、游戏)
头部开销 较大(20~60 字节) 较小(8 字节)

数据包在传输层的经历:对应用层的数据进行封装,添加 TCP 头部(包含源目端口号、序号、确认号、标志位如 SYN/ACK)。

作用:提供端到端的可靠传输(流量控制、差错校验),通过端口区分同一设备的不同应用。

TCP 三次握手过程

TCP 建立连接时通过三次握手(Three-Way Handshake)确保双方收发能力正常,并同步初始序列号(ISN)。具体流程如下:

服务器 客户端 服务器 客户端 1. 客户端发送 SYN(同步序列号) 2. 服务器回复 SYN+ACK 3. 客户端发送 ACK 确认 服务器收到 ACK 后也进入 ESTABLISHED 状态 SYN=1, seq=x(客户端进入 SYN_SENT 状态) SYN=1, ACK=1, seq=y, ack=x+1(服务器进入 SYN_RCVD 状态) ACK=1, seq=x+1, ack=y+1(客户端进入 ESTABLISHED 状态)

各阶段状态变化:

  1. 第一次握手(SYN):客户端发送 SYN=1, seq=x 报文,客户端进入 SYN_SENT 状态,等待服务器确认。
  2. 第二次握手(SYN+ACK):服务器收到 SYN 后,回复 SYN=1, ACK=1, seq=y, ack=x+1,服务器进入 SYN_RCVD 状态。
  3. 第三次握手(ACK):客户端收到 SYN+ACK 后,发送 ACK=1, seq=x+1, ack=y+1,客户端进入 ESTABLISHED 状态;服务器收到后也进入 ESTABLISHED 状态,连接建立完成,开始传输数据。

TCP 四次挥手过程

TCP 断开连接时通过四次挥手(Four-Way Wavehand)确保双方数据全部传输完毕,并有序释放连接资源。具体流程如下:

服务器 客户端 服务器 客户端 1. 客户端发送 FIN(主动关闭) 2. 服务器回复 ACK 确认 客户端收到 ACK 后进入 FIN_WAIT_2 状态 3. 服务器发送 FIN(被动关闭) 4. 客户端回复 ACK 确认 等待 2MSL 后客户端进入 CLOSED 状态 服务器收到 ACK 后进入 CLOSED 状态 FIN=1, seq=u(客户端进入 FIN_WAIT_1 状态) ACK=1, seq=v, ack=u+1(服务器进入 CLOSE_WAIT 状态) FIN=1, ACK=1, seq=w, ack=u+1(服务器进入 LAST_ACK 状态) ACK=1, seq=u+1, ack=w+1(客户端进入 TIME_WAIT 状态)

各阶段状态变化:

  1. 第一次挥手(FIN):客户端发送 FIN=1, seq=u 报文,表示数据发送完毕,请求关闭连接。客户端进入 FIN_WAIT_1 状态。
  2. 第二次挥手(ACK):服务器收到 FIN 后,回复 ACK=1, seq=v, ack=u+1,表示已收到关闭请求,但可能还有数据未发送完。服务器进入 CLOSE_WAIT 状态;客户端收到 ACK 后进入 FIN_WAIT_2 状态。
  3. 第三次挥手(FIN):服务器数据发送完毕后,发送 FIN=1, ACK=1, seq=w, ack=u+1 报文,请求关闭连接。服务器进入 LAST_ACK 状态。
  4. 第四次挥手(ACK):客户端收到 FIN 后,回复 ACK=1, seq=u+1, ack=w+1 报文。客户端进入 TIME_WAIT 状态,等待 2MSL(最大报文段生存时间)后自动进入 CLOSED 状态;服务器收到 ACK 后立即进入 CLOSED 状态,连接彻底关闭。

关键说明:

  • TIME_WAIT 状态持续 2MSL(约 1~4 分钟),目的是确保最后一个 ACK 能被服务器收到,并让网络中残留的报文段自然消失。
  • 四次挥手比三次握手多一次交互,因为服务器收到 FIN 后不能立即关闭,需要先回复 ACK 确认,待自身数据发送完毕后再发送 FIN,因此 ACK 和 FIN 分开发送,共需四次。
  • 实际场景中,seq 和 ack 序号基于三次握手时协商的初始序列号递增,上图中 uv 分别代表客户端和服务器的当前发送序列号。

网络层

主要协议:IP 协议

相关设备:路由器、三层交换机

IP 协议:寻址与编址的作用是为主机提供逻辑身份。IPv4 和 IPv6 是 IP 协议的两个版本。IP 协议是无连接的、不可靠的,它将可靠性问题交给上层协议(如 TCP)去解决,IP 协议本身保持极简和高效。IP 协议的核心任务是跨网的路由和寻址。

数据包在网络层的经历:对 TCP 报文段封装,添加 IP 头部(包含源目 IP、TTL 生存时间、协议类型)。路由器通过 IP 地址寻址,选择从本地网络到目标服务器网络的最佳路径。

作用:实现跨网络的数据包转发,通过 IP 地址标识网络中的设备。

网络接口层(数据链路层)

主要协议:以太网协议

相关设备:二层交换机

数据包在数据链路层的经历:对 IP 数据包封装,添加以太网头部(源目 MAC 地址、数据帧类型)。交换机通过 MAC 地址在本地网络中转发数据帧(基于 MAC 地址表,记录 MAC 地址与端口的对应关系)。

作用:在同一物理网络内传输数据,通过 MAC 地址标识同一网络中的设备,提供帧校验(FCS 字段)。

网络接口层(物理层)

主要协议:物理介质协议(如双绞线、光纤的电气/光学规范)

数据包在物理层的经历:将数据链路层的二进制数据帧转换为电信号/光信号,通过物理介质(网线、光纤)传输。

作用:实现物理介质上的比特流传输。

OSI 自下而上

物理层接收

服务器网卡检测物理信号、时钟恢复与同步、比特流重组,传递给数据链路层。

数据链路层处理
  • 帧校验:计算 CRC,丢弃错帧(错误率约 10⁻¹²)
  • MAC 过滤:检查目的 MAC(本机 MAC / 广播 / 组播)
  • VLAN 处理:根据 802.1Q 标签确定所属 VLAN
  • 解封装:剥离帧头尾,提取 IP 数据包
网络层处理
  • IP 验证:检查版本、头部校验和长度
  • 分片重组:根据标识、偏移、标志字段重组 IP 分片
  • 路由决策:确定数据包是发往本机还是需转发
  • 防火墙检查:检查安全策略,记录连接状态
传输层
  • 协议分发:根据 IP 头部协议字段(6=TCP,17=UDP)分发给相应协议栈
  • TCP 处理:按序号重组数据段、发送 ACK 确认、流量控制(调整接收窗口)、拥塞控制(根据网络状况调整发送速率)
  • 端口分发:根据目的端口(80/443)传递给对应应用程序
会话层恢复

恢复会话上下文、检查会话有效性(超时、认证等)、管理会话状态。

表示层转换
  • 解密:TLS 解密应用数据
  • 解压缩:gzip 解压缩
  • 编码转换:字符集转换(如 UTF-8 → Unicode)
  • 数据格式化:将网络格式转换为应用可读格式
应用层处理

HTTP 服务器处理:

  • 日志记录:记录访问日志
  • 缓存检查:检查是否有缓存副本
Logo

AtomGit 是由开放原子开源基金会联合 CSDN 等生态伙伴共同推出的新一代开源与人工智能协作平台。平台坚持“开放、中立、公益”的理念,把代码托管、模型共享、数据集托管、智能体开发体验和算力服务整合在一起,为开发者提供从开发、训练到部署的一站式体验。

更多推荐