停止等待协议

上传人:jin****ng 文档编号:223233534 上传时间:2023-07-17 格式:DOCX 页数:11 大小:29.54KB
收藏 版权申诉 举报 下载
停止等待协议_第1页
第1页 / 共11页
停止等待协议_第2页
第2页 / 共11页
停止等待协议_第3页
第3页 / 共11页
资源描述:

《停止等待协议》由会员分享,可在线阅读,更多相关《停止等待协议(11页珍藏版)》请在装配图网上搜索。

1、停止等待协议1 实验目的 12 协议介绍 121 停止等待协议的简单介绍 (STOP AND WAIT): 122 帧的结构: 123 停等协议中相关事件的介绍 23 实验内容和步骤 331 步骤: 332 基本内容: 433 扩展内容: 44 实验要求 45 程序说明 65.1主要的数据结构介绍: 65.2 主要函数介绍: 65.3 重点和难点介绍: 86 参考资料 101 实验目的掌握停止等待协议的基本原理理解数据链路层的主要功能(数据出错控制,数据重复控制,数据丢失控制 分析简单的协议数据单元 掌握停止等待协议的运行机制 了解停止等待协议的定量分析2 协议介绍2. 1停止等待协议的简单介

2、绍(stop and wait):停止等待协议是数据链路层的几个协议中最基本的协议,是数据链路层各种 协议的基础。此实验是基于 winsock 编程,是在 VC+6.0 的 windows 界面下和控 制台下实现的。它采用客户机/服务器(C/S)模型。停止等待协议就是通过双方 的收发数据而达到相互通信的目的。在通信时,当收方收到一个正确的数据帧后,便会向发送方发送一个确认帧 ACK,表示发送的数据正确接收。当发送方收到确认帧后才能发送一个新的数据 帧,这样就实现了接收方对发送方的流量控制。由于通信线路质量各方面的影响,数据帧从发送方到接收方传输的过程中可 能会出现差错。为了保证数据的正确性和完

3、整性,接收方在收到数据后,会用一 定的方法对接收到的数据进行差错检验,所以接收方很容易检测出收到的数据帧 是否出现差错。当接收方发现收到的数据出现差错时,就会向发送方发送一个否 认帧 NAK, 表示对方发送的数据错误。发送方会根据接收方发来的信息做出相应 的操作。采用这样的有效的检错机制,数据链路层可以对上面的网络层提供了可 靠的传输的服务。2. 2 帧的结构:帧的类型帧的序号帧的确认号数据信息(可变)校验序列帧的结构 帧的类型(frame_kind):分为数据帧(data_frame),确认帧(ack_frame)和否认帧(nak_frame) 三种。发送方向接收方发送数据,是以帧为单位的,

4、就称为数据帧。它的数据信息 是可变的,但最佳的帧长为 1500 个字节。接收方接收数据后,会对收到的数据帧进行差错校验,当数据正确时,就会 向发送方发送一个确认帧,以表示发送方发送的数据正确接收了,反之,就会向 发送方发送一个否认帧,并把这个出错的数据帧丢弃。 帧的序号(seq):对数据帧来说:序号(seq)表示的是发送端发送的帧的序号。对确认帧来说:序号(seq)表示的是接收方希望接收到的帧的序号,它表 示seq以前的各帧都已经正确接收,希望收到序号为seq的帧。对否认帧来说:序号(seq)也是表示接收方希望收到的数据帧的序号,表 示接收方已经收到序号为seq的帧,但是这个帧出现错误,希望发

5、送方重新发送 该数据帧。数据信息:是用来表示发送端发送的数据信息。 校验序列:是为了避免数据在传输的过程中出现差错,而采取的一个检错机制。发送方 用一定的方法根据发送端的数据产生一个校验序列,再把这个校验序列作为 数据帧的一部分,发送出去。接收方接收数据后,会采用同样的方法对收到的数据进行校验,以此来判断收到的数据是否出现差错。采用这样的一个校 验序列位,从而保证了数据链路层对上面的网络层提供了可靠的传输服务。停止等待协议采用的是单工通信,接收端向发送端发送的确认帧和否认帧中 没有数据信息,它们的数据域为空。由于是单工通信,发送方只发送数据,所以 发送方帧的“帧的确认号”中并没有包含任何的确认

6、信息。23 停等协议中相关事件的介绍 帧丢失:有时,链路上的噪声干扰很严重,或者由于其他的一些原因,接收方收不到 发送方发送过来的数据帧,这种情况称为数据帧丢失。发生数据帧丢失时,接收 方自然不会向发送方发送任何应答帧。如果发送方要等收到收方的应答信息后再 发送下一个数据帧,那么双方将永远等下去,这样就出现了死锁现象。为了解决这个问题,可在发送方发送完一个数据帧后,就启动一个超时定时 器。若到了超时定时器所设置的重发时间 t 仍收不到收方的任何应答帧,则发 送方就重传前面所发送的这一数据帧。如果在重传时间t内收到确认信息,则 out将超时定时器清零并停止计时。 t 一般的时间设置为略大于“从发

7、完数据帧到 收到确认帧所需的平均时间”。 out 帧重复:若丢失的是应答帧,则超时重发将会使接收方收到两个同样的数据帧。由于 接收方无法识别重复的数据帧,因而在接收方收到的数据中出现了一种接收序号 差错,称为重复帧。要解决这个问题,必须使每一个数据帧带上不同的发送序号。若接收方收到 序号相同的数据帧,就表明出现了重复帧。这时接收方应当丢弃这个重复帧,同 时向发送方发送一个确认帧。因为接收方这时已经知道发送方没有收到上一次发 送的确认帧。大家都知道,任何一个编号系统的序号所占用的比特数应是有限的。经过一 段时间,发送序号就可重复。使用序号占用的比特数越少,数据传输的额外开销 就越少。对于停等协议

8、,由于每发送一个数据帧就停止等待,用一个比特来编号 就够了,也就是说序号轮流使用 0 和 1。 帧出错:数据在传输的过程中,不可能保证 100%的正确传输,而错误的数据帧对于 接收方来说是没有什么意义的。为了避免收到错误的数据帧,接收方在收到数据 帧后,就会采用一定的机制对收到的数据帧进行校验,当校验数据正确时,会向 高层传送该帧,反之,则丢弃该帧,从而对上面的网络层提供了传输的服务。 3 实验内容和步骤31 步骤:(一) 启动程序打开“数据链路层实验”文件1. 找到停止等待协议文件2.双击此文件中的两个可执行的程序(server.exe, client.exe)(二) 运行应用程序服务器端:

9、1. 在服务器信息-服务器IP中输入运行这个程序的计算机的IP地址;2. 在端口 PORT 中输入端口号,也可以使用默认的端口号 4000;3. 点击“建立服务器” 按钮,使其处于监听状态,直到有连接请求;客户端:1. 在输入服务器信息-输入服务器IP中输入想连接的服务器的IP地址和端口 号;2. 点击“连接到服务器” 按钮,使其和服务器进行连接;3. 点击“设置链路参数”按钮,对链路中的每个参数进行设置 其中,链路的参数主要有:输入数据的出错率和丢失率主要是为了模拟现实的网络线路状态的,这两个 参数的值确定后,输入数据的正确率也就定下来了; 传输数据的超时时间,是发送端发送完一个数据帧到收到

10、应答帧所需的时 间;重传次数是为了避免出现死循环,当出现帧丢失或者是帧出错时,发送端在 重传一定的次数后,就不再进行重传,在显示错误信息后,终止发送数据;4. 点击“开始发送数据”按钮,在弹出的框中输入要传送的数据,然后单击“确 定”,则表示从网络层取到一个包,在数据链路层中,把这个数据包封装成 帧,发送到接收方,重复这一步可以不断的从网络层取到要发送多组数据5. 如果不想再往接收端发送数据,则点击“ END”按钮,可退出应用程序6. 关闭服务器端的应用程序 注意:一般的客户机/服务器的运行机制是这样的:服务器端先打开,然后等 待客户端的请求,当客户端发送完数据后,会和服务器端主动断开连接,但

11、客户 端和服务器断开的时候,需要向服务器端发送一个特殊的数据帧,以此向服务器 端说明客户端的数据已发送完毕,这时服务器端也会向客户端发送一个特殊的响 应帧,来说明服务器端已做好了和这一客户端断开的准备。本实验采用的是这样的一个机制来实现客户端和服务器端断开连接的:它 采用了停止等待协议中帧的结构中的一些变量来交互断开的信息。当客户端不再 向服务器端发送数据的时候,便向服务器端发送一个具有两位数,且内容都是“1” 的数据信息,然后封装成帧,发送到接收端。当接收端收到这个特殊的帧后,会 把向客户端发送确认帧中的校验位中的值置为“111”,表示接收端已经知道客户 端要和它断开连接。当客户端收到接收端

12、发送来的这个确认帧后,便和服务器端 断开连接,则点击“ END”按钮,退出应用程序。32基本内容:1. 通过对链路参数进行不同的设置,仔细观察不同的设置对程序的运行有什么 影响?2. 每发送一个数据帧后,分别观察客户端和服务器端的运行结果,体会停止等 待协议采用什么样的机制来发送和接收数据信息的?3. 根据对链路参数不同的设置,记录停止等待协议中发送端数据帧丢失复、帧 错误、超时重传次数等各种情形的发生,以加深协议中数据出错控制,数据 重复控制,数据丢失控制及协议对这些情况的处理的理解。33扩展内容:1. 通过阅读源程序,画出服务器端和客户端的程序流程图2. 重点分析等待事件的实现和模拟链路参

13、数的实现3. 修改程序,使接收端在收到错误帧后丢弃,不发否认帧,仍能正常工作。4 实验要求基本要求 记录实验的基本数据,包括选用的计算机的IP地址、连接的端口号、发送 端的参数的设置,超时时间的设置,服务器和客户机双方发送的和接收到的 数据 记录实验中对数据丢失率,数据出错率等链路参数的设置和相应的实验的结 果 根据接收端收到十六进制的数据帧的信息,把它转换成发送端发送的原始的 数据根据所使用的机器是发送端还是接收端,填写下面的表格 1 和表格 2 数据表格 1发送端:协议名称服务器IP端口号(PORT)参数设置出错率丢失率超时时间重传次数发送数据接收信息数据表格2接收端:对实验结果进行分析,

14、分析通信双方的数据帧和应答帧之间的关系记录停止等待协议中帧丢失、帧重复、帧错误等各种情形的发生,以及协议这些情况的处理思考题:如果发送端和接收端设置的端口号不一样,将会出现什么情况,为什么?扩展要求 在读源程序之后画出程序的流程图捕获事件是停止等待协议的核心,解释程序中是如何实现捕获事件的5 程序说明5.1主要的数据结构介绍: typedef unsigned int seq_nr; /帧的序号和确认号 / 从网络层得到的包的定义typedef structchar dataMAX_PKT;packet; / 帧类型 frame_kind 的定义typedef enumdata,ack,nak

15、 frame_kind;data 表示数据帧, ack 表示确认帧, nak 表示否认帧 /事件的类型的定义typedef enumframe_arrival,cksum_err,time_out,nothing event_type; / 帧结构的定义/帧的类型/序号/确认数 /网络层数据 /校验域typedef struct frame_kind kind; seq_nr seq; seq_nr ack; packet info; int checksum;frame;5.2 主要函数介绍: 求校验位:在构造数据帧的时候用于求出帧的校验域 在这个实验中,采用的是奇偶校验,下面对奇偶校验简单

16、的介绍一下:奇偶校验也称为垂直冗余校验(VRC),它是以字符为单位的校验方法。一个 字符由8位组成,低7位是信息字符的ASCII码,最高位叫奇偶校验位。该 位中放“1” 或放“0”是按照这样的原则:使整个编码中“1”的个数成为 奇数或偶数,如果整个编码中,“1” 的个数为奇数则叫“奇校验”;“1” 的 个数为偶数则叫“偶校验”。校验的原理是:如果采用奇校验,发送端发送一个字符编码(含校验位共 8 位)中,“1”的个数一定为奇数个,在接收端对8 个二进位中的“1”的个 数进行统计,若统计“1”的个数为偶数个,则意味着传输过程中有1位(或 奇数位)发生差错。否则,认为是正确传输。int check

17、sum_mat(int framekind,int frameseq,packet p) ; 参数P是要校验的数据包,framekind和frameseq是数据帧的类型和发送这个 帧的序号。进行校验的机制是采用奇偶校验,也就是把输入的数据信息也就是数 据包的信息进行奇偶校验,校验的方法是把数据信息按位异或,得出一个校验位, 最后把这个校验位再和数据帧的类型和序号进行异或,最终得出一个包含数据信 息和控制信息的校验位,最后把这个校验位放入帧中的校验域中,形成一个完整 的帧,发送到接收端。检查效验和bool examine_checksum(frame f);参数f是收到的数据帧,根据f的信息域在

18、接收端用奇偶校验重新求出校验域, 求校验域的方法与发送方求校验位的方法相同,然后与收到的数据帧中的校验域 进行比较,如果相同则说明收到的数据帧是正确的,则返回 True,否则返回 false。 从网络层取一个数据和将数据发送到网络层void from_neTwork_layer(packeT *p);void To_neTwork_layer(packeT p);为了体现 TCP/IP 中链路层和网络层的层次性,本实验将取数据和上交数据分别 写为一个函数,具体实现的时候用主机来模拟网络层,从网络层取数据直接从键 盘或文件取到一个数据包放到 p 中,然后在数据链路层封装成帧,再发送到物理 层;向

19、网络层上交数据直接将接收到的数据在屏幕上输出或写入文件中。 从物理层取数据和向物理层发数据inT from_physical_layer(SOCKET sock,frame &r);void To_physical_layer(SOCKET sock,frame &s ,inT wp,inT lp ); 为了体现 TCP/IP 中链路层和物理层的层次性,本实验将接收到的数据和发送的 数据也分别写成了一个函数。接收数据函数从 sock 接收一个数据帧放到 r 中, 返回取到的字符个数;向物理层发送数据是将帧s从sock发送出去。对发送数 据和接收数据的过程中,数据链路中出现的帧出错、帧重复、帧丢

20、失等各种情况 的模拟是在发送端实现的,所以设置了链路质量参数int wp,int lpo其中,wp 表示为发送的数据帧的wrong percent (出错率),lp表示为帧的lost percent (丢失率)。这个函数要调用下面介绍的send_frame()函数。 发送一个数据帧, 控制发送,模拟链路质量void send_frame(SOCKET sock,frame s,int wp,int lp);sock 是发送数据用的套接口, s 是要发送的帧, int wp,int lp 这两个参数表 示要模拟的链路质量参数。 此函数并不在主程序中调用, 在而是 to_physical_laye

21、r(SOCKET sock,frame &s, int wp,int lp冲被调用。用它来 调用 winsock 中的 send() 函数。根据用户输入的各个参数,当模拟出错时,程序会显示出一个发送的数据帧 出错的消息,接收端根据校验会测出收到的数据有错误,给发送端发送一个NAK, 这时发送端会重发刚才发送过的一个帧。当发送端模拟数据丢失时,程序会显示出一个数据丢失的消息,若到了超时 问计时器所设置的重发时间而没有收到接收端发送过来的应答帧,发送端就重传 前面所发送的这一个数据帧,从而避免了死锁问题。 等待一个事件发生,返回事件类型void wait_for_event(SOCKET sock

22、,event_type &event, int timenum); 此函数的核心是调用select ()函数,如果在指定的timenum时间内sock不可 读则返回超时事件,否则返回数据到达事件。5.3 重点和难点介绍:模拟链路参数这个实验是在局域网的通信情况下进行实验的,现在的网络无论是局域网还 是广域网,数据的丢失率和出错率都很小,但本实验为了充分演示停止等待协 议中对各种可能出现的数据通信情况的处理,采用在发送端设置链路参数的方法 来模拟链路中各种可能出现的情况。对链路参数的模拟是整个程序的核心,本实验中的send_frame()函数就是 实现这种模拟功能的。假设链路参数为wp,lp。在

23、程序运行时,首先产生一个随机数,然后将其转 换位某个某个整数概率rand,根据rand所属的范围对数据进行处理。在本实验中根据用户输入的链路参数(这些参数有数据出现错误的百分率, 数据丢失的百分率),用户输入错误率和丢失率后,正确的百分率就出来了。它 们共同组成一个百分比,我们就是根据用户输入的这些数据来对链路上的各种情 况进行了模拟,从而生动的展现了真实性的网络信息通讯。客户端在发送数据的时候,采用随机函数randnum (100)产生一个0到99 的整数randnumber,然后根据用户输入的参数和产生的随机数来对各种事件进 行了模拟:一般数据传输的过程中,出错和丢失的机率是很少的,所以,

24、把出错率和丢 失率分布在0100这个比率范围的两端,剩下的就是传输数据的正确率了。如果用户输入的数据的错误率为wp,randnumber/100三0, wp),则就认为 发生了“帧错误”事件,这是会把客户凋所发送的数据中的某一部分的值修改一 下,发送到服务器端,从而模拟了数据通信中的帧错误事件。如果用户输入的数据的错误率为lp,如果randnumber/100三100-wp ,100), 就模拟发生了“帧丢失”事件,这时客户端会等待服务器的确认信息,而服务器 没有收到信息,就会发生超时事件,当发生超时事件时,客户端会重发上一个数 据帧。剩下的randnumber/100三wp , 100-wp

25、)就默认为数据传输的正确率,这 时数据帧会正确的发送到接收方。 计时器和数据到达事件的捕获 计时器和数据到达事件的捕获是链路层协议很重要的一部分, wait_event() 中主要调用了 winsock中的select()函数。WinSock 编程中有一很方便的地方便是它的消息驱动机制,不管是底层 API 的 WSAAsyncSelect()还是 MFC 的异步 Socket 类:CAsyncSocket,都提供了诸 如 FD_ACCEPT、FD_READ、FD_CLOSE 之类的消息供编程人员捕捉并处理。 FD_ACCEPT通知进程有客户方Socket请求连接,FD_READ通知进程本地So

26、cket 有数据可读, FD_CLOSE 通知进程对方 Socket 已关闭。这些函数都是基于窗口的,但超时计时器和等待事件是停止等待协议很重 要的一部分,在程序的实现中,一个重要的函数就是select()函数,下面简要 的介绍一下这个函数。select()的机制中提供了 fd_set的数据结构,实际上是一个long类型的数 组,每一个数组元素都能与一个打开的文件句柄(不管是 Socket 句柄,还是其他 文件或命名管道或设备句柄)建立联系,建立联系的工作由程序员完成,当调用 select()时,由内核根据IO状态修改fd_set的内容,由此来通知执行了 select() 的进程哪一 Sock

27、et或文件可读,select()调用返回满足条件的套接字的数目, 其调用格式如下: intPASCALFARselect(intnfds,fd_setFAR*readfds,fd_setFAR*writefds, fd_set FAR * exceptfds, const struct timeval FAR * timeout);下面做一些具体解释:int select(nfds, readfds, writefds, exceptfds, timeout)int nfds;fd_set *readfds, *writefds, *exceptfds;struct timeval *time

28、out;ndfs:select 监视的文件句柄数,它要视进程中打开的文件数而定,一般设 为要监视各文件中的最大文件号加一。readfds:select 监视的可读文件句柄集合。writefds: select 监视的可写文件句柄集合。exceptfds:select 监视的异常文件句柄集合。timeout:本次select()的超时结束时间。结构 timeval 的定义为:strut timeval long tv_sec; /* 秒数 */long tv_usec; /* 微秒数 */;当readfds或writefds中映象的文件可读或可写或超时,本次select()就 结束返回。程序员利

29、用一组系统提供的宏在select()结束时便可判断哪一文件 可读或可写。对Socket编程特别有用的就是readfds。参数readfds指向要做 读检测的套接字描述符集合的指针,调用者希望从中读取数据。参数 writefds 指向要做写检测的套接字描述符集合的指针。exceptfds指向要检测是否出错的 套接字描述符集合的指针。timeout指向select()函数等待的最大时间,如果设 为NULL则为阻塞操作。select()返回包含在fd_set结构中已准备好的套接字描 述符的总数目,或者是发生错误则返回 SOCKET_ERROR。几个相关的宏解释如下:FD_ZERO(fd_set *f

30、dset):清空fdset与所有文件句柄的联系。 FD_SET(int fd, fd_set *fdset):建立文件句柄 fd 与 fdset 的联系。 FD_CLR(int fd, fd_set *fdset):清除文件句柄 fd 与 fdset 的联系。 FD_ISSET(int fd, fdset *fdset):检查fdset联系的文件句柄fd是否可读写,0 表示可读写。6 参考资料1. COMPUTER NETRWORKS .计算机网络(第 4 版).Andrew S.Tanenbaum2Internet 原理与应用 刘化君 等编著 电子工业出版社3. 计算机网络(第二版),谢希仁 编著 电子工业出版社

展开阅读全文
温馨提示:
1: 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
2: 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
3.本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
5. 装配图网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。
关于我们 - 网站声明 - 网站地图 - 资源地图 - 友情链接 - 网站客服 - 联系我们

copyright@ 2023-2025  zhuangpeitu.com 装配图网版权所有   联系电话:18123376007

备案号:ICP2024067431-1 川公网安备51140202000466号


本站为文档C2C交易模式,即用户上传的文档直接被用户下载,本站只是中间服务平台,本站所有文档下载所得的收益归上传人(含作者)所有。装配图网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对上载内容本身不做任何修改或编辑。若文档所含内容侵犯了您的版权或隐私,请立即通知装配图网,我们立即给予删除!