22天:IP协议基础

第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. 总结

今天我们学习了:

核心知识点

  1. IP协议基础

    • 无连接、不可靠、尽力而为
    • 网络层协议
    • 负责寻址和路由
  2. IPv4地址

    • 32位地址
    • 点分十进制表示
    • A/B/C/D/E类地址
    • 私有地址和特殊地址
  3. 子网划分

    • 子网掩码
    • CIDR表示法
    • VLSM
    • 路由聚合
  4. IP报文

    • 20-60字节头部
    • 关键字段:TTL、Protocol、地址
    • IP分片和重组
  5. IP路由

    • 路由表
    • 最长前缀匹配
    • 直接路由vs间接路由
  6. 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%)