网络层的主要任务是把分组从源端传到目的端,为分组交换上的不同主机提供通信服务。
网络层传输单位是数据报
数据报与分组的关系
数据报和分组的关系就像父与子的关系一样
数据报是比较长的数据,分组是把数据报进行分割,而划分出来的一个片段
要实现网络层任务,需要解决以下主要问题:
①网络层向运输层提供怎样的服务(可靠传输还是不可靠传输)
②网络层寻址问题
③路由选择问题
网络层的功能一:路由选择与分组转发
功能二:异构网络互联
功能三:拥塞控制
如果所有结点都来不及接受分组,而要丢弃大量分组的话,网络就会处于拥塞状态。所以要采取一定的措施来缓解这种拥塞
解决的方法有两种
①开环控制 静
②闭环控制 动
路由器是网络的核心,两台主机要进行通信,需要通过路由器,那么我们怎样才可以让数据通过路由器从源主机传送到目的主机呢,这就需要数据交换这种技术
数据交换有三种方式
电路交换常见的例子是电话网络
我们打电话的时候,要先进行拨号,就当于是预备建立连接,对方接通电话,则说明连接建立起来了,接下来双方就可以进行通话,进行数据传递。电话打完,挂断以后,就相当于连接释放
连接建立好以后,数据是通过一个固定路径进行传输的
打通电话就可以马上通信
双方的电话打通后,就算没有说话,其他人也无法打电话进来
报文:源主机或者源主机的应用发送的信息整体
如果现在源主机要发送一个pdf文件,那么此时这一整个pdf文件就是一个报文
分组:把大的数据报分割成小的数据块,再进行存储转发
可以同时发送分组
数据报方式为网络层提供无连接服务
无连接服务:
不实现为分组的传输确定传输路径,每个分组独立确定传输路径,不同分组的传输路径可能不同,简单来说,就是传输没有固定路径。
采用这种方式的话,就算传输路径有一个设备坏了,也可以动态调整传输路径
虚电路方式为网络层提供连接服务
连接服务:
实现为分组的传输确定传输路径(建立连接),然后沿着这个路径(连接)传输系列分组,系列分组传输路径相同,传输结束后拆除连接。
简单来说,就是实现确定一条传输路径,所有的分组的传输路径都一样,这样如果中途有一个设备坏掉的话,就会导致传输失败。
数据部分是运输层的传输单元,有TCP段,也有UDP段
首部也可称为是IP数据报的头部
P数据报如果过大的话,我们就会对它进行分片,分割成的小单元就是分组
对于任何一个IP数据报来说,首部的固定部分都是20字节,可变部分也就是可有可无,大部分情况下是没有可变部分的
版本字段有4位
首部长度也是4位 首部长度要乘以4B才是实际的长度
最小十进制取值为5,表示IP数据报首部只有20字节固定部分
最大十进制取值为15,表示IP数据报收宝宝包含20字节固定部分和最大40字节可变部分
填充字段:确保首部长度为4字节的整数倍,使用全0进行填充
总长度:占16比特,表示IP数据报的总长度(首部+数据载荷)
最大取值为65535,以字节为单位
生存时间TTL:
占8比特,最初以秒为单位,最大生存周期为255秒,路由器转发IP数据报的时候,把IP数据报首部中的该字段的值减去IP数据报在本路由器上所耗费的时间,若不为0,就转发,否则就丢弃
现在以"跳数"为单位,路由器转发IP数据报的时候,把IP数据报首部中的该字段的值减1,如果不为0,就转发,否则就丢弃
MTU指的是链路层的数据帧可以封装数据的上限
以太网的MTU是1500字节
如果我们传送的数据报长度超过了某一个链路的MTU值要怎么办?这个时候,数据链路层不能把它封装成帧。需要将原来的IP数据报分片为更小的IP数据报
使用分片来解决问题
使用分片的前提是这个IP数据报本身同意进行分片
标识:同一数据报的分片使用同样标识
标志:只有2位有意义x_ _
中间位DF(Don’t Fragment)
DF=1, 禁止分片
DF=0,允许分片
最低位MF(More Fragment)
MF=1,后面还有分片
MF=0,代表最后一片/没有分片
只有DF=1,MF才有意义
片偏移:
指出较长分组分片后,某片在原分组中的相对位置。以8B为单位
除了最后一个分片以外,其他的每个分片长度一定是8B的整数倍
题目要求分片长度不要超过1420B,也就是MTU为1420B,但是这1420B中有20B是要给首部的,剩下的1400B才可以作为分片的数据部分
我们就把数据部分进行切割,尽可能使得分割完的数据部分越大越好
因为片偏移量必须是整数,所以这个方案不行
现实生活中,A要去好朋友B的家里的话,那么他首先就得知道B的地址,这样才可以找到B
同样道理,两台主机A,B要想进行通信的话,他们应该也要知道对方的地址,这样才能进行连接,然后发送信息,信息沿着链路,然后顺着路由器的转发,直到转发到主机上
所以,应该要知道是在哪一个网络,在哪一台主机
IP地址唯一标识网络上的一台主机或者路由器的接口
我们知道每一台主机的IP地址都不一样,为了进行区分,就得对IP地址进行编码,并不是随便分配的
①对于主机或者路由器来说,IP地址都是32位的二进制代码
②为了提高可读性,一帮在32位的IP地址中每隔8位就插入一个空格(机器中是没有这样的空格的)
③为了便于书写和记忆,我们通常用等效的十进制数字标识,并且在每一段数字之间加上一个小数点,这就是点分十进制表示法
网段个数指的是它可以分配多少个网络号
私有IP地址,也就是说只能用于私有网络或者专用网络,比如说学校的校园网,办公室的网络
路由器对目的地址是私有IP地址的数据报一律而不进行转发
不过私有的IP地址也是可以和外部网络进行通信的,就比如说,你在机房中也是可以用电脑来看电影的,这就说明和外部互连网进行了通信
那么,这个通信过程是怎么完成的呢
这就是接下来要说的网络地址转换NAT
端口号是用来标识某台主机上的具体应用,比如说IP标识到了是哪一台主机,但是主机上有微信,QQ等程序,通过端口才知道具体和哪个程序进行通信
接下来以主机A和主机B进行通信作为例子
那么主机B想把数据发送给C怎么办呢
过程也是类似的,这里就不画出来了
某单位有一个大型局域网需要连接到因特网上 如果申请C类网络地址,则可以分配的主机数只有254个,不够使用
所以该单位申请了一个B类网络地址,可以分配的主机数达到了65534个
给每台主机和路由器接口分配一个IP地址后,还有大量IP地址剩余,这些剩余的IP地址只能由该单位的同一个网络使用,其他单位的网络不能使用 随着这个单位的发展,多了一些主机 并且需要把原来的网络划分成三个独立的网络
我们称其为子网1,子网2,子网3
假设子网1仍然使用原先申请到的B类网络地址,就得对子网2和子网3各种申请新的网络地址
习题
我们从网络地址的第一个十进制可以看出属于C类网,网络号占3个字节,主机号占1个字节,子网掩码是借用主机号的位数,我们把子网掩码的最后一个字节,写出它的二进制,看它有几个连续的1,就代表子网号有几位
划分子网在一定程度上环境了因特网在发展中遇到的问题,但是数量巨大的C类网因为地址空间太小,并没有得到充分使用,,而因特网的IP地址仍在加速消耗,整个IPv4地址空间面临全部耗尽的威胁
所以,因特网工程任务组IETF又提出了采用无分类编址的方法来解决IP地址紧张的问题,同时还专门成立IPv6工作组辅助研究新版本IP以彻底解决IP地址耗尽问题
1993年,IETF发布了无分类域间路由选择CIDR的RFC文档
在聚合 C 类网的数量计算中除以 2 的 8 次方是因为 C 类网的主机位占 8 位。
这部分主要讲的是给定一个IPv4地址块,如何把它划分成几个更小的地址块,并把这些地址快分配给互联网中的不同网络,进而可以给各网络中的主机和路由器接口分配IPv4地址,一般来说,有两种方法
①采用定长的子网掩码FLSM(Fixed Length Subnet Mask)
②采用变长的子网掩码VLSM(Variable Length Subnet Mask)
IP数据报的发送和转发过程包含下面的两部分
为了把重点放在TCP/IP协议栈的忘记曾发送和转发IP数据报的过程,之后的举例中,忽略使用ARP协议来获取目的主机或路由器接口的MAC地址的过程以及以太网交换机自学习和转发帧的过程
S1接口和S2接口都直连了一个交换式的以太网
同一个网络的主机可以直接通信,这属于直接交付,不同网络的主机的通信需要路由器来进行中转,这属于间接交付
那么源主机怎么知道目的主机是否和自己在同一个网络中
假设主机C要给主机F发送数据报
主机C把自己的IP地址和子网掩码相与,就得到主机C所在网路的网络地址
主机C的掩码地址和主机F的IP地址相与,就可以得到目的网络地址
目的网络地址和C的网络地址不相等,所以主机C就知道主机F和自己不在同一个网络,他们之间的通信属于间接交付
主机C需要把IP数据报传输给路由器,由路由器把IP数据报转发给主机F
那么主机C又是怎么知道要把数据报发送给哪一个路由器呢
用户为了让本网络主机可以和其他网络的主机进行通信,就必须给其指定本网络中的一个路由器,由这个路由器帮忙进行转发,所指定的路由器也叫默认网关.
在本例,我们可以把路由器接口0的IP地址指定给该接口所直连网络中的各个主机作为默认网关,也可以把路由器接口1的IP地址作为默认网关
路由表中可能还会有其他路由条目,可以是用户或者网络管理员手工配置的静态路由,也可以是路由器使用路由协议自动获取到的动态路由
目的地址与地址掩码相与得到目的网络地址,然后看看相与得到的网络地址
如果相与得到的目的网络地址和路由条目中的目的网络地址不同,则这条路由条目不匹配,再检查下一条路由条目
这样主机D就可以收到路由器转发来的IP数据报
路由器是隔离广播域的,主机如果发送广播数据报的话,那么路由器是不会帮忙进行转发的,因为如果因特网中数量巨大的路由器,收到广播IP数据报后都进行转发,则会造成巨大的广播风暴,严重浪费因特网资源
根据IP地址和子网掩码相与与就可以得到目的网络地址
假设R1要转发一个IP数据报给该网络中的某个主机
从图中可以看出,R1应该要把IP数据报转发给路由器R2的接口0
但是R1的路由表中并没有关于该目的网络的路由条目
也就是说R1并不知道目的网络的存在,因此,我们可以使用路由器的相关配置命令,给R1添加一条到达该目的网络的路由条目
假设R2要转发一个IP数据报给该网络中的某个主机
从图中看出,R2应该白IP数据报转发给路由器R1的接口1
但是R2的路由表中并没有关于该目的网络的路由条目
所以我们可以给R2添加一条到达该目的网络的路由条目
假设路由器R2的接口2接到了因特网上
由于因特网上包含了众多的网络,如果我们给R1添加针对这些网络的每一条路由条目,则会给人工配置带来巨大的工作量,而且会使得R1的路由表变得非常大,降低了查表转发速度。
其实,对于具有相同下一条的不同目的网络的路由条目,我们可以用一条默认路由条目来替代。
默认路由条目中的目的网络地址为0.0.0.0
地址掩码也是0.0.0.0
对于本例,默认的路由条目中的下一跳,是路由器R2的接口0的地址,因为默认路由也是我们人工配置的,所以它的类型也是静态的
我们可以给路由器添加针对某个主机的特定主机路由条目,一般用于网络管理人员对未来的管理和测试,另外,在需要考虑某种安全问题的时候,也可以采用特定主机路由
特定主机路由条目中的目的网络地址为该特定主机的IP地址,地址掩码为255.255.255.255。其CIDR形式为特定主机IP地址/32。对于本例,特定主机路由条目中的下一跳是路由器R2的接口0的地址。由于特定主机路由也是由我们人工配置的,因此其类型也是静态。
可以看出特定主机路由的目的网络前缀最长,路由最具体。默认路由的目的网络前缀最短,路由最模糊。当路由器查表转发IP数据报时,若有多条路由条目可选,则采用最长前缀匹配的原则,选用目的网络前缀最长的那个路由条目进行转发。
也就是说错误的指向了R3的接口0
那么当R2要发送数据报给该网络的时候,下一条会错误的转发给路由器R3的接口0
R3接收到这个数据报后,就会进行查表转发
找到了匹配的条目后,下一跳就会转发给路由表中对应的地址10.0.1.1,也就是R2的接口1
然后R2进行查表转发,转发给10.0.1.2,也就是R3的接口0
我们可以看出,因为我们的静态路由配置错误导致R2和R3之间产生了路由环路
假设R2要转发IP数据报到该网络,进行查表转发,找到对应的路由条目,下一跳要转发的地址是R1的接口1,R1收到这个IP数据报以后,就会进行查表转发,下一跳是通过接口2直接交付
比如说R2要转发给一个不存在的网络192.168.3.0/24
进行查表转发后,它会转发给R1的接口1,对于这个不存在的网络,路由器R2应该不进行转发,但是却错误地把它转发给了路由器R1,R1接收到IP数据报后,只能走默认路由,下一条要转发的地址就是R2的接口0
从图中,我们可以看出R1,R2产生了路由环路
针对这种情况,我们可以在R2的路由表中,添加针对所聚合的,不存在的网络的黑洞路由
黑洞的下一跳是null0,这是路由器内部的虚拟接口,也就是路由器丢弃了这个数据报,而不是转发这个IP数据报
假设路由器R1检测到其接口0所直连的未来出现了故障而不可到达,就会自动在其路由表中删除该直连未来中的路由条目
假设后面R2要转发IP数据报到这一个网络,进行查表转发,下一跳要转发给10.0.0.1,也就是R1的接口1
R1接收到数据报后进行查表转发,找不到这个IP数据报的目的网络的相关路由条目,只能走默认路由
下一条就应该转发给R2的接口0
这样就把这个IP数据报错误的转发给了R2
针对这种情况我们可以在R1的路由表中添加针对该直连网络的黑洞路由
假设一段时间后,这个故障消失了,则R1又自动得出其接口0的直连网络的路由条目,并且把我们之前人工配置的针对该直连网络的黑洞路由条目设置为失效状态
如果说一段时间后,检测到R1接口的直连网络又出现了故障,这个时候R1的路由表就会自动把这个路由条目删除,然后之前设置的黑洞路由条目会设置成生效状态
路由选择分为静态路由选择和动态路由选择
因特网采用的路由选择协议的主要特点是自适应,分布式,分层次
自适应:因特网采用动态路由选择,能够比较好适应网络状态的变化
分布式:因特网的各路由器通过相互之间的信息交互,共同完成路由信息的获取和更新
分层次: 整个因特网划分成许多较小的自治系统AS(Autonomous System)
域内路由选择使用内部网关协议IGP这个类别的路由选择协议
域间路由选择使用外部网关协议EGP
在一个自治系统内部使用的具体的内部网关协议和因特网中其他自治系统中选用何种内部网关协议无关
路由器是一种有多个输入端口和多个输出端口的专用计算机,路由器的任务是转发分组
它可以分成两大部分
路由选择部分和分组转发部分
分组转发部分由三部分组成,分别是:
交换结构,一组输入端口,一组输出端口
信号从某一个端口进入路由器,物理层把信号转换成比特流,送交数据链路层处理,数据链路层从比特流中识别出帧,去掉帧头和帧尾以后,送交物理层处理
如果送交物理层的分组是普通带转发的数据分组,则根据分组首部中的目的地址进行查表转发,如果找不到匹配的路由条目,则丢弃这个分组,否则,按照匹配条目所指示的端口进行转发
网络层更新数据分组首部某些字段的值,比如说把数据分组的生存时间减1,然后送交数据链路层进行封装
数据链路层把数据分组封装成帧,送交物理层处理
物理层把帧看成比特流,然后把它变换成相应的电信号进行发送
如果送交物理层的数据分组是路由器之间交换路由信息的路由报文,则把这种分组送交路由选择处理机,路由选择机根据分组的内容来更新自己的路由表
路由选择机处理处理收到的路由报文以外,还会周期性地给其他路由器,发送自己所知道的路由信息
路由器各个端口还应该具有输入缓冲区和输出缓冲区
输入缓冲区用来暂存新进入路由器,但是还没有来得及处理的分组
输出缓冲区用来暂存已经处理完毕但是还没有来得及发送的分组
路由器的端口一般有输入和输出的功能
有些厂商的路由器没有严格按照RIP标准文档的规定来实现RIP
等价负载均衡也就是把通信量均衡地分步到多条等价的路由上
接下来看看RIP的基本工作过程
然后来看看RIP的路由条目的更新规则
路由器C和D是相邻路由器,它们之间周期性地交换并更新路由信息,C的路由表中所有的下一跳信息都记为?我们可以理解成路由器D并不需要关系路由器C的这些内容
假设路由器C的RIP更新报文发送周期到了,则路由器C就把自己路由表中的相关路由信息封装到RIP更新报文中发送给路由器D,我们可以理解成路由器C把自己的路由表发送给了路由器D,路由器D收到后进行改造,把到达各目的网络的下一跳都改为C,距离都增加1
这样的操作要怎么理解呢?
因为路由器C告诉路由器D,它可以到达这些目的网络,路由器D作为它的相邻路由器,当然也可以通过C来到达这些目的网络,这是比C到达这些网络的距离大1路由器现在就可以根据改造好的路由表来更新自己的路由表
路由器D原本到达目的网络N2的距离是2,下一跳通过路由器C的转发,现在路由器D知道,到达网络N2仍然要经过路由器C的转发,距离变成了5,也就是说C和N2之间的网络拓扑发生了变化,于是把自己这条路由条目中的距离更新为5
练习
RIP协议存在的“坏消息传得慢问题”
假设R1到达其直连网络N1的链路出现了故障,R1检测到故障后,就会把到达N1的路由条目中的距离修改为16,表示N1不可达,并且等待RIP更新周期到时后,发送该路由信息给R2。
而此时R2的路由表中关于N1的路由条目仍然之前通过RIP协议获取到的,也就是到达N1的距离为2,下一跳通过R1转发。
假设R2的RIP更新周期先到时(也就是R2的这条路由信息先到R1),R1的路由信息后到达R2
R1收到R2的路由信息后,就误以为可以通过R2到达N1,距离为3
并在自己的RIP更新周期到时后,把这条路由信息发送给R2,R2收到R1的路由信息后,误以为可以通过R1到达N1,距离为4.并且在自己的RIP周期更新到时后,把这条路由信息发送给R1
只有当R1和R2的路由表中,到达N1的路由条目中的距离都增加到16后,R1和R2才都知道N1不可达(也就是才收敛)
在这个过程中,R1和R2会出现路由环路,时间长达数分钟
问候分组需要封装在IP数据报中发送,发往组播地址224.0.0.5,IP数据报首部中的协议号字段取值应该为89,来表名IP数据报的数据载荷为OSPF分组,
问候分组的发送周期为10秒
如果40秒没有收到来自邻居路由器的Hello分组,则任务该邻居分组不可达
所以,每一个路由器都会建立一张邻居表
收到链路状态更新分组的路由器,将从自己其他所有接口转发该分组,也就是洪泛转发,这样自治系统中每个路由器所发送的封装有链路状态通告的链路状态更新分组,会传递给系统中其他所有路由器
各个链路层的数字表示代价,通过各路由器洪泛发送封装有自己链路状态通告的链路状态更新分组,各路由器最终会得出相同的链路状态数据库
接下来举例说明OSPF协议的基本工作过程
相邻路由器之间周期性发送问候分组,以便于建立和维护邻居关系
建立邻居关系后,给邻居路由器发送数据库描述分组(也就是把自己的链路状态数据库中的所有链路状态项目的摘要信息发送给邻居路由器)
比如说R1收到R2的数据库描述分组后,发现自己确实其中的某些链路状态项目,于是就给R2发送链路状态请求分组。
R2收到后,就吧R1所缺少的链路状态项目的详细信息封装在链路状态更新分组中发送给R1。
R1收到后,就把这些缺少的链路状态项目的详细信息添加到自己的链路状态数据库中,并且给R2发送链路状态确认分组。
最终,R1和R2的链路数据库将会达到一致,也就是链路状态达到同步
每30分钟或链路状态发送变化,路由器路由器都会发送链路状态更新分组
收到该分组的其他路由器将洪泛转发该分组,并且给该路由器发送链路状态确认分组。这又称为新情况下的链路状态数据库同步
当OSPF路由器在多点接入网络中建立邻居关系时,如果不采用其他机制,将会产生大量的多播分组
这样,每个路由器要向其他n-1给路由器发送问候分组和链路状态更新分组,为了减少所发送的分组数量,OSPF采用选举指定路由器DR和备用的指定路由器BDR
实现DR和非DR的选举并不复杂,无非就是各路由器之间交换一些选举参数,比如路由器优先级,路由器ID,接口IP地址等,然后根据选举规则选出DR和BDR,这和交换机生成树协议选举根交换机类似
每个区域都有一个32比特的区域标识符,可以用点分十进制表示
主干区域的标识必须为0,也可以表示成点分十进制的0.0.0.0.
主干区域用于连接其他区域,其他区域的标识符不能为0,而且互不相同。
每一个区域的规模不应该过大,一般所包含的路由器不应该超过200个
划分区域的好处是,把利用洪泛法交换链路状态信息的范围,局限于每一个区域,而不是整个自治系统,这样就减少了网络上的通信量
如果路由器的所有接口都在同一个区域内,则该路由器称为区域内路由器.
为了本区域可以和自治系统内的其他区域连通,每个区域都会有一个区域边界路由器。它的一个接口用于连接自己所在区域,另外一个接口用来连接主干区域
主干区域内的路由器称为主干路由器
我们也可以把区域边界路由器看成是主干路由器
在主干区域内还要有一个路由器专门和本自治系统外的其他自治系统交换路由信息。这样的路由器称为自治系统边界路由器
在本例中,区域边界路由器R3向主干区域发送自己所在区域1的链路状态通告,向自己所在区域发送区域0,2,3的力量状态通告
区域边界路由器R4向主干区域发送自己所在区域2的链路状态通告,向自己所在区域发送区域0,1,3的链路状态通告
区域边界路由器R7向主干区域发送自己所在区域3的链路状态通告,向自己所在区域发送区域0,1,2的链路状态通告
采用分层次的划分方法,虽然使得交换信息的种类增多了,但是也使得OSPF协议更加复杂了,但是这样却能使得每一个区域内部交换路由信息的通信量大大减小,因此是OSPF协议可以用于规模很大的自治系统中
自治系统之间的路由选择协议,应该允许使用多种路由选择策略,它们都是由网络管理人员对每一个路由器进行设置的,但是这些策略并不是自治系统之间的路由选择协议本身
基于上述情况,边界网关BGP只能是力求寻找一条能到达目的,而且比较好的路由(也就是不能兜圈子),而并非要寻找一条最佳路由
一般来说,两个BGP发言人都是通告一个共享网络连接在一起的,而BGP发言人往往就是BGP边界路由器
BGP适用于多级结构的因特网
下面给出一个BGP发言人交换路径向量的例子
自治系统AS2的BGP发言人通知主干网的BGP发言人,要到达网络N1,N2,N3,N4,可以经过AS2。
主干网在收到这个通知后,就发出通知,要到达网络N1,N2,N3,N4,可沿着路径(AS1,AS2)
这里的路径(AS1,AS2)称为路径向量
自治系统AS3收到这条信息后,如果AS3自身也包含在其中,则不能采用这条路径,否则会兜圈子
接下来介绍BGP-4的四种报文
在BGP协议刚刚运行时,BGP的邻站交换整个BGP路由表,但是以后只需要在发生变化的时候更新有变化的部分,这样做对节省网络带宽和减少路由器的处理开销都有好处