简单来说就是为数据包选择最佳路径,尽可能的转发数据包。分为两种,一种是管理员告诉路由器怎么走,一种是路由器自己来选择。前者是静态路由,后者是动态路由。
网络层要把数据包加上IP地址(源和目标),才能把包送达。路由器通过IP地址来传输数据包。这个网络可以实现负载均衡,让数据包的传输相对平均。
数据包传输过程不保证可靠传输,比如传输过程中出现差错或者路由器缓存表满,处理不过来,都会丢包。负责可靠传输的是由AB计算机的传输层来负责的。
路由器为数据包选择最佳路径,处理不过来就扔掉。网络层可以通过动态路由来让路由器动态选择路径,出现意外情况时可以选择备用路径送达数据包。
条件:数据包有去有回
当网络出现问题,排查错误时,我们就需要检查来路和去路,考虑数据包到得了而且返的回来。(比如私网直接访问公网就是数据包能到回不来的问题)
也就说网络不畅通无非就是两种:有去无回和不可到达。
正常流程:A-R1-R2-R3-B
其中路由器负责转发数据包,每个路由器内都有路由表,通过路由表来转发数据。路由表就是存储路由器下一个可到达的网段/路径信息的表。
一般当数据包到达一个路由器,路由器查路由表知道吓一跳要到哪一个路由器/网段,然后转发数据包。如果某路由器路由表不含吓一跳的信息,则该路由器会丢掉这个数据包并生成一个新的ICMP协议数据包反馈给发送端,告诉它发送失败已丢包和自己不知道下一跳(没有去这个网段的路径)去哪。对于这种不可到达的数据包,由于即使收到了ICMP回馈,ping的结果是无法访问目标主机
而对于可以到达,但是返回数据包过程中,回来的某个路由器出现问题或者路由表无合法路径,则数据包无法送回,此时由于发送端一直等待,在等待一段时间后就会认为等待时间过长,数据包已丢包。此时的ping结果是请求超时。
如图,我们看到了有三个数据包请求超时,数据包到了目的地,没回来。而第一个返回的消息,来自192.168.80.1并不是我们ping的192.168.80.128,也就说数据包没有到达目的地。
当然,我们网络排错是从低到高层排错,在检查网络层错误之前,应该进行物理层和数据链路层的排错。物理层的排错最简单,检查线路(重新插拔网线,水晶头接线方式,线路是否断路等),数据链路层(网络是否欠费,上网账号密码是否一致,MAC地址是否冲突等)。
静态路由就是管理员告诉路由器到指定网段下一跳指定了谁,路由器接入网络后只知道它直连的那些网段,没有直连的网段都不知道。如果要实现全网畅通,那么网络中的所有路由器都要知道到每一个网段如何到达。
图中就有4个网段,对R1而言,他知道网段1和网段2之间数据包如何转发,但是R1不知道怎么到网段3和网段4。此时管理员需要告诉R1,如果要到网段3和4,那么下一跳给R2。同理对于R2,它知道如何转发网段23之间的数据,所以需要告诉它去4网段下一跳给R3,去1网段下一跳给R1。以此类推。这样配置完后,对于每个路由器他们就都知道去每个网段的下一跳是哪个路由了。
管理员需要在路由器上添加没有直连的路由。要想实现全网畅通,网络中的路由器必须知道到所有网段如何转发。
【计算机网络原理·实验·第六章】搭建静态路由环境
静态路由详细讲解也附在这个链接里了。
静态路由的添加需要管理员一条一条的指定,如果网络规模不大,那么尚可操作,但是如果网络规模变大,或者企业网络需要直接访问Internet,则工作量将大到不可能实现。因为因特网中有无数网段,无数路由,不可能对我管理的路由器的路由表进行一条一条的添加,路由器也没有足够大的空间存这些路由条目。
所以我们简化路由表势在必行。方法有两种:默认路由和路由汇总。
上图,如果用静态路由添加的话,每个路由器需要配置256个路由表,而每个城市又有256个网段,这还没有包括路由器间的点对点链路,网段数量庞大。
北京市添加去石家庄的的路由表数量之和:256x256
路由汇总:
我们发现,172.16.0.0/24~172.16.255.0/24可以超网合并成172.16.0.0/16。
那么对于北京市路由器R1,我们就可以只添加一条路由表,因为去往石家庄的线路是唯一的。
就可以使用 ip route 172.16.0.0 255.255.0.0 10.0.0.2
对于城市之间的链路,利用超网的想法来进行简化,可以将一个路由表的效率大大提高。当然,这里只是使用了超网的概念,并不是将他们进行了超网合并。这样对于每一个路由,我们只需要添加一条路由表。
北京市添加去石家庄的的路由表数量之和:256 x256 = 256
如果是这种情况,石家庄的网段分布更大后,我们仍然可以用同样的方式合并,将172.0.0.0/16~172.255.0.0/16 合并成 172.0.0.0/8。
路由汇总成功的条件:区域内分配的地址连续。地址块给了物理位置连续的网段。
路由汇总例外:如图,有一个172.16.10.0/24网段不在石家庄,在北京。这种情况是仍然可以汇总的,只不过路由配置多写一条命令。告诉它这一个网段例外,即可。
顺序无所谓,命令先写哪一条都可以。
当数据包到达R1时,他会先判断子网掩码长的那一个路由表来决定去向。如果先判断子网掩码短的一项,则例外路由表永远用不上。
知识贵在灵活,我们合并路由表可以只通过子网掩码前移几位来合并一个不大的规模的IP地址,而并不一定一次合并一整个大网段。
比如我们可以通过子网掩码前移一位合并2台设备,也可以前移两位合并4台设备,前移3位合并8台设备。当然这些设备的IP地址是由要求的,要满足超网合并的条件。
图中就是应用的典例。
全球最大的网段:0.0.0.0/0 是全球最大的网段,包括了全球所有的网段。
子网掩码为0.0.0.0,网段为0.0.0.0。这条路由就叫默认路由。
如果路由器上有这样几条命令:
那么当一个数据包到达后,按照子网掩码长度进行判断,子网掩码越长判断的优先级越高。其余没有特别指定的网段都走默认路由。
对于任意一个路由器,它知道与自己直连的网段如何转发,需要人工指定不与其直连的网段。而对于网络末端的路由器(树状结构的叶节点),它的路由可以用一条命令来涵盖所有路由表。用默认路由来指定因特网。
如图,对于图中RB而言,转发给10.1.0.0/24和RC的接口是直连的,也就说它的路由表里默认已经写上了这两条。那么我只需要写一条默认路由,不管去哪的数据包,只要不是去这两个网段,那么下一跳一定是C。
同理对于D而言,只要不是去C和10.4.0.0/24的,下一跳一定转发给C,配置路由表也只需要一条命令。
对于C而言,直连ABD,手动添加去10.1.0.0和10.4.0.0的路由表后,其余所有去向数据包都需要转发给A。
对于A而言,手动添加去10.1.0.0和10.4.0.0和B和D的路由表后,其他的都是去因特网的命令,也是用默认路由一条就可以涵盖。
即便网络没有接入因特网,我们也可以用默认路由来指定大多数网段。
环状结构使用默认路由,能用最简单的配置方法让网络通,但是可能在效率上会出现问题。比如A和F通信,需要绕一个大圈发数据包,返回的数据包是最佳路径而发送的数据包是最差路径。
如图,这种配置可以让AB网络互通吗? 可以。
A发送数据给B,A发现和B不在同一网段,发给路由器RA。RA没有找到合适的路径选择默认路由发给RB,RB与B所在网段直连,将数据包交给B。然后B返回数据包到RB,RB没有去A的最佳路径选择默认路由转发给RA,RA与A直连转发给A。这样就完成了AB间通讯,但是问题也随之而来。
如果Aping一个不在这两个网段下的计算机,比如1.1.1.1。那么会发生什么呢?
A发送数据给未知网段,转发给路由器RA走默认路由,RA发给RB。RB也不知道这个网段怎么走,通过默认路由转发给RA。进入死循环。如此往复,数据包会在一条线路上不断往返永不前进。
数据包有一个指标是TTL,一般默认是128,每过一个路由器TTL值-1.当TTL值为0判定该数据包出现问题,丢包。正因为有TTL这种机制,才能保证数据包出现这种死循环的情况下能够删除在网络中的流量,否则这种无效信息会一直占据带宽影响整体通信效率。
这样的情况同样会出现在环路上。上上个图如果试图访问不在记录网段的计算机,也会出现死循环的情况。
然后试着分析一下上图中每一种级别的路由器至少要加多少路由表。
不同的OS上都有默认的路由表,只不过平常不太关注。
我们可以在cmd里输入route print 命令来查看计算机的路由表。
1.计算机网关就是默认路由
打开虚拟机,然后用cmd输入route print命令。
网关就是对于当前位置的下一跳是谁。
不填网关,也就没有对应的默认路由了。
2.计算机网络连通性与路由表的关联
计算机是可以手动添加路由表的,路由表的添加命令可以通过route /?来查看
可以使用
route add 目标网段 子网掩码 网关 -参数 来写
route delete 目标网段 子网掩码
分析一下下面的场景。
web服务器的本地连接的(网关)默认路由应该指向哪一边?一般而言web服务器与外界网络交互更多,所以默认路由添加到右边即可,但是添加后右边的路由器又没有到私网(左边路由器左接口的网段)的路由表,那么他需要把数据包给web服务器然后web服务器转发给数据库。
这种情况下,web服务器满足上述要求的命令就是:
route add 172.16.0.0 mask 255.255.255.0 132.108.10.254 -p
指向数据库的路由表
route add 0.0.0.0 mask 0.0.0.0 132.108.10.1 -p
默认路由
然后我们来思考一个问题,网关其实就是某个网段直连的路由器的某一个接口,那么对于这个路由器接口,它的网关应该写什么?它自身吗?或者说这里的路由器改为一台有两个网卡的电脑,一个网卡接交换机,交换机接一个局域网;一个网卡接路由器连接互联网,那么对于这台设备接交换机的网卡,它的网卡怎么写?
==>什么都不写,不加网关。网关是下一跳的地址,而对于网关而言,如果你写自己,它的下一跳给自己,数据包就出不去了。所以这里就不用写,意味着这台计算机或路由器有一个默认路由,可以指向互联网。
如果瞎写了一个路由来充当网关(0.0.0.0 0.0.0.0 192.168.80.100【不存在的地址】),这么写的话,作为网关,这是数据包的流向之一,而网络会自动负载均衡,对于这台设备他会认为自己有两条等价的通向互联网的路径,那么如果这时交换机上的设备访问互联网,发送数据包过来,因为负载均衡会有一半的数据包发给不存在的网关而丢包,另一边传输成功。得益于传输层的可靠传输,丢包的数据会重传,重传仍然会分流一半给不存在的网关,也就说每次数据包的重传都只有原效率的一半而且每次重传必定会丢一半的包导致下一次重传,会导致网速很慢。这里的网速慢并不是因为网络拥堵,而是因为路由表配置出现了问题。
网络排错案例
如图ApingB不通,但是Aping路由器的两个端口都通,路由器直连两个网段又不需要路由表,且B ping 路由器也通。那么问题在哪呢?
==>B没有配置网关。也就说数据包能够到达B但是返不回来,因为数据包到B之后没有网关出不去,即便是直连,计算机也不知道怎么转发这个数据包给路由器。
排错时,IP、子网掩码、网关都是很重要的一项。而排错的中心思想就是数据包有去有回。
实验验证:
修改PC2的网关到无。然后模拟上述的情况,发现确实出现了这种问题,PC1ping通路由,甚至可以ping通80网段的网关,唯独ping不通PC2。是因为PC2没有网关。数据包返回时出现了问题。
我们是用抓包工具来验证想法。
可以看到PC2确实收到了来自PC1的数据包,但是他想返回时,需要返回到网关255.255.255.0,他开始询问并且发现并没有这个网关。
这样看更加直观,我们发现收到的和返回的数据包是相等的,但是接收端却接收不到,再看下面的大量ARP协议就知道没有找到合适的出口,一直等待到数据包被丢弃。由此可见网关的重要作用已经不可忽视性。