学习日志7.21--VLAN虚拟局域网

VLAN(virtual)虚拟局域网技术,是对连接在二层的交换机端口,进行划分隔离的技术,将一个大的广播域划分成逻辑上虚拟的几个小的广播域,小的广播域之间互相不连通。LAN是一个局域网,vlan就是将一个局域网划分成多个小的局域网,且各个小的局域网之间互相不通信。

一、VLAN工作原理--只有一台交换机的情况

举个例子,好比如说一个企业的两个部门,部门A部门B,他们的主机是连在同一台交换机上,即连在同一个局域网。现在要求,两个部门之间通信互不干扰,即两个部门广播的时候不会相互影响,A部门广播的时候不会发到B部门,B部门广播的时候不会发送到A部门。就需要将两个部门设置在不同的广播域。最简单的办法就是将两个部门的主机连接在不同的交换机,即不同的局域网不同的广播域,但是,这种办法会浪费资源,于是开发了VLAN虚拟局域网技术,即将一个大的局域网,划分成几个小的局域网,这样将两个部门连接在不同的局域网,就可以实现两个部门互不影响。

二、VLAN虚拟局域网的配置

设置A、B两个部门连接在一台交换机,即一个局域网,配置好主机的IP,查看交换机的初始状态

命令        display vlan,可以产看交换机VALN的初始状态可以看到一台交换机有24个接口。The total number of vlans is : 1,这句话说明,现在只有一个虚拟局域网,也就是没有划分之前那个,在Description中说明,这个未划分的虚拟局域网叫0001。

现在对两台PC机做通行测试,ApingB通信成功

通信成功后A创建ARP表

然后用BpingA,在交换机上创建两台PC的MAC地址表

命令:display mac-address,成功学习到两台主句的MAC地址

以上操作,均是对基本信息的查看设置,以下操作才是对交换机局域网的划分操作


命令:vlan 10,后面的数字10是自己加的,等于给自己创建的局域网一个编号

给创建的局域网一个描述,这里我给的是A,表示,这个局域网是给A部门用的

命令:description A

同样的操作,给B部门划分局域网。

然后退出到系统视图,查看局域网划分情况

命令:display vlan看到The total number of vlans is : 3,这句话,意思是,现在这台交换机上有三个局域网,VID那一栏是局域网的编号,是自己起的,vlan10 交给A部门使用,vlan20交给B部门使用,注意到,10和20后面没有端口,接下来就给vlan10和vlan20配置端口

命令:[SW1]interface GigabitEthernet 0/0/1,进入到接口视图

命令:[SW1-GigabitEthernet0/0/1]port link-type access,将接口连接状态设置为accsee接入接口命令:[SW1-GigabitEthernet0/0/1]port default vlan 10,将这个接口给vlan 10

命令:[SW1-GigabitEthernet0/0/1]q,退出接口视图,进如系统视图,查看配置信息可以看到vlan 10已经有接口GE0/0/1,同样的操作,给vlan20配置接口vlan 10和vlan 20 都已经配置成功。

到这里,局域网的配置操作完成,下面是测试操作,局域网配置是否成功


在主机A上对B进行ping操作,发现通信失败,在A主机上有B主机的MAC地址的请款下还是不能通信成功

对B主机的端口进行抓包处理,发现没有看到ARP请求对A主机进行抓包处理,发现有ARP请求但是没有回应在交换机上查询MAC地址表,可以看到,两个MAC地址在不同的VLAN下

说明VLAN局域网配置完成。

三、VLAN工作原理--有多台交换机交互的情况

上面说的是只在一台交换机上的情形,如果需要两台或者多台交换机交互的情形又怎么办。按这样的设备连接,对主机进行配置,交换机进行互联。同样的操作,先将SW2划分成多个局域网vlan 10和vlan 20,PC3划分给vlan 10,PC4划分给vlan 20。两个交换机连接在一起在接口0/0/24。尝试两个主机ping通,ping的时候要注意在同一个局域网,即SW1中的vlan 10的主机pingSW2中vlan 10的主机,即用Aping主机PC3通信失败。

其实通过交换机的配置表我们可以发现,端口ge0/0/24在vlan1的局域网上,没有在valn10的局域网上,所以连个交换机的vlan10局域网不能通信。

将GE0/0/24划分到vlan10局域网上把ge0/0/24都划分给vlan 10后,测试主机A和主机PC3能不能通信能通信,再测试主机B和PC4能不能通信发现不能通信,原因和上一个一样,需要将ge0/0/24端口划分再vlan 20里面,但是划分后,vlan 10里面就没有端口ge0/0/24,意味着主机A就不能和主机PC3通信。

面对这个情况有两种解决办法:

第一种就是,在两交换机之间在增加一个连线,让两个交换机的vlan 20互通。增加一个接口23,让接口23负责两交换机vlan20的连接,接口24负责两交换机vlan10的连接现在两台交换机的接口配置好了,进行主机的ping通测试

主机Aping主机PC3,发现通信失败然后用主机B去ping主机PC4,发现可以通信这里出现问题,理论上说,只要让两个交换机的vlan 10和vlan 20分别互相通信就可以实现两个交换机,不同主机之间的通信,但是测试结果是不通信。

为了弄清楚哪里出现问题,用数据抓包,看是那个接口出现问题

先对SW1的GE0/0/1接口进行抓包,发现有ARP请求再对SW1的GE0/0/24接口进行抓包,发现没有ARP请求再对SW2的GE0/0/24接口进行抓包,发现有ARP请求

由此可以发现,是SW1的GE0/0/24不能通信。思考后发现,是因为两台交换机之间相连形成回路,交换机的STP生成树协议会自动计算生成网络。

查看SW1的接口信息就会看到,GE0/0/24接口状态是舍弃状态

所以这就是为什么,主机B能和主机PC4ping通(GE0/0/23接口状态是转发),但是主机A不能和主机PC3ping通的原因(GE0/0/24接口状态是舍弃)。

第二种 解决办法就是将接口的状态设置为Trunk(主干链接)的状态。

在这之前介绍一下接口的链接状态,在设置接口划分的时候,会有一条命令

命令:port link-type access,这条命令就是设置接口的状态

接口状态分为Access(接入接口)和Trunk(主干接口),access状态只允许一个vlan通过,通常用来链接单一 host 终端,trunk状态允许多个vlan通过,通常用来链接交换机,这是最大的区别。

下面重新对交换机进行配置

命令:interface gigebitethernet0/0/24,先进入到接口视图,进行对接口的配置。

命令:undo port default vlan,可以清空接口的vlan配置,重新设置接口的状态。

命令:port link-type trunk,设置成trunk模式

命令:port trunk allow-pass vlan 10 20,允许接口通过vlan10和vlan20

配置成功之后,对主机进行ping操作,看是否能通信能通信,则说明配置成功。

四、Access和Trunk状态接口

交换机接口时Access状态时,只允许通过一个vlan的流量,而且通过Access接口的数据帧不会带有vlan数据标记,其数据包装形式是以太网Ⅱ的包装,这个是access接口模式下的数据封装

交换机的接口是trunk状态的时候,可以允许通过多个vlan流量。那就会有一个问题,一个接口允许通过多个流量的vlan,那么怎么确定这个vlan的流量是发送给哪个vlan的。其实Trunk接口有一个特点,就是通过Trunk接口的vlan流量会被打上一个叫802.1Q的vlan标记Tag字段,接收端的trunk接口只要顺着这个vlan标记就可以把数据转发给目的vlan。但是要注意的是,经Trunk接口打上的802.1Q的Tag字段只能被交换机识别,主机终端识别不了,识别不了就无法通信

现在把GE0/0/3接口由原来的accesss状态改为现在的trunk状态       然后用主机A去ping主机PC3,发现ping失败,在SW2的GE0/0/3上进行数据抓包,发现由802.1Q的vlan标记,标记的ID是10,说明是vlan10发送的数据。但是因为SW2的GE0/0/3是Trunk模式,给数据打上了vlan标记,主机识别不了,所以不能通信

也存在特殊情况,在trunk接口模式下,可以设置某个vlan不对他进行标记

命令:port trunk pvid vlan 10,可以让vlan 10 的流量不进行vlan标记

通过命令把SW1的trunk接口让他的vlan10的流量不进行标记,把SW2的trunk(GE0/0/24,和干才设置的GE0/0/3)的vlan10流量不进行标记,配置好后让主机Aping主机PC3,ping通

在默认请况的pvid是1,默认请况下vlan1的流量是不带标记。

可以看到UT(untagged)表示的是不带Tag,而TG(tagged)表示的是带Tag的。SW2的3和24接口在发送vlan1  20的时候是带标记的,但是在vlan10的时候是不带标记的,因为配置的PVID是vlan 10。

一次PVID只能设置一个vlan,不能设置多个

  • 30
    点赞
  • 19
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
### 回答1: c语言中,你可以使用for循环来遍历seita的所有可能取值,并在每次迭代时计算q0_1和q0_2的值。然后,你可以找到q0_1和q0_2最接近0的值,并记录下对应的seita值。 例如: ``` #include <stdio.h> #include <math.h> int main() { double hk = 0.0; double seita = 0.0; double q0_1 = 0.0; double q0_2 = 0.0; double min_diff = 1000000000.0; // 设置一个极大的初始值 double min_seita = 0.0; // 用于记录最接近时的seita值 for (seita = 0.0; seita <= 7.21; seita += 0.01) { // 遍历所有可能的seita值 q0_1 = hk * (1 / pow(seita, 0.25)) * seita; q0_2 = 2340.2650 * (7.21 - seita); double diff = fabs(q0_1 - q0_2); // 求出q0_1和q0_2的差值的绝对值 if (diff < min_diff) { // 如果当前的差值比之前的小 min_diff = diff; // 更新最小差值 min_seita = seita; // 记录最接近时的seita值 } } printf("seita = %f, q0_1 = %f, q0_2 = %f\n", min_seita, q0_1, q0_2); return 0; } ``` 在这段代码中,我们使用了for循环来遍历seita的所有可能取值,并在每次迭代时计算q0_1和q0_2的值。然后,我们比较q0_1和q0_2的差值的绝对值,并找到最小值,最后输出最接 ### 回答2: 根据给定的公式,我们需要编写程序来求出变量seita取值范围为[0, 7.21]时,使得q0_1和q0_2的值最接近的seita的值。 首先,我们可以设定一个初始值best_seita,用来保存当前使得q0_1和q0_2最接近的seita的值。初始时,我们可以将best_seita设定为0,并计算相应的q0_1和q0_2的值。 接下来,我们采用遍历的方式,从0到7.21的范围内,以较小的步长进行迭代计算。在每一次迭代中,我们用当前的seita值计算q0_1和q0_2。如果当前的q0_1和q0_2的差值比之前的最小差值还要小,则将当前的seita值更新为best_seita,并更新最小差值。 最后,程序运行完成后,best_seita的值即为使得q0_1和q0_2最接近时的seita值。 下面是一个示例程序的代码: ```c #include <stdio.h> #include <math.h> int main() { double best_seita = 0; double min_diff = __DBL_MAX__; // 设置初始最小差值为最大浮点数 for (double seita = 0; seita <= 7.21; seita += 0.001) { double q0_1 = hk * (1 / pow(seita, 0.25)) * seita; double q0_2 = 2340.2650 * (7.21 - seita); double diff = fabs(q0_1 - q0_2); // 计算当前q0_1和q0_2的差值的绝对值 if (diff < min_diff) { best_seita = seita; min_diff = diff; } } printf("使得q0_1和q0_2值最接近时的seita的值为:%f\n", best_seita); return 0; } ``` 以上就是一个求解最接近的seita值的C语言程序。注意,为了提高精度,我们在每次迭代中使用了较小的步长0.001。实际使用时,可以根据需要进行调整。 ### 回答3: 要求编写程序求出q0_1和q0_2最接近时seita的值。 首先,我们需要确定seita的取值范围为[0,7.21]。由于seita是一个变量,我们需要以一定的精度遍历这个范围。 首先,定义一个变量step,表示遍历的步长。为了保证精度,我们可以将seita的范围划分为多个小区间,然后在每个小区间内进行遍历。 假设步长为0.001,则需要遍历的次数为(7.21-0)/0.001 = 7210次。 我们可以使用一个循环来遍历这个范围。在每次遍历中,计算q0_1和q0_2的值,然后判断与之前的最接近值的差距,如果更接近,则更新最接近的值和seita的取值。 下面是一个伪代码示例: ```c double q0_1_min = MAX_DOUBLE; double q0_2_min = MAX_DOUBLE; double seita_min = 0; double hk = 1.0; // hk值需要根据实际情况确定 for (double seita = 0; seita <= 7.21; seita += 0.001) { double q0_1 = hk * (1 / pow(seita, 0.25)) * seita; double q0_2 = 2340.2650 * (7.21 - seita); double diff_q0_1 = fabs(q0_1 - q0_1_min); double diff_q0_2 = fabs(q0_2 - q0_2_min); if (diff_q0_1 < fabs(q0_1_min - q0_2_min) || diff_q0_2 < fabs(q0_1_min - q0_2_min)) { q0_1_min = q0_1; q0_2_min = q0_2; seita_min = seita; } } printf("q0_1最接近时的seita值:%f\n", seita_min); printf("q0_2最接近时的seita值:%f\n", seita_min); ``` 通过遍历并比较差值,最后输出q0_1和q0_2最接近时的seita值。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值