计算机网络网络层

        网络层的主要目的是在任意结点之间进行数据包传输(不可靠),网络层提供的三大功能是:路由选择与分组转发、异构网络的互联(在路由器互联的多个局域网结构中,物理层、数据链路层、网络层协议可以不同,而网络层之上的高层协议必须相同)、拥塞控制。

        在交换机中,一个数据帧到来时,链路层会根据帧头的MAC地址来确定该帧的下一个目标MAC地址并转发,期间不会对帧头的相关字段做修改。而在一个数据报到来时,网络层会根据数据包的头部的目标IP地址字段查找路由表。

        可以想象,如果我们拥有一个信件,而信件上有着收件人的地址,作为一个信件中转站,我们要根据地址来将信件传到下一个我们所知道的中转站去,如果信件上的地址为天津市津南区天津大学,而我们的信件中转站目前知道的其他中转站地址如下:华北地区中转站(地址为:XXXX)、天津中转站(地址为:XXXX),天津市津南区中转站(地址为:XXXX)。根据我们的现有信息来说,我们的目的一定是将信件送到离收件人最近的那一个中转站,使得信件从发件人发出去的那一刻开始,与收件人的距离是越来越近的趋势,现在我们找到了两个符合条件的中转站,那么我们肯定要将信件送到天津市津南区中转站(即和收件人地址从左开始连续匹配字段数最多的那个地址)。但是对于一个中转站来说,我们或许可以直接派送离我们最近的几个小区的收件人,自然来说,对于离我们远的收件人,我们不可能直接跨地区直接略过其他中转站直接交付,因为他们与我们的中转站不是直接连接的,我们就会根据收件人的地区,尽可能多的匹配我们所拥有的更近的中转站,因此一个收件地址可以被视为几个部分,天津大学作为一个与天津市津南区中转站直接连接的一个地址,可以视为一个交付点(类比于IP地址的主机号),收件地址中的天津市津南区作为中转站部分(类比于IP地址的网络号),如果最终的中转站还需要一个快递员(交换机)来交付给具体的客户(这就是链路层的内容了,尽量不做赘述),因为具体给某个客户打电话费自己的电话费,为了控制成本,索性直接建一个群(集线器替代交换机),谁的信件到了就在群里通知,每个收件人在群里看群里发的消息是不是自己的信件,如果是此人就收下,不是自己就丢弃。

        因此一个IP地址可以根据划分方式的不同分为不同的几个段,互联网早期采用的方案是,分类的IP地址,即A、B、C、D、E类,A类IP地址就是将32位IP地址中的前8位作为网络号,后24位作为主机号,B类将前16位作为网络号,后16位作为主机号,C类将24位作为网络号、后8位作为主机号......但是这样就属于静态划分,静态划分的方法的缺点就是不够灵活,如果申请一个B类IP地址,其可以分配6万多个主机,但是B类IP地址只有一万多个,这样能申请的IP地址很快就会被用完。因此我们可以更加灵活地分配网络号和主机号,既然要灵活,我们就需要给出网络号是前几位、主机号是前几位,路由表上的属性就有:目标IP地址、子网掩码和下一跳地址。

        在路由器上的这些信息就可以转发到来的数据包了,现在的问题是,路由器上的这些表项信息从哪里来呢?这就是接下来要展开的路由算法的内容了。

        路由算法分为静态路由和动态路由。静态路由,就是在路由器工作之前,管理员就已经手工将路由信息配置好了,当网络的拓扑结构和链路的状态发生变化时,需要管理员手工将相关的路由信息修改。这样做就使路由器不能及时的响应网络状态的变化了。

        动态路由:按照一定的算法由路由器自身动态地更新路由信息。而动态路由又根据其全局性(每一个路由器掌握完整的网络拓扑和链路代价)和分散性(每一个路由器只掌握了与自身物理相连的设备的拓扑和代价)有链路状态路由算法和距离向量路由算法。对于距离向量路由算法的实现就是RIP协议(Routing Information Protocol)。

        RIP协议:

                每个路由器维护从它自己到其他每一个网络的唯一最佳记录。在路由器中,维护了目的网络地址、距离和下一跳路由器的信息。如果是与自己直接物理向量的结点,则距离为1。距离为16时,表示此结点不可达。

                首先,每个路由器都会初始化与自己直接相连的结点的表项,每过30秒,一个路由器都会与自己相邻的路由器交换RIP报文。RIP报文中有发送方路由器的路由表的全部结点的信息,接收方根据这些信息与自己的路由表进行比较(由于自己离相邻结点的距离为1,因此比较时将接收到的路由表信息的下一跳路由器字段改成发送方路由器,距离=距离+1):

                        1、若报文中有自己的路由表中没有的表项,则会更新自己的路由表,将此表项添加。

                        2、若有,则查看自己的路由表的表项的下一跳是不是发送方路由表,若是,则直接更新自己的路由表,若不是,则权衡距离,若距离更小,则更新为报文中的路由表项。

                因为每过30秒都会与相邻的路由器交换报文信息,如果超过180秒没有收到相邻路由器发送的报文,则认为该路由器不可达,将下一跳为该路由器的表项的距离设为16。

                RIP协议是应用层协议,使用的UDP报文。该协议的优点是好消息传的快,坏消息穿得慢。

               好消息就是指如果到达某个结点的代价变低了,则在30秒内该消息就能传达到自己的邻居结点,邻居再传给邻居的邻居。

                但是如果一个结点的代价变为了不可达,即180秒内没有收到RIP报文,则在当前路由器该表项的代价变成了16,但是在它将这个坏消息30秒后传达给其他结点之前,它收到了来自其他结点的RIP报文,其他结点还没收到不可达的更新,它们仍然认为此结点可达,那RIP报文中的相关字段自然就不会是16,因此当前路由器看到此报文会将自己的表项从16更新为(邻居的相关表项+1)。这时轮到当前结点向邻居发送RIP报文,邻居看到当前结点的相关表项变成了之前的+1,则邻居也会将相关表项改成RIP报文的表项+1,如此循环,每交流一次就会造成相关表项+1,但是因为距离最大只能为16,此时到了双方都能知道该结点已经不可达了。但是在双方知道前交换了多次RIP报文,因此说 “ 坏消息穿得慢 ” 。

        OSPF路由协议:

               除了这种分散性的距离向量路由算法,另一种就是每一个路由器可以知道自治系统内的所有结点信息的OSPF(Open Shortest Path First)算法。该算法就是每一个路由器知道每一条路径的代价,如果说网络是一张图的话,每一个路由器都知道该图的所有结点信息和边信息,根据这些信息,我们就可以根据数据结构中学过的Dijkstra的最短路径算法算出到每一个结点的最短路径。但是前提就是路由器得有上述提到的信息。路由器会将这些信息放在自身的数据库中。该算法的另一个优点就是,我们可以自由地选择选择什么信息作为代价(边的权值)。因为数据库中包含了费用、距离、时延、带宽等属性可以作为代价。

                现在的问题是数据库中的信息怎么来。

                OSPF算法会向本自治系统通过泛洪法来传递这些信息。即每个结点都将与自己相邻的所有结点和边的信息向所有自己的邻居广播出去。邻居收到这些信息后将这些信息再广播。想象有一张图,使用邻接矩阵来存储这个图,每一个结点都知道自己所在的那一行和列的信息(每一个路由器都可以通过向邻居结点发送HELLO问候分组。用于发现和维护有关邻居的信息),所有结点将这些信息通过广播互相分享起来,每个结点再将广播中收到的这些信息放进数据库。最终就能构成完整的一张图。

                详细的泛洪过程就是(改天继续更)

你可能感兴趣的:(网络)