#####################
#####################
分层检查
从物理层检查,查看端口状态来排除接口、线缆问题
查看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下一跳就是默认路由,查看位置就是下图:
对于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口
####################################
####################################
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 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 on eth0
[root@centos6 ~]#
6、上面可以看到下一跳172.16.1.2的MAC地址并没有获取到,所以说,就验证了问什么ping不通,就是因为不知道目标MAC地址,所以无法封装,也就无法将数据包发出去了。
所以说路由表是非常重要的!!!