第一篇:集成实验VCS实验报告
武汉大学 电工电子实验教学示范中心 集成电路设计实验实验报告 电子信息 学院
电子信息工程
专业
XXXX
年 X 月 XX 日
实验名称 8 位累加器 VCS CLI 仿真验证(实验三)指导教师
姓名
年级 级 学号
成绩
一、预习部分 1. 实验目的(预期成果)
2. 实验基本原理(概要)
3. 主要仪器设备(实验条件,含必要的元器件、工具)
一、实验目的 掌握集成电路计算机设计工具验证仿真工具 VCS(Verilog Compiled Simulator)的基本操作命令行命令,从集成电路 Verilog 设计到 VCS 验证的基本流程;掌握利用命令行来实现对 Verilog 设计的调试与分析。
二、实验基本原理
1.VCS 是编译型 Verilog 模拟器,它完全支持 OVI 标准的 cVerilog HDL 语言、PLI 和 SDF。VCS 首先会读入 Verilg 的源文件,检查语法及语言结构错误,即Compiler;然后结合测试模块,进行时序的仿真,即 Simulator;最后根据时序图进行调试,修改源程序,即 Debugger。
2.本次实验中需要用到的一些基本命令有:
>ls-显示文件名 >cd-转换目录 >cd/../../-退出两层 >more-以分页方式查看文件内容 >pwd-显示当前路径 > vcs source_file [complie_time_options] 编译 verilog 文件成为一个可执行的二进制文件,source_file 指所有用 Verilog 编写的待测文件。
>simv [run_time_options] 运行可执行文件 > vcs source_files –R 单命令行方式,-R 表示编译后立即执行。
3.VCS 调试的基本方式 a.Verilog SystemTask calls 主要是将一些函数加到测试模块中,从而实现相应的操作。
b.CLI 调试,实际上是用命令行的方式来进行调试。
c.VirSim 进行仿真、验证与调试。
4.8 位累加器逻辑框图
图1
5.实验设备与软件平台 UNIX 服务器,unix 工作站及 Synopsys VCS。
二、实验操作部分 1. 实验数据、表格及数据处理(综合结果概要、仿真波形图、时序分析结果、signalTAPII 结果等)
2. 实验操作过程(可用图表示)
3. 结论
三、实验操作过程 1.VCS 的编译 此步骤实验内容参照实验讲义进行,略过。
2.利用 Verilog SystemTask Calls 进行调试。
(1)在控制台下键入:cd../../lab2/parta 进入 lab2 的 parta 部分, shell> vcs –f adder.f –R,进行 8 位的加法运算,但会出现如下的显示:
图 2 这说明在源代码中存在错误,接下来要做的就是把错误找出来。
(2)shell>vi addertb.v 进入 vi 编辑器对 addertb.v 文件修改。首先对 add8 的模块进行检测,如图所示在相应部分添加画圈部分代码。
图 3 其中 add8(u1)是指 8 位加法器的低四位相加模块。加入后保存文件,shell> vcs –f adder.f –R 重新编译文件,会有如下的显示:
图 4
(3)因此在 add8(u1)中存在错误。为了进一步的检测,如图所示在相应部分继续添加画圈部分代码。
图 5 为了设置断点将$finish 改为$stop,这样每当发现一个错误的时候,结果都会由$display 函数显示出来,同时仿真过程会停在出错的地方。shell> vcs –f adder.f –R 重新编译文件,VCS 在遇到$stop 后会停止仿真,同时进入 CLI 的调试阶段。
图 6(4)可以看到在低位的相加上结果有误。为了确定最终的错误位置还要继续下一组数据的相加,在 CL 下多次输入”.”,最后可确定问题出在 fa 模块上。
图 7(5)Cl> quit,退出 CLI 模式。Shell>vi fa.v 进入 vi 编辑器对 fa.v 文件修改,问题出在数据相加时没有将 cin 位加上。
图 8
(6)修改后重新编译,然后运行程序。shell> simv +monitoroff,此时可以看到无错误提示,即运算正确。
图 9(7)利用+monitoroff 可以在运行程序时跳过所有的$monitor 命令,从而加快运行速度。
图 10
3.利用 VCS CLI 进行调试(1)> cd../partb 进入 lab2 的 partb。再一次运行程序,看是否运行正确。shell> vcs –f adder.f –R,得到如下结果:
图 11
为了可以解决出现的问题,这时需要在 addertb.v 中设置断点,把$finish 改为$stop,如下:
图 12
(2)接着编译并启动 CLI 界面。shell> vcs –f adder.f +cli+3 –R –s –l sim.log,-s 可以启动 CLI 并且将仿真时间停在 0 时刻,-l 可以将所写过的命令记录下来。cli_0> ?可以显示所在的位置,即位于模块的哪一层。cli_1> scope,cli_2>.程序开始运行,有如下的显示。cli_3> show variables,会显示所有的变量。cli_4> print a_test a_test b_test cin_test cout_test sum_test 可显示所有的变量值。
图 13
(3)可见 sum_test 的结果是不正确的,cli_5>scope u1 可以进入 u1(add8)模块。cli_6> show variables。cli_7> alias praves print a b sum sum_0 sum_1 cin c4。为了方便可以利用 alias 命令新设立一个命令 praves,用来显示变量值,cli_8> prvaves。
图 14
(4)可见问题出在高四位,为了确定错误需要检查源文件,另外开一个 UNIX 的控制台。在 add8.v 中可以看到,在对结果的高四位以及输出进位的赋值均出现了错误。
回到 CLI 环境下,进行如下的操作:cli_9> print zero_add_cin one_add_cin,可得:
zero_add_cin: 0 one_add_cin:1。对上述变量强制赋值,如下:
cli_10> force zero_add_cin = 1 cli_11> force one_add_cin =0
图 15
(5)运用设定好的命令 praves 来显示变量值,cli_12> pravas zero_add_cin one_add_cin,输出显示命令错误。cli_13> tbreak #10,cli_14>.,cli_15> praves, 输出显示命令错误。cli_16> print a_test a_test b_test cin_test cout_test sum_test,如下所示:
图 16
结果正确,现在 add8 模块中设置断点,以变量 c4 的上升沿位为标志。cli_17> always @posedge u1.c4,cli_18>.可以发现从 60 时刻到 26400 时刻均没有出现错误。cli_19> print a_test a_test b_test cin_test cout_test sum_test,显示变量值:
a_test:01 b_test:08 cin_test:0 cout_test:0 sum_test:08 结果正确,但由于仿真运行到断点出就停止了,那么断点后出现的错误就无法检测 到,所以需要去除断点的限制。cli_20> tbreak #1,cli_21>.,cli_22> show break 会显示如图所示断点。
(6)cli_24> delete 2,cli_25>.则运行后成功编译如下图。
图 17(7)可以将上述命令写在一个约束文件(script file)中,然后直接运行。这里已有一个test.s 的文件,下面来看如何运行。
(8)cli_26> $reset,cli_30> source test.s,图 18(9)cli_31> prtb,cli_32>.可以看到运行无误,此时结束仿真,退出 CLI,检查 log 文件,可以看到所有的操作都被记录在文件中。cli_33> $finish。
图 19
图 20(10)shell> more sim.log 可以看到所有命令均被记录,由此也可以完成约束文件的建立。
三、实验效果分析(与预期结果的比较 ,实验中发现的问题。包括仪器设备等使用效果)
四、实验思考题 1. 集成电路从设计到验证的基本流程? 答:集成电路设计的基本流程是:(1)功能设计阶段,(2)设计描述和行为级验证,(3)逻辑综合,(4)门级验证,(5)布局和布线。
验证过程:(1)用 VCS 编译 Verilog 源程序,(2)执行 simv 进行仿真验证,(3)在错误点停下,(4)确定错误并改正(4)编译仿真确认修改是否正确(5)解释结果。
2. VCS 对 verilog 模型进行仿真包括哪两个步骤? 答:VCS 对 verilog 模型进行仿真包括两个步骤:(1)编译 verilog 文件成为一个可执行的二进制文件,命令为:> vcs source_file [complie_time_options];(2)运行可执行文件,>simv [run_time_options] 3. VCS 验证各选项参数的含义? 答:(1)-y lib_dir 在 lib_dir 的路径下的所有文件中寻找未被编译的相关模块,(2)+libext+lib_ext 在 lib_dir 的路径下使用文件的扩展名 lib_ext 来寻找文件,(3)-s 在 0 时刻停止仿真,(4)$stop 采用断点的方式停止仿真,$finish 终止仿真过程,$display 将数据或消息等显示在控制台上,(5)? 显示所在的位置,即位于模块的哪一层,(6)print 显示所有的变量值,(7)scope 进入指定模块。
4. 在 lab1 中,能不能在 adder.f 文件中加入-R? 答:不能。-R 的作用是显示文件及所有子目录,而 adder.f 为自定义格式,没有其他文件或子目录可以显示。
5. 在 lab1 中,是否可以用-v 代替-y?如果可以该怎样进行? 答:在 lab1 中,可以用-v 代替-y,将命令行 shell> vcs addertb.v add8.v –y../../lib +libext+.v –R
改为:shell> vcs addertb.v add8.v –v vcs 因为 partb 文件夹下仅有两个文件:addertb.v,add8.v,其余的模块放在库文件的根目录下。
-v lib_file 在文件 lib_file 中寻找未被编译的相关模块。
-y lib_dir 在 lib_dir 的路径下的所有文件中寻找未被编译的相关模块。
四、源代码(仅记录自己设计的 ,或者针对实验资料修改的部分)
module fa(a, b, cin, sum, cout);input a, b, cin;output sum, cout;assign {cout, sum} = a + b+cin;endmodule
教
师
评
语
第二篇:实验动物学实验报告
实验动物学实验报告
一、实验动物:小鼠
二、操作流程:抓取,固定,编号,给药,取血,麻醉,绝育,解剖。
三、具体操作
1、抓取:抓取小鼠时,右手抓住小鼠尾巴,不要过于用力,以免惊吓小鼠。左手从小鼠身体后部向前抓(以免小鼠向后缩咬伤自己),抓住小鼠颈部。固定住小鼠后,将小鼠皮肤往上抓,尽量将小鼠背部皮肤抓住。左手将小鼠腹部朝向自己,把小鼠尾巴用左手无名指和小指夹住,这时小鼠腹部皮肤紧绷,不能动弹。
2、固定: 通常使用固定器进行固定。将固定器拧开后,抓住小鼠尾巴,使其钻入固定器中,再将拧下的固定器部分装好,使小鼠尾部露出,再将可旋转的铁片固定住即可进行后续实验。
3、编号:编号方式有两种:①剪脚趾编号:把小鼠腹面朝上,在下的脚趾从左至右依次编为1~10号,剪10号脚趾加1~9号脚趾依次编为11~19号,在上的脚趾依次编为20,30,40,50,60,70,80,90号,其余编号与11~19号类似。②打耳钉编号:耳钉上均有唯一编号,通过使用耳钉钳将耳钉打在小鼠耳朵上即可。实验时通常使用的是第一种方式进行编号,第二种编号通常用于需要长距离运输的动物。
4、给药:常用的给药方式有:
①口服给药:即灌胃。将注射器装入药物溶液,装上灌胃针(灌胃针有直头和弯头两种,区别不大)。如上所述,抓取小鼠后,使其头部朝上,尽量呈一直线,取灌胃针,从小鼠嘴角一侧缓缓插入(保持刻度在自己能看到的位置),顺着小鼠口腔食道的弧度让小鼠将针咽入,灌胃过程中如果遇到阻碍一定要及时拔出灌胃针,不可强行灌胃以免伤及小鼠食道以及肺部。灌胃针顺利进入后基本与小鼠身体呈一条直线,注入适量体积后再顺着食道缓缓取出灌胃针。
②静脉注射:小鼠尾部有3条静脉和1条动脉,3条静脉非别位于背部,及两侧。静脉注射时一般选取两侧静脉,因为其相对于背部静脉更为清晰饱满。将小鼠固定后,用酒精擦拭其尾部静脉,使其充血,以便注射。之后使注射器针孔处朝上,针与尾部呈约30°扎入尾部后向上轻挑,再向内扎入部分,此过程应该比较顺畅,没有阻碍,若阻碍较大则有可能扎入到了皮肤中。扎入后将活塞向后回抽一点可见到有血回流,则说明成功扎入静脉当中,注射适当体积后迅速拔针,用酒精进行消毒。
5、取血:有断尾取血法和眼眶取血法两种。本次实验使用的是眼眶取血法。抓取小鼠,固定其头部用手指将其上下眼睑分开,露出其眼球并且不能闭上。用玻璃毛细管从其上眼角处扎入眼球后方毛细血管从,使血液顺着毛细管留下,取血完成后快速将毛细管取下。
6、麻醉:抓取老鼠,使其头部朝下,使其腹部脏器向胸腔靠拢,露出腹部空腔,以免刺伤脏器。将注射器竖直扎入靠近后腿部腹腔,刺入之后稍微向前倾斜但不要向前刺入,一般注入0.5mL麻醉剂即可。随后拔出针,方向小鼠,等待几分钟后即可麻醉。
7、绝育:绝育手术是通过剪除雌鼠卵巢或雄鼠输精管来实现的。将麻醉的雌鼠背面朝上,从其胸腔和尾部之间向下三分之一处剪开一个小口,用镊子将其卵巢取出,上面呈现红色斑点的部分即为卵巢,用剪刀将这一部分剪除,然后用缝合针线将其缝合,缝合方法为将针穿过后,将线缠绕镊子两圈再逆时针缠绕两圈,再重复缠绕一遍,将镊子夹住线头把缠绕的线移至线头系紧即可(缝合过程全程用镊子和剪刀操作),里面肌肉层以及外面皮层均需缝合。雄鼠则从外生殖器向上1-2cm处剪开小口,用镊子在其中找出输精管(较细长的乳白色小管),尽量多减掉一些,以免其长长愈合,以上述方法缝合伤口即可。
9、解剖:以颈椎脱臼法处死小鼠,使其腹面朝上。用镊子将其腹部皮肤夹起,然后用剪刀剪开,观察各个器官所在位置和形态,解剖完的小鼠放入尸体袋中。
第三篇:趣味实验实验报告
趣味实验
实验员:张燕年级、班级:09级化学三班学号:40907147 联系方式:***
一、实验目的:
激发学生学习化学的兴趣,通过化学实验的趣味化活动,使学生的思维更加活跃,手脑并用的能力更强,创新意识和创造精神得到充分发挥。
二、实验内容:
(一)蓝色振荡实验:
1.实验原理:
亚甲基蓝的水溶液呈蓝色,在碱性条件下,葡萄糖可以将它还原为无色,搅拌条件下空气会把无色产物亚甲基白氧化为蓝色,蓝色又被还原为无色,如此反应,实验能多次重复。
2.实验仪器和药品:
碘量瓶(用于微量元素的测定)、小烧杯、NaOH固体、葡萄糖、亚甲基蓝溶液(10mol/L)。
3.实验步骤:
(1)称取5.0g氢氧化钠(为整个实验过程提供一个碱性环境)于小烧杯中,加入约30mL水充分溶解。再将所得溶液转移至碘量瓶中,加水至约150mL;
(2)称取7g葡萄糖加入到(1)所得的溶液中,充分搅拌,使其完全溶解。再向碘量瓶中滴加1mL(约20滴)亚甲基蓝溶液,缓慢摇匀,之后静置大约半分钟,会发现蓝色的溶液慢慢变为无色透明的溶液,再继续振荡碘量瓶,会发现溶液又变回蓝色,再继续静置半分钟左右,溶液又变为无色。此现象可重复若干次。
(二)化学冰袋:
1.实验原理:
铵盐溶解会吸热,可以起到降温的效果。
2.实验仪器和药品:
密封袋、(NH4)2SO4、NH4NO3、Na2SO410H2O和NaHSO4。
3.实验步骤:
(1)分别称取4g硫酸铵、5g硝酸铵、9.6g十水硫酸钠和4g硫酸氢钠;
(2)将所称取的药品按顺序加入到密封袋中,添加顺序如下:十水硫酸钠、硫酸氢钠、硫酸铵和硝酸铵。将所加的药品用手压碎,会发现密封袋温度很低,此时我们的冰袋就做好了。
(三)固态汽水:
1.实验原理: 3
碳酸氢钠和柠檬酸钠反应可以释放出二氧化碳,能带走部分热量,这就是特别爽口的碳酸饮料。
2.实验仪器和药品:
烧杯、玻璃棒、研钵,柠檬酸、柠檬黄、蔗糖、明胶、碳酸氢钠。
3.实验步骤:
(1)称取0.1g明胶于小烧杯中,加入约10mL水使其吸水膨胀,如溶解过慢可用酒精灯适当微热;
(2)称取2.5g碳酸氢钠与小烧杯中,再取1mL(1)所得的溶液加入其中,最后用电吹风将小烧杯中的液体吹干;
(3)取4g蔗糖、4.5g柠檬酸和微量的柠檬黄于研钵中,研细成粉末状之后再加入到(2)所得的固体药品中,这时我们就制成了固体汽水;
(4)用100mL来冲调固体汽水,就制成了我们日常饮用的爽口的饮料。
三、实验注意事项
1、明胶微热溶解时不可温度太高,烧杯距离火焰需保持一定的距离,原因是明胶是一种蛋白质,高温容易变性。
2、称量NaOH时需用烧杯,纸张要现称现用,这样也会产生潮解。当然由于此实验主要是要一个碱性环境,所以此影响在此实验中可以忽略。
3、蓝色振荡实验过程中包含的是一种热力学平衡,在2—3h后这个实验现象就完全消失,此时已达到了极限状态。
4、冰袋制作不能使用无水碳酸钠(纯减)粉末,必须是含结晶水的晶体碳酸钠或成块状纯碱。可以将无水碳酸钠粉末溶于水,然后加热浓缩至晶体析出,自制晶体碳酸钠。
四、实验反思1、1.化学是一门实验科学,化学实验能够引起学生的认知兴趣,如果把实验做趣味化处理,则更能引起学生的兴趣,产生强烈的学习动机。我们本次实验包括观察性趣味实验和操作性趣味实验。
2、作为一名准化学教师,做好演示实验是很重要的一项教学技术,尤其是趣味实验,它在激发学生学习化学方面起着很重要的作用。而在这次演示实验时,我由于过于紧张,所以出现了小差错,而且讲解实验的方式也不够生动,没有“趣味”,没有很好的达到趣味实验所要求达到的目的。
第四篇:实验一 实验报告
网 络 程 序 设 实验报告
实验名称:Winsock编程接口实验 实验类型: 验 证 型
计
一、实验目的
掌握Winsock的启动和初始化;
掌握gethostname(),gethostbyname(),GetAdaptersInfo()等信息查询函数的使用。
二、实验设计
实验内容:
1、编写程序能同时实现对多个域名的解析。比如在控制台输入:getip www.xiexiebang.com对应的IP地址列表。
2、编写程序获取并输出本地主机的所有适配器的IP地址,子网掩码,默认网关,MAC地址。
根据实验内容编写程序:
1、对相关域名进行解析,利用gethostbyname()完成解析,用到的结构体为:
struct hostent{ char FAR*
h_name;char FAR* FAR* h_aliases;short
h_addrtype;short
h_length;char FAR* FAR* h_addr_list;}
得到的IP地址列表由h_addr_list存储;
2、利用GetAdaptersInfo()函数获得本地主机的相关信息,通过IP_ADAPTER_INFO结构体返回所需信息。
IP_ADAPTER_INFO的定义如下: typedef struct _IP_ADAPTER_INFO {
struct _IP_ADAPTER_INFO* Next;
DWORD ComboIndex;
char AdapterName[MAX_ADAPTER_NAME_LENGTH + 4];
char Description[MAX_ADAPTER_DESCRIPTION_LENGTH + 4];
UINT AddressLength;
BYTE Address[MAX_ADAPTER_ADDRESS_LENGTH];
DWORD Index;
UINT Type;
UINT DhcpEnabled;
PIP_ADDR_STRING CurrentIpAddress;
IP_ADDR_STRING IpAddressList;
IP_ADDR_STRING GatewayList;
IP_ADDR_STRING DhcpServer;
BOOL HaveWins;
IP_ADDR_STRING PrimaryWinsServer;
IP_ADDR_STRING SecondaryWinsServer;
time_t LeaseObtained;
time_t LeaseExpires;
} IP_ADAPTER_INFO, *PIP_ADAPTER_INFO;
三、实验过程(包含实验结果)
1、分析题目,编写程序;
2、将编写的程序进行编译、运行,输入题目给定的内容,完成题目要求; 结果如下:
第1题:
第2题:
四、讨论与分析
思考题:
1、Winsock初始化的作用:只有调用了WSAStartup()进行初始化之后,应用程 序才能调用其他Windows Sockets API函数,实现网络通信;
2、函数原型为:
DWORD GetAdaptersInfo(PIP_ADAPTER_INFO pAdapterInfo,//接受数据的缓冲区
PULONG pOutBufLen
// 数据的长度大小);
3、域名解析时出现域名对应多个IP,原因:该域名存在于多个服务器。
五、实验者自评
通过本次实验,我掌握了Winsock的启动和初始化以及gethostname(),gethostbyname(),GetAdaptersInfo()等函数查询的使用,加深了以前对课本知识的认识程度。
六、附录:关键代码(给出适当注释,可读性高)
第1题代码:
////////////////////////////////////////////////// // GetAllIps.cpp文件
//#include “../common/InitSock.h” #include
using namespace std;
#pragma comment(lib, “WS2_32”)// 链接到WS2_32.lib //CInitSock initSock;// 初始化Winsock库
void main(){
char szMessage[256];// 取得本地主机名称
// 初始化
WSADATA wsaData;if(WSAStartup(MAKEWORD(2,2), &wsaData)!= 0){
exit(0);}
// 通过主机名得到地址信息
printf(“ Get IP::”);gets(szMessage);
// 获取主机信息
hostent *pHost = ::gethostbyname(szMessage);
// 打印出所有IP地址
in_addr addr;for(int i = 0;;i++){
char *p = pHost->h_addr_list[i];
if(p == NULL)
break;
memcpy(&addr.S_un.S_addr, p, pHost->h_length);
char *szIp = ::inet_ntoa(addr);
printf(“ 服务器 %s IP地址:%s n ”,szMessage, szIp);
printf(“服务器名字: %s n”,pHost->h_name);}
/////////////////////////// ::WSACleanup();
}
第2题代码:
// 获取并输出本地主机的所有适配器的IP地址,子网掩码,默认网关,MAC地址
#include
void main(){ // 定义变量
IP_ADAPTER_INFO *pAdapterInfo;ULONG ulOutBufLen;DWORD dwRetVal;PIP_ADAPTER_INFO pAdapter;
pAdapterInfo =(IP_ADAPTER_INFO *)malloc(sizeof(IP_ADAPTER_INFO));ulOutBufLen = sizeof(IP_ADAPTER_INFO);// 第一次获取适配器信息,得到ulOutBufLen的实际大小
if(GetAdaptersInfo(pAdapterInfo, &ulOutBufLen)!= ERROR_SUCCESS){
free(pAdapterInfo);
pAdapterInfo =(IP_ADAPTER_INFO *)malloc(ulOutBufLen);} // 第二次获取适配器信息,获得了pAdapterInfo信息
if(dwRetVal = GetAdaptersInfo(pAdapterInfo, &ulOutBufLen)!= ERROR_SUCCESS){
cout<<“GetAdapterInfo Error!”< // 打印MAC地址信息、子网掩码以及网关 pAdapter = pAdapterInfo;while(pAdapter){ cout<<“MAC Address: ”; for(int i=0;i AddressLength;i++) { if(i ==(pAdapter->AddressLength-1)) { cout< } else { cout< } } cout< cout<<“IP 地址:”< IpAddressList.IpAddress.String< cout<<“子网掩码 :”< IpAddressList.IpMask.String< cout<<“网关 :”< IpAddressList.IpAddress.String< cout<<“****************************************”< pAdapter = pAdapter->Next;} // 释放资源 if(pAdapterInfo){ free(pAdapterInfo);} cout< } 交换机实验II 实验目的 1.理解掌握环路对网络造成的影响,掌握环路的自检测的配置; 2.理解路由的原理,掌握三层交换设备路由的配置方法 3.掌握DHCP的原理以及其配置方法 实验步骤 配置交换机的IP地址,及基本的线路连接等; 实验1: ①.用独立网线连接同一台交换机的任意两个端口时期形成自环 ②.对交换机的两个端口进行配置,开启所有端口的环路检测功能、设置检测周期等属性 实验2: ①.按图1方式对三层交换机的VLAN、端口进行配置 ②.在交换机中分别对VLAN的IP地址进行配置 ③.启动三层交换机的IP路由 ④.设置PC-A、PC-B的IP地址,分别将它们的网关设置为所属三层交换机VLAN的IP地址 ⑤.通过Ping验证主机A、B之间的互通状况 实验3: 三层交换机作为DHCP服务器,两台PC-A和PC-B,分别从交换机上获取IP地址。PC-C手动配置IP地址。 ①.按图2方式建立主机A、B、C与三层交换机间的连接,配置交换机的IP地址 ②.配置三层交换机的DHCP地址池属性 ③.启动DHCP服务 ④.(1)查看主机A、B能否正确的获取到给定范围内IP地址,通过Ping查看网关、交换机之间的互通情况;(2)拔掉主机B的网线,将主机C的IP地址设置为主机B所获取的到的IP地址,然后再插上B机网线,查看其是否能获取到不同的IP地址;(3)分别重启主机A、B及交换机,查看A、B获取到的IP地址是否和前一次相同。 图1.三层路由连接图 图2.DHCP连接图 实验结果 实验1:环路测试 交换机出现环路的自检测结果: 实验2:路由配置: 主机A连接交换机端口2,划分为vlan10,端口IP地址为192.168.1.1。主机IP地址192.168.1.23; 主机B连接交换机端口10,划分为vlan20,端口IP地址为192.168.2.1。主机IP地址192.168.2.27; 在未设置IP routing之前主机A、B分属于不同网段,因此它们不能互通,设置后通过路由则可相互联通: 实验三:DHCP配置和验证: 主机A、B、C分别连接到交换机的端口2,端口18和端口10上。其中主机A、B的IP地址自动获取,主机C的IP地址则手动配置。 主机A通过DHCP获取的IP地址(192.168.1.211) 主机B通过DHCO获取到的IP地址(192.168.1.210) 测试主机A与主机C的互通性(可连通) 测试主机B与主机A、C之间的互通性(可连通) 当主机C配置为主机B获取到的IP地址是会产生IP地址冲突的错误提示: 配置的主机C的IP地址与主机B的IP地址相冲突 主机B网线重新连接后获取到的新的IP地址 交换机重新启动后A、B主机自动获取到的IP地址信息: 主机A自动获取的IP地址 主机B自动获取的IP地址 DHCP可分配IP地址池内IP数目小于申请的主机数目时实验验证情况:(可分配的IP地址为192.168.1.210 — 192.168.1.212),此时连接主机A、B、C、D。 主机D自动获取IP地址的结果 实验与结果分析 环路问题: 分为第二层环路和第三层环路,所有环路的形成都是由于目的路径不明确导致混乱而造成的。例如第二层,一个广播信息经过两个交换机的时候会不断恶性循环的产生广播造成环路,而第三层环路则是原路由意外不能工作,造成路由通告错误,形成一个恶性循环。传统的二层预防技术主要有STP(Spanning tree)来预防,STP在不断的修改和更新中,产生了诸如STP/RSTP/MSTP等多个版本,大家可根据各自的组网规划来选择应用,但是STP的配置复杂度,以及协议本身的开销通常都是网络管理人员比较头痛的事情。 解决因环路(自环或外环)对网络造成的影响,能够提高网络的自检错性、容错性和健壮性。环路检测的过称为:对交换机的每个端口周期性的发送回路检测(Loopback-detection)数据包;交换机查看端口收到包的CPUMAC字段,如果其中存的是本交换机的MAC,则本交换机的某些端口形成环路,否则将其丢弃,出现环路后,交换机会关闭端口号较大的端口以消除环路。图1中反映了在交换机开启所有端口的环路检测功能后每隔30秒检测到的信息以及对端口的关闭等操作信息。 三层路由意义和工作过程: 实现不同VLAN间主机的通信,通过配置VLAN能够有效地控制广播域的大小。在同一VLAN内的主机间的通信不需要经过交换机的路由处理可直接到达目的主机,当不同VLAN间通讯时,数据包先转发至路由器,由路由器查询其路由转发表选择正确的端口间数据包转发到目的VLAN的交换机,再由目的VLAN内交换机将数据包转发至目的主机。其中扮演主要角色的即为交换机的路由功能,如果没有设置相关属性则不同VLAN间不能通讯。 因此在图3的验证实验中,通过路由器的转发功能实现了分别位于VLAN10和VLAN20中主机A、B之间的通信,在未配置IP Routing之前VLAN10和VLAN20分属不同网段(A、B也属于不同网段),因此不能实现通信,配置之后路由器(三层交换设备)可通过内部路由转发表实现数据的转发和通信。 DHCP工作过程与实验分析: 即动态主机配置协议(Dynamic Host Configuration Protocol),是一个局域网的网络协议,使用UDP协议工作,主要有两个用途:给内部网络或网络服务供应商自动分配IP地址,是使内部网络管理员能够集中管理(从中心结点监控)和自动分配IP 网络地址的通信协议。当某台计算机移到网络中的其它位置时,能自动收到新的IP 地址。DHCP 服务器从地址池中为客户端选择并分配IP 地址及其他相关参数当作为DHCP服务器的设备收到客户端发来的DHCP 请求时,将从地址池中挑选一个空闲的IP 地址。 DHCP工作过程: 当 DHCP客户端第一次登录网络的时候,也就是客户发现本机上没有任何 IP 数据设定,它会向网络发出一个 DHCP DISCOVER封包(广播包)。因为客户端还不知道自己属于哪一个网络,所以封包的来源地址会为 0.0.0.0,而目的地址则为 255.255.255.255,然后再附上 DHCP discover 的信息,向网络进行广播。如果都没有得到DHCP服务器的响应,客户端则会显示错误信息,宣告 DHCP discover 的失败。之后,基于使用者的选择,系统会继续在 5 分钟之后再重复一次 DHCP discover 的过程。 当 DHCP服务器监听到客户端发出的 DHCP discover 广播后,它会从那些还没有租出的地址范围内,选择最前面的空置 IP,连同其它 TCP/IP 设定,响应给客户端一个 DHCP OFFER封包。由于客户端在开始的时候还没有 IP 地址,所以在其 DHCP discover封包内会带有其 MAC 地址信息,并且有一个 XID 编号来辨别该封包,DHCP服务器响应的 DHCP offer 封包则会根据这些资料传递给要求租约的客户。根据服务器端的设定,DHCP offer封包会包含一个租约期限的信息。 如果客户端收到网络上多台 DHCP 服务器的响应,只会挑选其中一个 DHCP offer 而已(通常是最先抵达的那个),并且会向网络发送一个DHCP request广播封包,告诉所有 DHCP 服务器它将指定接受哪一台服务器提供的 IP 地址。同时,客户端还会向网络发送一个 ARP封包,查询网络上面有没有其它机器使用该 IP 地址;如果发现该 IP 已经被占用,客户端则会送出一个 DHCPDECLINE 封包给 DHCP服务器,拒绝接受其 DHCP offer,并重新发送 DHCP discover 信息。事实上,并不是所有 DHCP客户端都会无条件接受 DHCP服务器的 offer,尤其这些主机安装有其它 TCP/IP 相关的客户软件。客户端也可以用 DHCP request 向服务器提出 DHCP 选择,而这些选择会以不同的号码填写在 DHCP Option Field 里面。 当 DHCP服务器接收到客户端的 DHCP request 之后,会向客户端发出一个DHCPACK 响应,以确认 IP 租约的正式生效,标志着一次DHCP的工作过程完成。 图4—6反映了主机A、B通过自动获取IP地址方式由三层交换机动态分配IP后,各自得到的IP地址,由于A、B、C连接与同一台交换设备上,由没有VLAN划分等因素,所以它们之间不论是自动获取IP地址还是手动配置IP地址(不冲突的前提下)都能相互连通。当为主机C配置成已得到自动分配IP地址的主机B的IP地址时,自然会出现IP地址冲突的出错信息提示。当B网线重新链接时,相当于重新加入的客户端,交换机会从地址池中顺序选择下一个未分配的IP地址给新的请求用户。因此主机B会获得新新的IP地址,并且其值是主机C的IP地址的下一个邻接IP地址(在未超出可分配的IP地址范围条件下)。图7 —10中反映了上述描述的结果。 图11中显示了一种造成IP地址动态分配失败的情形:可分配的IP地址数仅有3个,而由4台主机请求分配IP地址,当可分配地址全部分配给主机A、B、C后,主机D的请求不能得到满足,因此未得到给定范围内的合理IP地址。第五篇:交换机实验 实验报告