基本的网络故障排查、路由器工作原理、任意两台主机互相通信

#####################

网络排查

#####################

基本思路

  • 分层检查
    从物理层检查,查看端口状态来排除接口、线缆问题
    查看ip地址和路由灯配置是否正确

  • 分段检查
    将网络划分成很多歌小的段,逐段排除错误

步骤

1、首先查看网线是否接好
使用ethtool命令,查看打印结果中的“Link detected”项目是否是“yes”

[root@centos6 ~]# ethtool eth0
Settings for eth0:
	Supported ports: [ TP ]
	Supported link modes:   10baseT/Half 10baseT/Full 
	                        100baseT/Half 100baseT/Full 
	                        1000baseT/Full 
	Supported pause frame use: No
	Supports auto-negotiation: Yes
	Advertised link modes:  10baseT/Half 10baseT/Full 
	                        100baseT/Half 100baseT/Full 
	                        1000baseT/Full 
	Advertised pause frame use: No
	Advertised auto-negotiation: Yes
	Speed: 1000Mb/s
	Duplex: Full
	Port: Twisted Pair
	PHYAD: 0
	Transceiver: internal
	Auto-negotiation: on
	MDI-X: off (auto)
	Supports Wake-on: d
	Wake-on: d
	Current message level: 0x00000007 (7)
			       drv probe link
	Link detected: yes
[root@centos6 ~]#

2、查看MAC地址
就是IP对应的MAC地址对不对
(大部分情况下是对的,档出现IP冲突的时候,就可能对应出错了)


[root@centos6 ~]# arp -n
Address                  HWtype  HWaddress           Flags Mask            Iface
172.16.2.34              ether   2c:56:dc:9c:95:cc   C                     eth0
172.16.12.99             ether   00:0c:29:fa:b5:2f   C                     eth0
[root@centos6 ~]# 

也就是这里的IP地址和ifconfig中的MAC地址一致的话,那么就说明我们的MAC地址没有出错,也就是并没有出现IP地址冲突的问题。

3、网路层

(1)查看ip、子网掩码是否正确

首先我们查看windows的ip地址(下图是在windows中的打开网络适配器,找到本地网口,右键属性中的TCP/IPv4)
在这里插入图片描述
在上图中我们可以看到windows的IP地址是172.16.213.31,子网掩码是255.255.0.0,简单的说,上图中可以看到,windows将子网掩码和IP地址都分为四段,那么子网掩码中有几段255,ip地址就需要有几段与之对应,也就是说首先我们Linux的子网掩码必须是255.255.0.0,其次更重要的是,Linux的IP地址必须是172.16开头,后面两段可以随意写。
这里查看IP地址和子网掩码应用的是网络位、主机位的原理,我会在后期的博文中详细介绍。

(2)查看路由表

[root@centos6 ~]# 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@centos6 ~]# 

首先根据上面的ip地址的判定,查看路由表中的ip是不是以172.16开头,(这里不是一定是172.16开头,具体以您的windows主机ip和子网掩码为主)

如果有默认路由的话,看一下默认路由的GATEWAY下一跳是不是与当前主机连接的路由器的IP地址

GATEWAY下一跳就是默认路由,查看位置就是下图:

在这里插入图片描述
(3)ping命令

对于ping命令不论在Linux还是Windows系统中都可以操作,就是看一下当前ip地址是否冲突。当关闭Linux的网口的时候,之前使用的ip依然能够ping通的话,说明这个ip在当前局域网中有其他用户正在使用,俗称的“IP冲突”。如果不能ping通,说明ip是可用的。

下面是windows中ping一个IP
在这里插入图片描述
下面是在linux中ping一个IP
在这里插入图片描述

但是一般情况下不会出现这方面的问题

(4)traceroute命令

[root@centos6 ~]# traceroute 172.16.12.11
traceroute to 172.16.12.11 (172.16.12.11), 30 hops max, 60 byte packets
 1  172.16.12.11 (172.16.12.11)  0.561 ms  0.392 ms  0.311 ms

###########################

路由器工作原理

###########################

举例

两台linux之间互相通信

在这里插入图片描述
1、首先数据包要从1.1主机发送出来,发给4.1主机,那么1.1在发出去之前要封装好数据,在网络层用到的是IP协议,IP头部中有源IP和目的IP,源IP是1.1,那么目的IP是什么?
(1)首先数据包从1.0主机发送给4.0主机,数据包不是直接从1.0发给4.0主机的,中间经过了多个路由器,那么1.0主机怎么知道数据包要先发给路由器呢?
(2)这时候就要看主机上面的路由表,不仅仅交换机上面有路由表,主机上也有路由表。因为主机可以工作在每一层,从应用层到物理层他都是支持的,也就是一个数据包在主机上面怎么转发出去,也要看他自己的路由表。
(3)查看主机路由表的方法是:

[root@centos6 01-15]# 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@centos6 01-15]# 

(4)路由表一行是一个条目
(5)一个网段对应下一个路由器的IP地址,我们把这个IP地址叫做下一跳的地址。也就是说,一个路由器就是一跳,经过一个路由器就是一跳,TTL就会减1
(6)那么路由器A的下一跳就是路由器B,下一跳的S0口的 2.2 IP地址是路由器A路由表中对应的IP地址。

注意:
而主机知道数据包发出来应该经过哪个路由器的真正原因是:
	①ARP协议,将IP地址转换为MAC地址的,IP我们可以再路由表中查看到。
	②数据包在发出之前封装的时候,在网络层会封装源IP和目的IP,在数据链路层会封装源MAC和目的MAC,那么源IP就是1.1,目的IP就是4.1。
源MAC地址是1.1主机的MAC地址,但是目的MAC地址是路由器A的MAC地址,而不是目标主机4.1的MAC地址,数据包每经过下一跳(也就
是每经过下一个路由器)就会解封装,将上一层的MAC打开识别,并在此封装给下一个路由器,所以,一定要注意IP和MAC在传输数据过程中
的区别。

2、路由器接收到数据包之后,会根据路由表中的路由条目找到数据包中的目的IP所在的网络地址。
3、如果能找到的话,就会从对应的数据包中转发出去。
4、如果找不到,就会丢弃,不会广播,这与交换机不同

在这里插入图片描述
5、路由器A根据路由表找到目标IP 4.1属于4.0网段,4.0网段在表中有,对应的是S0口,那么就转发数据到S0口
在这里插入图片描述
6、路由器B接收到数据包,看数据包的IP头部中的目的IP,查到是属于4.0网段,对应E0口,那么就将数据包转发到E0口

####################################

任意两台主机互相通信

####################################

同一个广播域下的两台Linux互相通信

A_Linux的IP:172.16.12.98
B_Linux的IP:172.16.12.99

1、首先Linux主机要看当前主机和目标主机是否是在同一网段
(1)12.98这台Linux要判断12.99这台主机在哪个网段,那么就要判断12.99的网络地址,虽然12.98不知道12.99的子网掩码,但是12.98会用本机的子网掩码,去算12.99的网络地址,可以得到12.98和12.99的网络地址都是一样的172.16.0.0这个网络地址,说明他们是在同一个网段。
2、接下来就是A_Linux发送数据包,那么就要看路由表,这样才知道怎么发送

[root@centos6 ~]# route -n
Kernel IP routing table
Destination     Gateway         Genmask         Flags Metric Ref    Use Iface
1.2.0.0         0.0.0.0         255.255.0.0     U     0      0        0 eth1
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@centos6 ~]# 

3、在路由表中文我们可以看到与172.16.0.0这个网络位匹配的路由条目,但是没有下一跳,这就说明是本网段通信。
4、发送数据包前的封装
(1)A_Linux发出数据包,前需要封装,那么封装包括IP地址和MAC地址。
(2)IP地址,包括源IP地址和目标IP地址
(3)MAC地址,包括源MAC地址和目标MAC地址
(4)首先数据包从A_Linux发送给B_Linux,先封装IP头部,源IP地址就是172.16.12.98,目标IP地址,就是172.16.12.99。
(5)第二步就是封装MAC头部,源MAC是A_Linux的MAC地址,而A_Linux给B_Linux发送数据包的时候,只知道当前主机(A_Linux)的MAC地址 (这里为什么看的是A_Linux的eth0的MAC地址,而不是eth1等等其他端口的MAC地址的原因是,在上面路由表中,最后一列“Iface”处我们可以看到本地接口是eth0,所以封装的就是eth0的MAC地址)

[root@centos6 ~]# ifconfig eth0 | grep "HWaddr"
eth0      Link encap:Ethernet  HWaddr 00:0C:29:55:F0:F2  
[root@centos6 ~]# 

(6)那么目的MAC呢?还是眼看路由表这里

[root@centos6 ~]# route -n
Kernel IP routing table
Destination     Gateway         Genmask         Flags Metric Ref    Use Iface
1.2.0.0         0.0.0.0         255.255.0.0     U     0      0        0 eth1
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@centos6 ~]#

(7)没有下一跳就是本网段通信,本网段通信就可以直接封装目的主机的MAC地址。
(8)那么如何得到目的主机的MAC地址?通过ARP广播获取,通过ARP获取之后,就会将缓存保存在本地中,那么通过arp -an命令就可以查看到这个缓存。

[root@centos6 ~]# arp -an
? (172.16.2.34) at 2c:56:dc:9c:95:cc [ether] on eth0
? (172.16.12.99) at 00:0c:29:fa:b5:2f [ether] on eth0
? (172.16.1.5) at <incomplete> on eth0
[root@centos6 ~]# arp -n
Address                  HWtype  HWaddress           Flags Mask            Iface
172.16.2.34              ether   2c:56:dc:9c:95:cc   C                     eth0
172.16.12.99             ether   00:0c:29:fa:b5:2f   C                     eth0
172.16.1.5                       (incomplete)                              eth0
[root@centos6 ~]# 

(9)这时候目的MAC也获取到了,IP和MAC全部都封装好之后,就可以转发出去了

不同网段之间的通信

1、我们配置一个默认路由

[root@centos6 ~]# route add default gw 172.16.1.2
[root@centos6 ~]# route -n
Kernel IP routing table
Destination     Gateway         Genmask         Flags Metric Ref    Use Iface
1.2.0.0         0.0.0.0         255.255.0.0     U     0      0        0 eth1
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.1.2      0.0.0.0         UG    0      0        0 eth0
[root@centos6 ~]# 

2、这时候我们去ping一个不在同一网段的IP地址

[root@centos6 ~]# ping 192.168.1.1
PING 192.168.1.1 (192.168.1.1) 56(84) bytes of data.
From 172.16.12.98 icmp_seq=1 Destination Host Unreachable
From 172.16.12.98 icmp_seq=2 Destination Host Unreachable
From 172.16.12.98 icmp_seq=3 Destination Host Unreachable
^C
--- 192.168.1.1 ping statistics ---
4 packets transmitted, 0 received, +3 errors, 100% packet loss, time 3556ms
pipe 3
[root@centos6 ~]# 

3、发现是不能ping通的
4、也是跟上面通网段的原理一样,源IP仍然是12.98,源MAC也是当前主机的MAC地址,但是目的IP是192.168.1.2,并且目的MAC并不知道
5、当前主机在给192.168.1.2这个主机发送数据包之前会封装,在网络层封装源IP和目的IP没有问题,但是在数据链路层封装MAC地址时,源MAC地址我们是知道的,但是目的MAC地址我们并不知道,要获取一个IP对应的MAc地址是需要通过ARP广播获取的,但是172.16.12.98和192.168.1.2并不在同一个广播域,因为他们的网段就不一样,那么在路由表中它匹配了默认路由,也就是说它是有下一跳的,并且下一跳一定与当前主机是在同一网段,那么ARP广播就会去获取下一跳的MAC地址

[root@centos6 ~]# arp -an
? (172.16.2.34) at 2c:56:dc:9c:95:cc [ether] on eth0
? (172.16.12.99) at 00:0c:29:fa:b5:2f [ether] on eth0
? (172.16.1.2) at <incomplete> on eth0
[root@centos6 ~]#

6、上面可以看到下一跳172.16.1.2的MAC地址并没有获取到,所以说,就验证了问什么ping不通,就是因为不知道目标MAC地址,所以无法封装,也就无法将数据包发出去了。

所以说路由表是非常重要的!!!
发布了33 篇原创文章 · 获赞 52 · 访问量 6万+

猜你喜欢

转载自blog.csdn.net/qq_44714603/article/details/88749922