Python -- 网络模型 -- 网络层基础

数据报服务(即分组):

Python -- 网络模型 -- 网络层基础

网际协议 IP

网际协议 IP TCP/IP 体系中两个最主要的协议之一IP 协议配套使用的还有三个协议:

  1. 地址解析协议 ARP (Address Resolution Protocol)
  2. 网际控制报文协议 ICMP (Internet Control Message Protocol)
  3. 网际组管理协议 IGMP (Internet Group Management Protocol)

Python -- 网络模型 -- 网络层基础

ARP 在下面,因为 IP 经常使用这个协议,而 ICMP 和 IGMP 要使用 IP 协议。

将网络互相连接起来要使用一些中间设备(也叫中继系统):

  • 物理层中继系统:转发器 (repeater)。
  • 数据链路层中继系统:网桥 或 桥接器 (bridge)。网络扩大了,而这仍然是一个网络。
  • 网络层中继系统:路由器 (router)。
  • 网桥和路由器的混合物:桥路器 (brouter)。
  • 网络层以上的中继系统:网关 (gateway)。  由于比较复杂,目前使用得较少。
  • 网络互连都是指用路由器进行网络互连和路由选择。由于历史的原因,许多有关 TCP/IP 的文献将网络层使用的路由器称为网关。   

虚拟互连网络的意义:

  • 所谓虚拟互连网络也就是逻辑互连网络,它的意思就是互连起来的各种物理网络的异构性本来是客观存在的,但是我们利用 IP 协议就可以使这些性能各异的网络从用户看起来好像是一个统一的网络。
  • 使用 IP 协议的虚拟互连网络可简称为 IP 网。
  • 使用虚拟互连网络的好处是:当互联网上的主机进行通信就好像在一个网络上通信一样,而看不见互连的各具体的网络异构细节
  • 如果在这种覆盖全球 IP 的上层使用 TCP 协议,那么就是现在的互联网 (Internet)

IP 地址的编址方法:

  • 分类的 IP 地址。这是最基本的编址方法
  • 子网的划分。这是对最基本的编址方法的改进
  • 构成超网。这是比较新的无分类编址方法。1993 年提出后很快就得到推广应用。

分类的 IP 地址:

  • 我们把整个因特网看成为一个单一的、抽象的网络IP 地址就是给每个连接在互联网上的主机(或路由器)分配一个在全世界范围是唯一的 32 位的标识符。四个字节,由四组十进制数字表示,范围:0.0.0.0~255.255.255.255。
  • IP地址划分为若干个固定一类地址都由两个固定长度的字段组成,其中一个字段是网络号 net-id它标志主机(或路由器)所连接到的网络,而另一个字段则是主机号 host-id它标志该主机(或路由器)主机号在它前面的网络号所指明的网络范围内必须是唯一的由此可见 IP 地址在整个互联网范围内是唯一的。这种两级的 IP 地址可以记为:{ <网络号>, <主机号>}        

Python -- 网络模型 -- 网络层基础

常用的三种类别的 IP 地址:

Python -- 网络模型 -- 网络层基础

一般不使用的特殊的 IP 地址:

Python -- 网络模型 -- 网络层基础

IP 地址的一些重要特点:

  • IP 地址管理机构在分配 IP 地址时只分配网络号,而剩下的主机号则由得到该网络号的单位自行分配。这样就方便了 IP 地址的管理。
  • 路由器仅根据目的主机连接的网络号来转发分组而不考虑目的主机号,使路由表中的项目数大幅度减少,减小了存储空间。
  • 实际上 IP 地址是标志一个主机(或路由器)和一条链路的接口
  • 当一个主机同时连接到两个网络上时,该主机就必须同时具有两个相应的 IP 地址,其网络号必须是不同的。这种主机称为多归属主机
  • 由于一个路由器至少应当连接到两个网络,因此一个路由器至少应当有两个不同的 IP 地址。
  • 转发器或网桥连接起来的若干个局域网仍为一个网络,因此这些局域网都具有同样的网络号 net-id
  • 所有分配到网络号 net-id 的网络,无论是范围很小的局域网,还是可能覆盖很大地理范围的广域网,都是平等的

互联网中的 IP 地址:

Python -- 网络模型 -- 网络层基础

  • 在同一个局域网上的主机或路由器的 IP 地址中的网络号必须是一样的。
  • 路由器总是具有两个或两个以上的 IP 地址。路由器的每一个接口都有一个不同网络号的 IP 地址。
  • 两个路由器直接相连的接口处,可指明也可不指明 IP 地址。现在常不指明 IP 地址。

IP 地址与硬件地址:

  • 硬件地址(或物理地址数据链路层和物理层使用的地址
  • IP 地址是网络层和以上各层使用的地址,是一种逻辑地址 IP 地址是逻辑地址是因为 IP 地址是用软件实现的)。
  • 路由器只根据目的站的 IP 地址的网络号进行路由选择。
  • 具体的物理网络的链路层,只能看见 MAC 帧而看不见 IP 数据报。

Python -- 网络模型 -- 网络层基础

地址解析协议 ARP:

  • ARP 作用:网络层使用 IP 地址,解析出在数据链路层使用的硬件地址
  • 不管网络层使用的是什么协议,在实际网络的链路上传送数据帧时,最终还是必须使用硬件地址。
  • 每一个主机都设有一个 ARP 高速缓存 (ARP cache),里面有所在的局域网上的各主机和路由器的 IP 地址到硬件地址的映射表
  • 主机 A 欲向本局域网上的某个主机 B 发送 IP 数据报时,就先在其 ARP 高速缓存中查看有无主机 B IP 地址有,就可查出其对应的硬件地址,再将此硬件地址写入 MAC 帧,然后通过局域网将该 MAC 帧发往此硬件地址如没有, ARP 进程在本局域网上广播发送 ARP 请求分组收到 ARP 响应分组将得到的 IP 地址到硬件地址的映射写入 ARP 高速缓存。当主机 B 收到 A ARP 请求分组时,就将主机 A 的这一地址映射写入主机 B 自己的 ARP 高速缓存中。这对主机 B 以后向 A 发送数据报时就更方便了。
  • ARP 分组封装在物理网络的帧中传输,包括:包含发送方硬件地址 / 发送方 IP 地址 / 目标方硬件地址(未知时填 0) / 目标方 IP 地址。
  • ARP 高速缓存的作用:存放最近获得IP 地址到 MAC 地址的绑定,以减少 ARP 广播数量。
  • ARP 是解决同一个局域网上的主机或路由器的 IP 地址和硬件地址的映射问题。如果所要找的主机和源主机不在同一个局域网上,那么就要通过 ARP 找到一个位于本局域网上的某个路由器的硬件地址,然后把分组发送给这个路由器,让这个路由器把分组转发给下一个网络。剩下的工作就由下一个网络来做。
  • IP 地址到硬件地址的解析是自动进行的,主机的用户对这种地址解析过程是不知道的。只要主机或路由器要和本网络上的另一个已知 IP 地址的主机或路由器进行通信,ARP 协议就会自动地将该 IP 地址解析为链路层所需要的硬件地址。 

IP 数据报的格式:

Python -- 网络模型 -- 网络层基础

 

Python -- 网络模型 -- 网络层基础

IP 层转发分组的流程:

  • 一个 IP 数据报由首部数据两部分组成。首部的前一部分是固定长度,共 20 字节,是所有 IP 数据报必须具有的。在首部的固定部分的后面是一些可选字段,其长度是可变的。
  • 版本——4 位,指 IP 协议的版本。目前的 IP 协议版本号为 4 (IPv4)
  • 首部长度——4 位,可表示的最大数值是 15 个单位(一个单位为 4 字节)因此 IP 的首部长度的最大值是 60 字节。
  • 区分服务——8 位,在一般的情况下都不使用这个字段 。
  • 总长度——16 位,指首部和数据之和的长度,因此数据报的最大长度为 65535 字节。总长度必须不超过最大传送单元 MTU
  • 标识(identification) ——16 位,它是一个计数器,用来产生 IP 数据报的标识。
  • 标志(flag) ——3 位,目前只有前两位有意义。标志字段的最低位是 MF (More Fragment)MF = 1 表示后面“还有分片”。MF = 0 表示最后一个分片。标志字段中间的一位是 DF (Don't Fragment) 只有当 DF = 0 时才允许分片。
  • 偏移—— 13 位,指出:较长的分组在分片后某片在原分组中的相对位置。片偏移以 8 个字节为偏移单位。
  • 生存时——8 位,记TTL (Time To Live),指示数据报在网络中可通过的路由器数的最大值。
  • 协议——8 位,指出此数据报携带的数据使用何种协议,以便目的主机的 IP 层将数据部分上交给那个处理过程
  • 首部检验——16 位,只检验数据报的首部不检验数据部分。这里不采用 CRC 检验码而采用简单的计算方法。
  • 源地址和目的地址都各占 4 字节
  • 选项字段的长度可变,1 个字节到 40 个字节不等,取决于所选择的项目。
  • 增加首部的可变部分是为了增加 IP 数据报的功能,但这同时也使得 IP 数据报的首部长度成为可变的。这就增加了每一个路由器处理数据报的开销。实际上这些选项很少被使用

IP 层转发分组的流程

  •  在路由表中,对每一条路由,最主要的是(目的网络地址,下一跳地址) 。
  • 根据目的网络地址就能确定下一跳路由器,这样做的结果是:IP 数据报最终一定可以找到目的主机所在目的网络上的路由器只有到达最后一个路由器时,才试图向目的主机进行直接交付。
  • 虽然互联网所有的分组转发都是基于目的主机所在的网络,但在大多数情况下都允许有这样的特例,特定的目的主机指明一个路由
  • 路由器还可采用默认路由减少路由表所占用的空间和搜索路由表所用的时间 。
  • IP 数据报的首部中没有地方可以用来指明“下一跳路由器的 IP 地址”。当路由器收到待转发的数据报,不是将下一跳路由器的 IP 地址填入 IP 数据报,而是送交下层的网络接口软件。网络接口软件使用 ARP 负责将下一跳路由器的 IP 地址转换成硬件地址,并将此硬件地址放在链路层的 MAC 帧的首部,然后根据这个硬件地址找到下一跳路由器。 
  • 路由表没有给分组指明到某个网络的完整路径路由表指出,到某个网络应当先到某个路由器(即下一跳路由器到达下一跳路由器后,再继续查找其路由表,知道再下一步应当到哪一个路由器这样一步一步地查找下去,直到最后到达目的网络。

     

划分子网和构造超网

  • 1985 年起在 IP 地址中又增加了一个“子网号字段”,使两级的 IP 地址变成为三级的 IP 地址。这种做法叫作划分子网 (subnetting) 划分子网已成为互联网的正式标准协议。
  • 划分子网纯属一个单位内部的事情。单位对外仍然表现为没有划分子网的网络。从主机号借用若干个位作为子网号 subnet-id,而主机号 host-id 也就相应减少了若干个位。
  • 凡是从其他网络发送给本单位某个主机的 IP 数据报,仍然是根据 IP 数据报的目的网络号 net-id,先找到连接在本单位网络上的路由器。然后此路由器在收到 IP 数据报后,再按目的网络号 net-id 子网号 subnet-id 找到目的子网。最后就将 IP 数据报直接交付目的主机。
  • 当没有划分子网时,IP 地址是两级结构。划分子网后 IP 地址就变成了三级结构。划分子网只是把 IP 地址的主机号 host-id 这部分进行再划分,而不改变 IP 地址原来的网络号 net-id

Python -- 网络模型 -- 网络层基础

一个未划分子网的 B 类网络145.13.0.0:

Python -- 网络模型 -- 网络层基础

划分为三个子网后对外仍是一个网络

Python -- 网络模型 -- 网络层基础

子网掩码:

  • 从一个 IP 数据报的首部并无法判断源主机或目的主机所连接的网络是否进行了子网划分。使用子网掩码(subnet mask)可以找出 IP 地址中的子网部分。 
  • 规则:子网掩码长度=32某位=1IP地址中的对应位为网络号和子网号某位=0IP地址中的对应位为主机号
  • 子网掩码是一个网络或一个子网的重要属性。路由器在和相邻路由器交换路由信息时,必须把自己所在网络(或子网)的子网掩码告诉相邻路由器。路由器的路由表中的每一个项目,除了要给出目的网络地址外,还必须同时给出该网络的子网掩码若一个路由器连接在两个子网上就拥有两个网络地址和两个子网掩码。
  • 固定长度子网变长子网两种子网划分方法。采用固定长度子网时,所划分的所有子网的子网掩码都是相同划分子网增加了灵活性,但却减少了能够连接在网络上的主机总数。
  • 在不划分子网的两级 IP 地址下,从 IP 地址得出网络地址是个很简单的事。但在划分子网的情况下,从 IP 地址却不能唯一地得出网络地址来,这是因为网络地址取决于那个网络所采用的子网掩码,但数据报的首部并没有提供子网掩码的信息。因此分组转发的算法也必须做相应的改动。

Python -- 网络模型 -- 网络层基础

无分类编址 CIDR:

  • 划分子网在一定程度上缓解了互联网在发展中遇到的困难。然而在 1992 年互联网仍然面临三个必须尽早解决的问题:(1) B 类地址在 1992 年已分配了近一半,眼看就要在 1994 3 月全部分配完毕!(2) 互联网主干网上的路由表中的项目数急剧增长(从几千个增长到几万个)。(3) 整个 IPv4 的地址空间最终将全部耗尽。
  • 1987 年,RFC 1009 就指明了在一个划分子网的网络中可同时使用几个不同的子网掩码使用变长子网掩码 VLSM (Variable Length Subnet Mask)可进一步提高 IP 地址资源的利用率。
  • VLSM 的基础上又进一步研究出无分类编址方法,它的正式名字是无分类域间路由选择 CIDR (Classless Inter-Domain Routing)。 
  • CIDR 消除了传统的 A 类、B 类和 C 类地址以及划分子网的概念,因而可以更加有效地分配 IPv4 的地址空间。
  • CIDR使用各种长度的“网络前缀(network-prefix)来代替分类地址中的网络号和子网号。IP 地址从三级编址(使用子网掩码)又回到了两级编址。 
  • CIDR 使用斜线记法(slash notation),它又称为 CIDR ,即在 IP 地址后面加上一个斜线“/”,然后写上网络前缀所占的位数(这个数值对应于三级编址中子网掩码中 1 的个数)例如: 220.78.168.0/24
  • CIDR 把网络前缀都相同的连续的 IP 地址组成“CIDR 地址块”。
  • 28.14.32.0/20 表示的地址块共有 212 个地址(因为斜线后面的 20 是网络前缀的位数,所以这个地址的主机号是 12 位)。
  • 这个地址块的起始地址是 128.14.32.0在不需要指出地址块的起始地址时,也可将这样的地址块简称为“/20 地址块”。128.14.32.0/20 地址块的最小地址:128.14.32.0128.14.32.0/20 地址块的最大地址:128.14.47.2550 和全 1 的主机号地址一般不使用。
  • 一个 CIDR 地址块可以表示很多地址,这种地址的聚合常称为路由聚合,它使得路由表中的一个项目可以表示很多个(例如上千个)原来传统分类地址的路由路由聚合有利于减少路由器之间的路由选择信息的交换,从而提高了整个互联网的性能。
  • 路由聚合也称为构成超(supernetting)
  • CIDR 虽然不使用子网了,但仍然使用“掩码”这一名词(但不叫子网掩码)。
  • 对于 /20  地址块,它的掩码是 20 个连续的 1。 斜线记法中的数字就是掩码中1的个数。    前缀长度不超过 23 位的 CIDR 地址块都包含了多个 C  地址。这些 C 类地址合起来就构成了超网。
  • CIDR 地址块中的地址数一定是 2 的整数次幂。
  • 网络前缀越短,其地址块所包含的地址数就越多。而在三级结构的IP地址中,划分子网是使网络前缀变长
  • CIDR 一个好处是可以更加有效地分配 IPv4 地址空间,可根据客户的需要分配适当大小 CIDR 地址块。 
  • 使用 CIDR 时,路由表中的每个项目由“网络前缀”和“下一跳地址”组成。在查找路由表时可能会得到不止一个匹配结果。 应当从匹配结果中选择具有最长网络前缀的路由:最长前缀匹配 (longest-prefix matching)网络前缀越长,其地址块就越小,因而路由就越具体 (more specific) 最长前缀匹配又称为最长匹配最佳匹配。

Python -- 网络模型 -- 网络层基础