ping、tcpdump、curl 验证每一层的存在。前六篇你掌握了 Linux 系统层面的操作——文件、进程、网络配置、脚本、包管理。现在要回答一个更底层的问题:当你在 Kali 上执行 nmap scanme.nmap.org 时,这条命令背后,数据是如何从你的网卡出发、穿过无数路由器、到达远端服务器的?答案藏在"分层模型"里。
网络通信极其复杂:物理层面要处理电信号和光纤脉冲,链路层面要解决 MAC 地址寻址和碰撞检测,网络层面要路由跨越多个子网,传输层面要保证数据可靠到达,应用层面要解析 HTTP 请求格式。如果把所有问题混在一起处理,任何一处改动都会牵连全局。分层模型的核心思想是分而治之——每一层只负责一个特定职责,对上层提供服务,对下层隐藏细节。
iptables 工作在网络层和传输层,它不需要知道下层用的是 WiFi 还是有线网卡——那是数据链路层和物理层的事。这种隔离让每层可以独立演进:WiFi 6 替代 WiFi 5 时,上层的 IP 路由和 HTTP 协议完全不受影响。OSI(Open Systems Interconnection)模型由 ISO 在 1984 年提出,将网络通信划分为七个层级。我们从最底层开始,逐层向上理解——就像拆快递时从最外层包装拆到商品本身。
物理层(Layer 1)关心的是 0 和 1 如何变成电信号、光脉冲或无线电波。网线中的电压变化、WiFi 中的电磁波振荡,都在这一层定义。设备:集线器(Hub)、中继器(Repeater)。
数据链路层(Layer 2)在同一个局域网内通过 MAC 地址找到目标网卡。你在第04篇用 ip link show 看到的 link/ether 后面的地址就是 MAC。设备:交换机(Switch)。
网络层(Layer 3)解决跨网段通信——源 IP 和目的 IP 可能不在同一个局域网,需要路由器逐跳转发。ping 命令使用的 ICMP 协议就在这一层。设备:路由器(Router)。
传输层(Layer 4)通过端口号区分同一台机器上的不同服务——22 端口给 SSH,80 端口给 HTTP。TCP 保证可靠送达(三次握手),UDP 追求速度不保证送达。你在第03篇用 ss -tlnp 查看的就是这一层的信息。
会话层(Layer 5)管理通信双方的"对话"——何时建立连接、何时断开、谁先发言。实际工程中,这一层的功能常被传输层和应用层吸收,独立协议较少。
表示层(Layer 6)处理数据的"翻译"——加密解密(TLS)、编码转换(UTF-8)、数据压缩(gzip)。当你访问 HTTPS 网站时,TLS 握手就发生在这一层。
应用层(Layer 7)是离用户最近的一层——HTTP 请求、DNS 查询、SSH 登录,都是应用层协议。注意:应用层不等于"你的应用程序",而是应用程序使用的网络通信协议。
OSI 模型理论上完美,但实际互联网使用的是 TCP/IP 模型。它更简洁,将七层合并为四层。会话层、表示层、应用层合并为"应用层",物理层和数据链路层合并为"网络接口层"。
| OSI 层 | OSI 名称 | TCP/IP 层 | 代表协议 |
|---|---|---|---|
| 7 | 应用层 | 应用层 | HTTP, DNS, SSH |
| 6 | 表示层 | TLS, JPEG | |
| 5 | 会话层 | RPC | |
| 4 | 传输层 | 传输层 | TCP, UDP |
| 3 | 网络层 | 网际层 | IP, ICMP |
| 2 | 数据链路层 | 网络接口层 | Ethernet, ARP |
| 1 | 物理层 | 电缆, WiFi |
为什么 TCP/IP 模型赢了?因为它先有实现(ARPANET),后有模型——从实战中长出来的协议栈自然更健壮。OSI 则是先有理论模型再尝试实现,会话层和表示层在实际工程中几乎没有独立协议。后续文章中我们提到的"网络层"指 TCP/IP 的网际层,"传输层"两者一致。
理解了七层结构,现在看数据如何穿越这些层级。当你用浏览器访问 https://www.kali.org 时,数据从应用层出发,每经过一层就被"套上一层信封"(添加头部),这个过程叫封装(Encapsulation)。
每一层添加的头部包含该层需要的控制信息。传输层头部携带端口号(区分服务),网络层头部携带 IP 地址(区分主机),链路层头部携带 MAC 地址(区分网卡)。这些头部信息就是你在第04篇用 iptables 过滤数据包时匹配的字段。
解封装是封装的逆过程。接收方从物理层收到比特流,逐层向上"拆信封":链路层读取 MAC 地址后剥离帧头,网络层读取 IP 地址后剥离 IP 头,传输层读取端口号后剥离 TCP 头,最终把原始 Data 交给应用层。每一层只看自己的头部,不关心其他层的内容。
每一层处理的数据单元有专用名称,称为 PDU(Protocol Data Unit):
理论需要实践验证。以下四个命令分别对应不同层级,让你亲眼"看到"每一层的存在。如果 Kali 上没有 tcpdump,先用第06篇学到的 sudo apt install tcpdump -y 安装。
ttl=117 是 IP 头部中的 Time-To-Live 字段——每经过一个路由器减 1,减到 0 则丢弃。从 8.8.8.8 到你的机器经过了 117 跳吗?不是——TTL 初始值通常是 128,128-117=11,说明经过了约 11 个路由器。
这条 curl -v 命令的输出完美展示了分层协作:先 DNS 解析得到 IP(网络层),再建立 TCP 连接(传输层),然后 TLS 握手加密(表示层),最后 HTTP 请求响应(应用层)。一条命令,四层联动。
端口是传输层的概念——一台机器上同时运行多个网络服务,靠端口号区分。以下是网络安全领域必须牢记的常见端口:
| 端口 | 服务 | 协议 | 安全备注 |
|---|---|---|---|
| 22 | SSH | TCP | 加密远程登录,暴力破解首选目标 |
| 23 | Telnet | TCP | 明文传输,可抓包窃听 |
| 53 | DNS | UDP/TCP | 域名解析,DNS 劫持/隧道攻击 |
| 80 | HTTP | TCP | Web 明文,可中间人窃听 |
| 443 | HTTPS | TCP | Web 加密,TLS 握手在表示层 |
| 3306 | MySQL | TCP | 数据库,不应暴露公网 |
| 3389 | RDP | TCP | Windows 远程桌面,勒索软件入口 |
| 8080 | HTTP-alt | TCP | Web 代理/备用端口,常被忽略 |
ping -c 4 1.1.1.1,记录返回的 TTL 值,计算数据包从 1.1.1.1 到你的机器大约经过了多少个路由器(假设初始 TTL 为 64)。ttl=57,则经过 64-57=7 个路由器。
tcpdump -e -i eth0 icmp -c 2 抓取 ping 包,观察输出中的 MAC 地址和 IP 地址;② 对比 -e 参数加与不加的区别,说明哪个参数显示了链路层信息。-e 时 tcpdump 从网络层开始显示(IP 地址),加上 -e 后额外显示链路层信息(源/目的 MAC 地址、以太网类型)。
curl -v https://www.kali.org 2>&1,对照本篇的七层模型,找出输出中至少三个分别属于不同层级的线索(如 IP 地址对应网络层、端口号对应传输层等),并说明你的判断依据。Trying IP:Port(网络层+传输层)、TLS handshake(表示层)、GET/HTTP(应用层)。思考为什么 2>&1 是必要的——curl 的调试信息输出到 stderr 而非 stdout。