- 1、本文档共26页,可阅读全部内容。
- 2、原创力文档(book118)网站文档一经付费(服务费),不意味着购买了该文档的版权,仅供个人/单位学习、研究之用,不得用于商业用途,未经授权,严禁复制、发行、汇编、翻译或者网络传播等,侵权必究。
- 3、本站所有内容均由合作方或网友上传,本站不对文档的完整性、权威性及其观点立场正确性做任何保证或承诺!文档内容仅供研究参考,付费前请自行鉴别。如您付费,意味着您自己接受本站规则且自行承担风险,本站不退款、不进行额外附加服务;查看《如何避免下载的几个坑》。如果您已付费下载过本站文档,您可以点击 这里二次下载。
- 4、如文档侵犯商业秘密、侵犯著作权、侵犯人身权等,请点击“版权申诉”(推荐),也可以打举报电话:400-050-0827(电话支持时间:9:00-18:30)。
查看更多
TCPIP协议分析实验指导书毯牛好专业:计算机科学与技术
课 程 号:
适用专业:计算机科学与技术
制 定 人:
教 研 室:网络教研室
计算机科学与信息工程学院
2007 年9 月
实验一 数据链路层协议的设计与实现(6学时)
一、实验目的
计算机网络的数据链路层协议保证通信双方在有差错的通信线路上进行无差错的数据传输,是计算机网络各层协议中通信控制功能最典型的一种协议。
本实验实现一个数据链路层协议的数据传送部分,目的在于使学生更好地理解基本数据链路层协议的基本工作原理,掌握计算机网络协议的基本实现技术。
二、实验内容
在一个数据链路层的模拟实现环境中,用C 语言实现下面数据链路层协议。
分析一个理想的链路层协议的实现,熟悉它的实现环境。
对于前面实现的协议进行扩充,实现它的第一次改进,如何防止发方过快淹没收方。
对②再假设在不可靠的的链路上进行通信。
三、模拟实现环境及其使用
数据链路层协议位于物理层之上,网络层之下。它使用物理层提供的服务,并且向网络层的分组数据传输提供可靠的服务。因此,实现一个数据链路层协议必须要有一个模拟实现环境。也就是说在本实验中网络层和物理层所要执行的任务已经由该模拟环境模拟实现了,同学只需要完成数据链路层协议的设计和实现。
(1)、模拟实现环境的描述:
模拟系统由以下几部分组成:
协议文件使用的头文件potocol.h,定义了帧的数据结构及一个枚举类型的变量;
通用的头文件common.h,包含类型预定义、常量定义等;
代码文件sim.c 和worker.c。(其中sim.c用于控制模拟环境和协议的运行;worker.c中实现了协议文件使用的一些调用函数)
模拟系统使用的三个进程分别为:
· main: 控制整个模拟系统
· MO: 协议2 和协议3 的发送方(machine 0)
· M1: 协议2 和协议3 的接收方(machine 1)
文件sim.c 中包含的主程序完成如下功能:
首先分析命令行并且将参数保存起来;
接着创建六个管道使得三个进程之间能够进行通信,所创建的文件描述字以如下方式命名:
MO 和M1 的通信;
w1、r1:MO 到M1 的帧传递
w2、r2:M1 到MO 的帧传递
Main 和MO 的通信:
W3、r3:main 通知MO go-ahead
w4、r4:MO 通知main,MO 已准备好
Main 和M1 通信:
w5、r5: main 通知M1-go-ahead
w6、r6:M1 通知main,M1 已准备好。
建管道之后,主程序Main 创建两个子进程MO 和M1。MO 和M1 将分别调用所选中的协议子程序。所有的协议都被编译成二进制码,无需执行exec。
每个协议都执行它自己的初始化并运行,实际上它是调用一个wait_for_event()函数来完成这项工作的,这个函数在文件worker.c 中。Wait_for_event()函数设置一些计数器,接着读入从MO 或M1 传来的帧,此时将帧从管道中取出以防止管道阻塞。读入的帧被保存在数组quene[]中,在需要的时候也可将其在quene[]中删除。指针inp 和outp 分别指向queue[]中第一个空位置和下一个将被删除的帧。Nframes 保存queue[]中帧的数目。输入管道一旦被读完, wait_for_event()向main 发送一个4 个字节的消息来说明它已准备执行一个事件,此时它等待main 发给它一个go-ahead。
Main 选择一个进程(M0或M1) 来运行,并将当前时间通过文件描述字w3 或w5 传给它做为go-ahead 信号。被选中的进程根据从管道传来的值设置自己的时间,从而使两个进程保持时间上的同步。接着进程 调用pick_event()来决定返回哪个事件。对不同的协议来说,可能发生的事件表是不同的。pick_event()将检查哪些事件是可行的,并做出选择。例如,如果没有运行定时器,或者被模拟的协议不存在定时器,那么超时事件是不能被返回的;如果没有帧保存于quene[]中,那以帧到达事件是不能被返回的。
一旦一个事件被返回, wait_for_event()将返回其调用者,即协议例程。这些例程可以调用worker.c 中所有的库函数,它们完成管理时钟,向管道中写帧等操作。worker.c 中的代码很简单并且有很多注释。
主程序也很简单,它选择进程并且向通信管道中写一个4 个字节整数的时间值做为go-ahead 信号。被选中的进程检查是否能运行。如果可以,那么返回代码OK;如果现在不能运行且没有未关掉的时钟,那么返回代码NOTHING;如果两个进程都返回NOTHING,那么表示发生死锁。死锁被设定为超时间隔的三倍,可能过于保守,但能够消除错误的死锁事件。
(2)、模拟实现环境的使用
执行make命令,将模拟环境文件和实现的
文档评论(0)