文章目录
- 网络层服务
- 虚电路网络
- 数据报网络
- IPv4
- IP数据报
- IP数据报分片
- IP编址(IPv4)
- 有类IP地址
- IP子网划分
- 子网掩码
- 无类IP地址(CIDR)
- DHCP
- NAT
- ICMP协议
- 路由算法
- 链路状态路由算法
- 距离向量路由算法
- 不同子网之间的路由算法学习
- RIP协议
- OSPF协议
- BGP
网络层服务
发送端:在网络层角度上看,要把主机传输层交付下来的数据段进行再次封装成数据报,然后再往下交付。
接收端:把主机数据链路层交付上来的数据进行解封,然后差错纠错等。
需要注意的是在网络层中是不关心数据链路层与物理层怎么运作的,所以对于网络层来说,他的平台就是网络(指的是网络互联),也就是不再是面向端到端了,因为在传输层中他的平台就是端到端,只关心两个主机之间的通信,但是网络层需要考虑的变成了不仅要考虑两端了,还要考虑网络之间的通信传输了。
在网络层中首先会学到网络的IP是如何区分每一个主机的,如何划分子网区域的,之后就是IP数据报的结构以及是如何封装一个IP数据报的(统称IP数据报),封装完之后就是网络之间的互联协议了(路由器之间的算法以及协议学习)。
题外话:路由器转发是要靠记录和维护IP接口的,而相对于交换机就可能不需要IP。
-
转发表
无论是需要建立连接的网络还是现在应用广泛的Internet无须建立连接的网络都是需要用到转发表,这个转发表是在路由器中的,存储的是转发出口,意思是我们要怎么样将一个数据报正确的转发出去靠的就是这个转发表,网络互联以及路由算法基本都是围绕这个转发表进行的。 -
建立连接服务
在网络需要建立连接的时候,路由器采用的就是建立虚电路网络- 典型例子:虚电路网络
由于电路传输是相对可靠的,那么建立虚电路就是best effort尽力做到仿真电路传输,那么虚电路就是让经过这两个主机之间的路由建立起一条模拟的路,也就是这条路上所用到的路由器都必须记录这俩主机之间的通信信息以及转发路由表信息,这就模拟了一条电路,因为俩主机要通信传输分组的数据就得通过这电路- 好处
模拟电路,电路的好处就是分组的数据可以按顺序到达,因为只有一条路,先后顺序基本是正确的,
- 好处
- 典型例子:虚电路网络
-
无连接服务(数据报网络)
首先无连接服务就是发送数据到对方即可,不用事先建立一个路线,会出现不同路线但是到达目的地,因此也就会有数据报不是按序到达的情况,也就是IP数据报考虑好了的事情。- 典型例子:Internet网络(也就是我们现在的网络)
虚电路网络
一条类似于电路的逻辑连接路线
-
虚电路采用分组交换。
因为虚电路是一条模拟电路,所以俩个主机进行数据传输交换的时候会占用和这个路线的全部带宽,因此不会带宽会得到确定与保证,且分组数据会按序到达目的主机。 -
虚电路的建立之后这个路径上的路由器都会记录且维持这个路线上的转发表并维持主机之间的通信,路由器共同参与维护虚电路
-
呼叫建立:call setup
初始呼叫(发起方)
↓
呼叫到达
↓
接收呼叫(接收方)
↓
呼叫建立(接受方)
-------开始传输数据-------在虚电路中建立连接就是一个呼叫建立过程,由于建立完成后路由器会一直维护这个虚电路路径,所以在完成数据传输之后需要将其拆除掉,否则会浪费带宽也会给路由器造成负载。
下面开始介绍虚电路建立的完整过程、传输过程
- 信令协议(不作详细解释)使用虚电路的信令建立VC、拆除VC、维护VC
- VC是两个主机标识进行通信的转发表(在每一个路由器都会有一个,且维护拆除连接都是操作每个路由器的这个VC表)
VC表里有一个叫做VCID,也就是说有了VCID这玩意之后,我们不用源IP与目的IP进行数据的传输,使用这VCID玩意来转发出口。
解释:因为虚电路建立之后已经确定了走一条路线,不会走其他的,因此源IP目的IP只在信令建立连接的时候找到目的主机然后目的主机确认建立连接的这个过程会用到。之后路由器维护这条虚电路之后就不用使用IP了,直接使用VCID即可知道如何通往目的主机。
(Internet不采用信令协议进行连接的建立)
这就是Call setup的过程,使用虚电路信令协议
- VC是两个主机标识进行通信的转发表(在每一个路由器都会有一个,且维护拆除连接都是操作每个路由器的这个VC表)
这时候情不自禁的就会提问,到底是如何传输的,换句话来说就是通过IP建立连接之后不使用IP的话那你到底是如何知道我要转到哪一个路由器然后到目的地的??
-
VC转发表
(说白了还是一个转发表,只不过叫法与存的内容不一样而已,实质都是转发)
首先我们建立连接后,路径上每一个路由器都知道了你这个数据是通过应该通过哪一个出口能够到达目的主机的,然后在VC表中就有记录你这份数据从那个接口来,然后把这个接口记录一个VC#,从哪一个接口出去,然后把这个接口记录一个VC#,这样我们的数据就顺着这个路由器走就能走到了。下面给出这个VC表(注意:入接口出接口都分别对应的VC#) -
这时候我有一个很无语的疑问
看上图中,我搞不懂我数据是怎么能够进入到这条路径呢?
思考过后我的解答是:只要发送到VC#=12的就能够沿着这条路走到目的主机了。
数据报网络
数据报网络就是我们网络层的一个重要内容了,都是基于这个数据报网络学习。网络层无连接服务。
-
数据报
每一个分组写到IP地址 -
路由转发表
路由表中存储的是IP地址然后数据转发的出口链路(依旧是熟知的路由器转发表)后面会围绕和这个转发表学习一堆协议与算法。
- 在路由器之间的网络,转发表在匹配一个IP的时候不是匹配整个IP地址,因为这样是很难找到的,由于我们的IP进行了区域子网划分,也就是所谓的网络号,我们的路由表只需匹配网络号前缀即可,不用匹配到主机号,匹配主机号只有到了该子网的时候这个数据就会自行寻找到这个主机了。
- 匹配最长的网络号,也就是转发的时候可能会出现两个IP地址前缀一样,但是IP肯定对于有一个记录是能够继续往后匹配的,也就是说匹配度最高的就是这个数据转发的输出链路
就好比快递地址,肯定越详细越能够送到你手里
-
忍不住写的:
这里的路由转发表特别有意思,由于我们的端系统是有一个IP地址的,但是我们的IP都是由一个大的IP地址块划分下来的,也就是一堆一堆的分类那种,那么我们真实的网络中的路由器存的不是每个人的IP地址(应该没人会觉得路由器存232个地址吧),然而存的是一块一块地址范围,然后路由器之间转发到范围内网络子网,总而言之就是一段一段的缩小范围(如果能理解哲理的话学习后面的就异常简单了)
之所以觉得有趣是因为这个划分子网实在是太妙了,让我觉得网络真是件艺术品,因为不单单是划分好ABCD类子网后,还能继续借用网络号划分网络。之后因为觉得ABCD类划分浪费主机号就用了聚合技术,网络做的实在是太美了。
IPv4
IP数据报
-
版本号
占4个bit位
算出来的十进制数就是对应的版本号,比如IPv4=4,IPv6=6 -
首部长度
4个bit位,单位是4B即4字节
算出来代表的是4字节为单位的十进制数,也就是说算出来的数字是5,那么总共5×4=20字节,然后一个字节又对应着8bit位,也就是说假如是5的话应该是160bit位。
一般的IPv4首部长度就是20字节也就是一般的首部长度记录的是十进制数5。- 为什么一般是5(20字节)呢,因为我们可以看到在图中绿色的就是首部长度,然后首部长度每一行对应32位,也就是4字节,一共有6行,但是由于选项字段部分一般不填写,所以是5行,也就是5字节,这也就进一步说明了为什么要4字节为单位(4×8=32)。
-
服务类型,1998改名为区分服务
占8个bit位
期望获得哪种类型服务,但是由于实在是不常用,所以只有在你所在网络提供区分服务的时候才会使用,因为实在是不常用,所以一般会取0填充。 -
总长度
占16个bit位,单位是B即字节
这个总长度的意思是整个数据报的总长度,所以是:首部+数据部
这个很有意思的是,正因为有了16位限制,即216=65535B,然后就限制了下面的偏移量的单位取值(后面细说)
由于头部刚刚说过了一般的头部是4×5=20字节=20B,所以我们的数据部分一般能够存的最大字节数是65535-20=65515B,但是请注意,实际的传输不会封装这么大的数据,必须进行分片。 -
标识字段
这个是用于IP分组后标识一个分组是那一段的,也就是告诉接收方要怎么组装的,这是使用计数器产生的,每次生成一个IP分组计数器加1,然后就是使用该 数字对这个IP分组进行标识。但是只使用一个计数器就代表了这个分组是哪一个段的我觉得内心不安,总觉得少了点什么,因为我这一段进行分片之后我要怎么区分这个分片是哪一段呢,因为我们分片会将这些分片都归为这一段数据的标识,也就是说属于这标识字段的都要进行重组恢复回这个IP数据报,那么再进行细分就需要另一个变量字段了->(后面还会使用偏移量进行标识) -
标志位
占3bit位(这里埋下一个伏笔了,下面的偏移量取值单位因此变化)
有两种:
DF:是否不允许分片
MF:是否为分片最后一段
两个都用0、1取值,0表示false,1表示true
例如:
DF=1,表示不允许分片,0则表示允许分片
这里就是看你这个IP数据报标志位如何设置了,如果恰好链路觉得你的数据报太大想分片的话首先检查你得DF标志位是否为0,0的话就进行分片,否则不能分片的话只能丢弃了。
MF=0,表示可能是最后一片也有可能根本没有分片,那么应该如何区分呢,这时候就要考虑到下面的偏移量了。(提示:如果偏移量是0且MF是0的话就表示根本没有分片),如果为1的话就表示不是最后一片且进行了分片。 -
偏移量
占13bit单位,以8字节为单位(下面具体会说明为什么)
偏移量意思是一个IP数据报分组进行分片封装原IP分组数据的相对偏移量。将刚刚的标识字段的计数器位组合起来就能表示这个分组进行分片后到底是哪一段了。- 为什么是8字节为单位
这个很玄乎,首先是由于我们总长度是216B,但是我们这里的长度表示只有213,缺了23=8,那我们既然缺了8位,我们将这个数计算出来的乘8不就好了吗,因此这个8字节单位就这么来的,我们需要每一位bit换算成8字节单位,这样就能对上我们总长度216字节了,也就是能够满满当当表示出最大的数据,假如我们的标志位取4位,我们单位就会变成24=16,也就是我们这的每一个bit就要换算成16字节为单位了
- 为什么是8字节为单位
-
TTL(time to live)
占8位bit位
数据报的生存时间,表示在路由器中能够转发多少跳叫做生存时间,因为当这个生存时间被路由器减为0的时候就会被丢弃掉,然后向主机发送一个对应的ICMP报文告诉主机这个数据报可能因为某些原因传输过长被某某路由器丢掉了 ,这边需要你重新发一下。 -
协议字段
占8bit位
通过这个协议实现了复用和分解(我真的服了这个说法,不就是说明了这个数据报能够区分TCP还是UDP数据报吗,非得搞这么一出“实现了复用和分解”,当然仅仅是对于我这种非学术党来说认为这个说法太过唬人了)
将这8位计算出6就代表是TCP数据报传输,17就代表是UDP数据报传输。 -
首部校验和
占16bit位(和UDP一样)
IP数据报的首部校验和计算方式也和传输层中介绍的UDP校验和计算一样,都是先填充0,然后计算好数据的二进制和求反码后将其填充到该位置上去。- 与传输层不一样的是:
这个校验和在网络层面向的是网络中的一堆路由,所以每次经过一个路由都要进行校验和计算,每一跳计算一次校验和,但是在传输层也说得很明白了,面向的是端到端的,所以只需要双方主机的传输层进行校验和计算即可检错纠错,这也进一步说明了网络的分层分的十分完美,哪一层就做对应这一层该做的事情就行了,其他不用多管。
- 与传输层不一样的是:
-
源IP地址、目的IP地址
每个地址占32bit位
见名知意了,就是表示双方主机的一个地址号,用来传输数据接收数据最重要的一个字段。 -
选项字段
1~40B,一般是不填的,所以我们的头部只有20B。
如果要用的时候一般会用于:时间戳,路由路径信息… -
填充字节
0~3B
这个0~3B就选得很妙了,我们必须要控制整个IP数据报总字节的倍数为4字节,所以我们填充0 ~ 3 B的即可满足了,一般在选项字段有的时候这个填充字节才会出现。
IP数据报分片
-
MTU最大传输单元
每一条链路有他自己最大限度传输的数据帧,也就是说当你的IP数据报过大的时候,已经超过了封装数据帧的最大MTU(比如最常用的以太网是1500B),那么就会被丢弃掉,或者说不能经过这条链路,这里一般路由会尝试将这个大的数据报进行分片,允许分片就分片,不允许分片就丢掉然后发送ICMP报文告诉主机出什么问题了。- 因为传输过程中会经过很多的链路,因此假设我们知道了这条路怎么走(当然是不知道的),然后我们传输的数据报最大大小只能是这条路上链路允许通过的最小的MTU即为IP数据报能够传输的最大大小。
就是满足最小链路传输大小就能够满足所有了。(当然我们是不能知道整个路径是怎么走的,因为这里研究的是无连接) - 那么如果路由器发现IP数据报大于这条转发的链路允许传输的大小就会对这个数据报进行分片(DF为0的时候允许分片才能对其进行分片)
- 分完片之后到达主机,主机根据其分片偏移量进行组装,不能在路由器进行组装,因为浪费资源且破坏了这个结构。这个偏移量是对于这个IP数据报分组之后再进行分组的,所以是这个分组的标识字段加上偏移量就能够标识这个分片是哪一片
- 因为传输过程中会经过很多的链路,因此假设我们知道了这条路怎么走(当然是不知道的),然后我们传输的数据报最大大小只能是这条路上链路允许通过的最小的MTU即为IP数据报能够传输的最大大小。
-
分片全过程。以及分片之前的原因
由于将数据进行一个一个IP数据报分组后有一个标识字段标识了
但是还是过于大了,在链路上还要继续分片
↓
首先将这个IP数据报分组进行分片
↓
然后每一片都会有一个偏移量,这偏移量是8字节为单位,所以写的时候记得将字节除以8为这个偏移量,然后组装的时候需要乘以8找每一段衔接的地方
↓
然后这个标识字段需要复制到每一个分片中,也就是这些分片要告知重组的人这些分片只属于这个标识的分组,你给我组成后恢复成这个分组的样子,不然我你这个分组没了我整个数据就恢复不了。(也就是说首先组装分片再组装分组最后变成原本的数据了。) -
老师PPT的分片流程如下图
IP编址(IPv4)
仅讨论IPv4的IP地址
对于网络层中需要进行IP编址编程的一般都是路由器而不是交换机,所以在思科软件进行实验的时候我们对于路由器的指令常常要使用一些算法指令而交换机一般不需要并且有时候甚至不用给交换机接口分配地址。
- IP地址
是32位的二进制数字,由于太长了,所以我们就需要将其转换成十进制,因此就有了我们现在看到的点分十进制,形如:192.168.1.1,其本质是一堆二进制数字。 - 网络聚合
前面其实有说过一嘴,这个最有意思的点我觉得就是这个聚合了,他把每一个属于同一区域的将其聚合起来,也就是说网络号一样的进行聚合起来存储在路由器中,路由器就不用存储这老多IP地址了,只需要知道一个大概方向即可,只有到了那个区域内那一些路由才会记录整个拓扑图结构。- 网络号
这里在转发层面可以理解为一个IP地址前缀的意思,在网络中记录的就是这些网络号。(匹配长度越长数据就按照这个记录的转发出口出去) - 主机号
也就是除了网路号用来划分区域之后,剩下的都是给主机的了,也就是说剩下的能表示多少这个区域能容纳多少台主机数的意思。
- 网络号
- 同一子网
这个意思是没有跨越路由器的意思,因为路由必然要划分IP网段,而交换机就可以不用,那么就是说在同一子网内的主机可以直接互联,可以直接用命令ping通彼此的IP地址。
有类IP地址
到了我醍醐灌顶的这部分了,这部分着实是惊艳到我了,有类地址划分
-
有类编址
-
A类:
前8位二进制数网路号范围区分A类:0~127(十进制),且二进制最高位第一位固定为0,网络号有8位
-
B类:
前8位二进制数网络号范围区分B类:128~191(十进制),且二进制最高位前两位固定位10,网络号有16位
-
C类:
前8位二进制数网络号范围区分C类网:192~223(十进制),且二进制最高位前三位固定为110区分C,网络号有24位
-
D类:
固定前8位二进制数范围区分D类:224~239(十进制),且二进制最高位前四位固定为1110区分D类,不区分网络号了,已经用完了32位。D类没有网络号,属于多播地址,这个网络内的D类有一个发送数据的时候,这些D类同一网内的都会收到一个副本。
-
E类:
固定前8位二进制数范围区分D类:240~256(十进制),且最高位前四位固定为1111区分D类,不区分网络号了,已经用完了32位。E类没有网络号,属于实验研究用的。
-
-
A类网络号8位:即有28个A类网络,主机号有24位,即一个A类网络能有224个主机IP地址,所以后面的BCD也是这么个解释。
因此得出的结论就是:网络号越长表示这个类的网络越多,但是这一个类网络对应的主机就比较少,相反像A类这种网络号短,但是一个A类网络包含的主机数恐怖如斯。
这里我一直在重复前8位的二进制数来区分ABCD网,是因为ABCD就是靠前8位二进制数区分的,且好像老师和其他博文都几乎没提到为啥我只用8位就可区分但是像我BCD类网络号却大于8,而只有A真正使用8位区分且网络号也就只有8位。
下面给出我的解释以及我在学习过程中的笔记
ABCD类IP地址划分理解
首先网络号是区分ABCD网络的东西,
然后为什么明明范围都是用了8位,为何说B对应网络号为16,C为32,只有A真真正正的使用的是8位?
原因:是因为前8位是真的用来区分哪一个类的网络,首先前缀也是固定用来划分ABCD类网的,至于网络号类别越低越尝试怎么回事(默认A类别最高),是因为A网路号短代表能分的A类网络少但是他一个网络号就能分很多个主机网络,随着网络号的变长,这个类别能分很多个,但是一个网能分的主机数就很少(因为网络号长,主机号短)
- 特殊IP地址
并不是上面所说的每一个类分配的IP都能给主机端系统使用,而是有一些特殊的IP地址是用于特殊用途。(如图所示)
- 私有网络
这部分就厉害了,可以说是为后面IPv4分配殆尽后想了一办法埋下伏笔(即NAT)
私有网络的意思是在ABC类网络中下面对应的网络号范围内的都属于是私有网络地址,也就是说除了自己子网内部可以进行传输数据之外的外网是不能够对其进行访问以及传输数据的,所以世界上任意一个子网都能使用这些网络,不同子网能够拥有相同的子网,但是出不了外网,因为外网会人这些网络号属于是非法地址不可达(这里说的外网不是说国内国外之间的,而是相对于合法公网,你的私有网络叫内网,公网叫外网)。目前我们只需要知道有私有网络即可,且私有网络是外部访问不到且内部希望访问其他子网也访问不到,因为是外部的路由器认为你的地址是非法的。
- 私有网络
还是感叹一下私有网络,我觉得私有网络完成了一个里程碑的事情,且我觉得是一个非常具有艺术性的东西,世界上任何一个主机都可能用着同一个这些私有IP地址,这与我们写代码的时候想到的代码重用非常雷同,它实现的是IP地址重用,能够重用地址可想而知对IPv4分配殆尽有多大帮助(虽然现在已经完全分配殆尽,但是不得不承认是一件艺术品般的存在)
IP子网划分
主要思想就是借用主机号将其划分到网络号中就实现了同一网段却能够继续划分各个部分的工作。
子网掩码
各类对应的子网掩码,化为二进制就是全为1的部分+全为0的部分
A:255.0.0.0
B:255.255.0.0
C:255.255.255.0
-
子网掩码用处
在给出一段二进制IP地址的时候,与对应哪一个类的子网掩码进行按位与(即编程中的 &运算 ),&出来的结果就是网络号,然后就可以让路由器按照这个网络号进行转发即可。
子网掩码的出现是为了唯一标识一个网络的的,因为一个IP地址加上子网掩码才是真正的地址,因为我要用子网掩码求出你所属的网络号我才能聚合网络然后转发到更具体的网络中去,同时我也觉得这个子网掩码有一部分原因是因为借用网络号的原因所以更加有必要的加一个子网掩码进行计算出网络号,然后更利于路由器对其路由接口聚合路由转发(路由聚合这件事真的泰裤辣)
-
细说借用主机号划分子网
首先我们网络号已经是固定了,一般借用网路号都是发生在已经确定好是哪一类的网络了,然后觉得我们有必要再进行内部的划分子网。并且借用都是从主机号最高位进行借位
所以借用网络号划分内部网络,那么借用的这部分主机号就变成了网络号的一部分,比如我们B类网,前16个比特都是网络号,假如我们要借用最高位两位,那么这两位就变成了网络号了,是区分这个B类网内的子网网络号,两位bit,所以能划分四个子网00、01、10、11,借用两位后,还剩下16-2=14个主机号,也就是说每一个子网能够有214=16383个主机数。
易错点:当我们借用主机号的时候我们的子网掩码十进制那里是从0变成28+27+… 因为我们从最高位的开始借用,所以是从8次幂开始算,就好比图中的B类网,因为主机号被借用了3bit (从最高位数三位:8、7、6)
因此是28 + 27 + 26 - 1 = 225 - 1 = 224,所以原本的0变成了224,最后子网掩码的模样就是:255.255.224.0,因为借用主机号最高位,所以不再是全0,因此要重新计算,这也是我前期一直学不好子网划分的原因就是因为这个。
无类IP地址(CIDR)
- 解释:
首先对无类地址的理解就是消除了ABCD区分的,基于原本的ABCD类已经分过了,就是申请一个类别但是用不了这么多的时候就会造成了浪费,然后现在的CIDR就是为了完成:如果一个类别网络分配下来的太大的话就可以使用CIDR将其继续分配继续细分,这时候已经不用区分ABCD了,你可以自由的进行分配网络。 - 前缀:在CIDR中使用前缀来区分网络号,并且一个网络号能够分配多个主机数,也就是说我们可以完成一个动作,即路由聚合(真的是妙哉,路由聚合神一般的存在)
- 主机号:主机号在无类IP地址中仍然存在,正是因为能够借用主机号来划分子网的,规律是:借用n位主机号,就会有2n个子网提供给你划分,然后一个子网有几个主机数取决于你除了网络号+借用的主机号之外,剩下的主机号从全0~全1的就是可以用的该子网内的主机数。
- 后缀
就是斜杠加网络号就是后缀
以上就是CIDR的整个结构,下图提供例子:
- 这个举动仅仅是提高了IPv4的分配效率和利用率,并没有解决IPv4即将分配殆尽的问题。但同时这也让路由聚合进一步发挥了其作用,由于我们已经完全消除了有类地址分配,这时候我们的路由器只需要将其同一网络号即同一子网的路由转发表聚合起来,不用存每一个IP地址转发表,这大大减少了路由器的负担
首先解释一下这里路由聚合为啥看似和前面有类地址的聚合作用差不多, 其实不然,这里的聚合已经蔓延到了每一个主机IP地址的聚合,之前路由聚合都是在公网的有类ABCD之间的聚合,现在由于借用主机号进行的IP子网分配后还用了CIDR进行无类地址分配,路由聚合实现已经不单单局限于网络拓扑中的主干路由器 了,我们内部分配的网络之间也能够进行路由聚合了,之前可能会出现一个子网有多个主机数,没有进行无类地址划分子网的时候需要记录很多IP网络,这时候我们可以将其同一网络分配的子网统一聚合成一个网络记录在路由表中。如下图所示,对于边缘的路由器我们只需要记录这个子网的网络号即可,对于外部想要访问内部的时候,这个边缘路由器并不关心你到底要去哪一个主机,只知道你来这个子网的即可,把你传进去后自己慢慢通过内部路由器慢慢找,下图只给出了一层聚合,很有可能内部的继续划分子网后路由将会继续聚合,这时候已经完全没有ABCD类之分了,真正实现了路由器的聚合,给路由器的大包袱减重了。(这个聚合和无类子网划分真是妙哉妙哉!)
↓聚合后转发表变成了如下所示
- 存在的问题
由于无类地址划分与路由聚合是在后面才发展起来的,所以之前的有类地址划分或者其他比较老的地址划分形式可能会导致我划分的一个网络不是连续的在一个路由表中,也就是说我们的子网网络号一样,但是某个划分好的子网被调到另一个路由器上了,完犊子这时候不能进行路由聚合了,这时候同一子网网络号出现在不同的路两个路由器中了,我总不能为了聚合而将这俩合并吧。- 解决办法
首先想到的肯定是把那个特立独行的不在同一网络号的那段IP地址的最长网络号发布在他的那一个路由器中,而我本来的子网网络号继续聚合我的网络- 这时候就会有人问了:哎呀那我路由器不小心将那个特立独行的IP数据转发到不在他的那个路由器咋办?
这里很明显路由器会选择匹配长度最长的那一个进行转发,所以之前前辈们的设计终归还是有道理的,不过想想也很容易想明白,因为在现实生活中报地址的时候当然是越详细越能找到你在哪。
- 解决办法
DHCP
-
IP地址
现在一般都是说子网内的主机的地址(因为很少人真正的持有属于自己的IP地址) -
默认网关
当我们要访问外部的网络IP地址的时候,也就是我们要访问的IP不在我们子网内的时候就要通过某个路由器转发出去,那么这个默认网关就是这个转发到外网的路由器的接口的IP地址。 -
如何获得一个IP地址
-
硬编码进行静态配置
首先我们可以最直接的手动给自己分配IP地址,打开电脑的IPv4属性进行配置即可。需要配置自己的IP地址还要配置默认网关(当然你不想访问外网只是内部传输数据可以不配置网关) -
动态分配(DHCP)
DHCP,动态主机配置协议,如果我们的路由器网络提供有DHCP服务器这种服务的话,我们客户端就可以从服务器中租赁一个IP地址,并且会提供子网掩码、默认网关、DNS服务器等等信息。
首先这个动态分配有一个非常牛的功能就是连上就能用了,不用自己配置,然后这些地址能够重用,重用这个概念十分妙,也就是我们可以很好的对这些地址有效利用,且当我们电脑是DHCP获取的之后,在我们关机后这个地址会还回去给另外的人用,我们下回用的时候会再次申请一个地址。
所以说有时候我们的WiFi会限制连接人数,我们需要注意申请到了网络之后别被人抢走名额了,动态获取IP地址在现在已经随处可见了,手机、酒店WiFi等等移动网络。
-
-
DHCP服务器
在动态获取中提到的DHCP服务器,那么这个服务器到底是怎么让客户端连接到的,或者说他怎么确认分配IP地址给客户端?-
首先服务器并不会主动告诉客户机自己的DHCP还有IP地址能用,所以需要客户端进行一个主机广播的操作,然后等待服务器给回应。
这个就妥妥生活中的例子了:我们一打开WiFi,就会搜索附近的网络,这个就是主机广播的一个过程。 -
服务器知道你要请求地址的时候,就会返回一个DHCP offer 提供报文 响应,这时候如果附近有多台不同网络之间的DHCP服务器就会发现我们可用网络可在连接的时候自己选择,因为我们是广播形式所以可能会收到很多台DHCP服务器的响应
-
主机请求IP地址,发送DHCP request
这时候就是我们输入密码后点击连接请求IP地址的时候了 -
服务器发送ack确认请求,发送DHCP ack
这时候知道某个主机想要申请网络IP地址的时候就会发送一个确认说我同意你租赁IP地址了,拿去用吧。
-
-
说明一点:一般DHCP服务器会建在路由器中,因此我们可以在路由器中直接设置IP地址范围以及最大连接池个数。(如果不希望家里的网被隔壁小孩抢网速的时候就可以使用这个方法,在路由器中连接池设置为一个,然后就可以自己连着畅通无阻漫游网络了)
-
本人斗胆认为这个协议有点破坏路由器结构了:
因为路由器只需要关注网络层之下即可,但是突然来了个应用程序还是内嵌在路由器中的,这也太牵强了。
但是后来细想后,我也没想出有啥能够替代的方案,也只能想到是把这个协议内嵌一个应用程序在路由器实现了。
且因为DHCP服务协议在OSI七层模型中,被定义在了应用层,又因我们的路由器必须实现这么一个服务,所以需要在路由器建立这么一个应用程序运行DHCP协议。
NAT
他来了他来了,这玩意虽说备受争议,但是真正的为IPv4分配殆尽做了宏伟的贡献,1994年提出的NAT网络地址转换,它的出现怕不是给某些资本家吓了一跳,因为IPv4地址即将分配殆尽,我认为这时候宣告IPv4快没的时候,一些资本家肯定打捞一笔,NAT的出现将其IPv4快要分配殆尽之际将其延迟到了2019年,也就是NAT撑了二十几年,这对于我们来说节省了很大一批地址资源,也就是原本快要升值的IP地址在短时间内没有波动,当年可能让部分资本家非常的sad。
-
私有地址
在介绍有类地址IP的时候提到了私有地址部分,这些地址不是对外能访问到的,也就是说我们在希望通过访问其他子网内部设置的私有网络是不可行的,但是NAT的出现却打破了这个局面 -
NAT
在私有网络中,使用一个连接外网的边缘路由器记录替换表
替换:将私有网络的源IP地址替换成连接外网的边缘路由器的接口的IP地址和新生成的对应该源IP地址的端口号。然后并且记录到NAT转换表里面去,因为对方收到信息后还可能给我们回数据的,所以要记录这个NAT转换表中存储。
即(NAT地址,新端口号) <——>(私有源IP地址的,源端口号)
-
NAT支持的端口号有六万多个
也就是说这个端口号仅支持内部网络中六万多台主机进出登记
新端口号也就是在这六万多中生成的,并不会直接使用源端口号,而是进行一个转换才将其数据发布在Internet中。
那么应该如何才能实现这种穿透网络的功能呢?也就是说怎么将这个转换表补全呢?
-
静态配置NAT
在路由器中将特地的端口和IP手动将其配置,然后该IP地址就能够实现内外网互联了。 -
UPnP
如图所示,这又是一个能开一篇长博文的知识点
-
中继Skype
我们Windows已经贴心帮我们装了Skype这个软件,我们可以直接使用。
那么这个Skype的原理就是通过建立一个中间的服务器,这个服务器特地的用来记录这些转换记录,然后实现内外网互联的这么一个效果。
总结:NAT做出了十分伟大的贡献,可以说是我们不仅仅学习过程中,在平时中也使用的私有地址,就好比我们在cmd命令输入ipconfig得到的IPv4地址与我们在百度上直接搜本机IP地址的是不一样的,电脑上显示的是私有网络的私有地址,而百度上搜索到的确实我们通过NAT转换表后通过的路由器给我们分的这么一个IP地址(并带有新的端口号转换对应)有了这个NAT转换,我们能在私有网络做的文章跟多了。
ICMP协议
介绍:ICMP报文就是向主机发送一个出错报告报文
-
差错类ICMP报文
- 目的不可达(常用)
目的不可达可能不会TTL减为0,而是我们根本找不到这个IP地址和端口号,即这个数据已经群龙无首了,然后就会发送一个目的不可达的ICMP报文告知主机找不到这个目的地址然后随之将数据丢弃掉。 - 源抑制
通告网络拥塞给主机(但是好像不怎么用了,因为我们在传输层中已经实现了TCP拥塞控制,并且已经很成熟的应用中了) - 超时/超期(常用)
超时就是超时,也是传输层中讨论的拥塞控制的部分,超时就重传,
即当我们的TTL减为0的时候就会发送一个超时的ICMP控制报文 - 参数出错(常用)
就是传输过程中路由器觉得你的数据报头部不对劲的时候也就是出错的时候就会将其丢弃掉。 - 重定向(常用)
当路由器发现你的数据报在我这里没有对应记录的时候就会向主机发送一个重定向ICMP数据包告知其另辟蹊径走
- 目的不可达(常用)
-
探测类ICMP报文
- 回声请求与应答请求报文
经典的ping命令就是使用这个探测来检测是否能够ping通,就是请求,然后根据响应来判断是否连通。 - 时间戳请求与应答请求报文(没学)
下面给出所有类型ICMP报文
- 回声请求与应答请求报文
-
什么情况下不发送ICMP报文
首先第一个肯定就是发送的ICMP报文自己炸裂掉了,自己坏掉的时候不再发送了,因为谁希望网络中充斥着一堆差错报文。
第二个就是ICMP报文可能比链路大的时候进行了一次分片过后,仅仅保留第一段分片的继续向前发回主机方向,然后之后的分片都是仅保留分片的第一片,后面的都不要了都给丢,同样丢掉的片段不会发送ICMP报文
第三个就是对于多播地址IP的数据报不发送,很明显了这个,多播还要发送ICMP报文,还嫌链路上的垃圾信息还不过多吗,一堆IP地址给你发ICMP报文。
最后一个就是特殊地址,也就是说标识自己的比如127.0.0.0与全0的就不用发啦,自己给自己发送ICMP亏能想得出来。 -
报文格式
首先它是要封装成一个IP数据报进行传输的,因为本章中讨论网络层,那么必然是在网络层中看的话就是在网络层中传输的所以必须封装成IP数据报进行传输(当然会交付给数据链路层、物理层进行传输)
下面就是一个ICMP封装厚的IP数据报,然后ICMP报文里面的格式才是我们要学习的。
- ICMP这个报文里面的格式是怎样的?
如图所示:首先这个报文里面会把出错的这个源IP数据报的头部给复制一份下来,然后后面加了个8字节 - 对于IP数据报首部后面的8字节解释:首先这个字节是用来进一步确认哪一段数据报出错的,然后同时也考虑了当传输UDP报文段的时候对于UDP数据部分,那里的8个字节就是完整的UDP头部!!!妙哉妙哉!
- ICMP这个报文里面的格式是怎样的?
路由算法
当我们知晓路由是通过转发表进行对数据报的定向之后就要学习这个路由表到底是怎么生成的。
链路状态路由算法
这个算法也叫Dijkstra算法
- 目的
迪杰斯特拉算法目的就是为了找到本节点到其他所有结点的最短路径并且只保留找到的这些路径其他路径就无视
(当然这是要基于路径的费用距离等等考虑) - N’列表:当出发节点找到了到该节点最短路径的时候就将其节点添加进去。其实画表的时候迪杰斯特拉算法每次进行一步都会找到一个最短路径的结点并将其放进N’中
- D(x)表示路径费用,表示你的出发节点到x的费用
- p(x)表示到这个结点的前序结点
根据课件给出例子进行讲解
- 第一步:将其初始化,图中写的很明白了,第0step就是初始化的数据了,然后我们的这个例子是u结点作为出发节点。
时刻要记住每一列的D(?)代表的就是你当前走到的那一个位置的时候对于?的距离费用是多少
因此在第一步中可以发现u到w的距离最短,所以将其w添加到N’中去变成力量uw - 第二步:我们现在走到了w,就要重新计算所有的D,除了我们已经选好的那一个结点,也就是我们现在走到的w结点(其实每一步都会计算出当前走到的节点到达附近最近那一个就会将其添加进去),然后现在要重新计算的是w附近的结点,他附近能到达v、x、y,因此这些节点要重新计算,然后如果有发生最短路径的变化记得改变前序p(?),改成本节点p(w),这个原因也很清楚了,你本来就是走到w才计算附近的,那么到达附近的结点不就是要经过你自己的w嘛
计算出来结果就是到达v的距离变短了所以要改其前序结点和距离,距离就是我们N’(uw)的这几个经过的节点=6.还有y也要改变,因为初始是无穷远,现在变得可以直接到达了,也要计算出这个距离,距离就是我们N’(uw)的这几个经过的节点
然后找到最近的那一个,这里第二步最近的就是到达x的,因为x没有变,其他变了但是都不够到达x的距离短,因此把x加进N’中 - 后面以此类推
- 需要注意的是,每步都会找到一个最短的,
其实可以把每一行的还没加进N’的D(?)的那一列的数据抄下来。也可以采用老师这种方法,就是你要时刻记住,这个表的每一步是找还没有存进N’的D(?)的列,然后你更新完每一个列之后再进行找是否为最短路径,是的话就将其添加进N’中,然后继续往前走(这里的往前走的意思是:迪杰斯特拉算法一直会往前找最短的然后不停地找,存在表中对比下来最短的就将其存进N’表中) - 例子2
- 第一步:将其初始化,图中写的很明白了,第0step就是初始化的数据了,然后我们的这个例子是u结点作为出发节点。
距离向量路由算法
动态规划我们的最短路径
下图就是整个动态规划过程
每一列代表一个计算过程
- 算法细节
在这个算法中记录的我这个结点到达邻居节点的距离费用,所以每一个结点的表对于自己来说这个距离费用都是0
在第一次交换信息的时候信息量很大,以node x 表为例子:初始只有自己对于邻居的结点距离,并不知道y、z结点掌握的什么信息,所以在第二列中进行信息交换,node y 、z都把信息给了node x表,然后x表拿到信息之后就要衡量到y、z的路径有费用有没有比自己原本的取的费用要短。
1、比如先看:x->y中,我x原表中记录的是2,然后查看交换过来的信息中到能够通过他们到达y的路径有没有变短
y表告诉我们:y->y=0,经过y结点:x->y=2,因此2+0=2
z表告诉我们:z->y=1,经过z结点:x->z=3,因此3+1=3
对比下来就是2小了,不过原本就是2,所以没有变
2、再看x->z中,我们x原表记录的是3,然后查看交换过来的信息中到能够通过他们到达z的路径有没有变短
y表告诉我们:y->z=1,经过y结点:x->y=2,因此2+1=3
z表告诉我们:z->z=0,经过z结点:x->z=7,因此7+0=7
所以我们原表中记录的直接到z费用是7,我们y表告诉我们经过他到z只需花费3,那就把我们的x表最短路径换为3,以此类推后面。
-
假如说我们的链路发生了改变,变短了,这时候更新表十分迅速,也就是说在这个距离向量路由算法中好消息传播的速度非常快。
-
那么坏消息呢?这就会导致一个无穷计数问题。
为什么会出现无穷计数,首先我们的表是通过学习得来的,如果说xy之间的链路费用变大了,那么y肯定会不选这条路了,那就变成问z这家伙了,然后这家伙之前是因为我教他说你经过我的最短路径是3,他算法是不会说话的,y只管你告诉我最短就行,那他就会继续往x方向走,但是x方向还是很大,继续问z那z又告诉他之前的那个路径然后又回去,每次问一回就是要加上zy之间的一个费用,因为y问了z就代表她要经过z才能到达,可殊不知z要到达那个地方要经过y的,这就是无穷计数了。
-
毒性逆转
解决办法也和明显了,就是算法改写成:如果问下一个节点的路距离费用时候,他告诉的路径是经过自己的时候就不要问了,毒哑这个结点就行,并将这个结点置为无穷远,这时候就会自动选择刚刚更新过的虽然变大了但是只有这一条路了,毕竟邻居节点都是经过自己的。
-
当然毒性逆转在复杂的网络中可能还不足以解决这个无限计数问题
这时候就要定义一个最大度量值,rip协议也是使用16跳默认路径坏掉,就是超过16跳了就将其设置为无穷远的路径
不同子网之间的路由算法学习
-
AS系统
这里称一个子网为一个AS系统,当然这个AS是接入到互联网中的。
一个AS系统必须要有网关路由器,这些路由器负责记录邻居的AS系统的网关路由器距离以及对应的IP网络信息,一个AS系统可以有多个网关路由器,因为可以实现多方向传输数据 -
除了网关路由器需要记录外部网络其他AS系统的网关路由器信息外,AS系统内部的所有路由器仅仅记录本子网内的IP信息,不会记录其他子网的链路信息,所以这其实也得益于NAT,能让其使用内部私有IP。
-
我们内部的主机要希望传输数据到其他的子网的时候路由算法在这么多网关路由怎么选择路径呢?
- 热土豆
一个神奇的名字,意思就是哪一个一个AS系统中希望访问外部的网的时候,根据距离这个发送数据的那个路由器最近的网关路由器上面发,热土豆就是这样的,热土豆烫手,哪个离我近,我尽快把数据传输出去。
- 热土豆
-
网关路由器
网关路由器必须学习如何到达其他AS子网系统的路径
RIP协议
RIP使用的路由算法是:距离向量路由算法
首先在真实的路由器中启用这个RIP协议就代表动态分配地址了,也就是连接两个子网之间的映射关系会自动学习。(因为RIP用的就是动态规划的路由算法并且自动学习定时更新交换路由表信息)
-
RIP协议是每30s进行一次邻居之间的交换结点信息
-
RIP协议在路由器中使用的记录表有所不同,记录的是目的IP子网,吓一跳路由,距离目的子网的跳步数
-
在RIP协议中,当跳步数超过15跳的时候就会默认为这个目的不可达,也就算是解决了无穷计数问题。(需要解决这个问题就代表这个问题是会出现了,那么RIP在复杂且大的网络中无法做到快速传播。)
-
当超过180s都没有收到某个邻居节点给交换节点信息的时候就默认这个路由坏掉了这路由不可达了
-
在RIP协议中,他的通告信息是通过封装一个UDP数据报通告邻居节点。
RIP学习心得:RIP最突出的就是他的30s会进行交换节点信息,然后三次过后还没收到信息(也就是180s)默认邻居节点失效(寄了),由于他的路由表(route-d表)存有下一跳路由,所以能够有效的预防无穷计数问题(实现毒性逆转),还有一个RIP的特点就是数据只能进行16跳,但是我个人认为这个16跳步有点限制,只限制在比较小的网络拓扑里面,遇到大的网络的时候很明显有可能是16跳满足不了的,所以我们在设计网络的时候可以使用迪杰斯特拉算法进行拓扑计算出整个网络最长的跳步数是多少,超过16跳步就可能要考虑换一个路由协议了。
OSPF协议
OSPF使用的是链路状态路由算法,即:Dijkstra
-
OSPF协议会存三个表
- 邻居表
收集邻居节点信息 - LSDB(链路状态数据库)
这个表的目的就是为了了解自己所在的网络的信息、辅助计算所在网络的拓扑的最短路径。这些链路状态信息叫做LSA - OSPF路由表
这个表就是根据LSDB计算出一条最短路径树,当然是以本路由为结点(因为每一个路由所对应的OSPF路由表不一样),使用Dijkstra算法。
- 邻居表
-
安全性
通过报文认证预防恶意入侵
不详细探讨,因为本人不会,仅仅了解了这个概念 -
允许存储多条相同费用的路径(这是RIP没有的,RIP只有一条)
这个比RIP做的更完善了, -
对于每一条链路都可以设置其度量衡,主要是针对不同的服务(TOS),即费用。
为什么能自己设置呢?我当时也很疑惑,但仔细一想,假如说现在网络上的直播多媒体形式,那么我们可以将他传输的数据设置为网速比较快的带宽大的,然后其他的比如邮件类的数据就可以在低网速的链路传输等等
注意:这里不是说邮件就是在低网速上传输,只是举个例子,链路空闲的时候当然都往链路通畅的地方走。 -
可以进行层次划分
- 每个区域内的OSPF协议的内部路由是记录本区域内的链路路径信息
- 每个区域都有一个边缘路由器,记录的是骨干区域(也就是不同AS子网系统之间的路由信息)
-
OSPF协议没有路由跳步数限制。
-
节点信息通过泛洪形式通告
为什么要泛洪?
粗略解释:首先我们三个表中有一个叫数据库的东西LSDB,记录链路信息的,所以我们的泛洪之后的信息(即新的LSA),将会到达每一个路由节点,又因为每一个路由都是使用OSPF,所以每个节点的OSPF的LSDB表会更新这些信息,然后每一个结点持有的LSDB的信息都会同步更新,所以我们每一个结点认识到的整个网络的信息都是一样的,因此当我们链路发生改变的时候,进行泛洪然后更新路由表。
正是因为OSPF支持层次划分这个好处,我们的网络管理才变得如此简洁明了
BGP
专业术语
- BGP首先他这个协议是面向一个个AS自治系统的,所以后面学的时候时刻记住BGP是为了管理AS而出现的。
- eBGP会话
e:我理解是悬崖边缘edge,因此eBGP是连接每一个AS自治系统的手段名称 - iBGP会话
i:我理解是内部inner,因此iBGP是每一个AS自治系统内部的相互连接的手段名称
首先在之前的RIP、OSPF协议这些仅仅是说明了每一个路由器之间应该如何传播传数据,然后OSPF完成了子网之间分层次管理,但其实分层还不够,因为在相对于现实的网络中都是面向着每一个ISP厂商,每个厂商之间肯定谁也不想将自己的信息交给别人,因为自己维护好的网络凭啥交给你,所以就必须要有一种新的协议或者新的应用进行划分,那么BGP就可以完成这个划分任务。
- BGP会话
BGP会在每一个路由链路建立一个会话。
会话想必很熟悉了,就是Javaweb学习中的session会话结合起来比较容易理解。
如果双方同意建立会话就会交换双方子网的信息。
这个信息能够知道如何通往各个节点的网络前缀和路径信息。(这个网络前缀如果是两个AS之间进行建立会话通告信息的话,一般都会通告自己本网内聚合的网络前缀,否则将整个IP地址网络发过去人家还不一定能装得下你的信息,所以BGP都用到了之前学过的知识点了)
首先会话交换信息必须要双方同意的。- 交换发送的报文信息是基于TCP的(之前的OSPF是基于UDP进行信息泛洪)
- 报文信息
- 假如说有一个AS自治系统用eBGP向我们告知可达他们子网的信息,那么我们收到信息的那个边缘路由器就用iBGP会话向我们通告,然后我们就记录下来到达他们边缘路由器的,那个子网IP前缀。
- 因此BGP的特点已经很明显了
打个比方,有两个网络提供商双方谁都看不顺眼谁,假如他们子网之间有链路连接,但是这时候他们不希望联系,就可以使用BGP进行切断关系。
由此不仅仅是厂商之间可以这么做,一旦上升到政治关系的时候或者某两个国家是敌对关系就麻烦了。。。