本文内容基于 2025 秋季《计算机网络》课程讲述,如有差错,欢迎指正
IPv4 协议#
IPv4 是今天互联网的核心协议,其采用寻址机制很好的完成了网络层的两个基本功能,路由和转发。此外还提供了适应不同链路的分片机制,使上层可以一次性发送大量数据
IPv4 数据报格式#
IPv4 头部通常为 20 字节(不含选项)
其各个字段的含义:
- 版本: 4 bits,表示采用的IP协议版本(IPv4=4,IPv6=6)
- 首部长度: 4 bits,表示整个IP数据报首部的长度,单位是4字节
- 区分服务: 8bit,该字段一般情况下不使用
- 总长度: 16 bits,IP 数据报的总字节数(首部 + 数据)。最大为 65,535 字节
- 标识、标志、片偏移: 用于 IP 分片与重组
- 生存时间 (TTL, Time To Live): 8 bits
- 防止数据包在网络中无限循环。
- 每经过一个路由器,TTL 减 1。
- 当 TTL = 0 时,丢弃数据包并发送 ICMP 超时报文。
- 协议: 指示数据载荷部分使用的是什么协议(如 TCP=6, UDP=17, ICMP=1)
- 首部校验和: 仅校验 IP 首部,不校验数据部分。每跳都需要重新计算(因为 TTL 会变)
- 源 IP / 目的 IP: 32 bits,标识发送方和接收方
- 选项:可扩充部分,具有可变长度,定义了安全性、路由方式、时间戳等选项
- 填充:用全0的填充字段补齐为4字节的整数倍
IPv4 分片与重组#
由于底层链路层的 MTU (最大传输单元) 限制(如以太网 MTU 为 1500 字节),大 IP 包需要被切片发送
- 分片发生地:源主机或中间路由器
- 重组发生地:仅在目的主机。
- 原因:减轻路由器负担(不需要实现复杂机制);避免因路径不同导致分片无法在中间重组
- 关键字段:
- 标识 (ID):16bit,IP软件通过计数器自动产生,每产生1个数据报计数器加1。同一数据报的所有分片具有相同的 ID
- 标志 (Flags):3bit,只有两位有意义
- DF :置 1 时禁止分片(若包太大则丢弃并报错)
- MF :置 1 表示后面还有分片,置 0 表示这是最后一个分片
- 片偏移 (Offset):13bit,表示该分片在原IP数据报中的相对位置,单位是 8 字节
IP 地址#
IP 地址和网络接口的概念是绑定在一起的,主机的每个接口都有一个IP地址
在IPv4中,IP地址是32位二进制数,通常写成点分十进制形式(如127.0.0.1)。从结构角度来说,IP地址可以分为两部分: 网络号(网络地址)+主机号(主机地址)
从这个角度来说,我们对所有IP地址进行了切分,所有具有相同网络地址的网络接口,我们认为它形成了一个子网。 在实现上来说,在子网内部可以直接采用链路层的技术去进行传输。网络层是根据网络地址决定下一跳进行传输,这也符合我们前面所说最长前缀匹配的原则
在从网络管理的角度来说,这也使得网络更加容易维护
- 子网表示:子网掩码(subnet mask),与 IP 地址一一对应,是32 bit 的二进制数,置1表示网络位,置0表示主机位
- 网络前缀:网络号相同的这块连续IP地址空间称为地址的前缀,或网络前缀
子网由接口组成,与主机/路由器等设备无关:一个子网内的接口,可能来自不同设备;一个设备的多个接口,可能属于不同子网
若网络地址长度为24,上图中有6个子网
一些特殊的 IP 地址:
- 全0网络地址:只在系统启动时有效,用于启动时临时通信,又叫主机地址
- 全0主机地址:用于指定网络本身,称之为网络地址或者网络号
- 全1主机地址:用于子网内广播,也称定向广播,需要指定目标网络
- 255.255.255.255:用于本地广播,也称有限/受限广播,无须知道本地网络地址
- 网络127.0.0.0/8:指本地节点(一般为127.0.0.1),用于测试网卡及TCP/IP软件
IP 地址分类与表示方法:
- 分类编址:
- IP地址共分为A、B、C、D、E五类,A类、B类、C类为单播地址
- 网络号长度固定,难以适应现代网络的部署需求

- CIDR (无类别域间路由):
- 目前的互联网标准格式:
a.b.c.d/x,其中x是前缀长度,长度可以任意。 - 消除了 A/B/C 类的概念,使地址分配更灵活,并支持路由聚合(Supernetting)
- 目前的互联网标准格式:
路由聚合(地址聚合):CIDR子网内的地址,可以进一步划分为多个子网,对外只暴露1个CIDR网络地址
使用CIDR后,子网进行迁移时可以不用更改自身地址,只需修改路由规则(利用最长前缀匹配)
IP 包转发#
通过最长前缀匹配可以把数据包转发到正确的子网,但是子网内部有多个主机,该如何判断转发到哪个主机呢?
- 方法1:子网内仍然对目的IP地址进行最长前缀匹配,转发到正确主机
- 设备:网络层路由器
- 方法2(常用):子网内根据目的MAC地址,转发到正确主机
- 设备:链路层交换机。成本低、管理简单、规模有限
- 通过ARP协议获取MAC地址,利用交换机查找映射表进行转发
ARP 协议#
ARP 协议实现了局域网内 IP 地址到 MAC 地址的映射
我们先来了解一下MAC地址的作用:
子网内部通信时,数据链路层使用 MAC 地址进行寻址和转发。 MAC 地址是链路层的地址,是物理地址,由网卡厂商烧录在网卡上,全球唯一。 IP数据包经过不同链路的时候,封装在不同链路层帧里面的网络层的IP地址是始终不变的; 但是每经过一跳时,链路层地址都会发生改变,变化为下一跳的链路层地址
回想一下路由器的结构,在路由器的输出端口上,路由器需要将数据包封装在链路层帧中发送出去。 因此路由器需要知道下一跳的MAC地址,才能正确封装链路层帧并发送出去,这就是ARP协议的作用
工作原理#
ARP 协议维护了一张 ARP 表 (ARP Cache),存储 IP 地址与 MAC 地址的映射关系
- 当主机 A 知道 B 的IP地址,想知道 B 的 MAC 地址,先查本地 ARP 表,如果映射存在,直接使用
- 若表中无记录,A 在局域网中广播ARP查询请求
- 目的 MAC:
FF-FF-FF-FF-FF-FF(广播帧)
- 目的 MAC:
- B 收到广播后,发现找的是自己,向 A 发送 ARP 响应报文(单播),告知自己的 MAC 地址
- A 收到后,将映射关系写入 ARP 表,并设置老化时间 (TTL)

注意:ARP 仅在直连的局域网内工作。若目标在子网外,ARP 解析的是默认网关 (路由器) 的 MAC 地址
ARP Spoofing攻击:
- 攻击者随意地发送ARP请求或ARP响应(可以使用任意源IP地址与MAC地址)
- ARP协议是无状态的:即使受害者之前没发过ARP请求,收到一个ARP响应时,也会更新ARP表
- 受害者后续数据将被发往攻击者提供的MAC地址
- 攻击者可以修改自己的IP转发功能,将截获的受害者数据继续转发
DHCP 协议#
解决网络内部主机 IP 地址
IP地址一般有两种分配方式:
- 静态设定:管理员手动配置IP地址,比如路由器、服务器等
- 动态获取:主机使用DHCP协议或其他动态配置协议,从DHCP服务器动态获取IP地址
- 这种方式可以有效利用IP地址,方便移动主机的地址获取,避免地址冲突
采用 客户端/服务器 模式:
- 应用层协议,基于 UDP
- 客户端端口 68,服务器端口 67
工作方式#
- DHCP Discover(广播):新来的主机向整个网络进行广播,寻找DHCP服务器
- DHCP Offer(广播或单播):服务器广播或单播发出提供报文
- DHCP Request(广播):主机决定从多个DHCP服务器中选择一个,并向其以广播形式发送DHCP请求报文(广播是为了告诉其他服务器可以回收它们的 Offer)
- DHCP Ack(广播或单播):被选择的DHCP服务器广播或单播发送确认报文
DHCP过程中报文字段取值
| 阶段 | 源MAC | 目标MAC | 源IP | 目标IP | 形式 |
|---|---|---|---|---|---|
| Discover | PC机的MAC | 全FF | 0.0.0.0 | 255.255.255.255 | 广播 |
| Offer | DHCP服务器或者中继器路由的MAC | DHCP客户机的MAC | DHCP服务器或中继路由器的IP地址 | 255.255.255.255或准备分配的IP地址 | 广播或单播 |
| Request | PC机的MAC | 全FF | 0.0.0.0 | 255.255.255.255 | 广播 |
| Ack | DHCP服务器或者中继器路由的MAC | DHCP客户机的MAC | DHCP服务器或中继路由器的IP地址 | 255.255.255.255或准备分配的IP地址 | 广播或单播 |
DHCP服务不只返回客户机所需的IP地址,还包括:
- 缺省路由器IP地址
- DNS服务器IP地址
- 网络掩码
DHCP耗竭攻击与流氓DHCP:
- 攻击者短时间内发送大量DHCP请求,将子网内可用IP地址全部占用,导致后续主机无法获取新IP地址
- 通常在此之后攻击者启动自己的DHCP服务,给网络中的其他主机提供虚假的配置,包括DNS服务器IP与网关IP
NAT 协议#
随着现在互联网的发展,网络设备越来越多,IPv4地址资源变得越来越紧张。为解决这个问题, 在很多场合采用的一个做法是把少量的公共IP地址分配给不同的机构,由机构内部去统一的使用这个公共的IPv4地址去跟外界进行交互。
网络地址转换(NAT)是一种将私有(保留)地址转化为公有IP地址的转换技术
工作原理#
NAT 路由器维护一张 NAT 转换表,利用 端口号 来区分内网不同主机的连接,NAT表内部映射了 (私有IP:私有端口) 与 (NAT IP:公网端口) 的对应关系
- 出站 (Outbound):
- 将内网数据包的
(源IP:私有, 源端口)替换为(NAT IP:公网, 新端口)。
- 将内网数据包的
- 入站 (Inbound):
- 收到公网数据包,根据
(目的IP:公网, 目的端口)查表,替换回(目的IP:私有, 原端口)。
- 收到公网数据包,根据
有时NAT会进行更细化的端口映射,比如会对不同的传输层协议(TCP/UDP)进行表项管理
NAT的使用节省了公网的IP;对外隐藏内部网络结构,保护子网内的结构信息。 但是它违反了分层模型(路由器修改了 IP/Port),且不能处理IP报头加密;妨碍 P2P 应用(外网无法主动连接内网主机,需穿透技术)。
ICMP 协议#
互联网控制报文协议,用允许主机或路由器报告差错情况和提供有关异常情况的报告。 ICMP 报文被封装在 IP 数据报中传输(Protocol 字段为 1)
常见报文类型#
- 差错报告报文:
- 目的不可达:网络/主机/端口不可达
- TTL 过期:路由环路或 Traceroute 探测
- 参数问题:首部字段错误
- 特点:不为“差错报文”再产生差错报文;不为分片产生差错报文(只针对第一个)
差错报文封装过程:

- 询问报文:
- 回送请求/应答:用于 Ping
典型应用#
- Ping:
- 使用 ICMP 回送请求与回送回答报文
- 测试连通性及往返时延 (RTT)
- Traceroute (Linux) / Tracert (Windows):
- 原理:利用 TTL 字段。
- 发送 TTL=1 的包 -> 第 1 跳路由器丢弃并回送 ICMP TTL 过期
- 发送 TTL=2 的包 -> 第 2 跳路由器丢弃并回送 ICMP TTL 过期
- …以此类推,直到到达目的地(回送端口不可达或 Echo Reply)
- 由此探测出路径上所有路由器的 IP