Skip to content

Commit 0dddcbe

Browse files
authored
Merge pull request #108 from imarvinle/csguide-hope
增加 ip 地址
2 parents f9b8936 + 521509f commit 0dddcbe

File tree

1 file changed

+276
-43
lines changed

1 file changed

+276
-43
lines changed

docs/network/overview/45-ip-mac-port.md

Lines changed: 276 additions & 43 deletions
Original file line numberDiff line numberDiff line change
@@ -1,21 +1,21 @@
11
---
2-
title: 计算机网络中 MAC地址 vs IP地址 vs 端口号
3-
shortTitle: MAC地址 vs IP地址 vs 端口号
2+
title: 彻底搞懂计算机网络中 MAC 地址和 IP 地址
3+
shortTitle: MAC地址 vs IP地址
44
description:
55
head:
66
- - meta
77
- name: keywords
88
content: 网络数据包, 报文, 数据帧, 数据包, 网络分层, TCP/IP, OSI模型, MTU, 数据封装, 网络通信
99
---
1010

11-
## MAC地址 vs IP地址 vs 端口号
11+
## IP 地址和 MAC 地址
1212

1313

1414
大家好,我是小北。
1515

1616
关于 IP 地址和 MAC 地址是经常容易混淆的概念,在[网络是怎么连接中?](https://csguide.cn/network/overview/30_how_networks_connect.html) 有提到关于 IP 地址和 MAC 地址的一些基本知识。
1717

18-
在这篇文章中我们将重点讲解这两个地址的关系、以及是如何协作的,因为端口号也可以理解为一种寻址,所以也顺带讲一下端口号。
18+
在这篇文章中我们将重点讲解这两个地址的关系,因为端口号也可以理解为一种寻址,所以也顺带讲一下端口号。
1919

2020

2121
网络通信中的地址体系就像现实世界的定位系统,只不过更加精确和层次化。
@@ -26,22 +26,243 @@ head:
2626

2727
## IP 地址
2828

29-
IP地址本质上是一个逻辑标识符,而非物理标识符。
29+
IP地址是分配给网络上每台计算机和设备的唯一标识符,是 IP 协议的地址。
30+
3031

31-
这是理解IP地址最关键的一点,与 MAC 地址不同,IP地址是可分配、可变更的,它标识的是网络接口在特定网络拓扑中的位置和角色,而非网络设备本身
32+
IP地址本质上是一个逻辑标识符,而非物理标识符
3233

33-
可以把IP地址类比为城市中的门牌号:
34-
* 门牌号(IP地址)标识建筑物在城市规划中的位置
35-
* 建筑物可以拆除重建,门牌号仍然保留(类似更换电脑设备,IP 地址不变)
36-
* 同一个人(设备)可以搬家,获得新门牌号
37-
* 门牌号由城市规划部门统一规划分配,而非咱们自行决定
34+
这是理解IP地址最关键的一点,与 MAC 地址不同,IP 地址是可分配、可变更的,它标识的是网络接口在特定网络拓扑中的位置和角色,而非网络设备本身。
3835

3936
**IP 地址还是有层级的,记住这一点很重要,这也是为了 IP 地址用于全球范围内的主机的定位。**
4037

4138
接下来我们会讲一下,为什么 IP 地址可以有层级,是怎么产生的?
4239

40+
### IP 地址的构成
41+
42+
IP 地址分为 IPv4 和 IPv6,这篇文章我们将主要讨论 IPv4,因为这是当前主流使用的 IP 地址,理解 IPv4 基本也就理解了 IPv6。
43+
44+
45+
IP 地址由四个字节总共 32个bit 构成,以点分十进制表示法显示(如192.168.1.1)。
46+
47+
如果用二进制表示则是:11000000.10101000.00000001.00000001。
48+
49+
由于总共有 32 位,所以 IP 地址的总数是 2^32 个,总共大约 43亿个。
50+
51+
一直从 0.0.0.0 ~ 255.255.255.255。
52+
53+
互联网上每一台计算机都可以被分配一个 IP 地址(暂不考虑 NAT)。
54+
55+
IP 地址分为两部分,一个是用来标识属于哪一个网络,叫做**网络号**,一个是标识属于网络中哪一个主机,叫做**主机号**
56+
57+
比如 192.168.1.1,如果我们规定前面 24 位为网络号,后面 8 位为主机号的话。
58+
59+
网络号就是 192.168.1,主机号为 1。
60+
61+
同一个网络中的主机 IP 地址网络号相同,只有主机号不同。
62+
63+
64+
那么问题来了?
65+
66+
拿到一个 IP 地址,我怎么知道它的网络号是多少,主机号是多少呢?
67+
68+
69+
这要提到“子网掩码”了
70+
71+
72+
### 子网掩码(subnet mask)
73+
74+
子网掩码是一个32位的二进制数(对于IPv4而言),它的核心功能是帮助确定一个IP地址中哪些位是网络ID(网络部分),哪些位是主机ID(主机部分)。
75+
76+
判断子网对于网络通信和路由非常重要。
77+
78+
**子网掩码由连续的1和连续的0组成(记住这个特征)**
79+
80+
* 所有值为1的位对应IP地址中的网络ID部分
81+
* 所有值为0的位对应IP地址中的主机ID部分
82+
83+
例如,子网掩码 255.255.255.0 转换为二进制是:
84+
85+
`11111111.11111111.11111111.00000000`
86+
87+
这表示IP地址的前24位是网络ID,后8位是主机ID。
88+
89+
90+
当网络设备需要确定一个数据包中目的 IP 是本地网络还是远程网络时,会使用子网掩码进行计算:
91+
92+
1. 将IP地址和子网掩码都转换为二进制
93+
2. 对它们执行按位 AND 运算
94+
3. 得出的结果就是网络地址
95+
96+
道理很简单,因为子网掩码后面主机号部分都是 0,所以任何 IP 后面主机部分不管是 0 还是 1,和 0 做 AND,全部都是 0
97+
98+
那么剩下的也就是前面网络部分了。
99+
100+
**举个例子**
101+
102+
假设我们有:
103+
104+
IP地址: 192.168.1.15
105+
子网掩码: 255.255.255.0
106+
107+
二进制表示:
108+
109+
IP地址: 11000000.10101000.00000001.00001111
110+
子网掩码: 11111111.11111111.11111111.00000000
111+
112+
按位AND运算:
113+
114+
```
115+
11000000.10101000.00000001.00001111 (IP地址)
116+
11111111.11111111.11111111.00000000 (子网掩码)
117+
------------------------------------ (AND运算)
118+
11000000.10101000.00000001.00000000 (网络地址: 192.168.1.0)
119+
```
120+
121+
所以 IP 地址 192.168.1.15 属于网络192.168.1.0,主机 ID 为15。
122+
123+
124+
### 传统 IP 地址分类
125+
126+
以前,为了简化管理和路由,IPv4 地址被划分为五类(A、B、C、D、E),其中前三类(A、B、C)用于一般的网络通信:
127+
128+
| 地址类别 | 首位比特 | 网络位 | 主机ID | 地址范围 | 适用场景 | 子网掩码 |
129+
|---------|-------|-----| ---------|---------|---------|---------|
130+
| **A类** | 0 | 8| 24 | 1.0.0.0 - 126.255.255.255 | 超大型网络,每个网络可容纳约1600万台主机 | 255.0.0.0(/8) |
131+
| **B类** | 10 | 16 | 16 | 128.0.0.0 - 191.255.255.255 | 大型网络,每个网络可容纳约65,000台主机 | 255.255.0.0(/16) |
132+
| **C类** | 110 | 24 | 8 | 192.0.0.0 - 223.255.255.255 | 小型网络,每个网络最多254台主机 | 255.255.255.0(/24) |
133+
134+
规定了首位比特的特征,可以保证每一个地址的头部独一无二,拿到一个 IP 地址,可以快速根据首位特征定位到属于哪一类地址,然后根据子网掩码,快速分别网络号和主机号。
135+
136+
137+
> 对于 A、B、C 类 IP 地址,RFC 1918定义了三个主要的私有IP地址块:
138+
> 10.0.0.0/8 (10.0.0.0 - 10.255.255.255)
139+
140+
> A类私有地址块
141+
>提供16,777,216个IP地址
142+
> 前缀长度为8位
143+
144+
145+
> 172.16.0.0/12 (172.16.0.0 - 172.31.255.255)
146+
> B类私有地址块
147+
> 提供1,048,576个IP地址
148+
> 前缀长度为12位
149+
150+
151+
> 192.168.0.0/16 (192.168.0.0 - 192.168.255.255)
152+
> C类私有地址块
153+
> 提供65,536个IP地址
154+
> 前缀长度为16位
155+
156+
其中 A 类私有地址,大家一定经常在学校、大公司、云服务器厂商看到,大家在这些内网里面的地址,常常就是 10.xx.xx.xx
157+
158+
而 C 类地址一般是家庭、小型办公室经常会使用的,比如大多数家庭默认的内网 IP地址类似 192.168.xx.xx
159+
160+
这些私有地址的共同特点:
161+
162+
**不可路由**:这些地址在互联网上不可路由,路由器会丢弃目的地为这些地址的数据包
163+
164+
**可重用性**:世界各地的不同局域网可以使用相同的私有IP地址空间
165+
166+
**需要NAT转换**:要与互联网通信,需要通过网络地址转换(NAT)将私有地址转换为公网IP地址
167+
168+
**无需注册**:使用这些地址不需要向IANA或任何互联网注册机构申请
169+
170+
171+
这种A、B、C 分类方式虽然简单直观,但存在地址空间浪费严重的问题。
172+
173+
例如,一个只需要 500 台主机的组织分配到 B 类地址,会浪费超过64,000个 IP 地址。
174+
175+
为解决这个问题,现代网络采用了无类域间路由(CIDR)技术,允许更灵活的网络划分。
176+
177+
178+
### CIDR (无类域间路由) 详解
179+
180+
CIDR (Classless Inter-Domain Routing,无类域间路由) 是在1993年引入的一种IP地址分配和路由聚合方法,用来取代之前的分类寻址系统。
181+
182+
CIDR的核心理念是打破传统A、B、C类IP地址的固定边界,提供更灵活的网络规划方式。
183+
184+
CIDR使用"前缀长度"表示法来定义网络,格式为:
185+
186+
`IP地址/前缀长度`
187+
188+
例如:192.168.1.0/24表示前24位是网络部分,后8位是主机部分。
189+
190+
前缀长度可以是1到32之间的任何数字(对于IPv4),不再局限于传统的8、16或24位边界。
191+
192+
193+
至于网络号的计算还是使用 AND
194+
195+
**CIDR的优点**
196+
197+
* 更高效的地址分配:可以根据实际需要分配恰当大小的网络,避免地址浪费
198+
199+
比如需要500个地址?使用/23网络(提供512个地址),需要2000个地址?使用/21网络(提供2048个地址)
200+
201+
* 灵活的子网划分:可以将较大的网络划分为大小不等的子网,根据不同部门或功能需求分配
202+
203+
* 路由聚合(超网):多个小型网络可以聚合为一个更大的CIDR块,减小互联网路由表规模
204+
205+
例如: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
206+
207+
(就是找到这些 IP 子网前缀相同的部分,这几个相同的是前面 22 位,那么就可以聚合为一个新的子网)
208+
209+
210+
最初我看到 CIDR 就有个疑问:
211+
212+
CIDR对于同一个 IP 地址,有不同的解释方法? 比如按不同的网络号解释,而不是像 A B C 类,看前缀特征就能知道是哪一类,这在实际路由中是怎么解决的呢?
213+
214+
以IP地址192.168.1.20为例,在传统分类系统中,它始终是C类地址(因为它以"192"开头),网络前缀固定为24位。
215+
216+
但在CIDR中,这个地址可能属于多种不同的网络,取决于CIDR前缀长度:
217+
218+
192.168.1.20/24 - 属于192.168.1.0/24网络(256个地址)
219+
192.168.1.20/23 - 属于192.168.0.0/23网络(512个地址)
220+
192.168.1.20/16 - 属于192.168.0.0/16网络(65,536个地址)
221+
192.168.1.20/8 - 属于192.0.0.0/8网络(16,777,216个地址)
222+
223+
**如何确定IP地址的网络归属**
224+
在CIDR环境中,一个IP地址属于哪个网络不再由地址本身决定,而是由网络管理员定义的网络前缀确定。
225+
226+
这就是为什么同一个IP地址可以在不同配置中有不同解释。
227+
228+
确定一个IP地址属于哪个网络需要两个信息:
229+
230+
**1. IP地址本身**
231+
**2. 应用于该地址的网络前缀长度(子网掩码)**
232+
233+
234+
235+
路由器和主机通过以下方式处理可能的多重解释:
236+
237+
1.显式配置:网络设备上明确配置子网掩码或CIDR前缀,例如:
238+
```
239+
IP地址: 192.168.1.20
240+
子网掩码: 255.255.255.0 (/24)
241+
```
242+
243+
这是我家路由器上的配置:
244+
245+
![](https://cdn.how2cs.cn/gzh/2025-04-26-152956.png)
246+
247+
2. 路由表查找:路由器在路由表中存储目标网络及其前缀长度:
248+
249+
```
250+
目标网络 前缀长度 下一跳
251+
192.168.1.0 /24 直连
252+
10.0.0.0 /8 192.168.1.1
253+
0.0.0.0 /0 192.168.1.254
254+
```
255+
256+
3. 最长前缀匹配原则:当多个条目可能匹配时,路由器选择前缀最长(最具体)的路由。例如,对于目标地址10.1.1.1:
257+
258+
```
259+
10.0.0.0/8 匹配
260+
10.1.0.0/16 匹配(更具体)
261+
10.1.1.0/24 匹配(最具体)
262+
```
263+
264+
这种灵活性使CIDR成为现代网络设计和IP地址管理的基础,远比传统的A、B、C类寻址系统更适合各种规模的网络需求。
43265

44-
### IP地址的构成
45266

46267
### IP地址的分配机制
47268

@@ -79,55 +300,67 @@ IP地址的分配是一个分层体系,由国际组织(IANA)、区域机构(RI
79300

80301

81302

82-
六、思考题:IP设计的哲学启示
303+
## MAC 地址
83304

84-
​为什么IPv4不采用全局唯一MAC地址直接通信?
85-
答:MAC地址缺乏层次化结构,路由表规模爆炸(想象全球数十亿设备的路由条目)
86305

87-
​容器网络如何实现IP动态分配?
88-
答:通过CNI插件(如Calico、Flannel)管理虚拟IP池,每个Pod获得独立IP
89306

90-
​5G网络中的UPF如何影响IP分配?
91-
答:用户面功能单元实现本地分流,为边缘计算提供灵活IP管理能力
307+
MAC地址(Media Access Control Address)是一个用于在网络中唯一标识设备的物理地址,也称为物理地址、硬件地址或以太网地址。
92308

309+
它是数据链路层的寻址机制,用于在同一网络内识别和通信。
93310

94-
**报文(Message)、包(Packet)、帧(Frame)是数据在不同网络分层中的不同“包装形式”**,对应不同层级的协议处理逻辑,区别在于所属层级、封装信息、传输范围三方面。
311+
从本质上讲,MAC地址是:
95312

96-
---
313+
* **一个48位(6字节)的二进制数值**
314+
* **由硬件厂商烧录到网卡中**
315+
* **理论上全球唯一,不可更改(尽管现在允许软件修改)**
316+
* **与网络拓扑无关,不提供位置信息**
97317

98-
### 1. 各层数据包
99-
**关键逻辑:不同层级处理不同维度的信息**
100-
| 网络分层 | 数据包名称 | 典型协议 | 核心任务 |
101-
|----------------|--------------|---------------|--------------------------|
102-
| 应用层 | 报文(Message) | HTTP, FTP | 用户可理解的完整数据块 |
103-
| **传输层** | **段(Segment)**<br>(TCP)或**数据报(Datagram)**(UDP) | TCP, UDP | 端到端传输控制(端口号) |
104-
| **网络层** | **包(Packet)** | IP | 全局寻址(IP地址) |
105-
| **数据链路层** | **帧(Frame)** | Ethernet, WiFi | 本地设备间物理传输(MAC地址) |
106318

107-
---
319+
### MAC 地址的表示
108320

109-
### 2. 数据包的逐层封装
321+
`ifconfig`命令可以查看本机的 IP 地址和网络接口MAC 地址,比如我的:
110322

111-
这里引用之前文章[TCP/IP 模型](https://csguide.cn/network/overview/20_protocol.html#%E7%BD%91%E7%BB%9C%E5%8D%8F%E8%AE%AE%E5%B0%81%E8%A3%85%E5%92%8C%E8%A7%A3%E5%8C%85)中提到的图:
323+
![](https://cdn.how2cs.cn/gzh/2025-04-26-162358.png)
112324

113-
![TCP/IP 数据包](https://cdn.how2cs.cn/gzh/2025-03-04-tcp-ip-encapsulation.svg)
325+
一般是六组十六进制数,每组两个字符,用冒号分隔
114326

327+
例如: 00:1A:2B:3C:4D:5E
115328

116-
1️⃣ **应用层**:生成原始数据(如 `HTTP请求报文`
117-
2️⃣ **传输层**:添加TCP头部(端口号、序列号)→ 变成 `TCP段`
118-
3️⃣ **网络层**:添加IP头部(源/目标IP地址)→ 变成 `IP包`
119-
4️⃣ **链路层**:添加帧头帧尾(源/目标MAC地址、CRC校验)→ 变成 `以太网帧`
329+
一个 MAC 地址前24位(3字节),由IEEE分配给制造商,后面 24 位由制造商自己分配给设备,这样就能保证全球唯一。
120330

121-
**❗ 注意**
122-
**MTU(最大传输单元)**:链路层帧的数据部分最大长度(如以太网默认1500字节),若IP包超过MTU,需在网络层分片(Fragment)。
123331

124-
---
332+
### MAC地址的作用
333+
334+
MAC 地址作用于 OSI 模型的第二层(数据链路层),负责局域网内设备的直接通信,与网络层的IP地址形成互补。
335+
336+
发送方在数据帧头部写入目标设备的 MAC 地址,交换机根据 MAC 地址表精准转发到目标端口。
337+
338+
而如何知道对方的 MAC 地址呢?
339+
340+
答案是**广播**,将目标MAC填为 FF:FF:FF:FF:FF:FF,交换机将数据帧广播至所有端口(如ARP请求)
341+
342+
343+
**ARP协议流程​​:**
344+
345+
* 设备A向局域网广播ARP请求(含目标IP);
346+
* 设备B响应并返回自身MAC地址;
347+
* 设备A缓存IP-MAC映射(arp -a可查看)。
348+
* ​动态更新​​:ARP缓存条目会老化(默认2-4分钟),防止过时映射。
349+
350+
351+
352+
### IP地址和MAC地址的关系
353+
354+
MAC 地址是identify,而 IP 地址是 locate
125355

356+
​​MAC地址​​ = 身份证号(唯一标识)
357+
​​IP地址​​ = 居住地址(实际定位)
126358

359+
**为什么有了 MAC 地址为什么还要有 IP 地址?**
127360

128-
## 总结
361+
因为 MAC 地址无法定位,就比如我无法根据一个身份证号找到你这个人现在在哪,身份证号只能看出你的籍贯(类似网卡的生产厂商)。
129362

363+
确没法找到你现在的位置,所以还需要一个能够定位你现在的位置的地址体系,这就是 IP 地址,IP 地址是有层级的。
130364

131-
术语在不同协议中可能有别名(如TCP叫Segment,UDP叫Datagram),但核心逻辑一致
365+
只要给出一个 IP 地址,就能在网上查出大概所在的位置
132366

133-
实际开发中"包"可能泛指所有数据单元,需结合上下文判断~

0 commit comments

Comments
 (0)