IPV4 协议
# IPV4 协议
- 主机、路由器网络层的主要功能
ICMP 协议一定程度上可以看做是 IP 协议的伴随协议
# IP 数据报
IP 数据报的格式
版本号
首部长度
- 以 4 个字节为单位
服务类型(TOS): 指示期望获得哪种类型的服务
- 1998 年这个字段改名为区分服务
- 只有在网络提供区分服务(DiffServ)时这个字段才有效
一般情况下不使用,通常IP分组的该字段(第2字节)的值为00H
总长度: IP分组的总字节数(首部+数据)
- 最大IP分组的总长度:65535B
- 最小的IP分组首部:20B
- IP分组可以封装的最大数据:65535-20=65515B
生存时间(TTL) 字段占8位:IP分组在网络中可以通过的路由器数(或跳步数)
- 路由器转发一次分组,TTL 减 1
- 如果 TTL=0,路由器则丢弃该 IP 分组
- 路由器丢弃分组后会向源主机发送 ICMP 报文
协议: 指示IP分组封装的是哪个协议的数据包
- 实现复用/分用
- 6为TCP,表示封装的为TCP段;17为UDP,表示封装的是UDP数据报
首部校验和:
- 计算校验和时,该字段置全0
- 采用反码算数运算求和,和的反码作为首部校验和字段
- 逐跳计算、逐跳校验
源IP地址、目的IP地址字段各占32位
- 分别标识发送分组的源主机/路由器(网络接口)和接收分组的目的主机/路由器(网络接口)的IP地址
选项字段占长度可变,范围在1~40B之间:携带安全、源选路径、时间戳和路由记录等内容
- 实际上很少被使用
填充字段占长度可变,范围在0~3B之间:
- 目的是补齐整个首部,符合32位对齐
- 即保证首部长度是4字节的倍数
# IP 分片
# 最大传输单元(MTU)
网络链路存在MTU (最大传输单元)—链路层数据帧可封装数据的上限
- 不同链路的MTU不同
大IP分组向较小 MTU 链路转发时,可以被“分片” (fragmented)
- 1个IP分组分为多片IP分组
- IP分片到达目的主机后进行“重组”(reassembled)
- 路由器只分不装,由目的主机进行组装
# IP 分组格式
- IP首部的相关字段用于标识分片以及确定分片的相对顺序
- 总长度、标识、标志位和片偏移
- 标识字段占16位
- 标识一个IP分组
- IP协议利用一个计数器,每产生IP分组计数器加1,作为该IP分组的标识
- 标志位字段占3位
- DF (Don't Fragment)
- DF = 1 禁止分片
- DF = 0 允许分片
- MF (More Fragment)
- MF = 1 非最后一片
- MF = 0 最后一片(或未分片)
- DF (Don't Fragment)
- 片偏移字段占13位
- 一个IP分组分片封装原IP分组数据的相对偏移量
- 片偏移字段以8字节为单位
# IP 分片过程
- 假设原IP分组总长度为
,待转发链路的MTU为 - 若
,且 ,则可以/需要分片 - 分片时每个分片的标识复制原IP分组的标识
- 通常分片时,除最后一个分片,其他分片均分为MTU允许的最大分片
- 一个最大分片可封装的数据应该是8的倍数,因此,一个最大分片可封装的数据为
- 需要的总片数为
- 隐含前提
- 隐含前提
- 每片的片偏移字段取值为
- 每片的总长度字段为
- 每片的 MF 标志位为
# IP 编址
IP 分组
- 源地址 (SA)
- 目的地址 (DA)
接口 (interface)
- 主机/路由器与物理链路的连接
- 实现网络层功能
- 路由器通常有多个接口
- 主机通常只有一个或两个接口
- (e.g.,有线的以太网接口,无线的802.11接口)
IP 地址: 32 比特 (IPv4)
- 编号标识主机、路由器的接口
编址示例
- IP 地址与每个接口关联
# IP 子网(Subnets)
- IP 地址
- 网络号(NetID)
- 高比特位
- 主机号(HostID)
- 低比特位
- 网络号(NetID)
IP 子网
- IP地址具有相同网络号的设备接口
- 不跨越路由器(第三及以上层网络设备)可以彼此物理联通的接口
注意以上两个条件均需要满足
判断子网数目的方法
- 将路由器去掉后,能够相互联通的网络的数目,即子网的数目
# "有类" IP 地址
划分方法
划分图示
"有类"编址示意图
按高位比特
0, 1
进行对半A, B, C 类 NetID 分别为 8, 16, 24 位
A, B, C 类
D 类地址
- 多播地址,只能接收数据报
E 类地址
- 保留,作为研究使用
# 特殊 IP 地址
NetID | HostID | 作为IP分组 源地址 | 作为IP分组 目的地址 | 用途 |
---|---|---|---|---|
全0 | 全0 | 可以 | 不可以 | 在本网范围内表示本机 在路由表中用于表示默认路由 (相当于表示整个Internet网络) |
全0 | 特定值 | 不可以 | 可以 | 表示本网内某个特定主机 |
全1 | 全1 | 不可以 | 可以 | 本网广播地址(路由器不转发) |
特定值 | 全0 | 不可以 | 不可以 | 网络地址,表示一个网络(g一般用来表示一个特定的子网) |
特定值 | 全1 | 不可以 | 可以 | 直接广播地址 对特定网络上的所有主机进行广播 |
127 | 非全0或 非全1的任何数 | 可以 | 可以 | 用于本地软件环回测试 称为环回地址 |
# 私有(Private) IP 地址
Class | NetIDs | Blocks |
---|---|---|
A | 10 | 1 |
B | 172.16 to 172.31 | 16 |
C | 192.168.0 to 192.168.255 | 256 |
- 各个不同的子网可以重用
# 子网划分(Subnetting)
将"有类"编址中大的子网划分为更小的子网
IP地址的划分
网络号(NetID)
- 高位比特
子网号(SubID)
- 原网络主机号部分比特
主机号(HostID)
- 低位比特
IP 地址划分示意图
子网划分后通过路由器的转发表进行区分
示意图
子网掩码
- 用来确定是否划分了子网,利用了多少位划分子网
- 子网掩码形如 IP 地址,但 NetID、SubID 位全取1
- HOSTID 位全取 0
- 子网地址 + 子网掩码 → 准确确定子网大小
子网掩码示例
- 子网
201.2.3.0, 255.255.255.0
划分为等长的 4 个子网- 取两位作为
SubID
,则子网掩码为255.255.255.192
- 根据
SubID
的不同取值,划分为 4 个子网 - 一个子网中
HostID
全为0,可用于标识这个子网- 各个子网中的
HostID
有 6 位
- 各个子网中的
- 如图中的
201.2.3.0[00(000000)₂]
201.2.3.64[01(000000)₂]
201.2.3.128[10(000000)₂]
201.2.3.192[11(000000)₂]
- 取两位作为
路由器确定 IP 分组转发子网的方法
- 将IP分组的目的IP地址与子网掩码按位与运算,提取子网地址
示例
- 目的IP地址:
172.32.1.112
,子网掩码:255.255.254.0
按位与操作
- 子网地址:
172.32.0.0
(子网掩码:255.255.254.0
)- 属于 B 类地址,
SubID
占 3 位,NetID
占 16 位
- 属于 B 类地址,
- 地址范围
172.32.0.0 ~ 172.32.1.255
- 不动
NetID
和SubID
(即子网掩码的部分),HostID
确定地址范围
- 不动
- 可分配地址范围:
172.32.0.1
~172.32.1.254
HostID
有 9 位,除去有特殊用途的全 0 和 全 1,共有个可分配地址
- 广播地址:
172.32.1.255
HostID
全 1
- 表示网络地址:
172.32.0.0
HostID
全 0
# CIDR 与路由聚合
无类域间路由 (CIDR: Classless InterDomain Routing)
- 消除传统的 A 类、B 类和 C 类地址的界限
- NetID+SubID→Network Prefix (Prefix) 可以任意长度
- 融合子网地址与子网掩码,方便子网划分
- 无类地址格式:
a.b.c.d/x
, 其中为前缀长度
- 无类地址格式:
CIDR 的优点
- 提高 IPv4 地址空间分配效率
- 提高路由效率
- 将多个子网聚合为一个较大的子网
- 构造超网 (super netting)
路由聚合 (route aggregation)
- 示意图
图示
- 可以简化路由器中的转发表
- 层级编址使得路由信息通告更高效
最长前缀匹配优先
- 可以避免网络黑洞
# DHCP 协议
主机获得 IP 地址的方法
- "硬编码"
- 静态配置
- 默认网关
- 当数据报要离开子网时,数据传送到的路由器接口
- 动态主机配置协议 -- DHCP: Dynamic Host Configuration Protocol
- 从服务器动态获取
- IP地址
- 子网掩码
- 默认网关地址
- DNS服务器名称与IP地址
- "即插即用"
- 允许地址重用
- 支持在用地址续租
- 支持移动用户加入网络
- 从服务器动态获取
DHCP 的工作过程
- 主机广播 "DHCP discover"(发现报文)
- DHCP服务器利用 "DHCP offer" (提供报文) 进行响应
- 主机请求IP地址: "DHCP request" (请求报文)
- DHCP服务器分配IP地址: "DHCP ack" (确认报文)
工作过程示意图
- DHCP request 采用广播是为了告知其它 DHCP 服务器自己已接受 IP 分配
DHCP 在应用层实现
- 请求报文封装到 UDP 数据报中
- IP 广播
- 映射为链路层广播
- (e.g. 以太网广播)
- ACK报文
- 包括分配给客户的IP地址、子网掩码、默认网关、DNS服务器地址
# 网络地址转换 (NAT)
NAT 示意图
特点
- 只需/能从 ISP 申请一个 IP 地址
- IPv4 地址耗尽
- 本地网络设备 IP 地址的变更,无需通告外界网络
- 变更 ISP 时,无需修改内部网络设备 IP 地址
- 内部网络设备对外界网络不可见,即不可直接寻址(安全)
实现方法
- 替换
- 利用
(NAT IP地址,新端口号)
替换每个外出IP数据报的(源IP地址,源端口号)
- 利用
- 记录
- 将每对
(NAT IP地址, 新端口号)
与(源IP地址, 源端口号)
的替换信息存储到NAT转换表中
- 将每对
- 替换
- 根据NAT转换表,利用
(源IP地址, 源端口号)
替换每个进入内网IP数据报的(目的IP地址,目的端口号)
,即(NAT IP地址, 新端口号)
- 根据NAT转换表,利用
NAT 过程示意图
16-bit端口号字段
- 可以同时支持60,000多并行连接
NAT 的主要争议
- 路由器应该只处理第3层功能
- 端口号一般由传输层使用
- 违背端到端通信原则
- 应用开发者必须考虑到 NAT 的存在
- e.g., P2P应用
- 应用开发者必须考虑到 NAT 的存在
- 地址短缺问题应该由 IPv6 来解决
NAT 穿透问题
- 问题
客户期望连接内网地址为
10.0.0.1
的服务器- 客户不能直接利用地址
10.0.0.1
直接访问服务器 - 对外唯一可见的地址是NAT,地址:
138.76.29.7
- 客户不能直接利用地址
- 解决方案 1
静态配置 NAT,将特定端口的连接请求转发给服务器
- e.g., (138.76.29.7, 2500) 总是转发给(10.0.0.1, 25000)
- 解决方案 2
利用 UPnP(Universal Plug and Play) 互联网网关设备协议 (IGDInternet Gateway Device) 自动配置
- 学习到 NAT 的公共 IP 地址 (
138.76.29.7
) - 在 NAT 转换表中,增删端口映射
示意图
- 学习到 NAT 的公共 IP 地址 (
- 解决方案 3
中继(如 Skype)
- NAT内部的客户与中继服务器建立连接
- 外部客户也与中继服务器建立连接
- 中继服务器桥接两个连接的分组
示意图