说在前面
做实验的时候我就在想,我是否有能力写好这篇博客。
本次实验做完之后,没有充沛的分享欲,而只是劫后余生的感慨。
明明是N层实验,但整体来说和D层实验的感觉十分相似,你需要熟练展现上次实验所培养你的能力与素养。
但除此之外,本次实验还要求你熟络ARP和ICMP,尤其是它们在报文中的封装。
一些提醒:
-
小程序传图片时一定要及时,晚一点就无法再上传。
-
传的图片尽可能展示核心内容,若缺乏重点可能拿不到9.5。
-
报文直接筛选好 arp or icmp。本次实验就只涉及这两种。
-
如何修改PC的IP地址?
控制面板->网络和共享中心->左侧栏“更改适配器设置”->右键“本地连接”->点击属性->双击IPv4项即可进入修改,可修改本机IP地址、子网掩码和缺省网关。
-
不同网段为啥还要分不同VLAN?
不同网段确实拥有不同的广播号,但是不同广播号不代表不同广播域!!
不加处理的话,大家都在缺省VLAN里,处于同一广播域。
广播号只能决定我是否接受,但是仍然会被泛洪到!
N层的IP管理当然管不到D层的传输。
ARP
在理论课上,我们只是知道:
- A想要B的MAC地址,发出ARP报文,上面写着A的IP地址、A的MAC地址以及B的IP地址。
- ARP报文被广播,同广播域内如果有B,B将单播回一个ARP报文。
但在实验课,你需要掌握:
- ARP有一个缓存的表。
- PC的ARP缓存表在cmd直接arp -a就可以看到。中间设备则需要在PuTTY上display arp。
- 如果下一跳不在ARP缓存表里,我就要发ARP去找到下一跳的MAC地址。
- 对于跨网段的ping,下一跳当然是缺省网关。
- ARP request 广播时,目标MAC地址是ffff-ffff-ffff,不过在报文中目标MAC地址显示为全0。
ICMP的理论课讲得倒比较详细,实验涉及的也很浅,不作解释。
跨交换机VLAN间路由实验
下面重点讲这个实验的ARP与ICMP报文分析。

首先这道实验题以分析为主。因为有大量步骤,凭实验不能单步观测变化情况。
此外,要知道S1是三层交换机,有跨网段路由功能。S2是双层交换机,只是个同网段内引路的。
接下来,我们就从理论角度,分析这样一个删去全部缓存的组网如何实现PCC ping PCD。
PCC想知道下一跳
PCC和PCD经过计算发现属于不同网段。
PCC要把ICMP(ping request)发给缺省网关——192.168.2.1,也就是S1的VLAN2接口。
PCC的下一跳就是192.168.2.1。
PCC的ARP Cache是空的。
PCC要向192.168.2.1发送ARP request报文。
Source: 192.168.2.11 PCC_MAC
Dest: 192.168.2.1 FFFF-FFFF-FFFF
路过交换机S2
要知道这个ARP报文的信息很明确,不会再改变了。
S2只是一个路由,一个搬运工,告诉你往哪个端口走,仅此而已。
MAC表也是这样简单,谁给我发了东西,我就把source(mac+vlan)和它进来的端口学习下来。
不过交换机还有一个功能,就是管理VLAN。毕竟VLAN是D层的事情。
交换机的端口就是划分VLAN的工具。你从这个口进来,那你就是这个VLAN。
端口分为access/trunk/hybrid这三种。
-
access是我们一般理解的那种,一个端口只对应一个vlan,广播泛洪的时候只对同VLAN的全部端口。
所以一进来我就知道你是哪个VLAN,就先给你打上tag。
相应地,从access口出去**不需要打(需要去掉)**tag,同样因为从我这出去的VLAN号是可以确定的。
-
trunk的特点是一个端口支持多种vlan。因此从它出去要带上vlan tag。
需要注意
其实也不需要注意,每对trunk端口都有一个PVID,PVID用于适配无VLAN时代的设备。所以如果VLAN号为PVID,就相当于无Tag,出去的时候也要去掉tag。 -
hybrid更自由,可以指定出去时某些vlan带tag,某些vlan不带tag。
好嘞,铺垫这么多,一鼓作气讲清楚吧!
Step 1
首先是PCC发了ARP广播,只可惜只广播到了S2这里。
此为Step1。
Step 2
S2首先收到报文先学习MAC表,PCC_MAC对应GE1/0/1。
然后为报文打上VLAN Tag=2(因为S2的GE1/0/1是access VLAN 2)。
然后S2要继续广播,发现支持VLAN2的只有GE1/0/1和GE1/0/13,除了自己之外,就只能给trunk口GE1/0/13了。
从trunk口出,不去除tag。
因此从GE1/0/13发送了含tag VLAN id=2的报文。
此为Step2。
S1回应PCC的ARP报文
Step 3
首先S1作为交换机,收到报文肯定也是先学习MAC表,PCC_MAC对应GE1/0/13。
但同时作为N层相关设备,随便收到一个报文也会直接学习ARP Cache,192.168.2.11对应PCC_MAC。
PCC向192.168.2.1发送的ARP request报文是:
Source: 192.168.2.11 PCC_MAC
Dest: 192.168.2.1 FFFF-FFFF-FFFF
而S1的VLAN2接口就是192.68.2.1。
所以S1应当把VLAN2接口的MAC地址传回PCC。
因为刚学到MAC表里PCC_MAC对应GE1/0/13,所以ARP reply直接从这个trunk口发出去。
从trunk口出去要带tag,因为是从VLAN2接口发的,所以VLAN id = 2。
192.168.2.1向192.168.2.11发送的ARP reply报文是:
Source: 192.168.2.1 VLAN2_MAC
Dest: 192.168.2.11 PCC_MAC
此为Step3。
再次路过S2
Step 4
S2首先收到报文先学习MAC表,VLAN2_MAC对应GE1/0/13。
S2要继续单播,发现PCC_MAC对应GE1/0/1。
从access口出,去除tag。
此为Step4。
PCC向下一跳发出ICMP-ECHO-REQUEST
Step 5
PCC收到了报文,直接学习ARP:192.168.2.1对应VLAN2_MAC。
这下终于知道了,我要去ping PCD了!
之前我知道N层的Source和Dest,但是一直不知道D层对应的下一跳应该是谁,现在终于可以封装报文了。
-
Source IP:192.168.2.11
-
Dest IP:192.168.3.11
-
Source MAC:PCC_MAC
-
Dest MAC:VLAN2_MAC
此为Step5。
Step 6
依旧经过交换机S2。
S2首先学习:PCC_MAC,啊嘞,这个学过了。
然后access口进,所以带tag vlan2。
接下来和Step2不同的是,现在是单播!
所以要查表,目标是VLAN2_MAC,这个也学过。那很好!不然就又要广播了。
直接从trunk口GE1/0/13出,不去tag。
此为step6。
ICMP报文更改!
ICMP报文发了一半,把第一段D层打通了。
接力棒传到S1的interface vlan2这里来了。
接下来经过某种判断逻辑你可以不知道,但很显然S1知道。
S1知道它该把报文交付给网络层处理了。
然后ICMP报文成功地从interface vlan3出来了。
ICMP报文的N层没有改变,而外部的D层则换成了路由器选择的新路由:
VLAN3_MAC,到它的下一跳:PCD。
ICMP报文的内容正式变为:
-
Source IP:192.168.2.11
-
Dest IP:192.168.3.11
-
Source MAC:VLAN3_MAC
-
Dest MAC:PCD_MAC
int VLAN3想知道下一跳
Step 7-8
再次审视报文内容。
PCD_MAC是未知的。
我需要——ARP!
接下来便是和Step1-2如出一辙。
此为step7-8。
PCD回应S1的ARP报文
Step 9-10
其实你知道这个和Step3-4如出一辙。
但是为了标题工整一点,就写这么几句话占个位置。
此为step9-10。
int VLAN3向下一跳发出ICMP-ECHO-REQUEST
Step 11-12
以防你不知道,在刚刚ARP的request与reply中,PCD和int VLAN3学到了ARP Cache,S2学到了MAC表。
这一段和Step5-6也只能说如出一辙了。
此为step11-12。
PCD向下一跳发出ICMP-ECHO-REPLY
诶诶你PCD怎么就能直接发reply?不用ARP?
好吧我写这个问题纯粹无聊打几个字。。
都叫reply了,PCD早就学进ARP Cache了。
Step 13-16
哎哟我真不想写了。
Step13-14就是Step5-6,Step15-16就是Step11-12。
此为step13-16。
后记
一写就又写了三个小时。
不过确实是弄明白了不少当时不太清楚的问题。
我特意把StepX也写进了标题里,方便你直接去跳转~
写博客本意是对问题的再思考,但如果还能帮到你们就太好了!