Roxy's Library

Back

本文内容基于 2025 秋季《计算机网络》课程讲述,如有差错,欢迎指正

IPv4 协议#

IPv4 是今天互联网的核心协议,其采用寻址机制很好的完成了网络层的两个基本功能,路由和转发。此外还提供了适应不同链路的分片机制,使上层可以一次性发送大量数据

IPv4 数据报格式#

IPv4 头部通常为 20 字节(不含选项)

IPv4 Header 其各个字段的含义:

  • 版本: 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地址空间称为地址的前缀,或网络前缀

子网由接口组成,与主机/路由器等设备无关:一个子网内的接口,可能来自不同设备;一个设备的多个接口,可能属于不同子网

Subnet Mask 若网络地址长度为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类为单播地址
    • 网络号长度固定,难以适应现代网络的部署需求

Classful IP

  • 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 地址的映射关系

  1. 当主机 A 知道 B 的IP地址,想知道 B 的 MAC 地址,先查本地 ARP 表,如果映射存在,直接使用
  2. 若表中无记录,A 在局域网中广播ARP查询请求
    • 目的 MAC:FF-FF-FF-FF-FF-FF (广播帧)
  3. B 收到广播后,发现找的是自己,向 A 发送 ARP 响应报文(单播),告知自己的 MAC 地址
  4. A 收到后,将映射关系写入 ARP 表,并设置老化时间 (TTL)

ARP Process

注意: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

工作方式#

  1. DHCP Discover(广播):新来的主机向整个网络进行广播,寻找DHCP服务器
  2. DHCP Offer(广播或单播):服务器广播或单播发出提供报文
  3. DHCP Request(广播):主机决定从多个DHCP服务器中选择一个,并向其以广播形式发送DHCP请求报文(广播是为了告诉其他服务器可以回收它们的 Offer)
  4. DHCP Ack(广播或单播):被选择的DHCP服务器广播或单播发送确认报文

DHCP过程中报文字段取值

阶段源MAC目标MAC源IP目标IP形式
DiscoverPC机的MAC全FF0.0.0.0255.255.255.255广播
OfferDHCP服务器或者中继器路由的MACDHCP客户机的MACDHCP服务器或中继路由器的IP地址255.255.255.255或准备分配的IP地址广播或单播
RequestPC机的MAC全FF0.0.0.0255.255.255.255广播
AckDHCP服务器或者中继器路由的MACDHCP客户机的MACDHCP服务器或中继路由器的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)

常见报文类型#

  1. 差错报告报文:
    • 目的不可达:网络/主机/端口不可达
    • TTL 过期:路由环路或 Traceroute 探测
    • 参数问题:首部字段错误
    • 特点:不为“差错报文”再产生差错报文;不为分片产生差错报文(只针对第一个)

差错报文封装过程: ICMP Error Message

  1. 询问报文:
    • 回送请求/应答:用于 Ping

典型应用#

  • Ping:
    • 使用 ICMP 回送请求与回送回答报文
    • 测试连通性及往返时延 (RTT)
  • Traceroute (Linux) / Tracert (Windows):
    • 原理:利用 TTL 字段。
    • 发送 TTL=1 的包 -> 第 1 跳路由器丢弃并回送 ICMP TTL 过期
    • 发送 TTL=2 的包 -> 第 2 跳路由器丢弃并回送 ICMP TTL 过期
    • …以此类推,直到到达目的地(回送端口不可达或 Echo Reply)
    • 由此探测出路径上所有路由器的 IP
网络层协议
https://astro-pure.js.org/blog/csnet_net_chap2
Author GreyRat
Published at December 14, 2025
Comment seems to stuck. Try to refresh?✨