前文中,我们提到的通信都是两台设备在同一个网段的情况。只要两台设备连接在一个LAN,即同一个二层交换机或者同一组级联的二层交换机上。那这些不同LAN之间的设备要怎么通信呢?
1 LAN与网段之间的关系
网段是针对IP地址而言,属于OSI七层模型中的第三层,而LAN位于OSI模型中的第二层。他们的关系是一一对应的,怎么理解呢?
如果两台设备连接的LAN不一样,往往他们的IP地址也属于不同的网段。如果两台设备的IP地址属于不同网段,往往他们连接的LAN也不一样。
当然了,如果我们强制把两台设备配置成同网段的IP,但接入不同的LAN,是可以生效,但是两者不会互通。如果我们强制把两台设备接入同样的LAN,IP地址配成不同的网段,是可以生效的,但两者也不会互通。
2 如何实现跨LAN的通信
如上图所示,我们使用路由器和三层交换机来实现跨LAN的通信。各个设备的IP地址、MAC地址、Gateway地址、对端设备接口、对端设备接口IP和MAC地址如下表所示。
仔细观察,可以发现设备的Gateway地址,都是同LAN下的路由器或者三层交换机接口地址,并且设备的Gateway一定是与自己在同一网段。
设备 | IP地址 | MAC地址 | GW地址 | 对端设备接口 | 对端设备接口IP | 对端设备接口MAC |
PC-A | 192.168.10.1 /24 | 1111.1111.1111 | 192.168.10.254 | RT-A: Gi0/1 | 192.168.10.254 | aaaa.aaaa.aaaa |
PC-B | 192.168.20.2 /24 | 2222.2222.2222 | 192.168.20.254 | RT-A: Gi0/2 | 192.168.20.254 | bbbb.bbbb.bbbb |
PC-C | 192.168.30.3 /24 | 3333.3333.3333 | 192.168.30.254 | SW: Gi0/1 | 192.168.30.254 | cccc.cccc.cccc |
PC-D | 192.168.40.4 /24 | 4444.4444.4444 | 192.168.40.254 | SW: Gi0/2 | 192.168.40.254 | dddd.dddd.dddd |
2.1 同网段下通信与跨网段通信对比
我们回想下,在同网段下的设备如何通信?发送方根据目标设备的IP地址查找自己路由表,发现到目标设备的Gateway为On-link,说明两者在同一网段。然后接着查找ARP表,寻找目标设备IP地址对应的MAC地址,没找到就广播,最后以目标设备MAC地址作为报文的目的MAC地址,目标设备IP地址为IP地址,把数据直接发送过去。
那如果跨网段呢? 其实跨网段也好、同网段也罢,都不会影响到终端设备的工作机制。发送方依然是先查路由表、再查ARP表,最后封装数据发送出去。不过不同的是。在同网段的情况下, 查找路由表的结果是到目标设备的Gateway为On-link,而在不同网段的情况下,到目标设备的Gateway通常是与自己在同LAN的路由器或者三层交换机的接口地址。当然了Gateway地址与终端设备IP地址得在同一网段。否则Gateway都与自己跨网段。
因此可以看出。终端要跨网段通信的前提是。终端设备的Gateway与自己是同网段。即同网段通信是跨网段通信的前提。
2.2 路由器实现跨LAN的通信
上左图的是用路由器实现跨LAN的通信拓扑,路由器RT-A通过Gi0/1和Gi0/2口分别连到两个不同的傻瓜交换机(LAN)上,其他条件如下:
(1)PC-A的IP地址为【192.168.10.1 /24】,网关为同一个LAN上的RT-A的Gi0/1口的IP地址【192.168.10.254】,两者IP地址都属于同一网段【192.168.10.0 /24】。
(2)PC-B的IP地址为【192.168.20.2 /24】,网关为同一个LAN上的RT-A的Gi0/2口的IP地址【192.168.20.254】,两者IP地址都属于同一网段【192.168.20.0 /24】。
(3)RT-A的Gi0/1口IP地址为【192.168.10.254 /24】,作为PC-A的Gateway;Gi0/2口IP地址为【192.168.20.254 /24】,作为PC-B的Gateway。
在路由器上给接口配置IP地址,命令如下(以思科路由器为例):
RT-A#show running-config interface gigabitEthernet 0/1
Building configuration...
Current configuration : 71 bytes
!
interface GigabitEthernet0/1
ip address 192.168.10.254 255.255.255.0
RT-A#show running-config interface gigabitEthernet 0/2
Building configuration...
Current configuration : 71 bytes
!
interface GigabitEthernet0/2
ip address 192.168.20.254 255.255.255.0
可以发现,IP地址是直接配置在路由器的物理接口上,不过有时候我们也会把IP地址配置在虚拟子接口下(虚拟子接口是建立在物理接口上),后面文章我们再讲。
2.3 三层交换机实现跨LAN的通信
上右图的是三层交换机实现跨LAN的通信拓扑,路由器SW-A通过Gi0/1和Gi0/2口分别连到两个不同的傻瓜交换机(LAN)上,其他条件如下:
(1)PC-A的IP地址为【192.168.30.3 /24】,网关为同一个LAN上的SW-A的Gi0/1口的IP地址【192.168.30.254】,两者IP地址都属于同一网段【192.168.30.0 /24】。
(2)PC-B的IP地址为【192.168.40.2 /24】,网关为同一个LAN上的SW-A的Gi0/2口的IP地址【192.168.40.254】,两者IP地址都属于同一网段【192.168.40.0 /24】。
(3)SW-A的Gi0/1口IP地址为【192.168.30.254 /24】,作为PC-A的Gateway;Gi0/2口IP地址为【192.168.40.254 /24】,作为PC-B的Gateway。
在三层交换机上给接口配置IP地址,命令如下(以思科三层交换机为例):
SW-A#show running-config interface gigabitEthernet 0/1
Building configuration...
Current configuration : 81 bytes
!
interface GigabitEthernet0/1
no switchport
ip address 192.168.30.254 255.255.255.0
SW-A#show running-config interface gigabitEthernet 0/2
Building configuration...
Current configuration : 81 bytes
!
interface GigabitEthernet0/2
no switchport
ip address 192.168.40.254 255.255.255.0
可以发现,三层交换机的接口配置相比路由器多了一条命令【no switchport】,目的是改变交换机的接口工作模式为路由模式(路由模式下,才可以配置IP地址),默认为交换模式(交换模式下,可以配置access vlan或者trunk vlan),路由器的接口只能工作在路由模式。
不过一般三层交换机的接口都会采用默认的交换模式,这里只是举例说原理。至于IP地址一般是配置在interface vlan下面,后面文章会讲。
3 通信流程分析(PC-A到PC-B,PC-C到PC-D同理)
其实三层交换机和路由器处理机制一样的,只是接口配置略有不同,本文就以路由器处理为例。
(1) PC-A ---> RT-A
当我们在PC-A上配置了gw以后, 路由表会新增一条,如下所示: 最后一行就是我们配置gw以后, 新增的路由表项.
PC-A >route print -4
Network Destination Netmask Gateway Interface Metric
192.168.10.0 255.255.255.0 On-link 192.168.10.1 291
192.168.10.1 255.255.255.255 On-link 192.168.10.1 291
192.168.10.255 255.255.255.255 On-link 192.168.10.1 291
0.0.0.0 0.0.0.0 192.168.10.254 192.168.10.1
当PC-A要发送数据到PC-B时,先根据PC-B的地址【192.168.20.2】查找自己路由表,发现它匹配了【0.0.0.0 / 0.0.0.0】这条默认路由.对应的Gateway为【192.168.10.254】。默认路由是当没有到达目标设备的明细路由【即目标设备IP地址所在的网段的路由】时,就会走的路由,而且默认路由一定是【0.0.0.0 / 0.0.0.0】这样子。
接下来PC-A根据Gateway地址【192.168.10.254】,查找自己的ARP表,找到Gateway对应的MAC地址【aaaa.aaaa.aaaa】,如下所示。找不到就广播, 前面讨论过, 这里不展开。
PC-A > arp -a
Interface: 192.168.10.1 --- 0x5
Internet Address Physical Address Type
192.168.10.254 aa-aa-aa-aa-aa-aa dynamic
因此PC-A封装数据,像这样【aaaa.aaaa.aaaa】【1111.1111.1111】【192.168.20.2】【192.168.10.1】【DATA】。
以RT-A: Gi0/1口的MAC地址为目的MAC地址,PC-A的MAC地址为源MAC地址,以PC-B的IP地址为目的IP地址,PC-A的IP地址为源IP地址,然后通过傻瓜交换机把数据给到Gateway,即路由器RT-A。
可以看到在数据包中的目的IP地址和目的MAC地址不是同一个设备的, 怎么理解?
这就是我们本系列文章的第一篇提到的,有了IP地址为何还要MAC地址。
在此处可以看到通过MAC地址实现数据的LAN内部通信, 数据从PC-A到RT-A.。通过IP地址实现数据跨LAN的通信,数据从PC-A到PC-B。这两处的数据都是同一个数据,只是他们的目的MAC地址改变了而已。
(2) RT-A ---> PC-B
当RT-A给接口Gi0/1和Gi0/2配置了IP地址以后, 会在本地生成路由表,如下所示.
caowen-c2911#show ip route
C 192.168.10.0/24 is directly connected, gi0/1
L 192.168.10.254/32 is directly connected, gi0/1
C 192.168.20.0/24 is directly connected, gi0/2
L 192.168.20.254/32 is directly connected, gi0/2
当RT-A从Gi0/1口收到PC-A给PC-B的数据帧时,先解封装二层头部,发现目的MAC地址是自己的Gi0/1口的MAC地址,于是接受此数据帧,并把解封装后的数据包给到IP引擎,否则会丢弃。
IP引擎收到没有二层头部的数据包(有二层头部的叫数据帧),解封装三层头部,发现目的IP地址不是自己任何一个接口的IP地址,于是把数据给到路由引擎。 如果目的IP地址是自己某一个接口的地址,说明数据包是给路由器自身的,而不是让路由器转发。那么IP引擎会把数据给到路由器的上一个层级的引擎,而不是路由引擎。
路由引擎根据数据包的目的IP地址192.168.20.2,查找路由表,匹配了上图中的第三条路由,发现该目的地与自己gi0/2口直连。类似于PC-A的Gateway为On-link,只是不同设备表示方式不一样,其实都是表示直连路由。
路由器于是根据IP地址192.168.20.2【PC-B的IP地址】,查找本地的ARP表,找到PC-B的MAC地址,如下所示。 如果没有,就广播。
caowen-c2911#show ip arp
Protocol Address Age (min) Hardware Addr Type Interface
Internet 192.168.10.1 1 1111.1111.1111 ARPA gi0/1
Internet 192.168.20.2 1 2222.2222.2222 ARPA gi0/2
因此RT-A会重新封装数据,像【2222.2222.2222】【bbbb.bbbb.bbbb】【192.168.20.2】【192.168.10.1】【DATA】。
以PC-B的MAC地址为目的MAC地址,自己Gi0/2口的MAC地址为源MAC地址,PC-B的IP地址为目的IP地址,PC-A的IP地址为源IP地址封装此数据,然后通过Gi0/2口转发出去。
可以发现数据包中的源MAC地址和源IP地址不是同一设备,目的MAC地址和目的IP地址也不是同一设备, 原因前面解释了。
不过这里要提的是,无论数据的二层头部源和目的MAC地址如何变,源和目的IP地址都没有变,数据的源IP地址一直都是是PC-A,目的IP地址也一直都是是PC-B。这也好理解,如果源或者目的IP地址都变了,那这也就不是PC-A到PC-B的数据了。
还有一点, 数据的源和目的MAC地址一定处于同一个LAN,也就是说MAC地址的作用范围是LAN内部,不能像IP地址一样,既可以LAN内部使用,也可以跨LAN使用。
这一点我们本系列第一篇也说到了,MAC地址像身份证,只能在国家内部使用,IP地址像护照,可以国际上使用,当然国家内部也可以使用。
(3) PC-B ---> RT-A
PC-B从RT-A的Gi0/2口收到数据帧后,显示二层解封装,发现目的MAC地址为自己的MAC地址,于是继续三层解封装,发现目的IP地址是自己,于是交给对应引擎处理。
处理完毕后,回复数据给PC-A,根据PC-A的IP地址192.168.10.1查找路由表,发现到PC-A的Gateway为192.168.20.254。
PC-B >route print -4
Network Destination Netmask Gateway Interface Metric
192.168.20.0 255.255.255.0 On-link 192.168.20.2 291
192.168.20.1 255.255.255.255 On-link 192.168.20.2 291
192.168.20.255 255.255.255.255 On-link 192.168.20.2 291
0.0.0.0 0.0.0.0 192.168.20.254 192.168.20.2
于是根据Gateway地址192.168.20.254查找ARP表,发现Gateway的MAC地址为bbbb.bbbb.bbbb。
PC-B > arp -a
Interface: 192.168.20.2 --- 0x5
Internet Address Physical Address Type
192.168.20.254 bb-bb-bb-bb-bb-bb dynamic
因此封装数据,像这样【bbbb.bbbb.bbbb】【2222.2222.2222】【192.168.10.1】【192.168.20.2】【DATA-Reply】。
通过傻瓜交换机把数据给点RT-A。
(4) RT-A ---> PC-A
RA-A通过Gi0/2口受到回复的数据帧,而是二层解封装发现目的MAC地址为自己的Gi0/2口MAC地址,继续三层解封装发现目的IP地址为192.168.10.1,不属于自己的任何接口地址,因此把数据给路由引擎。
RT-A路由引擎收到此数据后,根据目的IP地址192.168.10.1查找路由表,找到到此地址的目标设备是直连在自己Gi0/1口上。
caowen-c2911#show ip route
C 192.168.10.0/24 is directly connected, gi0/1
L 192.168.10.254/32 is directly connected, gi0/1
C 192.168.20.0/24 is directly connected, gi0/2
L 192.168.20.254/32 is directly connected, gi0/2
于是根据IP地址192.168.10.1,查找ARP表,发现目的MAC地址为1111.1111.1111。
caowen-c2911#show ip arp
Protocol Address Age (min) Hardware Addr Type Interface
Internet 192.168.10.1 1 1111.1111.1111 ARPA gi0/1
Internet 192.168.20.2 1 2222.2222.2222 ARPA gi0/2
因此RT-A重新封装此数据,像这样【1111.1111.1111】【aaaa.aaaa.aaaa】【192.168.10.1】【192.168.20.2】【DATA-Reply】,然后把数据从Gi0/1口发送出去。
(5)PC-A
PC-A从傻瓜交换机收到此数据后,先是二层解封装,发现目的MAC地址是自己,接着三层解封装,发现目的IP地址也是自己,于是把数据给到相应的上层程序处理,至此通信完成。
4 PC-A、PC-B、PC-C、PC-D两两互通
上一节我们讲的是连在同一台设备(路由器或者三层交换机)上的两台终端通信,那如果连在不同设备的两台终端要通信呢?
比如PC-A和PC-C/PC-D要通信或者PC-B和PC-C/PC-D要通信呢?也就是我们要PC-A、PC-B、PC-C、PC-D两两通信呢?即全网互通的问题。
这个问题特殊在要互相通信的终端的Gateway不在一台路由器或者三层交换机上,这牵涉到静态路由、动态路由,因此留到后面单独文章讲解。