趣谈网络协议:通信协议综述
在数字时代,互联网已成为连接世界的“通天塔”。作为一名“程序猿”,我们敲击着通用的语言,构建着这个互联世界。但你是否想过,你的“Hello World!”代码本身也是一种协议,是你与计算机沟通的方式?而要连接世界,让“一大片机器互相协作”,则需要更复杂的网络协议。
一、协议的三要素
无论是人类语言、计算机语言,还是网络协议,它们都具备以下三个核心要素:
- 语法 (Syntax):规定了内容需要符合的规则和格式。例如,编程语言中括号要成对,语句要以分号结束。在网络协议中,HTTP 请求和返回也有其特定的格式。
- 语义 (Semantics):代表了内容的意义。例如,数字相减有意义,而数字与文本相减通常无意义。HTTP 响应中的状态码
200表示网页成功返回,404则表示未找到页面。 - 顺序 (Sequence):规定了操作的先后次序。例如,先加后减的计算顺序。在网络通信中,先发送 HTTP 请求,才有对应的 HTTP 返回。
二、网络为什么要分层?理解网络包的“生命周期”
教科书常将网络分层比喻为公司架构,但这种比喻并不恰当。更准确的理解是,网络分层是为了处理复杂性,是一种程序设计的必然要求。网络包在传输过程中,就像俄罗斯套娃(或层层封装的快递),每一层都在上一层的数据外加上自己的“头部”信息,形成一个完整的包裹。
核心原则:只要是在网络上跑的包,都是完整的。可以有下层没上层,绝对不可能有上层没下层。
发送过程(封装):当你点击浏览器发送 HTTP 请求时,你的程序(浏览器)将 HTTP 请求内容交给底层的网络处理程序。
- 应用层数据(HTTP请求)会被 TCP 层加上 TCP 头(包含源端口和目的端口,如80端口)。
- 带TCP头的包再交给 IP 层加上 IP 头(包含源 IP 和目的 IP 地址)。
- 带IP头的包再交给 MAC 层加上 MAC 头(包含源 MAC 地址和目的 MAC 地址)。
- 最终,这个完整的网络包通过网卡发送出去。
接收过程(解封装):当网络包到达你的机器时,网络处理程序会逐层解开:
- MAC 层首先处理,检查 MAC 头是否与本机相符,如果相符则去掉 MAC 头。
- 然后交给 IP 层处理,检查 IP 头是否与本机相符或需要转发,如果发给本机则去掉 IP 头。
- 再交给 传输层(TCP或UDP),根据 TCP/UDP 头判断包的类型(发起、应答、数据包),处理后去掉 TCP/UDP 头。
- 最终,应用层(如浏览器)根据端口号接收并处理剩余的应用层数据(如HTML内容),与底层无关。
设备分层:
- 二层设备(如交换机)收到完整的网络包,只摘取 MAC 头来判断是丢弃、转发还是自己保留。
- 三层设备(如路由器)收到完整的网络包,摘取 MAC 头后,还会摘取 IP 头来判断是丢弃、转发还是自己保留。

三、IP 地址与 MAC 地址:门牌号与身份证
在Windows上是ipconfig
在Linux上是 ifconfig 、ip addr
Windows上刷新DNS缓存的命令:ipconfig /flushdns
- ifconfig 是传统的网络配置命令,属于 net-tools 工具包。
- ip addr 是较新的命令,属于 iproute2 工具包,功能更强大。
在网络世界中,IP 地址和 MAC 地址是识别设备的两种重要方式。
IP 地址 (Internet Protocol Address):
- 作用:相当于现实世界的“门牌号码”,具有远程定位功能,用于在互联网中找到目标机器。
- 格式:IPv4 是 32 位(四段点分十进制表示,如 10.100.122.2),IPv6 是 128 位。
- 唯一性:一个网络接口在一个网络中应拥有唯一的 IP 地址,冲突会导致网络问题。
公有 IP 与私有 IP:
- 私有 IP 地址:在组织内部(如家庭、办公室、数据中心)使用,由内部 IT 人员管理和分配,可以在不同组织间重复使用。常见的私有 IP 段如
192.168.x.x、10.x.x.x等。
- 公有 IP 地址:由统一组织分配,全球唯一,用于互联网上的公开访问。
- 私有 IP 地址:在组织内部(如家庭、办公室、数据中心)使用,由内部 IT 人员管理和分配,可以在不同组织间重复使用。常见的私有 IP 段如
CIDR (Classless Inter-Domain Routing):
- 一种表示 IP 地址的方式,用斜杠
/后跟数字表示网络号的位数(如10.100.122.2/24表示前 24 位是网络号,后 8 位是主机号)。 - 通过将 IP 地址与子网掩码进行按位 AND 运算可得到网络号。
示例:
16.158.165.91/22- 网络号:
16.158.164.0(二进制计算165的前 6 位101001作为网络号,后 2 位01和91组成主机号。网络号主机位全为 0,所以10100100即164)。 - 第一个地址:
16.158.164.1(网络号 + 最小主机号)。 - 子网掩码:
255.255.252.0(网络号位全为 1,主机位全为 0)。 - 广播地址:
16.158.167.255(网络号 + 主机位全为 1)。
- 网络号:
- 一种表示 IP 地址的方式,用斜杠
广播地址是一个特定的地址,它的主机位全部设置为
1。这意味着在这个子网范围内,所有的设备都会接收到发送到这个地址的数据包。
MAC 地址 (Media Access Control Address):
- 作用:相当于设备的“身份证”,是一个网卡的物理地址,出厂时固化,设计上是全球唯一的标识。
- 格式:十六进制,6 个字节表示。
- 定位能力:MAC 地址的通信范围非常有限,仅限于一个子网(局域网)内部通信。
- 与 IP 结合:尽管 MAC 地址全球唯一,但它不具备远程定位功能。要实现跨网络通信,必须依赖具有定位功能的 IP 地址。在本地子网内,IP 地址需要通过 ARP 协议解析为 MAC 地址才能进行通信。
- 可修改性:虽然 MAC 地址由厂商分配且号称全球唯一,但操作系统层面可以修改 MAC 地址。在不同局域网内修改为相同的 MAC 地址不会导致冲突,但在同一局域网内冲突则会影响通信。
ip addr 命令解析(以 Linux 为例):
lo(loopback):环回接口,通常分配127.0.0.1地址,用于本机进程间通信,数据包不离开本机。eth0(网卡接口):link/ether fa:16:3e:c7:79:75:MAC 地址。link表示数据链路层的信息link/loopback- 回环接口link/ppp- PPP(点对点协议)接口link/tunnel- 通用隧道接口inet是网络层(第3层)的IPv4地址信息
<BROADCAST,MULTICAST,UP,LOWER_UP>:网络设备状态标识。UP:网卡已启动。BROADCAST:网卡有广播地址,可发送广播包。MULTICAST:网卡可发送多播包。LOWER_UP:物理层(L1)已启动,通常表示网线已插入。
mtu 1500(Maximum Transmission Unit):最大传输单元。这是 MAC 层的概念,指一个以太网帧中数据(不含 MAC 头和帧校验码)的最大载荷大小为 1500 字节。如果 IP 包加上 TCP 头和 HTTP 头后超过这个大小,就需要分片传输。qdisc pfifo_fast(queueing discipline):排队规则。内核通过它管理网络接口的数据包发送队列。pfifo_fast是一种优先级队列,有三个波段 (band),优先级从高到低,高优先级波段有数据时,低优先级数据包不会被处理。数据包根据 IP 头中的Type of Service (TOS)字段分配到不同波段。- pfifo_fast 适合简单需求,配置最少。
- mq 更适合高性能多核和虚拟化环境。
scope
- global,说明这张网卡是可以对外的,可以接收来自各个地方的包
- host,说明这张网卡仅仅可以供本机相互通信
数据链路层的层次结构:
┌─────────────────────┐
│ 第三层(网络层) │
├─────────────────────┤
│ LLC子层 (上子层) │ ← 逻辑链路控制
├─────────────────────┤
│ MAC子层 (下子层) │ ← 媒体访问控制
├─────────────────────┤
│ 第一层(物理层) │
└─────────────────────┘
MAC子层靠近物理层,负责介质访问、MAC地址和帧处理。
LLC子层靠近网络层,负责流量控制、错误检测和上层接口。四、DHCP 与 PXE:IP 地址的“租用”与系统自动化安装
1. IP 地址的配置
可以使用 ifconfig,也可以使用 ip addr。设置好了以后,用这两个命令,将网卡 up 一下,就可以开始工作了。
使用 net-tools:
$ sudo ifconfig eth1 10.0.0.1/24
$ sudo ifconfig eth1 up使用 iproute2:
$ sudo ip addr add 10.0.0.1/24 dev eth1
$ sudo ip link set up eth1❌ 错误配置示例
- 周围机器都是
192.168.1.x - 自己配置成
16.158.23.6 - 结果:包发不出去
🔍 原因分析
- 网络包必须完整:有上层必须有下层
MAC地址填充问题:
- 源MAC:自己知道 ✅
- 目标MAC:需要判断 ❓
📡 Linux发包逻辑
判断目标IP是否同网段
├── 是 → 发送ARP请求获取MAC地址
└── 否 → 尝试发送到网关
├── 有网关 → 获取网关MAC发送
├── 无网关 → 包发不出去
└── 网关配置错误 → 系统拒绝配置⚠️ 配置要点
- 网段一致性:IP必须与网络环境匹配
- 网关限制:网关必须与本机至少一个网卡同网段
实际部署:使用配置文件,包含:
- CIDR
- 子网掩码
- 广播地址
- 网关地址
2. 动态主机配置协议 (DHCP)
- 作用:为了方便客户端设备(如笔记本)自动获取 IP 地址,以及非技术人员的使用,DHCP 协议应运而生,实现了 IP 地址的动态自动配置和回收。这就像“租房”一样,按需使用。
工作方式(DORA):
- DHCP Discover (发现):新加入网络的机器(此时没有IP地址,源IP为
0.0.0.0,目的IP为255.255.255.255,携带自身MAC地址)发送广播包,寻求IP地址租用。MAC 地址的唯一性在此处至关重要。
- DHCP Offer (提供):网络中配置的 DHCP Server 收到 Discover 后,为该客户端保留一个可用的 IP 地址,并通过广播(因为客户端尚未拥有 IP 地址)向其提供此 IP 地址,以及子网掩码、网关和租期等信息。
- DHCP Request (请求):客户端收到多个 Offer 后,选择其中一个(通常是最先到达的),并通过广播再次发送请求,告知所有 DHCP Server 它接受了哪个 IP 地址,并请求其他服务器撤销其提供的 IP 地址。
- DHCP ACK (确认):DHCP Server 收到客户端的 Request 后,通过广播返回确认消息包(ACK),告知客户端已接受其选择,并发送最终的合法租用信息和其他配置信息。
- DHCP Discover (发现):新加入网络的机器(此时没有IP地址,源IP为
- IP 地址的收回与续租:客户端会在租期过去 50% 时主动向 DHCP Server 发送请求续租,更新配置。
DHCP的必须项和缺省项
- 最小配置:IP地址 + 子网掩码 + 租约时间
- 推荐配置:+ 默认网关 + DNS服务器
- 完整配置:根据网络环境添加其他选项
3. 预启动执行环境 (PXE)
- 作用:除了分配 IP 地址,网络管理员还可以通过 PXE 协议(Pre-boot Execution Environment)实现自动安装操作系统,尤其适用于数据中心大批量机器的部署。
工作过程:
- PXE 客户端启动与 DHCP 请求:计算机启动时,BIOS 中的 PXE 客户端被调入内存。它会发送 DHCP 请求,不仅为了获取 IP 地址,还会请求 PXE 服务器的地址 (
next-server) 和启动文件 (filename)。 - TFTP 下载启动文件:PXE 客户端得到 PXE 服务器地址和启动文件名(如
pxelinux.0)后,会使用 TFTP 协议(一种轻量级文件传输协议)从 PXE 服务器下载该启动文件。 - 下载配置与内核:启动文件执行后,会指示 PXE 客户端继续向 TFTP 服务器请求计算机的配置信息(如
pxelinux.cfg),并根据配置信息下载 Linux 内核和initramfs文件。 - 操作系统启动:所有必要文件下载完成后,Linux 内核启动,完成操作系统的初始化和安装。
- PXE 客户端启动与 DHCP 请求:计算机启动时,BIOS 中的 PXE 客户端被调入内存。它会发送 DHCP 请求,不仅为了获取 IP 地址,还会请求 PXE 服务器的地址 (
- 安装后启动:为避免每次重启都重新安装操作系统,首次安装完成后,需将 BIOS 设置从网络启动更改为从硬盘启动。

问答小测
请用2-3句话简要回答以下问题。
- 请解释网络协议“三要素”的含义。
- 为什么说“只要是在网络上跑的包,都是完整的。可以有下层没上层,绝对不可能有上层没下层”?
- IP地址和MAC地址各自的主要作用是什么?
- CIDR是什么?它如何解决了传统IP地址分类的不足?
- 公有IP地址和私有IP地址有什么区别?请举例说明。
- 简述DHCP协议“四步走”的工作流程。
- DHCP协议中的广播(Broadcast)机制在哪些步骤中发挥了作用?
- 为什么即使知道目标IP地址,仍然需要MAC地址才能发送网络包?
- MTU(最大传输单元)是哪一层的概念?它对网络包的传输有什么影响?
- PXE协议主要解决了什么问题?它如何利用DHCP协议实现其功能?
问答小测答案键
- 请解释网络协议“三要素”的含义。 协议三要素指语法、语义和顺序。语法规定数据内容的格式和规则;语义规定数据内容的具体意义;顺序则指定了操作执行的先后次序,确保通信双方能够理解和协调行为。
- 为什么说“只要是在网络上跑的包,都是完整的。可以有下层没上层,绝对不可能有上层没下层”? 这意味着网络包在传输过程中是层层封装的,上层协议的数据被封装在下层协议的数据中。例如,一个HTTP包必须包含TCP、IP和MAC层的信息才能在物理网络上传输,因为下层提供了传输和寻址的基础。
- IP地址和MAC地址各自的主要作用是什么? IP地址是逻辑地址,用于在互联网上进行远程定位和路由选择,实现跨网络通信。MAC地址是物理地址,用于在局域网内部标识唯一的网络设备,实现同一子网内的直接数据传输。
- CIDR是什么?它如何解决了传统IP地址分类的不足? CIDR(无类型域间选路)是一种IP地址表示方法,它使用斜杠后的数字表示网络号的位数。它打破了传统A/B/C类地址的固定划分,使得IP地址的分配更加灵活和高效,有效避免了IP地址的浪费。
- 公有IP地址和私有IP地址有什么区别?请举例说明。 公有IP地址是全球唯一的,由权威机构统一分配,用于互联网上的公开访问,例如网站服务器的IP地址。私有IP地址则可以在组织内部(如家庭或公司网络)重复使用,无需全球唯一,例如192.168.1.x。
- 简述DHCP协议“四步走”的工作流程。 DHCP流程包括:1. DHCP Discover(客户端广播请求IP);2. DHCP Offer(服务器提供IP);3. DHCP Request(客户端广播确认选择的IP);4. DHCP ACK(服务器广播最终确认并分配IP)。
- DHCP协议中的广播(Broadcast)机制在哪些步骤中发挥了作用? 在DHCP Discover阶段,新加入的客户端通过广播寻找DHCP服务器。在DHCP Offer、DHCP Request和DHCP ACK阶段,DHCP服务器和客户端也可能使用广播(尤其是在客户端尚未获得IP地址时),以确保所有相关方都能接收到信息。
- 为什么即使知道目标IP地址,仍然需要MAC地址才能发送网络包? IP地址提供了逻辑上的定位,但数据包最终需要在物理层传输。MAC地址是网卡在局域网内的唯一物理标识,没有MAC地址,网络包就无法被封装成以太网帧并在物理链路上发送给特定的设备。
- MTU(最大传输单元)是哪一层的概念?它对网络包的传输有什么影响? MTU是第二层(MAC层/数据链路层)的概念,特指以太网帧中数据载荷的最大长度,通常为1500字节(不含MAC头和尾)。如果网络包的数据量超过MTU,就需要进行分片传输,这会增加网络开销和处理复杂性。
- PXE协议主要解决了什么问题?它如何利用DHCP协议实现其功能? PXE协议解决了在没有操作系统的情况下,通过网络启动计算机并自动安装操作系统的问题,极大地简化了大规模服务器部署。它利用DHCP协议获取IP地址、PXE服务器地址和初始启动文件路径,从而引导客户端从网络下载并启动操作系统安装程序。
