第22天:IP协议基础
今日目标
- 理解IP协议的作用和特点
- 掌握IPv4地址格式和分类
- 学习子网划分和CIDR
- 了解IP报文格式
- 理解IP路由基础
- 学习NAT技术原理
- 实现IP地址计算器
1. IP协议概述
1.1 什么是IP协议?
IP(Internet Protocol):
IP = 互联网协议
作用:
在网络层负责数据包的寻址和路由
生活类比:
IP地址就像邮政地址:
- 国家(网络号)
- 省市(子网号)
- 街道门牌(主机号)
邮递员根据地址投递信件
路由器根据IP地址转发数据包
IP在网络协议栈中的位置:
┌────────────────────────────┐
│ 应用层(HTTP、FTP等) │
├────────────────────────────┤
│ 传输层(TCP、UDP) │
├────────────────────────────┤
│ 网络层(IP、ICMP、ARP) │ ← IP协议在这里
├────────────────────────────┤
│ 数据链路层(以太网等) │
├────────────────────────────┤
│ 物理层 │
└────────────────────────────┘
1.2 IP协议的特点
核心特点:
1. 无连接(Connectionless)
- 不需要建立连接
- 直接发送数据包
- 类似于寄信
2. 不可靠(Unreliable)
- 不保证送达
- 不保证顺序
- 不保证不重复
- 可靠性由上层(TCP)保证
3. 尽力而为(Best Effort)
- 尽力传输
- 不承诺服务质量
4. 分组交换
- 数据分成小包
- 独立路由
- 可能走不同路径
IP协议版本:
IPv4(第4版):
- 1981年发布
- 32位地址(4字节)
- 约43亿个地址
- 当前主流
IPv6(第6版):
- 1998年发布
- 128位地址(16字节)
- 约340万亿亿亿亿个地址
- 逐步普及
为什么没有IPv5?
IPv5是实验性协议(Internet Stream Protocol)
从未大规模部署
2. IPv4地址
2.1 IPv4地址格式
地址表示:
IPv4地址 = 32位二进制数 = 4个字节
表示方法:
二进制:11000000.10101000.00000001.00000001
十进制:192.168.1.1(点分十进制)
转换示例:
192 = 11000000
168 = 10101000
1 = 00000001
1 = 00000001
完整地址:
192.168.1.1 = 11000000101010000000000100000001
地址数量:
32位 = 2^32 = 4,294,967,296 个地址
约43亿个
问题:
全球人口约80亿
设备数量更多
地址不够用!
解决方案:
1. NAT(网络地址转换)
2. IPv6
3. CIDR(无类域间路由)
2.2 IPv4地址分类
传统分类(已过时,但仍需了解):
A类地址:
格式:0xxxxxxx.xxxxxxxx.xxxxxxxx.xxxxxxxx
范围:1.0.0.0 ~ 126.255.255.255
网络数:126个(2^7 - 2)
主机数:16,777,214个/网络(2^24 - 2)
默认子网掩码:255.0.0.0 (/8)
用途:大型网络
示例:
10.0.0.0 ~ 10.255.255.255(私有)
B类地址:
格式:10xxxxxx.xxxxxxxx.xxxxxxxx.xxxxxxxx
范围:128.0.0.0 ~ 191.255.255.255
网络数:16,384个(2^14)
主机数:65,534个/网络(2^16 - 2)
默认子网掩码:255.255.0.0 (/16)
用途:中型网络
示例:
172.16.0.0 ~ 172.31.255.255(私有)
C类地址:
格式:110xxxxx.xxxxxxxx.xxxxxxxx.xxxxxxxx
范围:192.0.0.0 ~ 223.255.255.255
网络数:2,097,152个(2^21)
主机数:254个/网络(2^8 - 2)
默认子网掩码:255.255.255.0 (/24)
用途:小型网络
示例:
192.168.0.0 ~ 192.168.255.255(私有)
D类地址(多播):
格式:1110xxxx.xxxxxxxx.xxxxxxxx.xxxxxxxx
范围:224.0.0.0 ~ 239.255.255.255
用途:多播(组播)
E类地址(保留):
格式:1111xxxx.xxxxxxxx.xxxxxxxx.xxxxxxxx
范围:240.0.0.0 ~ 255.255.255.255
用途:实验和未来使用
特殊地址:
0.0.0.0
- 本网络
- 表示"任意地址"
- 作为源地址:表示本机
- 作为目的地址:表示本网络
127.0.0.0 ~ 127.255.255.255
- 环回地址(Loopback)
- 127.0.0.1是本地主机
- 数据不会发送到网络
255.255.255.255
- 受限广播地址
- 本地网络广播
- 路由器不转发
私有地址(Private Address):
10.0.0.0 ~ 10.255.255.255(A类)
172.16.0.0 ~ 172.31.255.255(B类)
192.168.0.0 ~ 192.168.255.255(C类)
- 内部网络使用
- 不能在互联网上路由
- 需要NAT转换
2.3 子网掩码
什么是子网掩码?
子网掩码(Subnet Mask):
用于区分网络部分和主机部分
格式:
二进制:连续的1后跟连续的0
示例:11111111.11111111.11111111.00000000
十进制:255.255.255.0
作用:
IP地址 & 子网掩码 = 网络地址
示例:
IP地址: 192.168.1.10
子网掩码: 255.255.255.0
网络地址: 192.168.1.0
计算过程:
11000000.10101000.00000001.00001010 (192.168.1.10)
& 11111111.11111111.11111111.00000000 (255.255.255.0)
= 11000000.10101000.00000001.00000000 (192.168.1.0)
常见子网掩码:
┌────────────┬─────────────────┬──────────┬──────────┐
│ CIDR表示 │ 子网掩码 │ 网络数 │ 主机数 │
├────────────┼─────────────────┼──────────┼──────────┤
│ /8 │ 255.0.0.0 │ 1 │ 16777214 │
│ /16 │ 255.255.0.0 │ 1 │ 65534 │
│ /24 │ 255.255.255.0 │ 1 │ 254 │
│ /25 │ 255.255.255.128 │ 2 │ 126 │
│ /26 │ 255.255.255.192 │ 4 │ 62 │
│ /27 │ 255.255.255.224 │ 8 │ 30 │
│ /28 │ 255.255.255.240 │ 16 │ 14 │
│ /29 │ 255.255.255.248 │ 32 │ 6 │
│ /30 │ 255.255.255.252 │ 64 │ 2 │
│ /31 │ 255.255.255.254 │ 128 │ 2 │
│ /32 │ 255.255.255.255 │ 256 │ 1 │
└────────────┴─────────────────┴──────────┴──────────┘
主机数 = 2^(32-前缀长度) - 2
(减2:网络地址和广播地址)
2.4 子网划分
为什么需要子网划分?
问题:
一个C类网络(192.168.1.0/24)
可以容纳254台主机
但可能有以下需求:
- 将网络分成多个部门
- 提高安全性
- 减少广播域
解决方案:
子网划分(Subnetting)
子网划分示例:
原网络:
192.168.1.0/24
子网掩码:255.255.255.0
主机数:254
需求:
划分为4个子网
每个子网至少60台主机
计算:
1. 确定子网数量:4个子网 → 需要2位(2^2 = 4)
2. 新的前缀长度:24 + 2 = 26
3. 新的子网掩码:255.255.255.192(/26)
4. 每个子网主机数:2^(32-26) - 2 = 62
子网划分结果:
子网1:192.168.1.0/26 (192.168.1.0 ~ 192.168.1.63)
网络地址:192.168.1.0
广播地址:192.168.1.63
可用范围:192.168.1.1 ~ 192.168.1.62
子网2:192.168.1.64/26 (192.168.1.64 ~ 192.168.1.127)
网络地址:192.168.1.64
广播地址:192.168.1.127
可用范围:192.168.1.65 ~ 192.168.1.126
子网3:192.168.1.128/26 (192.168.1.128 ~ 192.168.1.191)
网络地址:192.168.1.128
广播地址:192.168.1.191
可用范围:192.168.1.129 ~ 192.168.1.190
子网4:192.168.1.192/26 (192.168.1.192 ~ 192.168.1.255)
网络地址:192.168.1.192
广播地址:192.168.1.255
可用范围:192.168.1.193 ~ 192.168.1.254
VLSM(可变长子网掩码):
VLSM = Variable Length Subnet Mask
允许不同子网使用不同长度的子网掩码
示例:
公司网络:192.168.1.0/24
需求:
- 部门A:100台主机
- 部门B:50台主机
- 部门C:25台主机
- 点对点链路:2台设备(路由器之间)
分配:
部门A:192.168.1.0/25 (128个地址,126个主机)
部门B:192.168.1.128/26 (64个地址,62个主机)
部门C:192.168.1.192/27 (32个地址,30个主机)
链路: 192.168.1.224/30 (4个地址,2个主机)
优点:
✅ 灵活分配
✅ 节省地址
✅ 高效利用
2.5 CIDR(无类域间路由)
什么是CIDR?
CIDR = Classless Inter-Domain Routing
无类域间路由
替代传统的A、B、C类地址分类
允许任意长度的网络前缀
表示方法:
IP地址/前缀长度
示例:
192.168.1.0/24
- 192.168.1.0 是网络地址
- /24 表示前24位是网络部分
优点:
✅ 灵活分配地址
✅ 减少路由表大小(路由聚合)
✅ 提高地址利用率
路由聚合(Route Aggregation):
问题:
多个连续的网络
示例:
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
计算:
192.168.0.0 = 11000000.10101000.00000000.00000000
192.168.3.0 = 11000000.10101000.00000011.00000000
共同前缀: 11000000.10101000.000000(22位)
优点:
- 路由表从4条变成1条
- 减少内存占用
- 加快查找速度
3. IP报文格式
3.1 IPv4报文头部
报文结构:
IPv4头部(20-60字节):
0 1 2 3
0 1 2 3 4 5 6 7 8 9 0 1 2 3 4 5 6 7 8 9 0 1 2 3 4 5 6 7 8 9 0 1
+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
|Version| IHL |Type of Service| Total Length |
+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
| Identification |Flags| Fragment Offset |
+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
| Time to Live | Protocol | Header Checksum |
+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
| Source Address |
+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
| Destination Address |
+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
| Options (if any) |
+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
| Data |
+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
字段说明:
Version(版本,4位):
- IP协议版本
- IPv4 = 4
- IPv6 = 6
IHL(头部长度,4位):
- Internet Header Length
- 以4字节为单位
- 最小值:5(20字节)
- 最大值:15(60字节)
Type of Service(服务类型,8位):
- 现在称为DSCP(差分服务代码点)
- 用于QoS(服务质量)
- 优先级和延迟要求
Total Length(总长度,16位):
- 整个IP数据包的长度(头部+数据)
- 单位:字节
- 最大值:65,535字节
Identification(标识,16位):
- 唯一标识一个数据包
- 用于分片重组
Flags(标志,3位):
- Bit 0: 保留,必须为0
- Bit 1: DF(Don't Fragment)- 禁止分片
- Bit 2: MF(More Fragments)- 更多分片
Fragment Offset(片偏移,13位):
- 分片在原始数据包中的位置
- 以8字节为单位
Time to Live(生存时间,8位,TTL):
- 数据包最大跳数
- 每经过一个路由器减1
- 为0时丢弃
- 防止路由环路
Protocol(协议,8位):
- 上层协议类型
- 1 = ICMP
- 6 = TCP
- 17 = UDP
Header Checksum(头部校验和,16位):
- 用于检测头部错误
- 只校验头部,不校验数据
Source Address(源地址,32位):
- 发送方IP地址
Destination Address(目的地址,32位):
- 接收方IP地址
Options(选项,可变长度):
- 可选字段
- 用于测试、调试等
- 很少使用
3.2 IP分片
为什么需要分片?
问题:
不同网络的MTU(最大传输单元)不同
常见MTU:
- 以太网:1500字节
- PPPoE:1492字节
- VPN:更小
如果IP数据包大于MTU:
需要分片(Fragmentation)
分片过程:
原始数据包:
总长度:3000字节
MTU:1500字节
分片1:
- 头部:20字节
- 数据:1480字节
- 标识:12345
- MF标志:1(还有更多分片)
- 片偏移:0
分片2:
- 头部:20字节
- 数据:1480字节
- 标识:12345
- MF标志:1(还有更多分片)
- 片偏移:1480/8 = 185
分片3:
- 头部:20字节
- 数据:40字节(剩余)
- 标识:12345
- MF标志:0(最后一个分片)
- 片偏移:2960/8 = 370
重组:
接收方根据标识和片偏移重组
分片的问题:
性能问题:
- 增加处理开销
- 丢失一个分片,整个数据包需要重传
- 路由器需要缓存分片
解决方案:
1. 路径MTU发现(Path MTU Discovery)
- 发送DF标志的数据包
- 如果过大,路由器返回ICMP错误
- 发送方调整数据包大小
2. TCP MSS协商
- 在TCP握手时协商最大段大小
- 避免IP层分片
4. IP路由基础
4.1 路由的概念
什么是路由?
路由(Routing):
选择数据包传输路径的过程
生活类比:
从北京到上海:
- 可以坐飞机(直达)
- 可以坐高铁(中转)
- 可以自驾(多条路线)
路由器选择最佳路径
路由表:
路由表(Routing Table):
存储路由信息的表格
示例:
┌─────────────────┬─────────────┬──────────┬──────────┐
│ 目的网络 │ 子网掩码 │ 网关 │ 接口 │
├─────────────────┼─────────────┼──────────┼──────────┤
│ 192.168.1.0 │ /24 │ 直连 │ eth0 │
│ 10.0.0.0 │ /8 │ 直连 │ eth1 │
│ 0.0.0.0 │ /0 │ 192.168 │ eth0 │
│ │ │ .1.1 │ │
└─────────────────┴─────────────┴──────────┴──────────┘
0.0.0.0/0 = 默认路由(Default Route)
匹配所有地址
4.2 路由查找过程
最长前缀匹配:
目的地址:192.168.1.10
路由表:
1. 192.168.1.0/24 → 匹配✅(24位)
2. 192.168.0.0/16 → 匹配✅(16位)
3. 192.0.0.0/8 → 匹配✅(8位)
4. 0.0.0.0/0 → 匹配✅(0位)
选择:
192.168.1.0/24(最长匹配)
原则:
前缀越长,匹配越精确
选择最长匹配的路由
路由查找算法:
线性查找:
- 遍历所有路由
- O(n)复杂度
- 慢
前缀树(Trie):
- 二叉树或多叉树
- O(log n)复杂度
- 快
路由缓存:
- 缓存最近使用的路由
- 快速查找
4.3 直接路由vs间接路由
直接路由(Direct Routing):
目的主机在同一网络
示例:
主机A:192.168.1.10
主机B:192.168.1.20
同一网络:192.168.1.0/24
过程:
1. A想发送给B
2. 检查:B在同一网络
3. 直接发送(通过ARP获取B的MAC地址)
4. 不需要路由器
间接路由(Indirect Routing):
目的主机在不同网络
示例:
主机A:192.168.1.10(网络1)
主机B:10.0.0.20(网络2)
过程:
1. A想发送给B
2. 检查:B不在同一网络
3. 查找路由表
4. 发送给网关路由器
5. 路由器转发
5. NAT技术
5.1 为什么需要NAT?
地址短缺问题:
IPv4地址:约43亿个
全球需求:远超43亿
私有地址:
10.0.0.0/8
172.16.0.0/12
192.168.0.0/16
问题:
私有地址不能在互联网上路由
解决方案:
NAT(Network Address Translation)
网络地址转换
5.2 NAT工作原理
基本NAT:
内部网络:192.168.1.0/24(私有)
外部网络:公网地址
过程:
1. 内部主机(192.168.1.10)访问互联网
2. 数据包到达NAT路由器
3. NAT修改源地址:
192.168.1.10 → 公网地址(如1.2.3.4)
4. 发送到互联网
5. 响应返回时,NAT修改目的地址:
1.2.3.4 → 192.168.1.10
6. 转发给内部主机
NAPT(端口转换):
NAPT = Network Address Port Translation
也称为PAT(Port Address Translation)
多个内部主机共享一个公网地址
示例:
内部主机A:192.168.1.10:5000
内部主机B:192.168.1.20:6000
公网地址: 1.2.3.4
NAT表:
┌────────────────────┬─────────────────────┐
│ 内部地址:端口 │ 外部地址:端口 │
├────────────────────┼─────────────────────┤
│ 192.168.1.10:5000 │ 1.2.3.4:10000 │
│ 192.168.1.20:6000 │ 1.2.3.4:10001 │
└────────────────────┴─────────────────────┘
通过端口区分不同的内部主机
5.3 NAT类型
Full Cone NAT(完全锥形NAT):
特点:
- 内部地址:端口 → 外部地址:端口(固定映射)
- 任何外部主机都可以发送到这个外部端口
适用:
- 服务器
- P2P应用
Restricted Cone NAT(受限锥形NAT):
特点:
- 只有内部主机曾发送过数据的外部主机才能回复
- 限制外部IP
适用:
- 一般客户端
Port Restricted Cone NAT(端口受限锥形NAT):
特点:
- 限制外部IP和端口
- 更严格
适用:
- 安全性要求高的场景
Symmetric NAT(对称NAT):
特点:
- 每个外部目的地址都有不同的映射
- 最严格
问题:
- P2P穿透困难
5.4 NAT的优缺点
优点:
✅ 节省公网IP地址
✅ 提高安全性(隐藏内部结构)
✅ 灵活的网络规划
缺点:
❌ 破坏端到端连接
❌ 增加延迟
❌ 某些协议不支持(如FTP主动模式)
❌ P2P应用需要特殊处理(NAT穿透)
❌ 违反分层原则(修改传输层端口)
6. 实战项目:IP地址计算器
6.1 项目需求
功能需求:
1. IP地址信息查询
- 地址类型(A/B/C类)
- 私有/公网地址
- 网络地址
- 广播地址
- 可用主机范围
2. 子网划分
- 根据主机数划分
- 根据子网数划分
- VLSM计算
3. 子网聚合
- 路由聚合计算
- CIDR表示
4. 二进制转换
- IP地址二进制表示
- 子网掩码二进制表示
技术要求:
- Python实现
- 命令行界面
- 输入验证
- 友好的输出格式
6.2 工具演示
# IP地址信息查询
python day22_ip_calculator.py --ip 192.168.1.10 --mask 255.255.255.0
# 子网划分
python day22_ip_calculator.py --subnet 192.168.1.0/24 --split 4
# 路由聚合
python day22_ip_calculator.py --aggregate 192.168.0.0/24 192.168.1.0/24
7. 今日练习
练习1:地址计算
1. 计算以下IP地址的网络地址和广播地址:
- 172.16.5.130/24
- 10.1.2.3/16
- 192.168.100.50/27
2. 判断以下地址是否在同一网络:
- 192.168.1.10/24 和 192.168.1.20/24
- 10.0.0.5/16 和 10.1.0.5/16
练习2:子网划分
将192.168.1.0/24划分为:
1. 4个相等的子网
2. 2个子网(一个需要100台主机,一个需要50台)
3. 3个子网(分别需要60、30、15台主机)
练习3:路由聚合
聚合以下路由:
1. 192.168.0.0/24, 192.168.1.0/24, 192.168.2.0/24, 192.168.3.0/24
2. 10.0.0.0/24, 10.0.1.0/24
练习4:实战应用
使用IP计算器工具:
1. 规划一个企业网络(3个部门)
2. 分配IP地址段
3. 配置路由器(模拟)
8. 常见问题
Q1:子网掩码255.255.255.255(/32)有什么用?
A:
- 表示单个主机
- 主机路由
- 用于点对点链路
- 用于环回地址
Q2:为什么要减去2个地址(网络地址和广播地址)?
A:
- 网络地址:标识网络本身,不能分配给主机
- 广播地址:发送给所有主机,不能分配给单个主机
Q3:0.0.0.0/0是什么意思?
A:
- 默认路由
- 匹配所有地址
- 当没有更具体的路由时使用
Q4:NAT会影响网络游戏吗?
A:
- 会影响
- 对称NAT最难穿透
- 需要使用STUN、TURN等技术
- 或使用UPnP自动映射
Q5:IPv4地址真的不够用了吗?
A:
- 理论上不够(43亿 < 全球设备数)
- 实际上通过NAT缓解
- 长期解决方案是IPv6
9. 总结
今天我们学习了:
核心知识点
IP协议基础:
- 无连接、不可靠、尽力而为
- 网络层协议
- 负责寻址和路由
IPv4地址:
- 32位地址
- 点分十进制表示
- A/B/C/D/E类地址
- 私有地址和特殊地址
子网划分:
- 子网掩码
- CIDR表示法
- VLSM
- 路由聚合
IP报文:
- 20-60字节头部
- 关键字段:TTL、Protocol、地址
- IP分片和重组
IP路由:
- 路由表
- 最长前缀匹配
- 直接路由vs间接路由
NAT技术:
- 地址转换
- NAPT(端口转换)
- NAT类型
- 优缺点
重点回顾
IP地址计算公式:
网络地址 = IP地址 & 子网掩码
广播地址 = 网络地址 | (~子网掩码)
主机数量 = 2^(32-前缀长度) - 2
子网划分步骤:
1. 确定需要的子网数或主机数
2. 计算需要的位数
3. 确定新的前缀长度
4. 计算子网范围
路由查找:
最长前缀匹配原则
NAT工作:
内部私有地址 ←→ 外部公网地址
明天预告
第23天:IPv6详解
内容预览:
- IPv6地址格式
- IPv6 vs IPv4对比
- IPv6特性和优势
- IPv6过渡技术
- IPv6实践
继续加油! 🚀
今天我们学习了IP协议的基础知识,理解了IP地址、子网划分和路由的原理。这些知识是网络工程师的必备技能。明天我们将学习IPv6,了解下一代互联网协议!
进度:22/180天(12.2%)