本章学习 IP(Internet Protocol,网际协议)。IP 作为整个 TCP/IP 中至关重要的协议,主要负责将数据包发送给最终的目标计算机。因此,IP 能够让世界上任何两台计算机之间进行通信。本章旨在详细介绍 IP 协议的主要功能及其规范。
4.1 IP 即 网际协议
4.1.1 IP 是网络层的协议
- IP(IPv4、IPv6)是 TCP/IP 互联网层(网络层)的一种协议,对应于 OSI 参考模型的第三层,即网络层
- 网络层的主要作用:实现终端节点之间的通信,即点对点通信 (节点是主机和路由器的统称)
- 数据链路层的主要作用是在互连同一种数据链路的节点之间进行包传递,而借助网络层,则可以实现在不同的数据链路上端节点之间的数据包传输
- IP 的主要作用就是在复杂的网络环境中将数据包发送给最终的目标地址
4.1.2 网络层与数据链路层的关系
功能 | |
---|---|
数据链路层 | 提供两个直连的设备之间的通信功能(同一数据链路) |
网络层 | 在没有直连的两个网络之间进行通信传输(不同数据链路) |
计算机网络需要数据链路层和网络层的分层才能实现最终目标地址的通信
4.2 IP 基础知识
4.2.1 IP 地址属于网络层地址
- 数据链路层的 MAC 地址是用于标识同一链路中不同计算机的一种识别码(识别通信对端)
- 网络层中的 IP 地址用于在连接到网络中的所有主机中识别出进行通信的目标地址。
- 连接到互联网的所有主机和路由器都需要配置自己的 IP 地址。而物理层或数据链路层的数据包转发设备(eg. 网桥、交换集线器等)不需要设置 IP 地址
4.2.2 路由控制 Routing
- 定义:路由控制是指将分组数据发送到最终目标地址的功能
- IP 路由也称多跳路由,指:路由器或主机在转发 IP 数据包时只指定下一个路由器或主机,而不是将到最终目标地址为止的所有通路全部指定出来
- 一跳(Hop)是指利用数据链路层及其以下分层的功能传输数据帧的一个区间。一跳的这个区间内,电缆可以通过网桥或交换集线器相连,但不会通过路由器或网关相连。一跳时从源 MAC 地址到目标 MAC 地址传输帧的区间
- 路由控制表:所有主机和路由器都维护着一张路由控制表,记录 IP 数据在下一步应该转发给哪个路由器或主机
4.2.3 数据链路的抽象化
- IP 是实现多个数据链路之间通信的协议,因此对不同数据链路的相异特性进行抽象化是 IP 的重要作用之一
- 数据链路的地址可以被抽象化为 IP 地址,因此对 IP 的上层来说,不论底层数据链路使用以太网 or 无线 LAN or PPP,都被一视同仁
- 不同数据链路的最大区别是:最大传输单位 MTU
- 以太网是 1500 字节,FDDI 是 4352 字节,ATM 是 9180 字节
- 解决办法:IP 进行分片处理,即将较大的 IP 包分成多个较小的 IP 包,到了对端地址后再被组合起来传给上一次。IP 以这种方式抽象化了数据链路层,使上层无需关注底层数据链路的 MTU
4.2.4 IP 属于面向无连接型
- IP 面向无连接,即在发包之前,无需建立与对端目标地址之间的连接
- 面向无连接的缺点:可能会有很多冗余通信 :因为即使对端主机关机或不存在,数据包仍被发送;且主机若未做好准备可能会漏接包
- IP 采用面向无连接的原因:
- 简化
- 提速
- IP 提供尽力而为的服务,为了将数据包发送到最终目标地址尽最大努力,但不验证最终是否收到,因此为了提高可靠性,上一层(传输层)的 TCP 采用面向有连接型,保证对端主机收到数据
4.3 IP 地址的基础知识
4.3.1 IP 地址的定义
IPv4 地址由 32 位二进制数(0、1)表示,一般将 32 位数分为 4 组,每组 8 位,转化为十进制数,每组之间以“.”隔开 | 二进制 | 10101100 00010100 00000001 00000001 | | —- | —- | | 十进制 | 172.20.1.1 |
IP 地址不是根据主机台数配置,而是每块网卡都需要配置 IP 地址,而且一块网卡可以配置多个 IP 地址。此外,IP 地址有分为网络标识和主机标识,因此 32 位 IP 地址能连接的主机数实际上少于
亿台,还不到地球上的人口总数,因此是不够用的(可以根据一种可更换 IP 地址的技术 NAT,使连接计算技术超过43 亿)
4.3.2 IP 地址由网络和主机两部分标识组成
IP 地址由“网络标识/网络地址”和“主机标识/主机地址”两部分组成,如下表所示,“/24”表示 IP 地址的前 24 位属于网络地址
IP地址 | 网络地址/网络标识 | 主机地址/主机标识 |
---|---|---|
192.168.128.10/24 | 192.168.128 | 10 |
IP 地址具有唯一性
- 网络标识:在数据链路的每个段不相同
- IP 包被转发到途中某个路由器时,正是利用网络标识进行路由,判断是否属于该网段内的主机
- 主机标识:在同一个网段内不重复出现
4.3.4 广播地址
将 IP 地址的主机地址设置为全“1”,就成了广播地址,用于在同一个链路中相互连接的主机之间发送数据
- 本地广播:本网络内的广播。eg. 网络地址 192.168.0.0/24 的广播地址为 192.168.0.255,这个广播地址会被路由器屏蔽,不会传到 192.168.0.0/24 以外的其他链路
- 直接广播:不同网络之间的广播。eg. 网络地址 192.168.0.0/24 的主机向 192.168.1.255/24 的目标地址发送 IP 包,路由器收到这个包,将数据转给 192.168.1.0/24,在该网段进行广播,使得 192.168.1.1 ~ 192.168.1.254 的主机都能收到这个包
4.3.5 IP 多播
- 定义:多播用于将包发送给特定组内的所有主机。
- 优点
- 同时给多台主机发送数据,提高发送效率
- 多播既可以穿透路由(广播无法穿透路由),又可以实现只给必要的组发送数据包
- 多播使用 D 类地址,即 IP 地址的首 4 位为“1110”,剩下的 28 位为多播的组编号,多播地址的可用范围为“224.0.0.0”到“239.255.255.255”。其中“224.0.0.0”到“224.0.0.255”的范围不需要路由控制,在同一个链路内也能实现多播,其他多播地址则会给全网所有组内成员发丝多播的包
- 部分既定已知的多播地址 | 地址 | 内容 | | —- | —- | | 224.0.0.1 | 子网内所有的主机(路由器以外的主机和终端主机)必须属于 224.0.0.1 的组 | | 224.0.0.2 | 子网内所有的路由器必须属于 224.0.0.2 的组 |
4.3.6 子网掩码
- 4.2.3 IP 地址的分类 一节将 IP 地址分为 A, B, C, D 四类,但是 A, B 类一个链路内允许连接的主机数分别为 16777214,65534 个,实际上一般一个链路不会连接那么多台主机,因此有些浪费,使得网络地址不够用
- 引入“子网”, IP 地址就包含两种识别码:
- IP 地址本身:32 位二进制
- 子网掩码:32 位二进制,其对应的 IP 地址网络标识部分的位全为“1”,主机标识部分全为“0”,因而可以定位网络标识的长度
- eg. 子网掩码“255.255.255.192”的后缀表示法为“/26”,代表 IP 地址的前 26 位为网络地址
4.3.7 CIDR 与 VLSM
CIDR 和 VLSM、NAT 技术 是相对缓解全局 IP 地址不够用的机制,但无法改变 IP 地址绝对数本身有限的事实(需使用IPv4->IPv6等机制)
- CIDR 无类型域间选路
- 上面提到 4.2.3 IP 地址的分类 一节将 IP 地址分为 A, B, C, D 四类,导致地址不够用,因此开始放弃 IP 地址的分类,采用任意长度分割 IP 地址的网络标识和主机标识
- 根据 CIDR,连续多个 C 类地址就可以划分到一个较大的网络内,因此更有效地利用了当前的 IPv4 地址,同时通过路由集中降低了路由器的负担
- 例子:
- VLSM 可变长子网掩码
- 一种可以随即修改组织内各个部门的子网掩码长度的机制,使得域内的子网的掩码长度不必再相同,例如:有些部门有 500 台主机,子网掩码长度为 /23,有些部门有 50 台主机,子网掩码长度为 /26
- 理论上将 IP 地址的利用率提高至 50%
4.3.8 全局地址与私有地址
- 全局地址:整个互联网范围内保持一致
- 私有地址:同一个域内保持唯一即可
NAT 技术:互换私有 IP 与全局 IP地址,使得配有私有地址的主机与配有全局地址的主机能够通信
- 私有 IP 地址结合 NAT 技术是解决 IP 地址分配问题(不够用)的主流方案
- 实例:在公司/学校的每个终端设置私有 IP 地址,在路由器设置全局 IP 地址,若要进行互联网通信,则借助 NAT 技术
4.4 路由控制
路由控制表:
- 两种形成方式:
- 静态路由控制:管理员手动设置
- 动态路由控制:路由器与其他路由器相互交换信息使自动刷新
- 由“路由协议”制作,而不是 IP 协议,IP 协议本身没有定义制作路由控制表的协议,并始终认为路由表是正确的
4.4.1 IP 地址与路由控制
- IP 地址的网络地址部分用于进行路由控制
- 路由控制表中记录着网络地址与下一步应该转发至路由器的地址
- 根据最长匹配原则,将 IP 包首部的目标地址与路由控制表中的地址进行匹配,转发给相应的下一个路由器
- 默认路由:路由表中任一地址都能与其匹配,一般标记为“0.0.0.0/0”或“default”。如果目标网络地址与路由表中的所有记录(除去默认路由)都不匹配,则包被转发到默认路由
- 主机路由:“IP地址/32”的形式,即使用 IP 地址的所有位进行路由匹配,但是使用主机路由会导致路由表膨大,路由负荷增加,造成网络性能下降
- 环回地址:在同一台计算机上的程序之间进行网络通信时所使用的一个默认地址,为“127.0.0.1”,或主机名“localhost”
4.4.2 路由控制表的聚合
- 路由表的聚合也称路由汇总,利用网络地址的比特分别,对其进行有效的分层配置,使得即使对内有多个子网掩码,对外呈现的也是同一个网络地址。
- 优点:
- 可以有效削减路由表的大小
- 路由聚合可以将已知的路由信息传送给周围其它的路由器,以达到控制路由信息的目的
4.5 IP 分割处理与再构成处理
4.5.1 数据链路不同,MTU 则相异
不同类型的数据链路使用目的不同,其可承载的最大传输单元(MTU)也不同,而 IP 处于数据链路的上一层,必须不受限于不同数据链路的 MTU 大小,因此 IP 抽象化了底层的数据链路
4.5.2 IP 报文的分片与重组
- 在网络传输过程中,当报文大于数据链路的 MTU 时,就要进行分片,分片不仅发生在源端主机,中间的路由器也需要进行分片处理
- 但 IP 数据包的重组只能发生在目标主机,路由器不会进行重组(即路由器可能进行分片,不进行重组,以避免给路由器带来多余的负担,不至于降低网络传输效率)
4.5.3 路径 MTU 发现
分片机制的缺点:
- 导致路由器的处理负荷加重
- 分片处理中,一旦某个分片丢失,则会造成整个 IP 数据包作废
解决办法:“路径 MTU 发现”技术
- 路径 MTU:从发送端主机到接收端主机之间不需要分片时最大 MTU 的大小,即路径中所有数据链路的最小 MTU
- 路径 MTU 发现:发送主机直接按照路径 MTU 的大小将数据报分片后进行发送,这样中途的路由器就无需再进行分片操作
4.6 IPv6
4.6.1 IPv6 的必要性
IPv6 是为了根本解决 IPv4 地址耗尽的问题而被标准化的网际协议
- IPv4 地址长度为:32位二进制(一般写成 4 个 8 位字节)
- IPv6 地址长度为:128位二进制(一般写成 8 个 16 位字节)
- IPv6 的地址空间是 IPv4 的
倍
4.6.2 IPv6 的特点
- IP 地址的扩大与路由控制表的聚合,尽可能避免路由表膨大
- 性能提升
- 包首部采用固定的值(40字节),不再采用首部检验码。简化首部结构,减轻路由器负荷。路由器不再做分片处理,而是通过路径 MTU 发现技术,只由发送端主机进行分片处理
- 支持即插即用功能:即使没有 DHCP 服务器也可以实现自动分配 IP 地址
- 采用认证与加密功能
- 多播、Mobile IP 成为扩展功能(这两个功能在 IPv4 中难于使用)
4.6.3 IPv6 中 IP 地址的标记方法
IPv6 地址的长度为 128 位二进制数,一般以每 16 个比特为 1 组,共分为 8 组,每组记为 4 个16 进制数,每组之间用“:”隔开。用十六进制表示后,若出现连续的0,还可以用“::”代替连续的0,但一个 IP 地址只能出现一次“::”。
二进制数 | 1111111011011100:0000000000000000:0000000000000000:0000000000000000:0000000000000100:0000100000000000:0010000000001100:0100000101111010 |
---|---|
十六进制数 | FEDC:0:0:0:4:800:200C:417A |
省略连0 | FEDC::4:800:200C:417A |
4.6.4 IPv6 地址的结构
IPv6 地址种类 | 含义 | IPv6 地址前缀 | IPv6 地址简写 |
---|---|---|---|
未定义 | 0000 … 0000 (128比特) | ::/128 | |
环回地址 | 0000 … 0001 (128比特) | ::1/128 | |
唯一本地地址 | 限制性型络(不与互联网直接接入的私有网络)使用 | 1111 110 | FC00::/7 |
链路本地单播地址 | 不使用路由器 or 在同一个以太网网段内通信时使用 | 1111 1110 10 | FE80::/10 |
多播地址 | 1111 1111 | FF00::/8 | |
全局单播地址 | 用于互联网通信,全互联网唯一 | 其它 |
4.6.5 全局单播地址
- 全局单播地址是全球唯一的地址,是互联网通信以及各个域内部通信最常用的一种 IPv6 地址
- 通常接口 ID 中保存 64 比特版的 MAC 地址信息,但由于 MAC 地址是设备固有信息,有时候不希望对端知晓,则生成随机的临时地址,并定期更新
4.6.6 链路本地单播地址
- 链路本地单播地址是指在同一个数据链路内唯一的地址,用于不经过路由器、在同一个链路内的通信
4.6.7 唯一本地地址
- 唯一本地地址是不进行互联网通信时所使用的地址。例如,企业内部网络,与互联网隔离,若要进行互联网通信则须通过 NAT 或网关代理
- 全局 ID 不一定是全球唯一的,但完全一致的可能性也很低
4.6.8 IPv6 分段处理
- IPv6 的分片处理只在作为起点的发送端主机上进行,路由器不参与分片
- 优点:减少路由器的负荷,提高网速
- 使用的技术:路径 MTU 发现
- IPv6 中最小 MTU 为 1280字节,因此对于 CPU 处理能力或内存等受限的设备,不需要“路径 MTU 发现”,直接在发送端主机分片成 1280 字节发出
4.7 IPv4 首部
- 通过 IP 进行通信时,需要在数据前加上 IP 首部信息,包含着用于 IP 协议进行发包控制时所有的必要信息
标志:3 bits,表示包被分片的相关信息 | 比特 | 含义 | | —- | —- | | 0 | 未使用。现在必须是0 | | 1 | 指示是否进行分片:0 - 可以分片;1 - 不能分片 | | 2 | 包被分片的情况下,表示是否为最后一个包:0 - 最后一个分片的包;1 - 分片中段的包 |
片偏移:13 bits,标识被分片的每一个分段相对于原始数据的位置
- 第一个分片对应的片偏移为 0
- 片偏移占 13 位,因此最多可以表示
个相对位置,每个相对位置占 8 字节(32bits),因此最大可以表示原始数据
字节的位置
4.8 IPv6 首部格式
- IPv6 中为了减轻路由器的负担,省略了首部校验和字段,因此路由器不在需要计算校验和,提高了包的转发效率(上层的 TCP 和 UDP 在做检验和计算的时候使用伪首部,可以验证 IP 地址或协议是否正确,因此即使在 IP 层无法提供可靠传输,在 TCP 或 UDP 层也可以提供可靠传输的服务)
- IPv6 扩展首部
- IPv6 首部没有标识以及标志字段,在需要对 IP 数据包进行分片时,可以使用扩展首部