彻底搞懂计算机网络中 MAC 地址和 IP 地址
IP 地址和 MAC 地址
大家好,我是小北。
关于 IP 地址和 MAC 地址是经常容易混淆的概念,在网络是怎么连接中? 有提到关于 IP 地址和 MAC 地址的一些基本知识。
在这篇文章中我们将重点讲解这两个地址的关系,因为端口号也可以理解为一种寻址,所以也顺带讲一下端口号。
网络通信中的地址体系就像现实世界的定位系统,只不过更加精确和层次化。
比如我们在淘宝买东西,需要填写省份、城市、街道、门牌号,甚至需要收件人的名字。
网络里也有类似的定位需求,这就是为什么我们需要MAC地址、IP地址和端口号这三个关键的地址概念。
IP 地址
IP地址是分配给网络上每台计算机和设备的唯一标识符,是 IP 协议的地址。
IP地址本质上是一个逻辑标识符,而非物理标识符。
这是理解IP地址最关键的一点,与 MAC 地址不同,IP 地址是可分配、可变更的,它标识的是网络接口在特定网络拓扑中的位置和角色,而非网络设备本身。
IP 地址还是有层级的,记住这一点很重要,这也是为了 IP 地址用于全球范围内的主机的定位。
接下来我们会讲一下,为什么 IP 地址可以有层级,是怎么产生的?
IP 地址的构成
IP 地址分为 IPv4 和 IPv6,这篇文章我们将主要讨论 IPv4,因为这是当前主流使用的 IP 地址,理解 IPv4 基本也就理解了 IPv6。
IP 地址由四个字节总共 32个bit 构成,以点分十进制表示法显示(如192.168.1.1)。
如果用二进制表示则是:11000000.10101000.00000001.00000001。
由于总共有 32 位,所以 IP 地址的总数是 2^32 个,总共大约 43亿个。
一直从 0.0.0.0 ~ 255.255.255.255。
互联网上每一台计算机都可以被分配一个 IP 地址(暂不考虑 NAT)。
IP 地址分为两部分,一个是用来标识属于哪一个网络,叫做网络号,一个是标识属于网络中哪一个主机,叫做主机号。
比如 192.168.1.1,如果我们规定前面 24 位为网络号,后面 8 位为主机号的话。
网络号就是 192.168.1,主机号为 1。
同一个网络中的主机 IP 地址网络号相同,只有主机号不同。
那么问题来了?
拿到一个 IP 地址,我怎么知道它的网络号是多少,主机号是多少呢?
这要提到“子网掩码”了
子网掩码(subnet mask)
子网掩码是一个32位的二进制数(对于IPv4而言),它的核心功能是帮助确定一个IP地址中哪些位是网络ID(网络部分),哪些位是主机ID(主机部分)。
判断子网对于网络通信和路由非常重要。
子网掩码由连续的1和连续的0组成(记住这个特征)
- 所有值为1的位对应IP地址中的网络ID部分
- 所有值为0的位对应IP地址中的主机ID部分
例如,子网掩码 255.255.255.0 转换为二进制是:
11111111.11111111.11111111.00000000
这表示IP地址的前24位是网络ID,后8位是主机ID。
当网络设备需要确定一个数据包中目的 IP 是本地网络还是远程网络时,会使用子网掩码进行计算:
- 将IP地址和子网掩码都转换为二进制
- 对它们执行按位 AND 运算
- 得出的结果就是网络地址
道理很简单,因为子网掩码后面主机号部分都是 0,所以任何 IP 后面主机部分不管是 0 还是 1,和 0 做 AND,全部都是 0
那么剩下的也就是前面网络部分了。
举个例子
假设我们有:
IP地址: 192.168.1.15
子网掩码: 255.255.255.0
二进制表示:
IP地址: 11000000.10101000.00000001.00001111
子网掩码: 11111111.11111111.11111111.00000000
按位AND运算:
11000000.10101000.00000001.00001111 (IP地址)
11111111.11111111.11111111.00000000 (子网掩码)
------------------------------------ (AND运算)
11000000.10101000.00000001.00000000 (网络地址: 192.168.1.0)
所以 IP 地址 192.168.1.15 属于网络192.168.1.0,主机 ID 为15。
传统 IP 地址分类
以前,为了简化管理和路由,IPv4 地址被划分为五类(A、B、C、D、E),其中前三类(A、B、C)用于一般的网络通信:
地址类别 | 首位比特 | 网络位 | 主机ID | 地址范围 | 适用场景 | 子网掩码 |
---|---|---|---|---|---|---|
A类 | 0 | 8 | 24 | 1.0.0.0 - 126.255.255.255 | 超大型网络,每个网络可容纳约1600万台主机 | 255.0.0.0(/8) |
B类 | 10 | 16 | 16 | 128.0.0.0 - 191.255.255.255 | 大型网络,每个网络可容纳约65,000台主机 | 255.255.0.0(/16) |
C类 | 110 | 24 | 8 | 192.0.0.0 - 223.255.255.255 | 小型网络,每个网络最多254台主机 | 255.255.255.0(/24) |
规定了首位比特的特征,可以保证每一个地址的头部独一无二,拿到一个 IP 地址,可以快速根据首位特征定位到属于哪一类地址,然后根据子网掩码,快速分别网络号和主机号。
对于 A、B、C 类 IP 地址,RFC 1918定义了三个主要的私有IP地址块:
10.0.0.0/8 (10.0.0.0 - 10.255.255.255)
A类私有地址块
提供16,777,216个IP地址
前缀长度为8位
172.16.0.0/12 (172.16.0.0 - 172.31.255.255)
B类私有地址块
提供1,048,576个IP地址
前缀长度为12位
192.168.0.0/16 (192.168.0.0 - 192.168.255.255)
C类私有地址块
提供65,536个IP地址
前缀长度为16位
其中 A 类私有地址,大家一定经常在学校、大公司、云服务器厂商看到,大家在这些内网里面的地址,常常就是 10.xx.xx.xx
而 C 类地址一般是家庭、小型办公室经常会使用的,比如大多数家庭默认的内网 IP地址类似 192.168.xx.xx
这些私有地址的共同特点:
不可路由:这些地址在互联网上不可路由,路由器会丢弃目的地为这些地址的数据包
可重用性:世界各地的不同局域网可以使用相同的私有IP地址空间
需要NAT转换:要与互联网通信,需要通过网络地址转换(NAT)将私有地址转换为公网IP地址
无需注册:使用这些地址不需要向IANA或任何互联网注册机构申请
这种A、B、C 分类方式虽然简单直观,但存在地址空间浪费严重的问题。
例如,一个只需要 500 台主机的组织分配到 B 类地址,会浪费超过64,000个 IP 地址。
为解决这个问题,现代网络采用了无类域间路由(CIDR)技术,允许更灵活的网络划分。
CIDR (无类域间路由) 详解
CIDR (Classless Inter-Domain Routing,无类域间路由) 是在1993年引入的一种IP地址分配和路由聚合方法,用来取代之前的分类寻址系统。
CIDR的核心理念是打破传统A、B、C类IP地址的固定边界,提供更灵活的网络规划方式。
CIDR使用"前缀长度"表示法来定义网络,格式为:
IP地址/前缀长度
例如:192.168.1.0/24表示前24位是网络部分,后8位是主机部分。
前缀长度可以是1到32之间的任何数字(对于IPv4),不再局限于传统的8、16或24位边界。
至于网络号的计算还是使用 AND
CIDR的优点
- 更高效的地址分配:可以根据实际需要分配恰当大小的网络,避免地址浪费
比如需要500个地址?使用/23网络(提供512个地址),需要2000个地址?使用/21网络(提供2048个地址)
灵活的子网划分:可以将较大的网络划分为大小不等的子网,根据不同部门或功能需求分配
路由聚合(超网):多个小型网络可以聚合为一个更大的CIDR块,减小互联网路由表规模
例如:192.168.0.0/24, 192.168.1.0/24, 192.168.2.0/24, 192.168.3.0/24 可聚合为 192.168.0.0/22
(就是找到这些 IP 子网前缀相同的部分,这几个相同的是前面 22 位,那么就可以聚合为一个新的子网)
最初我看到 CIDR 就有个疑问:
CIDR对于同一个 IP 地址,有不同的解释方法? 比如按不同的网络号解释,而不是像 A B C 类,看前缀特征就能知道是哪一类,这在实际路由中是怎么解决的呢?
以IP地址192.168.1.20为例,在传统分类系统中,它始终是C类地址(因为它以"192"开头),网络前缀固定为24位。
但在CIDR中,这个地址可能属于多种不同的网络,取决于CIDR前缀长度:
192.168.1.20/24 - 属于192.168.1.0/24网络(256个地址)
192.168.1.20/23 - 属于192.168.0.0/23网络(512个地址)
192.168.1.20/16 - 属于192.168.0.0/16网络(65,536个地址)
192.168.1.20/8 - 属于192.0.0.0/8网络(16,777,216个地址)
如何确定IP地址的网络归属
在CIDR环境中,一个IP地址属于哪个网络不再由地址本身决定,而是由网络管理员定义的网络前缀确定。
这就是为什么同一个IP地址可以在不同配置中有不同解释。
确定一个IP地址属于哪个网络需要两个信息:
1. IP地址本身
2. 应用于该地址的网络前缀长度(子网掩码)
路由器和主机通过以下方式处理可能的多重解释:
1.显式配置:网络设备上明确配置子网掩码或CIDR前缀,例如:
IP地址: 192.168.1.20
子网掩码: 255.255.255.0 (/24)
这是我家路由器上的配置:

- 路由表查找:路由器在路由表中存储目标网络及其前缀长度:
目标网络 前缀长度 下一跳
192.168.1.0 /24 直连
10.0.0.0 /8 192.168.1.1
0.0.0.0 /0 192.168.1.254
- 最长前缀匹配原则:当多个条目可能匹配时,路由器选择前缀最长(最具体)的路由。例如,对于目标地址10.1.1.1:
10.0.0.0/8 匹配
10.1.0.0/16 匹配(更具体)
10.1.1.0/24 匹配(最具体)
这种灵活性使CIDR成为现代网络设计和IP地址管理的基础,远比传统的A、B、C类寻址系统更适合各种规模的网络需求。
IP地址的分配机制
IP地址的分配是一个分层体系,由国际组织(IANA)、区域机构(RIR)和本地ISP(电信联通这类)共同管理:
IANA(nternet Assigned Numbers Authority):
这是全球最高管理机构,负责将IP地址块分配给五大区域互联网注册机构(RIRs),如:APNIC(亚太)、ARIN(北美)、RIPE NCC(欧洲)等。
**RIRs:**将地址分配给本地ISP(如电信、联通)或大型企业(腾讯、阿里这种)。
ISP/企业: ISP为普通用户动态分配IP;企业可申请固定 IP 段供内部使用。
上面的分配过程,一次性分配的 IP 地址大多都是连续的地址块,为什么要这样呢?
这样的好处是,路由地址可以聚合,减少全球核心路由器中的路由条目,简单解释下:
假设电信获得IPO 地址段:203.0.113.0/22(包含 203.0.113.0 到 203.0.116.255 共1024个连续IP)。
那么我们的路由条目可以是:
- 203.0.113.0/22 -> 中国电信
也就是这个范围的 IP 地址请求,都转发给中国电信的核心路由器,交给他自己内部去路由,那么电信在将这些地址分配给:
广东电信、上海电信、深圳电信的时候,也会尽量连续去分配。
比如 203.0.113.0- 203.0.113.115 分配给广东电信,203.0.113.0- 203.0.113.50 分配给深圳。
那最后我们拿到一个 203.0.113.10,经过简单几跳之后就能路由到深圳,这也是为什么说 IP 地址是有层级的。
层级来自于顶层分配和设计,从分配的时候就尽量让在一个地方/地区的 IP 地址尽量多的连续一段,降低碎片化的路由。
MAC 地址
MAC地址(Media Access Control Address)是一个用于在网络中唯一标识设备的物理地址,也称为物理地址、硬件地址或以太网地址。
它是数据链路层的寻址机制,用于在同一网络内识别和通信。
从本质上讲,MAC地址是:
- 一个48位(6字节)的二进制数值
- 由硬件厂商烧录到网卡中
- 理论上全球唯一,不可更改(尽管现在允许软件修改)
- 与网络拓扑无关,不提供位置信息
MAC 地址的表示
ifconfig
命令可以查看本机的 IP 地址和网络接口MAC 地址,比如我的:

一般是六组十六进制数,每组两个字符,用冒号分隔
例如: 00:1A:2B:3C:4D:5E
一个 MAC 地址前24位(3字节),由IEEE分配给制造商,后面 24 位由制造商自己分配给设备,这样就能保证全球唯一。
MAC地址的作用
MAC 地址作用于 OSI 模型的第二层(数据链路层),负责局域网内设备的直接通信,与网络层的IP地址形成互补。
发送方在数据帧头部写入目标设备的 MAC 地址,交换机根据 MAC 地址表精准转发到目标端口。
而如何知道对方的 MAC 地址呢?
答案是广播,将目标MAC填为 FF:FF:FF:FF:FF:FF,交换机将数据帧广播至所有端口(如ARP请求)
ARP协议流程:
- 设备A向局域网广播ARP请求(含目标IP);
- 设备B响应并返回自身MAC地址;
- 设备A缓存IP-MAC映射(arp -a可查看)。
* 动态更新:ARP缓存条目会老化(默认2-4分钟),防止过时映射。
IP地址和MAC地址的关系
MAC 地址是identify,而 IP 地址是 locate
MAC地址 = 身份证号(唯一标识)
IP地址 = 居住地址(实际定位)
为什么有了 MAC 地址为什么还要有 IP 地址?
因为 MAC 地址无法定位,就比如我无法根据一个身份证号找到你这个人现在在哪,身份证号只能看出你的籍贯(类似网卡的生产厂商)。
确没法找到你现在的位置,所以还需要一个能够定位你现在的位置的地址体系,这就是 IP 地址,IP 地址是有层级的。
只要给出一个 IP 地址,就能在网上查出大概所在的位置。