本文不是背诵协议名称,而是探究为什么分层每一层解决什么核心问题、以及实际数据包是如何穿过这些层的。读完你会理解:三次握手、四次挥手、HTTP请求、IP路由、MAC帧转发,它们是如何在一个瞬间协同工作的。

一、分层模型的本质:抽象与解耦

网络通信极其复杂:数据要从一台计算机的内存,经过网卡、交换机、路由器、光纤、WiFi,到达另一台计算机。如果所有功能都写在一个巨型程序里,任何微小的改动都会导致灾难。

分层模型 = 计算机领域的“分工+接口”

其实分层就像公司的不同部门:

  • 上层: 只关心自己的业务(比如浏览器解析网页)。
  • 下层: 只负责具体的脏活累活(比如把数据变成电信号传输)。

每一层都“封装”了底层的复杂性,并为上一层提供稳定的接口(API)。这就是分层模型存在的根本原因。

在计算机网络中,两个最重要的分层模型是:

  • OSI 七层模型:国际标准,理论完整,但从未完全实现。
  • TCP/IP 四层模型:因特网事实标准,基于已有协议反向总结。

二、OSI 七层模型:每一层到底做了什么?

OSI(Open Systems Interconnection)是由国际标准化组织提出的理想模型,从下往上共 7 层,每层都有一个核心问题。

OSI七层模型

层级 名称 核心原理 数据单元 常见设备/协议
1 物理层 在媒体上传输比特流:定义电压、接口、线缆、光信号、频率。不关心比特的含义。 比特 (bit) 集线器、中继器、网线、光纤
2 数据链路层 在相邻节点间可靠传输帧:通过 MAC 地址寻址,提供差错检测(如 CRC)和流量控制。 帧 (frame) 交换机、网桥、以太网、WiFi(MAC)
3 网络层 路由与寻址:将数据从源主机跨网络送到目标主机,解决“怎么走”的问题。 包 (packet) 路由器、IP 协议
4 传输层 端到端可靠/不可靠传输:区分进程(端口号),提供可靠传输(重传、排序、流控)或不可靠快速传输。 段 (segment) / 数据报 TCP、UDP
5 会话层 建立、管理、终止会话:控制对话的 checkpoint、恢复、全双工/半双工。 SPDU NetBIOS、RPC(实际很少独立实现)
6 表示层 数据格式转换、加密、压缩:让不同系统的应用层能理解对方的数据(如 ASCII → EBCDIC,SSL/TLS 有时也归于此)。 PPDU JPEG、ASCII、加密(通常并入应用层)
7 应用层 面向用户的网络服务:提供 HTTP、FTP、DNS、SMTP 等具体协议。 APDU 浏览器、邮件客户端

OSI 的设计原则:每一层都应执行一个明确定义的功能,且层级之间的边界应选择在描述最少跨层交互的地方。
现实与理论的差异:在 TCP/IP 中,会话层和表示层通常被“吸收”进应用层,因为实际开发中发现它们的边界太模糊(例如,TLS 既做加密(表示层)又做握手(会话层))。


三、TCP/IP 四层模型:每一层的设计哲学

TCP/IP 模型是因特网实际使用的标准,共四层(从下到上),但每一层都对应一个必须解决的根本问题

TCP/IP 四层模型

层名 核心问题 设计意图 / 原理 协议数据单元 (PDU) 主要协议
网络接口层 如何在一块具体的物理介质(网线、WiFi)上发送数据? 屏蔽硬件差异。无论是以太网、光纤还是无线网,这一层把所有的物理网络统一抽象为“可以发送帧的链路”,让上层无需关心网线插头长什么样。提供 MAC 地址(48位唯一标识)和 CRC 校验。 以太网、Wi-Fi (802.11)
网络层 (IP) 如何从主机 A 找到主机 B(可能跨越多个不同网络)? 路由寻址 + 分组转发。解决“怎么找到对方”。IP 协议定义逻辑地址(IP 地址),路由器基于目标 IP 查路由表,逐跳转发。不保证顺序,不保证不丢包。就像快递系统:IP协议给每台设备分配唯一地址,并规划从北京到上海的最优路线。它只负责把数据包送到目的地的“楼栋(网络)”。 包(IP 数据报) IP、ICMP、ARP(ARP 常视为跨层)
传输层 (TCP/UDP) 如何将数据可靠地交给目标主机上的指定进程(应用程序)? 端到端通信与复用/分解。网络层只送到主机,但主机上有很多程序(QQ、浏览器)。这一层用“端口号”区分进程,并决定:要100%准确(TCP),还是要快(UDP)。TCP 提供可靠、有序、有流的服务;UDP 提供不可靠但低延迟的服务。 段(TCP) / 数据报(UDP) TCP、UDP
应用层(HTTP/DNS) 用户的数据长什么样?交互规则是什么? 数据语义与用户交互。这是用户直接接触的层。它定义消息格式(JSON、XML、HTML)、请求-响应模型、资源标识(URL)。 消息(或 APDU) HTTP、DNS、FTP、SMTP

设计的核心逻辑:

  • 下层为上层服务: 应用层的数据,被传输层加上端口头,再被网络层加上IP头,最后被网络接口层加上MAC头发送到网络中。

  • 对等通信: 你的应用层只跟对方的应用层“对话”,中间经过的物理传输对应用层透明。

为什么是四层而不是七层?

  • 会话层和表示层被证明不必要独立:在因特网设计中,会话控制(如何时开始结束对话)由应用自己管理,而数据格式(如加密、压缩)也大多放在应用层或作为独立库(如 SSL/TLS 嵌入在传输层之上)。
  • 网络接口层融合了物理层和数据链路层:因为 TCP/IP 假设底层是一个完整的链路层服务(既包括 MAC 寻址,又包括物理传输),不需要再拆分。

四、OSI 七层模型 vs TCP/IP 四层模型:学术派 vs 实战派

对比维度 OSI七层模型 TCP/IP四层模型
出发点 理论严谨,先有标准后有实现 实用优先,基于已有协议(TCP/IP)总结
分层数量 7层(多了会话层、表示层) 4层
完整层级(从上到下) 1.应用层 2.表示层 3.会话层 4.传输层 5.网络层 6.数据链路层 7.物理层 1.应用层 2.传输层 3.网际层(网络层) 4.网络接口层
现状 教学参考模型,实际很少直接实现 互联网事实标准,所有网络通信都在用

简单记忆:TCP/IP 的应用层 = OSI 应用层 + 表示层 + 会话层

OSI是教科书,TCP/IP是真功夫。TCP/IP将OSI顶部的会话层、表示层、应用层合并为“应用层”,因为实际应用中这些边界并不清晰。

OSI 七层模型 vs TCP/IP 四层模型

补充分层对应速记
TCP/IP 四层 对应 OSI 七层
应用层 应用层、表示层、会话层
传输层 传输层
网际层 网络层
网络接口层 数据链路层、物理层

五、封装与解封装:数据怎么穿过这些层?

这是理解分层模型最核心的动态过程

封装与解封装

发送端(从上往下)

应用层数据  "GET /index.html"   ----------  应用层消息(例如 HTTP 请求)
      ↓ 交给传输层,加上 TCP 头(源端口+目的端口+序号等)
传输层段    [TCP头 | HTTP数据]
      ↓ 交给网络层,加上 IP 头(源IP+目的IP等)
网络层包    [IP头 | TCP头 | HTTP数据]
      ↓ 交给网络接口层,加上以太网头(源MAC+目的MAC+类型)和尾部(FCS)
网络层帧    [以太网头 | IP头 | TCP头 | HTTP数据 | FCS]
      ↓ 变成比特流发送到物理介质

每一层添加的头部信息,称为封装(Encapsulation)。对端收到后,逐层解封装(Decapsulation),剥掉对应的头部,最终得到原始数据。

为什么需要这么多头部?

  • 以太网头:确保数据帧在同一个局域网内能被正确的网卡接收(MAC 地址)。
  • IP 头:确保数据包能跨过多个路由器,最终到达目标 IP 地址所在的主机。
  • TCP 头:确保到达该主机后,能交给正确的进程(端口号),并且能够重传丢失的段、按序重组。
  • HTTP 头:告诉对端这是什么请求(GET / POST),主机名是什么,以及其它应用层语义。

六、TCP 的建立与断开:三次握手 + 四次挥手

6.1 三次握手(建立连接)

为什么叫“握”手? 因为双方需要确认彼此的接收和发送能力都正常,并同步序列号。

过程(假设客户端主动打开):

Server Client Server Client 服务端收到,确认客户端发送能力正常,自己接收能力正常 客户端收到,确认服务器发送能力正常,自己接收能力正常 服务器收到ACK,连接建立 SYN (Seq=x) SYN+ACK (Seq=y, Ack=x+1) ACK (Seq=x+1, Ack=y+1)

为什么要三次,而不是两次或四次?

  1. 防止历史连接请求导致的资源浪费
    如果客户端发送一个旧的 SYN(网络延迟后到达),服务器如果只通过两次握手就直接建立连接,会白白分配资源。第三次 ACK 可以告知服务器:这个 SYN 是否有效。如果客户端没有对应的连接意愿,就不会回复 ACK,服务器超时释放资源。

  2. 同步双方的初始序列号(ISN)
    可靠传输需要给每个字节编号。三次握手允许双方互相确认对方的 ISN(Seq=x 和 Seq=y),并给对方 ACK。两次握手只能让一方确认,另一方无法确认自己的 SYN 是否被对方正确接收。

  3. 为什么不是四次?
    因为第二次握手的 SYN 和 ACK 可以合并在一个包中发送(标志位同时置1),不需要拆成两个包。三次已经是最小可靠值。

6.2 四次挥手(断开连接)

由于 TCP 是全双工的,每一端必须独立关闭自己的数据传输方向。因此需要四次挥手。

被动关闭方(B) 主动关闭方(A) 被动关闭方(B) 主动关闭方(A) 主动方不再发送数据,但还能接收 被动方确认收到FIN 被动方可能还有数据要发送 被动方也关闭发送 连接彻底关闭 FIN (Seq=u) ACK (Ack=u+1, Seq=v) FIN (Seq=w, Ack=u+1) ACK (Ack=w+1, Seq=u+1)

为什么需要四次?
因为 TCP 允许半关闭(half-close)。当主动方发送 FIN 后,只表示“我没有数据要发了”,但被动方可能还有数据要发,所以被动方的 FIN 和 ACK 必须分开(除非被动方也没有数据要发,可以合并,但规范不强制)。因此通常是四次。


七、浏览网页:按下回车后的一瞬间(完整时序图)

结合以上所有知识,下面是访问 https://example.com 的完整流程(使用 Mermaid 序列图)。

目标服务器(93.184.216.34) 路由器/互联网 本机TCP/IP栈 DNS服务器 浏览器 目标服务器(93.184.216.34) 路由器/互联网 本机TCP/IP栈 DNS服务器 浏览器 1. 应用层:DNS解析 2. 传输层:TCP三次握手 3. TLS握手(HTTPS) 协商会话密钥,握手完成 4. 发送HTTP请求 浏览器解析HTML、加载CSS/JS、渲染 5. TCP四次挥手 查询 example.com 的IP 返回 93.184.216.34 SYN (Seq=x) SYN+ACK (Seq=y, Ack=x+1) ACK (Seq=x+1, Ack=y+1) Client Hello (加密套件、随机数) Server Hello + 证书 + 公钥 预主密钥(公钥加密) HTTP GET /index.html (加密传输) HTTP/1.1 200 OK + HTML内容(加密) FIN (Seq=u) ACK (Ack=u+1, Seq=v) FIN (Seq=w, Ack=u+1) ACK (Ack=w+1, Seq=u+1)

每一层在图中做了什么?

  • 应用层:DNS 查询(UDP 请求)、HTTP 请求构造、TLS 握手(部分教材将 TLS 归为表示层,但 TCP/IP 中常视为应用层库)。
  • 传输层:TCP 三次握手 / 四次挥手,TLS 记录层也依赖 TCP 可靠传输。
  • 网络层:每个 TCP 段都被加上 IP 头,路由器根据目标 IP 转发(图中简化为“互联网”)。
  • 网络接口层:每一跳都涉及 MAC 地址和以太网帧(图中未显式画出,但隐含在“路由器”之间)。

八、一张 Mermaid 流程图总结封装与四层模型

接收端

发送端

传输

应用层数据: HTTP GET

传输层: 添加TCP头
得到TCP段

网络层: 添加IP头
得到IP数据报

网络接口层: 添加以太网头+尾部
得到帧

物理介质: 比特流

物理介质: 比特流

网络接口层: 剥除以太网头+CRC校验

网络层: 剥除IP头, 检查目标IP

传输层: 剥除TCP头, 重组数据

应用层: 解析HTTP请求


九、常见问题深入辨析

Q1:为什么 DNS 使用 UDP 而不是 TCP?

  • UDP 快:DNS 请求响应很短,一个 UDP 包即可搞定,不需要三次握手建立连接。
  • 可靠性由应用层处理:DNS 客户端自己实现重试和超时机制。
  • 当响应超过 512 字节(比如有大量记录)时,DNS 会切换到 TCP。

Q2:TCP 的 SYN Flood 攻击如何防范?

攻击者发送大量 SYN 而不回复 ACK,导致服务器为每个 SYN 分配资源并耗尽。防范方法:

  • SYN Cookie:服务器在收到 SYN 时,不立即分配资源,而是根据源 IP、端口、时间等计算一个 Cookie 作为序列号发回去。只有收到 ACK 且 Cookie 有效时才真正分配资源。

Q3:为什么有了 IP 地址还需要 MAC 地址?

  • IP 地址是逻辑地址,用于跨网络路由(可改变,如 DHCP)。
  • MAC 地址是物理地址,用于同一个局域网内标识网卡(出厂固化)。
  • 路由器通过 ARP 协议将目标 IP 解析为下一跳的 MAC 地址,这样才能在以太网上发送帧。

Q4:应用层常见协议

  • HTTP/HTTPS: 浏览器与服务器之间的协议。HTTPS = HTTP + SSL/TLS加密。
  • DNS: 域名系统(把 www.baidu.com 变成 IP 地址)。没有它,上网得记一串数字。
  • SMTP/POP3/IMAP: 电子邮件收发协议。
  • FTP: 文件传输协议。
  • SSH: 远程安全登录协议(开发必备)。

Q5:传输层主要协议:TCP 与 UDP 的对决

TCP 与 UDP 的对决

一个类比: TCP 像打电话(先拨号建立连接,逐句确认听到);UDP 像寄信(扔进邮筒,不保证送达,但成本低)。


十、最后的思考

TCP/IP 四层模型之所以能够支撑整个互联网,不是因为它在理论上完美,而是因为它足够简单、灵活、解耦。你可以替换底层光纤(网络接口层),而不影响浏览器(应用层);你可以给 TCP 增加新的拥塞控制算法,而不需要修改 IP 协议。

理解分层的本质,就是理解现代计算机系统如何管理复杂性的范本。


Logo

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

更多推荐