路由(选择最优路径)
跨越从源主机到目标主机的一个互联网络来转发数据包的过程
路由器不会广播,没有时会丢弃。
路由表可学习可配置。
跨网段才需要路由器,本网段不需要路由器。
路由器的工作原理
在要发送的主机中,要先封装数据,在网络层中,封装的数据头部中,源IP地址是1.1,目的IP地址是4.1.发送的主机要发送数据时,怎么知道要经过路由器呢?主机中也有路由表(主机可以工作在每一层),主机要发送数据时也要看自己的主机表,怎么看主机的路由表呢?如下:
route -n
[root@centos—text ~]# route -n
Kernel IP routing table
Destination//目的IP Gateway //下一跳Genmask//子网掩码 Flags Metric Ref Use Iface
169.254.0.0 0.0.0.0 255.255.0.0 U 1002 0 0 eth0
172.16.0.0 0.0.0.0 255.255.0.0 U 0 0 0 eth0
[root@centos—text ~]#
下一跳为0.0.0.0表示没有下一跳,不需要通过路由器,属于本网段通信。
在linux中配路由:route add default gw 172.16.255.254
删除路由为:route del default gw 172.16.255.254
[root@centos—text ~]# route add default gw 172.16.255.254
[root@centos—text ~]# route -n
Kernel IP routing table
Destination Gateway Genmask Flags Metric Ref Use Iface
169.254.0.0 0.0.0.0 255.255.0.0 U 1002 0 0 eth0
172.16.0.0 0.0.0.0 255.255.0.0 U 0 0 0 eth0
0.0.0.0 172.16.255.254 0.0.0.0 UG 0 0 0 eth0
[root@centos—text ~]#
总之,当主机或路由器需要发送数据时,会将数据的目的ip与本机的路由表的网段匹配,匹配成功会将数据发往相应的接口或下一跳,匹配不成功会丢弃。其中,目的ip为0.0.0.0表示可以匹配所有网段。
路由表的条目,一行是一条路由表。可以是网段对应接口,也可以是网段对应下一跳。其中,接口是本路由器的接口,下一跳是下一个路由器与本路由器相连的接口IP地址(同一网段的)。每经过一跳TTL都会减一。
[root@centos—text ~]# route add default gw 172.16.255.254
[root@centos—text ~]# route -n
Kernel IP routing table
Destination Gateway Genmask Flags Metric Ref Use Iface
169.254.0.0 0.0.0.0 255.255.0.0 U 1002 0 0 eth0
172.16.0.0 0.0.0.0 255.255.0.0 U 0 0 0 eth0
0.0.0.0 172.16.255.254 0.0.0.0 UG 0 0 0 eth0
[root@centos—text ~]# ping 192.168.1.1
PING 192.168.1.1 (192.168.1.1) 56(84) bytes of data.
From 172.16.3.36 icmp_seq=2 Destination Host Unreachable
From 172.16.3.36 icmp_seq=3 Destination Host Unreachable
From 172.16.3.36 icmp_seq=4 Destination Host Unreachable//这是目标主机不可达,有0.0.0.0可以匹配到
From 172.16.3.36 icmp_seq=5 Destination Host Unreachable
From 172.16.3.36 icmp_seq=6 Destination Host Unreachable
From 172.16.3.36 icmp_seq=7 Destination Host Unreachable
^C
— 192.168.1.1 ping statistics —
10 packets transmitted, 0 received, +6 errors, 100% packet loss, time 9463ms
pipe 3
[root@centos—text ~]# route del default gw 172.16.255.254
[root@centos—text ~]# route -n
Kernel IP routing table
Destination Gateway Genmask Flags Metric Ref Use Iface
169.254.0.0 0.0.0.0 255.255.0.0 U 1002 0 0 eth0
172.16.0.0 0.0.0.0 255.255.0.0 U 0 0 0 eth0
[root@centos—text ~]# ping 192.168.1.1//这是网络不可达,没有可以匹配的路由了
connect: Network is unreachable
[root@centos—text ~]#
网关就是下一跳。
Windows中查看路由表如下:
route print
发送数据的主机的数据怎么到达第一个路由器呢?
需要用到ARP地址解析协议(IP地址解析为MAC地址),广播得到MAC地址。MAC地址是数据链路层的。
Ip是在主机的路由表里知道的,如图,假设源地址的ip的2.0网段,目标地址的ip是1.0网段,在主机里肯定有一条到达1.0网段的路由可以匹配,1.0网段的下一跳是2.1,这时,想要将数据发送到1.100需要经过2.1转发过去,我们现在知道了2.1这个IP地址,但是不能将2.1作为目标地址封装,不然数据就发送给路由器了,就不能到达1.100了,我们现在知道2.1,但是不能将数据发给2.1,因为二层交换机,数据链路层只能识别MAC地址,所以在数据链路层封装的头部源地址应该是aa,目的地址应该是bb,bb是根据2.1地址和ARP地址解析协议得到的,ARP协议是根据广播(在本广播域中)得到的bb,ARP在2.0网段内广播我要2.1ip的MAC地址,得到bb。
路由器接收到数据后,先解封装,发现MAC地址是自己的,所以它将数据交给网络层进行处理,发现目的ip为1.100,然后查找路由表,将数据发送给1.100。
整个过程如下:
路由表的形成
路由表
路由器中维护的路由条目的集合
路由器根据路由表做路径选择
通信的过程可以说是封装与解封装的过程。
下面是一个封装与解封装完整的例子。
例:在172.16.50.59中向172.16.50.60中发送数据。
封装过程如下:
1、在网络层封装ip地址时,源IP地址为172.16.50.59,目的IP地址为172.16.50.60
2、在数据链路层封装源MAC地址时,怎么判断源MAC地址该封装哪个网口的MAC 地址呢?
查看路由表,通过路由表可以知道,本机ip和目的地址ip是不是同一个网段(即要知道他们的网络地址),50.59知道自己的IP地址和子网掩码,所以50.59知道自己的网段为172.16.0.0/16,此时50.59需要判断50.60是哪一个网段的IP地址,此时50.59选择用自己本机的子网掩码和50.60得到50.60的网段是172.16.0.0/16,然后50.59去路由表中找相对应的目的网段为172.16.0.0/16的路由,
查找到gateway为0.0.0.0(即没有下一跳,属于本网段通信),相对应的网口为eth0,所以此时在数据链路层应该封装的源MAC地址是eth0的MAC地址,查看eth0的MAC地址如下:
那么目的MAC地址呢?
没有下一跳的就是本网段通信,本网段通信直接封装目的IP地址的MAC地址,借助ARP广播获取172.16.50.60的MAC地址,获取后,封装到数据链路层的目的MAC 地址中。
ARP广播获取MAC地址后,会在本机内存中缓存MAC对应的IP地址,查看172.16.50.59的ARP缓存表如下:
所以在发送主机50.59中三层,二层都封装好了,可以转发出去了
总结一下:在发送方,查找路由表时,有下一跳时就封装下一跳的MAC地址(借助ARP广播获取MAC地址),没有下一跳(即下一跳为0.0.0.0,在同一个广播域内)时,就封装目的IP地址的MAC地址。
其实,在封装网络层之前它就已经查看路由表了,通过查看路由表知道要封装哪一个源ip地址,即封装哪一个网口的IP地址。再查看路由表之前已经得到了目的IP地址的网段,根据网段去路由表中匹配,根据匹配结果得到相应的接口名称,然后得到源IP地址和源MAC地址。
解封装过程如下:
172.16.50.60接收到数据后,要解封装(从下往上走的过程)。
1、首先,50.60查看数据链路层的目的MAC地址,发现就是自己的MAC地址,所以接着进一步解封装,把MAC头部去掉,剩下的交给网络层处理。
2.网络层查看目的IP地址发现是自己的IP地址,所以接着进一步解封装。后面的其他步骤我们还没有学。
配路由命令如下:
Route add default gw 172.16.1.2 //gw为下一跳,此时目的ip为0.0.0.0
查看ARP缓存表命令如下:
Linux:arp -an
Windows:arp -a
下一跳肯定和本机在同一个网段。
插一个例子,再讲一个封装解封装的例子,在172.16.50.60中ping192.168.1.1,此时50.60的路由表如下:
Ping192.168.1.1结果如下:
这个过程的封装和解封装过程如下:
在网络层,源IP地址为172.16.50.60,目的IP地址为192.168.1.1
由于在50.60的路由表中有一条目的地址为0.0.0.0的路由,可以匹配,
所以在数据链路层的源mac地址为172.16.50.60的接口eth0的MAC 地址
目的MAC地址为172.16.1.2的MAC地址(借助ARP广播)。但是我们查看arp缓存表得到:
可以发现没有172.16.1.2的MAC地址,所以无法完成封装,所以ping192.168.1.1的结果为主机不可达。
为什么有时候用xshell远程登录,前一天还可以登录,第二天就显示密码错误了呢?
有可能是IP地址和别人的重复了,
在封装的时候通过ARP广播获取MAC地址时,两个相同ip都收到了广播,收到时间会有先后顺序,先收到的那个将自己的MAC地址发给了交换机,如果发送的是想连接的MAC地址,就可以正常通信了,如果收到的是不正确的MAC地址,就会出错了。这种错误是可以防止的,可以通过手工配置MAC地址,防止这种错误,如下:
手工配置MAC地址:arp --help / /可以查看arp帮助
arp -s IP地址 MAC地址
例如:
arp -s 172.16.50.60 00:df:ab:cd: //配置ARP
arp -d 172.16.50.60 //删除ARP
ARP工作时,如果缓存中有了相应的MAC地址,就不会去广播了,所以缓存的作用就是提高速度。
在路由条目中,如果gateway(下一跳)为0.0.0.0,说明没有下一跳,就会通过arp广播获取目的ip的MAC地址
在路由条目中,如果gateway(下一跳)不为0.0.0.0,说明有下一跳,就会通过arp广播获取下一跳ip的MAC地址,获取到的MAC地址就会作为目的MAC地址。
下一跳地址肯定和本机ip在同一个网段。
路由表非常重要,路由表正确才可以封装成功,封装成功才可以通信。
路由器根据路由表收到数据包,然后转发,主机也是。
直连路由没有下一跳(下一跳为0.0.0.0),直连路由属于直连网段。
路由表的形成
直连网段
配置IP地址,端口UP状态,形成直连路由
直连网段(本网段)有直连路由。
只要给网口配置上IP地址,激活网口就会生成直连路由。
非直连网段
非直连网段才需要动态路由(学习)或者静态路由(配置)。
查看路由表用命令route -n //n不要少
如下:有三条直连路由
只要给网口配置上IP地址,激活网口就会生成直连路由,如下:
静态路由
由管理员手工配置的,是单向的
缺乏灵活性
默认路由
当路由器在路由表中找不到目标网络(具体网段)的路由条目时,路由器把请求转发到默认路由接口
路由的优先级,由高到低:直连路由,静态路由,动态路由,默认路由。
下一跳地址一定要配本网段的地址,不然配不上,如图:
本网段有172.16.0.0/16,172.17.1.2不属于本网段,所以配不上这条路由。
在路由表中,第一列目的地址如果是0.0.0.0,表示默认路由。
配路由操作如下:
Linux配置默认路由(默认网关):
route add default gw 172.16.1.2(下一跳IP地址,也叫网关地址)
要永久配置默认路由:
需要修改配置文件
方法1. 可以在网口的配置文件里面加
方法2. 可以在/etc/sysconfig/network(建议在这个文件加)加
加的内容为:
GATEWAY(必须大写,区分大小写)=IP地址
建议使用方法二配置默认路由,因为默认路由的优先级最低,只配一条就可以了。
配置静态路由如下:
route add -net 目的IP地址 netmask 目的IP地址子网掩码 gw 下一跳
例如:route add -net 192.168.1.2 netmask 255.255.255.0 gw 172.16.1.5
如果服务器所在的网络只有一个出口,只配置一条默认路由就可以了。
路由器转发数据包的封装过程
交换与路由对比
路由工作在网络层
根据“路由表”转发数据
路由选择
路由转发
交换工作在数据链路层
根据“MAC地址表”转发数据
硬件转发
故障排查
分层检查
物理层检查:线有没有接好,如果线接好了检查有没有激活网口;
数据链路层:主要看arp缓存表,看要访问的主机对应的IP地址是不是对的;
网络层:看ip是否正确,子网掩码是否正确;看路由表有没有对应的可匹配的路 由,如果有,下一跳对应的是否正确;
分段检查
将网络划分成多个小的段,逐段排除错误。
先看本网段是否可以通信,
先分层检查,看本机是否正常(检查三层是否正确),如果正常,看网段是否正确,比如ping网关看是否可以ping通,要到达其他网段肯定要可以ping通网关才可以。如果ping通了,说明本网段没有问题,问题在其他网段。
在检查过程中,可以不断ping各个下一跳,如果能ping通,说明从主机到下一跳之间网络正常。
例如:
检查如图的故障:
在pc1首先ping路由器R1的s0IP地址,如果通的话,说明从主机到路由器R1没问题,否则pingpc2的IP地址,如果通,说明主机正常,问题在路由器R1。然后ping外网一个地址,例如baidu.com,如果通说明公网没问题,如果不同说明公网有问题。剩下的检查和之前的一样,重复操作即可。
Icmp协议,就是平时我们用的ping命令,用来检查网络故障的协议。
网络层主要的协议就是ARP协议,ICMP协议。