116由浅入深学网络--局域网与交换机

116由浅入深学网络--局域网与交换机,第1张

在对网络的协议簇有个大概的认识之后,我们就来接触一些实际一点的东西,无论是在部署小型的局域网,还是中型企业网络,亦或者是大型的企业网络,甚至是广域网,我们都不是上来就做,必定会对网络的连接规划会有一定的设计,胡乱的连接与设置很容易网络的性能低,更甚者产生网络风暴,导致无法上网。
还记得我们在上文提到过的拓扑图吗?拓扑图能够以一种很清晰明了,很直观的方式让我们理清楚网络的结构,这样的方式在出现问题的时候易于定位。毕竟在实际生活中设备都是放在的不同的地理位置,没有拓扑图带来清晰、直观的逻辑结构。
这样的图式便是拓扑图,由点、线组成:

而在实际生活中我们更多的会使用模拟机来仿真设计我们的拓扑结构,如图所示:

Cisco 提供的解决方案是一种三层网络设计模型(three-layer network design model),他将网络分为这样三层:
核心层(Core)
汇聚层(Distribution)
接入层(Access)

三层模型虽然有诸多的好处,但是也不是适用于所有的场景,在某些网络情况下会将其中的某两层合成一层,从而得到一个两层结构的网络。
接下来我们便来看一下这三层模型各层的具体的作用:
核心层(The Core Layer)
核心层通过非常快速的数据包转发来提供一个已优化的并且非常可靠的传输结构。换句话,核心层就是要尽可能快的转发数据包(switch packets as fast as possible),所以尽可能的避免在核心层的设备运行其他一些很耗 CPU 资源的进程(交换机与路由器数据包的转发机制不同,转发芯片与 CPU,这里指代的是影响转发速率的一些功能),尽可能的让它全心全意的去转发数据包。而这里所说的很耗 CPU 资源的动作或者是影响速度的动作像是访问控制列表的访问控制检查,数据的加密,地址转换等等这样的网络控制功能。
核心层被认为是所有流量的最终承受者和汇聚者,所以对核心层的设计以及网络设备的要求十分严格。核心层设备将占投资的主要部分。 核心层需要考虑冗余设计。
汇聚层(Distribution)
汇聚层是位于核心层与接入层之间,有助于核心网络与其他网络的区分,这一层的主要功能是通过访问控制与一些其他的过滤条件来限制进入核心层网络,从而防止一些不必要的流量,以及某些网段的问题蔓延和影响到核心层。因此会在这一层为网络定义一些策略,而这些策略就是一些控制网络交通情况的一些方法,如 地址合并,协议过滤,路由服务,认证管理等等。
汇聚层设备一般采用可管理的三层交换机或堆叠式交换机以达到带宽和传输性能的要求。汇聚层设备之间以及汇聚层设备与核心层设备之间多采用光纤互联,以提高系统的传输性能和吞吐量。
接入层(Access)
接入层通常指网络中直接面向用户连接或访问的部分。接入层利用光纤、双绞线、同轴电缆、无线等传输介质,实现与用户连接。
接入层交换机具有低成本和高端口密度特性。
例如这样的设计:

而在设计时有这样的几个原则需要大家去考虑:
网络直径:任意两台终端之间连接时通过的交换机数目的最大值。网络直径最好不要超过7,否则一旦网络发生故障难以检测故障发生的链路或节点。而且,网络直径同路由收敛时间及整个网络的稳定性有很大关系。
带宽冗余:通过将两台交换机之间的多条并行链路合并为一条逻辑链路来实现带宽聚合
冗余链路:网络在分层网络的各层之间使用冗余链路来确保网络的可用性。

在不同的网络中层次中使用不同的网络设备,根据不同的使用环境有不同的选择,每一层都是用交换机或者都使用路由器,亦或者是交叉使用。
曾经我们提到过交换机是工作于网络的第二层数据链路层,所以也称之为二层交换机,但是仅仅为了做三层的转发,增加路由器很不划算,于是演进出了三层交换机。
虽然三层交换机有一些处理网络层功能的能力,但是它的设计有异于路由器,所以它并不能完全代替路由器,对于这样的讨论可以看看 这篇文章
对于中大型企业通常有这样的推荐型号组合:核心层使用 Cisco Catalyst 6500,汇聚层使用 Cisco Catalyst 4500,接入层使用 Cisco Catalyst 3750 亦或者是 3560。

思科官方也有这样的推荐:
核心层:7500, 7200, and 7000 series routers。
汇聚层:4500, 4000, and 3600 series routers。
接入层:2600, 2500, 1700, and 1600 series routers。

对于机器的选择到底使用交换机还是路由器,购买 6500 还是 7200,当然还有诸如华为,华三,juniper等等一些其他的厂商可以考虑,建议还是根据多方面去考虑,如网络的规模,网络的应用的场景,网络主题传输的是什么样的数据流量,网络未来的发展,还有成本的控制等等,大型的功能全面的机器当然越发的昂贵。

ISP 提供一个接入点给企业或者是民用,而给你的接入口只有一个,但是一个企业或者是家庭接入的设备肯定不止一个,在早期还没有出现无线的时候,使用的设备是集线器,一种基于物理层的设备,用于扩充端口。就像墙上的插线孔,我们觉得不够用需要使用插线板来扩充它的孔数,集线器就是这样的设备。
这种方式的实现也出现了新的问题,他就像漏斗一样开口变大了但是出口没有变化,也就意味着同一条线路上有很多信号的存在,而这些信号若是没有一个合理的规划很容易就混乱了,就像交通拥堵一般。信号与信号之间会有冲突,而这些冲突会导致数据包的碰撞而使得数据损坏或者直接丢失,这样在一个区域称之为冲突域。
由此便产生了一种新的技术 CSMA/CD(Carrier sense multiple access with collision detection:带冲突检测的载波侦听多路访问机制)。
以太网使用的一种规则集是基于IEEE 的载波侦听多路访问/冲突检测 (CSMA/CD)技术,系统将以太网信号传送到连接在 LAN 中的每一台主机,传送时使用一个特殊的规则集来确定哪台工作站可以访问网络。

如图中所示,总线型局域网,这是一个典型的冲突域,若是两台主机同时向外发送报文,报文将在介质中传播,相互碰头。此时,双方的信号就会混合,报文被损坏,从而形成冲突。
总线型网络:所有的节点共享一条数据通道,一个节点上发出的信息,可以在网络上的其他每个节点上接收,因为其所铺设的线缆最短,成本低,并且节点自身的故障并不会影响到网络,所以总线型网络非常的普遍。

所有节点共享一条传输线路,每个节点在传输数据之前都要侦听线路上是否空闲。如果空闲,则立刻发送数据;若不空闲,表示总线处于忙的状态,则等待一定时间之后再传,以免造成信号的碰撞,在等待的过程中依旧监听着线路空闲状况。如果在传输的时候,因为设备之间的距离造成一台设备的信号延时,也就是说,另一台设备无法检测到信号,可能会同时开始发送数据。那么,现有两台设备同时在介质中发送信号,信号相互碰头,双方的信号就会混合,报文被损坏,从而形成冲突。检测到冲突之后发送设备将发出堵塞信号。堵塞信号通知其它设备发生了冲突,以便使得其他设备使用退避算法后退一个随机时间,再重传数据。共享方式的以太网就是利用此机制进行数据传输的。
而 CSMA/CD 对线路的监听是通过线路处于的电压,也就是线路是高电平还是低电平来判断此时的线路是否有数据传输。
这便是以太网中的 CSMA/CD 技术的总体解决方案。
因为冲突域与 HUB(集线器)的端口问题,所以产生了交换机,交换机上每一个端口才是一个冲突域,从而减小了冲突域。

而二层的交换机工作于数据链路层,该层主要是以帧为单位,帧的传播有这样的三种方式:
单播:单播是一对一的发送,一个发送方,一个接收方,就像打电话一样;
组播:组播是一对多的发送,一个发送方,多个接收方,多个接收方是指定的一组地址,就像班上分小组讨论,我将我的想法讲给我的组员,班上的其他成员也在场但是班上的其他同学并不会知道我的想法;
广播:广播是一对多的发送,一个发送方,多个接收方,而这里的多个接收方是所有的端口,在同一个广播域内的所有设备,就像老师给班上的同学讲课,在场的所有同学都会接收到老师的信号。

集线器上所有的端口是一个冲突域,而在交换机中隔离的冲突域,一个端口是一个冲突域,但是交换机上所有的端口是一个广播域,也就是说广播域中一台设备发出广播帧,其他设备都会收到。就像微信群中,@所有人,群中所有人都会收到提示一样。以太帧的广播还有一个名字叫做泛洪(flooding)。

冲突域:数据流、数据帧在一条线路中,会发生碰撞、冲突的范围。
广播域:广播的数据流与数据帧会发送的范围。如上图中若是有一个端口中连接的交换机,那么广播域会进一步的扩大。
在交换机中数据的转发更多的是依靠以太帧中的 MAC 地址来实现数据的通信。正如我们在实验二中看到的 ARP 实现的过程,即使知道 IP 地址,但是没有 MAC 地址根本无法发出数据帧。
我们来回顾一下以太帧的格式。数据帧起始部分由前导码和帧开始符组成,后面紧跟着一个以太帧的报头,以 MAC 地址说明目的地址和源地址。

交换机根据源 MAC 地址填充 MAC 地址表。 当交换机收到一个传入的帧,而其目的 MAC 地址在 MAC 地址表中找不到时,交换机会将该帧转发到除作为该帧入口的端口之外的所有端口(泛洪)。 当目的设备作出响应时,交换机会将帧的源 MAC 地址和接收该帧的端口添加到 MAC 地址表中。 在多台交换机互连的网络中,MAC 地址表将包含与其他交换机连接的每个端口的多个 MAC 地址。这样在中间设备很多的时候也能准确的找出下一站转发的设备。
以下步骤描述了构建 MAC 地址表的过程:
1交换机收到来自 PC 1 的帧。

2交换机将检查源 MAC 地址并与 MAC 地址表进行比较。
若在 MAC 地址表中查无源 MAC 地址,交换机会在 MAC 地址表中将 PC1 的源 MAC 地址与入口端口相对应。 若是 MAC 地址表中存在源 MAC 地址与端口的对应记录,则它将重置老化计时器(MAC 地址表会清理一些老化项,以实事更新当前的网络结构)。MAC 地址条目通常可以保持五分钟。

3记录了源 MAC 地址后,交换机将检查目的 MAC 地址。然后转发到目的设备。
若 MAC 地址表中查无目的地址,或者它是一个广播 MAC 地址(以全 F 表示,Broadcast),则交换机会将该帧泛洪到除入口端口以外的所有端口

4目的设备收到帧后,为了响应此帧,发出目的地址为 PC 1 的单播数据帧。
5交换机现在无需泛洪即可在这些源设备和目的设备之间转发帧,因为地址表中已经有了标识关联端口的条目。

但是这是一种被动的方式,而且只能知道端口与设备名的对应关系,不能知道该设备的相关信息,若是管理员手中没有拓扑图,也不了解有哪些相关的设备,远程登陆上某台设备之后并不知道周围设备的相关信息,与当前的网络结构,由此便出现了 CDP 协议。
CDP(Cisco Discovery Protocol),它是由思科公司推出的一种私有的二层网络协议,大部分的思科设备启动时该协议都会自动运行起来。通过运行 CDP 协议,思科设备能够在与它们直连的设备之间分享有关 *** 作系统软件版本,设备表示,地址表,端口标识,性能表等等信息。类似的协议有 HP 的 LLDP (Link Layer Discovery Protocol)还有华为/H3C 的 NDP(邻居发现协议)协议。
CDP 是一个二层的网络协议,默认每 60 秒向 01-00-0C-CC-CC-CC 这个组播地址发送一次通告,如果在180秒内未获得先前邻居设备的 CDP 通告,它将清除原来收到的 CDP 信息。

我们可以来看看设备中 CDP 的数据包与其相关的指令:
实验目的:了解 CDP 的使用与数据包结构
实验材料:两台交换机

实验方法:
拖动两台交换机至画布
配置交换机的名字
查看链路中的 CDP 数据包

同样的我们使用终端的打开 GNS3 模拟器,并向画布中拖动两台设备,然后开启设备 Switch 1、Switch 2,同时链路上的监控 Switch 1 上的数据包:

我们可以看到开启设备之后,便可以清楚看到有很多的 CDP 数据包在传输。
在思科设备中 CDP 是默认开启所以开机之后便有 CDP 相关的数据包在发送,CDP 每 60 秒发一次组播信息,组播地址是 01:00:0c:cc:cc:cc(MAC地址第1字节是0x01、0xC1或者是0x33都表示这个MAC地址是组播地址,Cisco的OUI是00-00-0C,所以协议的数据包只能在 Cisco 的设备中发送,若中间有其他厂商的设备将不会被该协议发现)。CDP 获得的信息可以使用 CDP 命令查看,而其中的表项保留时间为 180 秒,也就是说 CDP 发送 3 次 CDP 之后都表中的设备都没有响应,说明该设备已经不存在,便会移除该表项;若是响应了则重置老化时间。
我们可以登录上 Switch 1 然后输入这个命令,我们可以看到与 Switch 1 直连相关的设备:

通过该命令我们可以看到与 Switch 1 直连 Switch 2 的一些相关信息:
Device ID:设备的 ID,也就是设备的 Hostname
Entry address:它的 IP 地址,此时我们并没有配置任何的 IP 地址,所以该栏是空白的。此 IP 地址是与本设备直连通信的 IP 地址
Platform:设备系统的运行平台,因为我们使用的是 IOU,所以平台显示的是我们的 *** 作系统 Linux
Interface:与该设备直连的端口名称与端口
Holdtime:该项目还会存在的时间
Version:设备所运行的系统版本
advertisement version:数据包的宣告版本
VTP Management Domain:VTP 所在域的域名
Native VLAN:该设备所属的 vlan
Duplex:端口的模式,是半双工模式

若是我们并不想看详细的信息,只是想看各个端口上有设备,我们可以使用这样的一个命令:

通过这个命令我们就可以看到一些简明扼要的信息:

当然若是觉得 60 秒发送一次数据,影响了我们网络的带宽,并且我们并没有使用的他的必要,我们可以关闭该协议:

此时再次使用 show cdp entry 会发现 CDP 并没有运行的提示,同时我们也可以看到 wireshark 中 Switch 1 也没有在继续发送 CDP 的数据包。
当然若是觉得还是很有必要的话可以开启 CDP,可以修改一下 timer 与 holdtime 这两个参数,timer 表示每多少秒发送一次 CDP 数据包取值是 5254,而 holdtime 表示发现项保留的时间,其取值范围是 10255。这样就可以减少其在网络中发送数据包的频次,从而减小网络带宽的压力

<PRE class=cpp name="code">//暂停layer上面的动画
- (void)pauseLayer:(CALayer)layer
{
CFTimeInterval pausedTime = [layer convertTime:CACurrentMediaTime() fromLayer:nil];
layerspeed = 00;
layertimeOffset = pausedTime;
}
//继续layer上面的动画
- (void)resumeLayer:(CALayer)layer
{
CFTimeInterval pausedTime = [layer timeOffset];
layerspeed = 10;
layertimeOffset = 00;
layerbeginTime = 00;
CFTimeInterval timeSincePause = [layer convertTime:CACurrentMediaTime() fromLayer:nil] - pausedTime;
layerbeginTime = timeSincePause;
}</PRE><BR>
<PRE></PRE>
<P>附上完整代码</P>
<P></P>
<P class=p1>AnimationPauseViewControllerh</P>
<PRE class=cpp name="code">#import <UIKit/UIKith>
@interface AnimationPauseViewController : UIViewController {

UIImageView soccer;
BOOL isPause;
UIButton controlButton;
}
@property (nonatomic, retain) IBOutlet UIImageView soccer;
- (IBAction)clickControlButton:(id)sender;
@property (nonatomic, retain) IBOutlet UIButton controlButton;
@end</PRE><BR>
<P></P>
<P class=p1>AnimationPauseViewControllerm</P>
<P><PRE class=cpp name="code">#import "AnimationPauseViewControllerh"
#import <QuartzCore/QuartzCoreh>
@implementation AnimationPauseViewController
@synthesize controlButton;
@synthesize soccer;
- (void)dealloc
{
[soccer release];
[controlButton release];
[super dealloc];
}
- (void)didReceiveMemoryWarning
{
// Releases the view if it doesn't have a superview
[super didReceiveMemoryWarning];

// Release any cached data, images, etc that aren't in use
}
- (void)addAnimations
{
//让足球来回移动
CABasicAnimation translation = [CABasicAnimation animationWithKeyPath:@"position"];
translationfromValue = [NSValue valueWithCGPoint:CGPointMake(24, 240)];
translationtoValue = [NSValue valueWithCGPoint:CGPointMake(320- 24, 240)];
translationduration = 2;
translationrepeatCount = HUGE_VALF;
translationautoreverses = YES;

//让足球来回转动
CABasicAnimation rotation = [CABasicAnimation animationWithKeyPath:@"transformrotationz"];
//kCAMediaTimingFunctionLinear 表示时间方法为线性,使得足球匀速转动
rotationtimingFunction = [CAMediaTimingFunction functionWithName:kCAMediaTimingFunctionLinear];
rotationtoValue = [NSNumber numberWithFloat:4 M_PI];
rotationduration = 2;
rotationrepeatCount = HUGE_VALF;
rotationautoreverses = YES;

[soccerlayer addAnimation:rotation forKey:@"rotation"];
[soccerlayer addAnimation:translation forKey:@"translation"];
}
#pragma mark - View lifecycle
- (void)viewDidLoad
{
[super viewDidLoad];
[self addAnimations];
}
- (void)viewDidUnload
{
[self setSoccer:nil];
[self setControlButton:nil];
[super viewDidUnload];
}
- (BOOL)shouldAutorotateToInterfaceOrientation:(UIInterfaceOrientation)interfaceOrientation
{
// Return YES for supported orientations
return (interfaceOrientation == UIInterfaceOrientationPortrait);
}
//暂停layer上面的动画
- (void)pauseLayer:(CALayer)layer
{
CFTimeInterval pausedTime = [layer convertTime:CACurrentMediaTime() fromLayer:nil];
layerspeed = 00;
layertimeOffset = pausedTime;
}
//继续layer上面的动画
- (void)resumeLayer:(CALayer)layer
{
CFTimeInterval pausedTime = [layer timeOffset];
layerspeed = 10;
layertimeOffset = 00;
layerbeginTime = 00;
CFTimeInterval timeSincePause = [layer convertTime:CACurrentMediaTime() fromLayer:nil] - pausedTime;
layerbeginTime = timeSincePause;
}
- (void)pauseSoccer
{
isPause = YES;
[controlButton setTitle:@"继续" forState:UIControlStateNormal];
[self pauseLayer:soccerlayer];
}
- (void)resumeSoccer
{
isPause = NO;
[controlButton setTitle:@"暂停" forState:UIControlStateNormal];
[self resumeLayer:soccerlayer];
}
- (IBAction)clickControlButton:(id)sender {
if (isPause) {
[self resumeSoccer];
}else{
[self pauseSoccer];
}
}
@end</PRE><BR>
<BR>
<P></P>


欢迎分享,转载请注明来源:内存溢出

原文地址: http://outofmemory.cn/yw/13409492.html

(0)
打赏 微信扫一扫 微信扫一扫 支付宝扫一扫 支付宝扫一扫
上一篇 2023-07-30
下一篇 2023-07-30

发表评论

登录后才能评论

评论列表(0条)

保存