计算机网络笔记 六.Internet 协议
网络互连需要一个全局统一的规则, 所有通讯设备运行 IP 协议.

不同网络采用的数据链路层和物理层协议可能不同, 对于这种网络, 可以采用相同的网络层协议实现它们的互连. 对于 Internet, 这个协议就是 IP, 使用的网络互连设备就是路由器.
路由器负责处理 IP 分组, 连接不同的网络, 在不同的网络之间提供数据转发服务.
Internet 设备主要包括:
- 网络侧设备: 例如路由器等, 提供数据转发服务, 通过多个设备之间的协作, 将数据投递到最终的目的地, 是数据传输服务的提供者.
- 用户侧设备: 例如用户终端, 服务器等, 产生数据, 利用网络进行传输, 或者从网络从接收数据, 是数据传输服务的使用者.
Internet 协议族
网络中的设备运行以 TCP 和 IP 协议为核心的一系列协议, 也称为 TCP/IP 协议族.

选择 IP 协议的原因
对 Internet 来说, 可扩展性极其重要, 因此需要解决异构性和效率问题, Internet 以 IP 为核心, 采用细腰体系架构互连各种异构网络; 采用基于 IP 的尽力服务模型, 实现简单, 保证大规模网络的传输效率.
IP 提供的是尽力传送服务, 不可靠且乱序.
设计原则是令网络尽可能简单, 这保证了 Internet 的可扩展性.
数据封装流程
- 发送端运行 FTP 应用程序
- 应用层调用 FTP 应用层模块, 将内容封装在 FTP 协议中
- 传输层调用 TCP 模块, 将上层内容封装在 TCP 协议中
- 网络层调用 IP 模块, 对每个数据段加上 IP 分组头
- 数据链路层对每个 IP 分组加上以太帧头或帧尾
- 物理层将数据帧的二进制码转换成光电信号
IP 协议本质上是定义了一种数据的封装格式, 在数据前面加上一些协议相关的重要信息, 这些信息里最重要的就是 IP 地址.
IP 地址的双重作用: 身份标识和位置标识.
IP 地址
IPv4 地址由 4 个字节 (32 位) 组成, 点分十进制表示
分为五类:
- A 类: 0 + 7 位网络号 + 24 位主机号, 单播地址, 标识 126 个 A 类网络, 每个网络可以有 个主机, - 2 是因为避免全 0 和全 1 出现
- B 类: 10 + 14 位网络号 + 8 位主机号, 单播地址, 标识 个 B 类网络, 每个网络可以有 个主机
- C 类: 110 + 21 位网络号 + 8 位主机号, 单播地址, 标识 个 B 类网络, 每个网络可以有 个主机
- D 类: 1110 开头, 组播地址, 标识一个组的地址
- E 类: 11110 开头, 保留地址
IP 地址中网络号或主机号为全 0 或全 1 的一般用做特殊处理, 不用来标识网络或主机. 例如:
- 有限广播: 全 1
- 定向广播: 网络号 + 全 1
- 回环地址 loopback: 127 + 任意
- 测试: 全 0, 全 0 + 主机号
IP 地址分配
Internet 上的 IP 地址由互联网编号分配机构 IANA (Internet Assigned Numbers Authority) 负责分配和管理.
- RIR 地区级, 范围为一个指定的地理区域, 例如亚太网络信息中心
- NIR 国家级, 范围为一个国家或者特定的经济区域, 例如中国互联网中心
- LIR 本地级, 通常为 Internet 服务提供商 (ISP: Internet Service Provider), 包括可进一步进行地址分配的下游 ISP
IP 地址配置
- 手动配置
- 拨号用户通过 PPP 协议分配
- 基于 DHCP 的配置: RFC 2131; 采用客户/服务器模式, 消息采用 UDP 协议封装; 分配机制包括:
- 自动分配: 给客户端分配一个永久地址
- 动态分配: 分配一个一段时间内有效的地址
- 手动分配: 由网络管理员分配, DHCP 仅用来将分配的地址通报给客户端
DHCP 过程:
- 客户端在广播 DHCPDISCOVER 消息, 源 IP 地址为 0.0.0.0, 目的 IP 地址为 255.255.255.255, 使用 MAC 地址标识客户端
- DHCP 服务器回应 DHCPOFFER 消息给客户端, 其中包含分配的 IP 地址, 租用期限和其它配置参数
- 客户端选择一个 DHCP 服务器并且在整个网络上广播 DHCPREQUEST 消息, 告诉其它 DHCP 服务器它选择哪个服务器提供的 IP 地址
- DHCPREQUEST 选定的服务器给客户端回应 DHCPACK, 其中包含有配置参数
- 客户端接收到 DHCPACK 后, 应该对参数进行最后的检查, 然后开始使用分配的 IP 地址
- 客户端可以通过向 DHCP 服务器发送 DHCPRELEASE 消息来释放对 IP 地址的租用, 其中包含有客户端的 MAC 地址和租用 IP 地址
DHCP 协议关键点
**如何确保 IP 地址的唯一性? **
DHCP 服务器统一管理和分配.
**客户端最开始如何标识? **
使用 MAC 地址, IP 地址使用 0.0.0.0.
**如何找到 DHCP 服务器? **
通过广播.
**多个 DHCP 服务器如何处理? **
客户端选择.
DHCP 中继

地址解析协议
IP 地址和 MAC 地址的区别
IP 地址在整个网络中标识不同的节点, 而 MAC 地址在链路或者局域网内标识不同的节点.
IP 地址包含有网络号 (前缀), 因此节点配置的 IP 地址与其所在的网络相关, 而 MAC 地址与节点位置无关, 因此一般事先固化在网络设备中.

| MAC | IP |
|---|---|
| 物理地址 (数据链路层地址) | 逻辑地址 (网络层地址) |
| 局部意义 | 全局意义 |
| 随机获得 | 上级分配 |
| 48 位, 如 08:00:39:00:2f:c3 | 32 位,如 202.38.64.1 |

网络寻址与链路寻址
网络寻址: 数据基于 IP 地址跨网络传输, 路由器基于 IP 地址将分组从一个网络转发到另一个网络
链路寻址: 数据基于 MAC 地址在网络内传输, L2 交换机基于 MAC 地址将分组从一条物理链路转发到另一条物理链路 (这两条链路在同一个网络内)
数据帧在不同链路上传输时, 源和目的 MAC 地址变化, 而源和目的 IP 地址不变.
需要在网络中传输数据时, 如果目标主机和源主机不在一个局域网内, 需要查转发表, 将数据交给下一跳对应的地址, 其中 0.0.0.0 是缺省路由, 可以匹配所有 IP 地址, 也可以表示为 default.
通过网络寻址查到下一跳对应的 IP 地址之后, 需要通过链路寻址将数据传到下一跳.
数据帧的封装

LLC: Logical Link Control, 逻辑链路控制
PDU: Protocol Data Unit, 协议数据单元
不写 IP 数据包是因为可能不是 IP 协议.
分组的目的 IP 地址由发送主机指定, 那么封装分组的数据帧的目的 MAC 地址如何确定呢?
给定 IP 地址, 通过地址解析协议 ARP找到对应节点的 MAC 地址.
注: 帧的目的 MAC 地址始终为转发 IP 分组的下一跳网络节点的 MAC 地址, 因此在执行 ARP 协议之前首先要查找转发表, 得到下一跳网络节点的目的 IP 地址, 下一跳网络节点可能为目的主机, 也可能为路由器, 然后再执行 ARP 过程
地址解析
ARP, Address Resolution Protocol.
情况 1: 目的 IP 地址所对应的主机和发送主机在同一个网络内
每个主机都有 ARP 缓存, 用来存放一些 IP 地址与 MAC 地址的对应关系. 主机根据分组头上的目的 IP 地址查阅自己的 ARP 缓存, 如果没查到, 就向广播地址发送 ARP 请求.
被请求的 IP 地址所对应的主机返回一个 ARP 响应, 主机收到响应后, 就可发送数据帧, 并将该 IP 地址与 MAC 地址对存放在 ARP 缓存中.
每个节点一般都维护 ARP 缓存, 通过 ARP 缓存可以减少频繁的 ARP 操作, 从而减少网络开销, 提高性能.
情况 2: 目的 IP 地址所对应的主机和发送主机在两个不同的网络内
发送主机通过查找转发表得到转发的下一跳网络节点 IP 地址 (第一跳路由器), 对该 IP 地址执行 ARP 过程, 然后发送数据;
第一跳路由器查找转发表得到第二跳路由器的 IP 地址, 对该 IP 地址执行 ARP 过程, 然后发送数据;
如此重复, 直到目的网络的路由器查找转发表知道目的节点和自己在同一个网络中, 对目的 IP 地址执行 ARP 过程, 然后将数据发送到目的节点.

ARP 过程被限制在链路范围 (同一个网络) 内, 始终是查找转发表得到转发的下一跳节点的 IP 地址, 然后对该 IP 地址做 ARP. 在数据传输频繁时, ARP 缓存表中一般有对应的表项, 节点间不需要交互 ARP 过程.
ARP 非常重要, 它决定了在链路上, 封装 IP 分组的帧会被哪个网络接口接收.
Windows 查看 ARP 缓存表:
arp -a |
潜在的安全问题
在链路层次上窃听数据, ARP Spoofing
防范措施:
- 监测可疑的 ARP 流量, 特别是路由器等关键设备的 MAC 地址的变化
- 通过划分子网, VLAN 等措施限制 ARP 的广播域
- 在 ARP Cache 中静态配置 IP 和 MAC 地址的映射表项
反向 ARP
用于查找物理地址所对应的 IP 地址, 例如对于打印机, 无盘工作站等小型嵌入式设备, 启动时需要知道自己的 IP 地址.
ARP 协议帧格式
对于以太网, ARP 协议 (RFC 826) 采用 MAC 帧进行封装.

帧类型 (Type): ARP 请求及响应为 0x0806
硬件类型: 指发送者的网络接口类型, 如以太网为 1
协议类型: 指发送者所采用的网络层协议类型, 如 IP 协议为 0x0800
操作: ARP 请求—1, ARP 响应—2, RARP 请求—3, RARP 响应—4
特殊情况:
- 目的 IP 地址为广播地址, 则目的 MAC 地址为 FF:FF:FF:FF:FF:FF
- 目的 IP 地址为组播地址, 则目的 MAC 地址采用地址映射, 将 IP 组播地址的低 23 位映射到 MAC 地址的低 23 位, 前面加上 01005E
注意: IP 组播地址是低 28 位不同 (最高四位为 1110), 但低 23 位可能存在重复, 这样的映射会造成多对一的地址重复问题.
IP 协议
Internet Protocol
IPv4 头标

版本号 (VERS): 4bits, IPv4 协议填 4, IPv6 协议填 6.
IP 分组头长度 (LEN): 4bits, 单位为 4 字节, 取值范围 5-15 (确省值为 5, 即标准头标长 20 字节), 指示 IP 分组头的长度.
服务类型 (TOS):

注意: TOS 域最初的设计并没有得到应用. 后来在引入区分服务时, 这前 6 个比特又被用来标记分组的服务类别. 然而, 实际的网络中, 服务质量控制并没有在全网范围内流行.
总长度和分段
总长度: 16bits , 单位为字节, 描述 IP 分组的总长 (包括头标和数据), 最大分组长度为 65535 字节≈64KB.
标识符 Identification: 16bits, 用于唯一标识分段所属的分组.
标志 Flags: 3bits, 第 1 位未定义, 第 2 位为 0 表示该分组可分段, 否则表示不可分段; 第 3 位为 0 表示这是最后的分段, 否则则表示还有后续分段.
段偏移 Fragment Offset: 13bits, 单位为 8 字节. 取值 0-8191, 标明当前分段在原分组中位置.
MTU: Maximum Transmission Unit, 最大传输单元, 即一帧所能携带的最大 IP 分组, 包括 IP 头标.
在 IPv4 中, 发送主机和中间路由器执行分段, 而目的主机执行分段重组 (即非透明的分段重组过程, 目的是减少多次重组操作带来的开销)
例: IP 头标取固定长度 20 字节

段偏移的单位是 8 字节, 所有分段后段的长度必须是 8 字节的整数倍.
TTL 和协议
生存时间 (TTL: Time to Live): 8bits, 单位秒, 表示分组的生存时间. 实际操作时, 分组每经过一个路由器, TTL 值减一, 当 TTL 值为 0 时, 该分组被丢弃.
协议 (Protocol): 表示封装在 IP 分组中的载荷的协议类型.
- 0 Reserved
- 1 Internet Control Message Protocol (ICMP)
- 2 Internet Group Management Protocol (IGMP)
- 3 Gateway-to-Gateway Protocol (GGP)
- 4 IP (IP encapsulation)
- 5 Stream
- 6 Transmission Control (TCP)
- 8 Exterior Gateway Protocol (EGP)
- 9 Private Interior Routing Protocol
- 17 User Datagram (UDP)
- 89 Open Shortest Path First (OSPF)
校验和与地址
分组头校验和: 16bits, 用来检验 IP 头标在传输过程中是否被破坏. 只检验 IP 头标, 不管数据部分.
源地址: 32bits, 分组发送者的 IP 地址.
目的地址: 32bits, 分组接收者的 IP 地址.
填充 (padding): 分组头长度必须为 4 字节的整数倍, 如果选项的长度不是 4 字节的整数倍, 那么就要进行填充.
校验和计算方法: 每两个字节切开成 10 段, 校验和位设置为零, 回卷累加 (进位回加到结果的最后一位), 取反, 得到结果即为校验和.
接收方将 10 段数字回卷累加, 如果全为 1 则正确, 否则传输出错.
可变部分
用于提供排错, 测量, 安全等措施, 1-40 字节
- 安全性 (Security): 指明分组的机密性
- 严格的源路由选择 (Strict Source routing): 给出分组经过的完整路由
- 松散的源路由选择 (Loose Source routing): 给出分组经过的某些路由器列表
- 路由记录 (Route recording): 使每个路由器都附上它的 IP 地址
- 时间标记 (Time stamping): 使每个路由器都附上它的 IP 地址和时间标记
优点: 增加了 IP 数据报的功能, 具有可选择性
缺点: IP 数据报首部长度可变, 增加了每个路由器处理开销, 但实际上很少选用选项
TLV 格式, 1B TYPE + 1B LENGTH + nB VALUE
路由器对 IP 分组执行的操作
- 验证校验和
- TTL 值减 1
- 重新计算校验和
- 根据需要执行分段操作
- 处理一些需要路由器处理的选项
- 分组转发
- 根据目的 IP 地址查找转发表
- 交换
IP 路由和转发
分组转发
在 Internet 中, 数据从源主机发送到目的主机, 中间可能要经过多个路由器.
路由器接收完整 IP 分组后, 根据接收到的头标中的目的 IP 地址查找转发表, 从而确定其转发的下一跳网络节点, 这种方式也称为逐跳转发.
路由表和转发表
路由表 Routing Table, 每个表项至少包含两个内容:
- 目的网络 (网络号或前缀)/目的主机的地址
- 下一跳 (Next Hop) 地址
在路由器上, 一般通过路由协议来动态建立和维护路由表.
转发表 Forwarding Table, 与路由表相比, 转发表包含了更多的信息, 包括包含目的网络的网络号/目的主机的地址, 输出端口以及一些 MAC 地址等信息.
主机 (用户终端) 上的转发表一般是手动或者通过 DHCP 等动态配置.
在 IP 网络中, 每个网络都使用网络号或者网络前缀来标识, 我们用 IP 地址/网络号长度 (或者前缀长度) 的方式来表示网络号或者网络前缀
例:
路由表:
| 网络号或前缀 | 下一跳 |
|---|---|
| 10 或者 10.0.0.0/8 | 171.69.245.10 |
转发表:
| 网络号或前缀 | 输出端口 | 下一跳 MAC 地址 |
|---|---|---|
| 10 或者 10.0.0.0/8 | 0 | 00:02:2b:e4:b:1:2 |
注意:
路由表是建立转发表的前奏, 也就是说转发表可以基于路由表的信息建立.
在路由器上, 一般是先通过路由算法 (协议) 生成路由表, 然后得到转发表.
在以后的叙述中, 如果不特别注明, 我们将不区分路由表和转发表, 路由器上一般采用路由表的形式, 而主机上一般采用转发表的形式.
路由表实例:

缺省路由:

查看路由表/转发表:
Linux:
ip route show |
Windows:
route print |
路由协议
自治系统 AS, Autonomous System
在 Internet 中, 自治系统一般是在同一个管理实体控制之下并且具有相同路由选择策略 (执行相同的路由算法) 的 IP 网络和路由器的集合, 也称为路由选择域 (Domain).
路由协议分为
- 内部网关路由协议 IGP (Interior Gateway Protocols), 也称为域内路由协议, 指路由选择的范围被限制在一个路由选择域内
- 外部网关路由协议 EGP (Exterior Gateway Protocols), 也称为域间路由协议, 指路由选择在不同的路由选择域中的路由器之间进行
内部网关路由协议
- 距离矢量路由协议, 基于距离矢量算法, 是一种分布式算法, 例如 Bellman-Ford 算法
- 链路状态路由协议, 基于链路状态算法, 也称为最短路径算法, 是一种全局算法. 例如 Dijkstra 最短路径算法
在距离矢量算法中, 每个节点只和直接相连的节点进行通信, 但是它把所知的全部信息 (即到所有节点的距离) 都告诉它们.
在链路状态算法中, 每个节点和其余各个节点通过扩散或者泛洪的方式都进行通信, 但是它只告诉它们自己确切知道的信息 (即与其直接相连的链路状态).
距离矢量算法只适用于小规模网络, 为了避免计数到无穷问题, 网络直径一般不能超过 15 跳.
与链路状态算法相比, 距离矢量算法对网络变化反应较慢.
路由信息协议
Routing Information Protocol, RIP, 这好像不太吉利
距离矢量算法的具体实现, 路由器向邻居路由器通告到达所有网络的距离.
RIP 分组格式:

分组的主要部分采用<网络地址, 距离>对.
一个路由条目占 20 字节, 最多一次发 25 个.
注: 子网掩码是一个特殊的 IP 地址, 这个 IP 地址中的若干个比特为 1, 其它比特为 0, 比特为 1 的位置对应着网络前缀, 例如: 255.255.128.0, 常与 IP 地址组合使用, 用以区分网络号和主机号
开放最短路径优先协议
Open Shortest Path First, OSPF
基于链路状态算法的具体实现, 只有链路状态变化时才采用 flooding 的方式.
在基本链路状态算法的基础上增加了特性:
- 路由选择消息的认证: 只有彼此信任的路由器才能参与 AS 的路由选择, 避免恶意的路由器通告恶意的路由选择消息, 例如开销为 0 的路由选择消息
- 直接采用 IP 分组 (协议号为 89), 而不是 UDP
- 使得 OSPF 适合规模很大的网络, 附加的层次性允许将路由选择域 (Domain) 划分为区 (Area), 多个网络组成一个区, 对于 AS 的其余部分隐藏 , 以减少路由信令开销, 区域内的路由选择仅仅由区域自己的拓扑来决定
- 负载均衡, 允许到同一位置的多条路由具有相同的开销, 网络业务在这些路径上均匀分配

外部网关路由协议
AS 间为什么不采用 RIP 或者 OSPF?
- 规模: Internet 规模庞大, 平坦式的路由协议不现实;
- 管理: 不同自治域之间还需要考虑其他因素, 例如政治, 安全等因素;
- 性能: 不同自治系统的声明的路径代价不同, 同时由于策略的原因, 寻找最佳路由不现实.
BGP: Border Gateway Protocol, 边界网关协议
- 基于距离矢量的外部网关协议, 在边界路由器之间交换网络可达信息
- 触发更新消息, 并使用 TCP 来实现更新消息的可靠性
- 丰富的路由度量, 被称为路径向量或者属性
- 能够扩展到大规模互联网络, 例如 Internet
路由协议的作用范围:

ICMP 协议
Internet Control Message Protocol
- 定义在 RFC 792 和 RFC 950
- IP 在网络层提供尽力服务 (best effort service), 当分组由于各种原因无法投递而遭丢弃时, 就用 ICMP 发送差错报告
- 通过 ICMP 获取网络相关的信息, 例如可达性, 网络前缀等
- 尽管 ICMP 也是网络层协议, 但它也需要经过 IP 协议封装. 同样 ICMP 也不能保证可靠传输
ICMP 定义了两类消息, 差错消息和信息消息.
差错消息:
- 源抑制 (Source quench): 抑制发送过多分组的主机
- 超时(Time exceeded) : 分组的 TTL 为 0
- 信宿不可达 (Destination unreachable) : 报告子网, 主机不能定位的信宿
- 重定向 (Redirect): 路由重定向
- 参数问题 (Parameter problem): 分组头参数出错
信息消息/查询消息:
- 回音请求/响应(Echo request/reply)
- 路由器发现 (Router discovery)
- 地址掩码请求/响应 (Address mask request/reply)
超时和回音请求是常用的网络诊断工具.
常用网络诊断工具包括:
- ping: 测试主机的可到达性和往返延迟等网络信息
采用 ICMP 的回音请求/响应 (Echo request/reply) 报文, 通过向目的主机发送回音请求, 返回响应消息, 来测试目的主机的可达性, 往返延迟以及丢包率. - traceroute in linux (tracert in windows): 发现从源主机到目的主机路径上的网络节点
首先发送 TTL=1 的 echo request, 第一跳节点向源端返回 ICMP 的 Time Exceeded 错误, 然后发送 TTL=2 的 echo request, 第二跳节点返回 Time Exceeded 错误, 不断递增 TTL, 直到到达目的主机
潜在的安全性问题: ICMP 协议本身不具备任何验证机制, 任意节点都可以发起请求. 对单一节点的大量 ping 请求, 会占用节点大量的带宽和计算资源, 严重者可以形成 DDoS 攻击.
解决方法: 可以设置参数禁用 ping
IP 组播
单播 Unicast: 一对一
组播 Multicast: 一对多, 多对多
组播也称多播, 可用于会议电视, 分布式计算, 视频转播, 网络游戏, 讨论组等.
IP 采用 D 类地址作为组播地址, 每个 D 类地址代表一组主机, 共有 28 位可用来标识小组. 因此可同时支持多达 25 亿个小组.
Internet 支持两类组地址: 永久组地址和临时组地址.
组播和广播的区别
组播使用 D 类地址, 广播使用特定的广播地址.
组播可以按需发送, 它允许一个或多个组播源发送同一报文到指定的多个接收者; 广播不管用户是否有需求, 都会把数据报文发送给本网段中的所有用户, 需要占用更多带宽.
广播传输数据源必须与用户在同一个网段, 组播可以跨网段传输.
组播可以选择路由路径 (组播路由); 广播处理流程简单 (网段内泛洪), 不用选择路径.
组播相关协议
Router to Router: 组播路由协议, 如 DVMRP, PIM, 负责生成组播路由表
Host to Router: 组播组管理协议, IGMP (Internet Group Management
Protocol), 负责处理组成员的加入和退出
组播路由协议
基于源的组播协议, 以发送方为组播树的根, 并且包含了所有的组成员
- DVMRP (Distance Vector Multicast Routing Protocol)
- MOSPF (Multicast Extension to OSPF)
基于共享树的协议, 对于每个组使用同一颗树
- CBT (Core Based Trees)
混合以上两种方法的协议
- PIM (Protocol Independent Multicast)
- PIM-DM (Dense Mode), PIM-SM (Sparse Mode)
IGMP
Internet Group Management Protocol, 组成员管理协议
L2 交换机与组播
交换机的所有端口都转发组播分组, 包括那些没有连接组成员的端口, 导致带宽资源浪费.
启用 IGMP Snooping 后, 交换机只向连接有组成员的端口转发分组.
IPv4 的可扩展性
问题:
- 大约 43 亿个 IPv4 地址不够用, IP 地址的利用率不高, 分配粒度太大.
- 路由器特别是核心网络路由器路由表 (转发表) 表项急剧膨胀, 降低路由效率.
每个路由器上都有一个路由表, 手动配置或者根据路由协议自动生成, 对于 Internet, 每增加一个网络, 必须在路由表中建立该网络网络号所对应路由表表项.
解决方案概述:
采用层次化地址结构
- 通过细粒度分配 IP 地址块来提高 IP 地址的利用率划分子网 (提高 IP 地址利用率)
- IP 地址进行汇聚, 以减少路由协议中路由选择消息携带的和路由器的路由表中储存的网络号的数量 (提高 IP 地址利用率, 减少路由表表项)
- 多台主机共享一个全局的 IP (解决 IP 地址不够用)
划分子网, 无类别域间寻路 CIDR, 网络地址转换 NAT.
划分子网
子网 subnet: 将大的 A/B/C 类网络划分为多个小的子网, 对外仍然表现为一个单独的网络, 只有一个网络号.
IP = 网络号 + 子网 ID + 主机号
子网号为前两项
用子网掩码配置每个子网中所有的主机, 确保具有相同的子网号.
子网掩码 Subnet Mask 为 1 表示此处是子网号, 0 对应主机号, 也可以通过地址/掩码长度表示.
划分子网的步骤:
在得到一个有类别的 IP 地址后:
- 根据实际需求, 确定子网号的长度或者主机号的长度:
- 子网数量决定子网 ID 的长度, 从而决定了子网号的长度
子网数量≤, 其中 m 为子网 ID 的长度 - 主机数量决定了主机号的长度
主机数量≤ , 其中 n 为主机号的长度
- 子网数量决定子网 ID 的长度, 从而决定了子网号的长度
- 为每个子网选定子网 ID, 确定子网号, 然后根据子网号 (网络号+子网 ID) 的长度确定子网掩码
- 确定主机号, 给子网内的主机分配 IP 地址, 注意主机号最大值由主机号的长度决定
- 根据子网掩码, 子网号等信息配置每个路由器上的转发表
在网络外面, 子网划分是不可见的. 因此, 分配一个新的子网无需联系 ICANN 或改变外部数据库.
划分子网的本质是将一个大的地址块根据需要划分成地址空间互不重叠的小的地址块, 这种划分是有约束的, 即要求这些小的地址块的子网号不同.
分组转发时, 通过子网掩码得 IP 地址所对应子网号, 然后查找路由表.
无类别域间寻路
Classless Inter-Domain Routing, CIDR
采用可变长度的网络前缀 (network prefix) 来取代地址分类中网络号长度固定的做法, 具有相同前缀的 IP 地址组成 CIDR Block, 表示为 A.B.C.D/N, 其中 N 为前缀长度, 例如 202.38.208.0/20.
可以将有类别地址分配看作是网络前缀长度固定为 8, 16, 24 的 CIDR 分配.
具有相同前缀的连续的 IP 地址组成 CIDR Block, 对于 CIDR Block, 前缀越短, block 越大, 该 block 包含的地址数量越多
关键词: 前缀汇聚, 前缀最长匹配
路由
由于前缀长度不固定, CIDR 的路由操作比采用有类别地址分配更加复杂.
路由表结构: <网络前缀/前缀长度, 下一跳>
实际的 IP 地址分配不一定是严格层次的, 大的 CIDR Block 划分为小的 CIDR Block 时, 到某些小的 CIDR Block 网络可能具有不同路由.
在 CIDR 中, 如果路由器上的路由表中有多条表项满足要求, 则采用前缀最长匹配规则.
前缀汇聚 + 前缀最长匹配减少路由表表项
前缀汇聚: R0 告诉邻居路由器: 目的地址为 200.25.16.0/21 的分组发给我
前缀最长匹配: R0 上对于目的地址为 200.25.22.32 的 IP 分组分组, 匹配的路由表表项包括 200.25.16.0/21 和 200.25.22.0/24, 但使用最长匹配规则选择下一跳为直接相连的端口 eth1.

划分子网并不改变 Internet 的 IP 地址分配机制, 而 CIDR 是目前 Internet 采用的 IP 地址分配机制. 企业或者机构分配得到 CIDR 地址块以后, 可以根据实际需求对该 CIDR 地址块进行进一步的细分, 即将其划分成多个子网.
网络地址转换
Network Address Translation, NAT
根据作用范围的不同, 分两种 IP 地址
- 全局 IP 地址, 也称公共 IP 地址: 用于 Internet 上的分组转发, 要求在 Internet 范围内唯一
- 私有 IP 地址: 用于指定网络内的分组转发, 只要求在指定网内部唯一
NAT 实现网络内的多台主机共享一个或者少量全局的 IP 地址.
原理
最简单的 NAT: 只使用 IP 地址信息
NAT 设备上需维护一个全局 IP 地址池, 对于每个访问外部网络的内部主机, 都需要使用一个全局的 IP 地址

问题: 如果只使用 IP 地址信息, 在只有一个全局 IP 地址的情况下, 对于从 Internet 到内部网络上的分组, NAT 设备无法知道分组所对应的内部主机.
注意到: Internet 上的大部分应用都是基于 TCP 或者 UDP, 且大部分的应用会话可以用<源IP地址, 目的IP地址, 源端口号, 目的端口号, 协议>这样一个五元组来标识.
解决方法: 使用 TCP 或者 UDP 端口号来区分, 也就是说 NAT 的依据不再仅仅是 IP 地址, 还包括端口号 (IP 地址+端口).
NAT 的一种: NAPT
网络地址和端口转换 NAPT: Network Address and Port Translation
最常用的一种 NAT 方式, 同时使用 IP 地址和 TCP/UDP 端口号.
端口号标识了同一台主机上不同的应用, 例如 FTP 服务器进程一般运行在 21 号端口, web 服务进程一般运行在 80 号端口, TCP/UDP 根据端口号将数据投递给相应的应用进程.
NAPT 操作不仅仅要修改分组的 IP 头标, 还要修改 TCP/UDP 头标中的端口号.
在 NAT 设备上, 虽然内部网络所有的主机共享同一个全局 IP 地址, 但是它们所使用的端口号不同.
NAPT 下的数据访问流程:
出:

入:

NAT 的局限性
地址和端口转换将带来比较大的开销.
IP 地址和端口号可能存在于载荷的任何位置, 因此需要软件针对具体的应用做额外的处理. 例如, FTP 在 PORT 命令的 FTP 头标中包含有十进制表示的 IPv4 地址, 如果不处理则将导致连接问题.
并不是所有的数据都是使用 UDP 或者 TCP 来传输. PPTP (Point-to-Point Tunneling Protcol) 使用 GRE (Generic Routing Encapsulation) 封装数据, 使用 GRE 头标中 Call ID 域来标识一个数据流, 因此需要 NAT 设备对 GRE 头标中的 Call ID 进行转换处理; ping 使用 ICMP 协议, 只有 IP 地址没有端口号.
破坏了原有的主机到主机的通信模型.
IPv4 地址长度只有 32 比特, 不论是 CIDR, 还是 NAT, 都只能延缓 IPv4 地址空间的耗尽速度, 而不能从根本上解决 IPv4 地址不足的问题.
根本的解决方法就是增加 IP 地址的长度, 从而扩展地址空间, 也就是采用 IPv6.
IPv6 协议
IPv6 的优势
- 扩展地址空间: 地址长度长达 128 比特
- 层次化地址分配: 与 CIDR 类似, 通过前缀汇聚减少了路由表 (转发表) 表项
- 简化头标: 去掉了校验和, 分段等 IPv4 网络中的路由器操作, 提高路由器处理效率
- 增强自动配置: IPv6 地址甚至网络前缀自动配置
- 增加移动性支持: 移动性支持已成为协议的组成部分
- 更高的安全性: IPsec (实现认证, 加密传输以及这些操作所需的密钥管理) 成为协议的强制要求实现部分
基本头标格式

采用 16 进制冒号分割表示.
地址前缀表示: IPv6 地址/前缀长度
2001:DA8:D800::3/64
子网前缀: 2001:DB8:2A0:2F3B::/64
汇聚路由前缀 (地址范围): 2001:DB8:3F::/48
目前所有 IPv6 子网的前缀长度都是 64 比特, 因此 IPv6 地址表示时可以不用指出前缀长度.
连续的 0 可以省略, 例如:
2001:0000:0000:00A1:0000:0000:0000:1E2A
省略为 2001:0:0:A1::1E2A
IPv6 地址类型
- 单播地址, 分配给节点上的某个特定网络接口, 目的地为单播地址的分组被转发到该接口上
- 组播地址, 分配给一组网络接口, 这些网络接口一般位于不同的节点, 目的地为组播地址被转发到这组接口上
- 任播地址 Anycast, 分配给一组网络接口,这些网络接口一般位于不同的网络节点, 目的地为任播地址的分组被转发到该组接口中距离发送主机最近的节点 (依据路由协议度量的最近距离)
IPv6 中没有了广播的概念, 原来 IPv4 中的一些需要广播实现的功能通过 IPv6 组播/多播来实现.
这也太多了, 整理完都近万字了.