网络层概述
网络层的主要任务是实现网络互连,进而实现数据包在各网络之间的传输。
要实现网络层主要任务,需要解决以下主要问题:
- 网络层向运输层提供怎样的服务(“可靠传输”还是“不可靠传输‘)
- 网络层寻址问题
- 路由选择问题
因特网(Internet)是目前全世界用户数量最多的互联网,它使用TCP/IP协议栈。
由于TCP/IP协议栈的网络层使用网际协议IP,它是整个协议栈的核心协议,因此在TCP/IP协议栈中网络层常称为网际层。
综上所述,我们通过学习TCP/IP协议栈的网际层来学习网络层的理论知识和实践技术。
网络层提供的两种服务
面向连接的虚电路服务
- 可靠通信由网络自身来保证
- 当两台计算机进行通信时,必须建立网络层的连接——虚电路VC(Virtual Circuit)
- 通信双方沿着已建立的虚电路发送分组
- 目的主机的地址仅在连接建立阶段使用,之后每个分组的首部只需携带一条虚电路的编号(构成虚电路的每一段链路都有一个虚电路编号)
- 这种通信结束后,需要释放之前所建立的虚电路。
- 很多广域分组交换网都使用面向连接的虚电路服务。例如,曾经的X.25和主键过时的帧中继FR、异步传输模式ATM等。
无连接的数据报服务
- 可靠通信应当由用户主机来保证
- 不需要建立网络层连接
- 每个分组可走不同的路径
- 每个分组的首部必须携带目的主机的完整地址
- 这种通信方式所传送的分组可能误码、丢失、重复和失序。
- 由于网络本身不提供端到端的可靠传输服务。这就使网络中的路由可以做的比较简单,而且加个低廉(与电信的交换机相比较)。
- 因特网采用了这种设计思想,也就是将复杂的网络处理功能置于因特网的边缘(用户主机和其内部的运输层),而将相对简单的尽最大努力和分组交付功能置于因特网的核心。
采用这种思想的好处:网络的造价大大降低、运行方式灵活、能够适应多种应用
由于TCP/IP体系结构的因特网的网际层提供的是简单灵活、无连接的、尽最大努力交付的数据服务,因此本博客主要围绕网际层如何传送IP数据报这个主题进行讨论。
IPv4地址
IPv4地址概述
概述
- IPv4地址就是给因特网上的每一台主机(或路由器)的每一个接口分配一个在全世界范围内是唯一的32比特的标识符。
- IP地址由因特网名字和数字分配机构ICANN进行分配。 我国用户可向亚太网络信息中心APNIC申请IP地址,需要缴费。 2011年2月3日,互联网号码分配管理局IANA(由ICANN行使职能)宣布,IPv4地址已经 分配完毕。 我国在2014年至2015年已逐步停止了向新用户和应用分配IPv4地址。同时全面开展商 用部署IPv6。
- IPV4地址的编址方法经历了如下三个历史阶段:
表示方法
32比特的IPv4地址不方便阅读、记录以及输入等,因此IPV4地址采用点分十进制表示方法以方便用户使用
分类编址的IPv4
A类地址
8位网络号第一个固定为0
可指派的网络数量为-2=126 (减2的原因是除去最小网络号0和最大网络号127)
每个网络中可分配的IP地址数量为-2=16777214(减2的原因是除去主机号全0的网络地址和全1的广播地址)
B类地址
16位网络号前两位固定为10
可指派的网络数量为=16384
每个网络中可分配的IP地址数量为-2=65534(减2的原因是除去主机号为全0的网络地址和全1的广播地址)
C类地址
24位网络号前三位固定为110
可指派的网络数量为=2097152
每个网络中可分配的IP地址数量为-2=254(减2的原因是除去主机号为全0的网络地址和全1的广播地址)
练习
划分子网的IPv4地址
首先我们先来说明以下为什么要将IPv4地址划分子网。
如图:某单位有一个大型的局域网需要连接到因特网。申请了一个B类的网络地址,因此分配IP地址的数量达到了65534个,给每台计算机和路由器的接口分配一个IP地址后,还有大量IP地址剩余,这些剩余的IP地址只能由该单位的同一个网络使用,而其他单位的网络不能使用。
随着发展需要将原来三个网络划分成三个独立的网络,需要将原来的网络划分成三个独立的网络假设子网1仍然使用原先申请到的B类网络地址,那么就需要为子网2和子网3个字申请一个网络地址。
为新增网络申请新的网络号会带来以下弊端:
- 需要等待时间和花费更多的费用
- 会增加其他路由器中路由表记录的数量
- 浪费原有网络中剩余的大量IP地址
为避免这种情况出现,可以从主机号部分借用一部分作为子网号,如图
子网掩码
32比特的子网掩码可以表明分类IP地址的主机号部分被借用了几个比特作为子网号
- 子网掩码使用连续的比特1来对应网络号和子网号
- 子网掩码使用连续的比特0来对应主机号
- 将划分子网的IPv4地址与其相应的子网掩码进行逻辑与运算就可以得到IPv4地址所在子网的网络地址
划分子网的细节
【举例】已知某个网络的地址是 218.75.230.0,使用子网掩码255.255.255.128对其进行子网划分,请给出划分细节。
【解析】
由网络号可知是C类网络地址
子网掩码
所以划分出的子网数量=2
每个子网可分配的地址数量-2=126(减2是要去掉主机号为“全0”的网络地址和“全1”的广播地址)
练习
【习题】已知某个网络的地址为218.75.230.0,使用子网掩码255.255.255.192对其进行子网划分,请给出划分细节。
【2019年 题39】某主机的IP地址为180.80.77.55,子网掩码为255.255.252.0,如该主机向其所在子网发送广播分组,则目的地址可以是
默认子网掩码
默认的子网掩码是指在未划分子网的情况下使用的子网掩码。
无分类编址的IPv4地址
-
划分子网在一定程度上缓解了因特网在发展中遇到的困难,但是数量巨大的C类网因为其地址空间太小并没有得到充分使用,而因特网的IP地址仍在加速消耗,整个IPv4地址空间面临全部耗尽的威胁。
-
为此,因特网工程任务组IETF又提出了采用无分类编址的方法来解决IP地址紧张的问题,同时还专门成立IPv6工作组负责研究新版本IP以彻底解决IP地址耗尽问题。
-
1993年,IETF发布了无分类域间路由选择CIDR的RFC文档
-
CIDR消除了传统的A类、B类和C类地址,以及划分子网的概念;
-
CIDR可以更加有效地分配IPv4的地址空间,并且可以在新的IPv6使用之前允许因特网的规模继续增长。
CIDR
- CIDR使用“斜线记法”,或称CIDR记法。即在IPv4地址后面加上斜线“/”,在斜线后面写上网络前缀所占的比特数量。
【举例】
- CIDR实际上是将网络前缀都相同的连续的IP地址组成一个“CIDR地址块”。
- 我们只要知道CIDR地址块中的任何一个地址,就可以知道该地址块的全部细节:
- 地址块的最小地址
- 地址块的最大地址
- 地址块中的地址数量
- 地址块聚合某类网络(A类、B类和C类)的数量
- 地址掩码(也可继续称为子网掩码)
举例
【例1】请给出CIDR地址块128.14.35.7/20的全部细节(最小地址,最大地址,地址数量,聚合C类网数量,地址掩码)。
【解析】
【练习】请给出CIDR地址块206.0.64.8/18的全部细节(最小地址,最大地址,地址数量,聚合
C类网数量,地址掩码)。
【解析】
路由聚合(构造超网)
- 网络前缀越长,地址块越小,路由越具体
- 若路由器查表转发分组时发现有多条路由可选,则选择网络前缀最长的那条,这称为最长前缀匹配,因为这样的路由更具体。
练习
IP地址的应用规划
定长的子网掩码FLSM
- 使用同一个子网掩码来划分子网
- 子网划分方式不灵活:只能划分出个子网,其中n是从主机号部分借用的用来作为子网号的比特数量
- 每个子网所分配的IP地址数量相同,造成IP地址浪费
举例说明一下定长的子网掩码FLSM
我们先分析一下应用需求
应用需求:将C类网络218.75.230.0划分成5个子网,每个子网上可分配的IP地址不少于各自的需求
由于划分成5个子网,因此可以从主机号借用3个比特作为子网号
子网数量:=8
每个子网上的地址数量:=32
我们看一下划分子网的细节
通过本例可以看出,采用定长的子网掩码进行子网划分,只能划分出个子网,其中n是从主机号部分借用的用来作为子网号的比特数量。每个子网所分配的IP数量相同,例如图中的网络5只需要4个IP地址 ,但是我们给它分配了32个IP地址,这样就造成了IP地址的严重浪费。
变长的子网掩码VLSM
- 使用不同的子网掩码来划分子网
- 子网划分方式灵活:可以按需分配
- 每个子网所分配的IP地址数量可以不同,尽可能减少对IP地址的浪费
示例:同样用上面的例子这次采用变长的子网掩码VLSM,首先我们分析每个子网的主机号位数、网络前缀位数、地址块、地址数量,如下:
得出应用需求:从地址块218.75.230.0/24中取出5个地址块(1个“/27”地址块,3个“/28”地址块,1个“/30”地址块),按需分配给下图所示5个网络
在该地址块中给下图所示的网络N1~N5分配子块,分配原则是“每个子块的起点位置不能随意选取,只能选取块大小整数倍的地址作为起点”。建议先给大的子块分配
每个子网块中最小地址位网络地址,最大地址位广播地址
循环语句的机器级表示
用条件转移指令实现循环
用条件转移指令实现循环,需要4个部分构成:
- 循环前的初始化
- 是否直接跳过循环
- 循环主体
- 是否继续循环
用loop指令实现循环
loop Looptop等价于:
dec ecx
cmp ecx,0
jne Looptop
理论上,能用loop指令实现的功能一定能用条件转移指令实现,使用loop指令可能会使代码更加清晰简洁
补充:loopx指令--如loopnz,loopz
loopnz--当ecx!=0&&ZF==0时,继续循环
loopz--当ecx!=0&&ZF==1时,继续循环