中南大学计算机网络课程设计报告.pdf
南 大 摩通信原理课程设计报告专业班级 电子信息1 1 X X姓名学号 xxx(09 09 1 1 X X X X)指导教师 陈科文、张金焕设计时间 2 01 4年7月电子信息工程系信息科学与工程学院目录第一章 课程设计要求和目的.11.1 设计要求.11.2 设计目的.1第二章滑动窗口协议仿真.12.1设计要求.12.2设计思想.12.3编程实现过程.92.3.1开发环境.92.3.2程序界面设计.92.3.3关键模块分析.112.3.4结果演示与分析.18第三章文件传输程序.263.1设计要求.263.2设计思想.263.3编程实现过程.283.3.1开发环境.283.3.2程序界面设计.283.3.3关键模块分析.293.3.4结果演示与分析.34第四章设计总结.39第五章参考文献.40第六章附录:程序源代码清单.406.1滑动窗口协议仿真.406.2文件传输程序.83第一章 课程设计要求和目的1.1 设计要求通过本课程教学,要求学生熟悉T C P/I P协议工作机制、熟 悉 基 于S o c k e t的网络通信程序的设计方法,熟练掌握至少一种编程语言及工具的使用。通过设计和调试有关程序,掌握一种网络协议或算法的编程实现方法或具体应用,同时设计一个相对独立的网络应用程序。1.2 设计目的通过将理论与实践相结合,使学生进一步深入理解通信网的工作原理,掌握网络应用开发技术,学会应用所学理论知识来分析和解决实际问题,培养网络技术研究与开发的基本能力以及创新精神。第二章滑动窗口协议仿真2.1 设计要求(1)程序按照滑动窗口协议实现端对端的数据传送。包括协议的各种策略,如包丢失、停等应答、超时等都应有所仿真实现。(2)显示数据传送过程中的各项具体数据;双方帧的个数变化,帧序号,发送和接受速度,暂停或重传提示等。(3)增加其它附加创新功能。程序应有图形化界面,显示直观、易操作。2.2设计思想滑动窗口机制(1).窗口机制滑动窗口协议的基本原理就是在任意时刻,发送方都维持了一个连续的允许发送的帧的序号,称为发送窗口;同时,接收方也维持了一个连续的允许接收的帧的序号,称为接收窗口。发送窗口和接收窗口的序号的上下界不一定要一样,甚至大小也可以不同。不同的滑动窗口协议窗口大小一般不同。发送方窗口内的序列号代表了那些已经被发送,但是还没有被确认的帧,或者是那些第 I 页 共 9 9 页可以被发送的帧。下面举 个例子(假设发送窗口尺寸为2,接收窗口尺寸为1):8发送方g(1)初态(2)(3)发 送 发 送0号独 I号帧(4)(5)(6)接 收 接 收 确 发 送0号 帧 认0号 帧2号帧(7)()接 收 接 收 确1号 帧 队1号帧图2-2-1分析:初始态,发送方没有帧发出,发送窗口前后沿相重合。接收方0号窗口打开,等待接收0号帧;发送方打开。号窗口,表示已发出。帧但尚确认返回信息。此时接收窗口状态不变;发送方打开0、1号窗口,表示0、1号帧均在等待确认之列。至此,发送方打开的窗口数已达规定限度,在未收到新的确认返回帧之前,发送方将暂停发送新的数据帧。接收窗口此时状态仍未变;接收方已收到0号帧,。号窗口关闭,1号窗口打开,表示准备接收1号帧。此时发送窗口状态不变;发送方收到接收方发来的0号帧确认返回信息,关闭0号窗口,表示从重发表中删除0号帧。此时接收窗口状态仍不变;发送方继续发送2号帧,2号窗口打开,表示2号帧也纳入待确认之列。至此,发送方打开的窗口又已达规定限度,在未收到新的确认返回帧之前,发送方将暂停发送新的数据帧,此时接收窗口状态仍不变;接收方已收到1号帧,1号窗口关闭,2号窗口打开,表示准备接收2号帧。此时发送窗口状态不变;发送方收到接收方发来的1号帧收毕的确认信息,关闭1号窗口,表示从重发表中删除1号帧。此时接收窗口状态仍不变。若从滑动窗口的观点来统一看待1比特滑动窗口、后退n 及选择重传三种协议,它们的差别仅在于各自窗口尺寸的大小不同而已。1比特滑动窗口协议:发送窗口=1,接收窗口=1;后退n 协议:发窗口 1,接收窗口1;选择重传协议:发送窗口 1,接收窗口 1。(2).1比特滑动窗口协议当发送窗口和接收窗口的大小固定为1时,滑动窗口协议退化为停等协议(stopand-wait)。该协议规定发送方每发送一帧后就要停下来,等待接收方己正确接收的确认(acknowledgement)返回后才能继续发送下一帧。由于接收第2页 共9 9页方需要判断接收到的帧是新发的帧还是重新发送的帧,因此发送方要为每个帧加一个序号。由于停等协议规定只有一帧完全发送成功后才能发送新的帧,因而只用一比特来编号就够了。其发送方和接收方运行的流程图如图所示。发送方 接收方图2-2-2.后退n 协议由于停等协议要为每一个帧进行确认后才继续发送下一帧,大大降低了信道利用率,因此又提出了后退n 协议。后 退 n 协议中,发送方在发完一个数据帧后,不停下来等待应答帧,而是连续发送若干个数据帧,即使在连续发送过程中收到了接收方发来的应答帧,也可以继续发送。且发送方在每发送完一个数据帧时都要设置超时定时器。只要在所设置的超时时间内仍收到确认帧,就要重发相应的数据帧。如:当发送方发送了 N 个帧后,若发现该N 帧的前一个帧在计时器超时后仍未返回其确认信息,则该帧被判为出错或丢失,此时发送方就不得不重新发送出错帧及其后的N 帧。第 3 页 共 9 9 页图22 3从这里不难看出,后 退n协议一方面因连续发送数据帧而提高了效率,但另一方面,在重传时又必须把原来已正确传送过的数据帧进行重传(仅因这些数据帧之前有一个数据帧出了错),这种做法又使传送效率降低。由此可见,若传输信道的传输质量很差因而误码率较大时.,连续测协议不一定优于停止等待协议。此协议中的发送窗口的大小为k,接收窗口仍是1。选择重传协议在后退n协议中,接收方若发现错误帧就不再接收后续的帧,即使是正确到达的帧,这显然是一种浪费。另一种效率更高的策略是当接收方发现某帧出错后,其后继续送来的正确的帧虽然不能立即递交给接收方的高层,但接收方仍可收下来,存放在个缓冲区中,同时要求发送方重新传送出错的那一帧。一旦收到重新传来的帧后,就可以原已存于缓冲区中的其余帧一并按正确的顺序递交高层。这种方法称为选择重发(SELECTICE REPEAT),其工作过程如图所示。显然,选择重发减少了浪费,但要求接收方有足够大的缓冲区空间。滑动窗口协议仍然考虑链路的延迟与带宽的乘积为8 K B,帧尺寸为1 K B的情形。让发送方在收到第帧的AC K的同时准备发送第九帧。允许我们这样做的算法称为滑 动 窗 口(sliding window),时间线如图2-2-3所示。1.滑动窗口算法滑动窗口算法工作过程如下。首先,发送方为每1帧赋一个序号(sequencenumber),记 作S e q N u m。现在,让我们忽略S e q N u m是由有限大小的头部字段实现的事实,而假设它能无限增大。发送方维护3个变量:发送窗口大第 4 页 共 9 9 页小(send window size),记作S W S,给出发送方能够发送但未确认的帧数的上界;L A R 表示最近收到的确认帧(last acknowledgement re c e i v e d)的序号;L F S 表示最近发送的帧(last frame sent)的序号,发送方还维持如下的不变式:LAR-LFRRWS当一个确认到达时,发送方向右移动L A R,从而允许发送方发送另一帧。同时,发送方为所发的每个帧设置一个定时器,如果定时器在A C K 到达之前超时,则重发此帧。注意:发送方必须存储最多S W S 个帧,因为在它们得到确认之前必须准备重发。接收方维护下面3个变量:接收窗口大小(receive window size),记为RWS,给出接收方所能接收的无序帧数目的上界;LA F 表示可接收帧(largestacceptable fram e)的序号;L F R 表示最近收到的帧(last frame re ce i ve d)的序号。接收方也维持如下不变式:LFS-LARSWS当一个具有顺序号S e q N u m 的帧到达时,接收方采取如下行动:如果SeqN um W LFR 或 S e q N u m L A F,那么帧不在接收窗口内,于是被丢弃;如果LFR SWS没有意义。2.有限顺序号和滑动窗口现在我们再来讨论算法中做过的一个简化,即假设序号是可以无限增大的。当然,实际上是在一个有限的头部字段中说明一个帧的序号。例如,一个3比特字段意味着有8个可用序号0 7。因此序号必须可重用,或者说序号能回绕。这就带来了一个问题:要能够区别同一序号的不同次发送实例,这意味着可用序号的数目必须大于所允许的待确认帧的数目。例如,停止等待算法允许一次有1个待确认帧,并有2个不同的序号。假设序号空间中的序号数比待确认的帧数大1,即SWS h d r)转化为能够安全放在消息前面的字节串(h b u f)o 该例程(未给出)必须将头部中的每一个整数字段转化为网络字节顺序,并且去掉编译程序加入C 语言结构中的第 7 页 共 9 9 页任意填充。7.1 节将详细讨论字节顺序的问题,但现在,假设该例程将多字整数中最高有效位放在最高地址字节就足够了。这个例程的另一个复杂性是使用sem Wa i t 和 s e n dW i n d ow N o t F u 1 1 信号量。Sen dWi n d o w N o tF uI I 被初始化为发送方滑动窗口的大小SW S(未给出这一初始化)。发送方每传输-帧,se m W a it操作将这个数减1,如果减小到0,则阻塞发送方进程。每收到一个AC K,在 d e I i v e r SW P 中调用s e m S i g n a I操 作(见下面)将此数加1,从而激活正在等待的发送方进程。在继续介绍S W P 的接收方之前,需要调整一个看上去不一致的地方。方面,我们说过,高层协议通过调用s e n d 操作来请求低层协议的服务,所以我们就希望通过S W P 发送消息的协议能够调用sen d(SWP,p a c k e t)-另一方面,用来实现S W P 的发送操作的过程叫做s e n d S W P,并且它的第一个参数是一个状态变量(S w p S ta te)结果怎样呢?答案是,操作系统提供了粘结代码将对s e n d 的一般调用转化为对s e n d S W P 的特定协议调用的粘结代码。这个粘结代码将s e n d 的第一个参数(协议变量S W P)映射为一个指向s e n d S W P 的函数指针和一个指向S W P 工作时所需的协议状态的指针。我们之所以通过一般函数调用使高层协议间接调用特定协议函数,是因为我们想限制高层协议中对低层协议编码的信息量。这使得将来能够比较容易地改变协议图的配置。现在来看de liv e r 操作的S W P 的特定协议实现,它在过程d e I i v e r SW P 中实现。这个例程实际上处理两种不同类型的输入消息:本结点已发出帧的AC K 和到达这个结点的数据帧。在某种意义上,这个例程的ACK部分是与send SWP中所给算法的发送方相对应的。通过检验头部的Fl ag s 字段可以确定输入的消息是ACK还是一个数据帧。注意,这种特殊的实现不支持数据帧中捎带AC K。当输入帧是一个ACK时;delive rSWP仅仅在发送队列(send Q)中找到与此ACK相应的位置(slot),取消超时事件,并且释放保存在那一位置的帧。由于A C K 可能是累积的,所以这项工作实际上是在一个循环中进行的。对于这种情况值得注意的另,个问题是子例程swp In Wind ow 的调用。这个子例程在下面给出,它确保被确认帧的序号是在发送方当前希望收到的AC K 的范围之内。当输入帧包含数据时,d e liv e rS W P 首先调用m s g S trip H d r和 lo a d _ s w p _ h d r以便从帧中提取头部。例程I o a d _s w p_ h d r 对应着前面讨论的s to r e _ s w p _ h d r,它将-个字节串转化为容纳S W P 头部的C 语言数据结构。然后d e I i v e r SW P 调用s w p I n Wi nd o w 以确保帧序号在期望的序号范围内。如果是这样,例程在已收到的连续的帧的集合上循环,并通过调用de liv e r HLP例程将它们传给上层协议。它也要向发送方发送累积的AC K,但却是通过在接收队列上循环来实现的(它没有使用本节前面给出的seqN u m T o A ck变量)。第 8 页 共 9 9 页最后,s w p I n W i n do w是 一 -个简单的子例程,它检查一个给定的序号是否落在某个最大和最小顺序号之间。4.帧顺序和流量控制滑动窗口协议可能是计算机网络中最著名的算法。然而,关于该算法易产生混淆的是,它可以有三个不同的功能,第一个功能是本节的重点,即在不可靠链路上可靠地传输帧。(一般来说,该算法被用于在一个不可靠的网络上可靠地传输消息。)这是该算法的核心功能。滑动窗口算法的第二个功能是用于保持帧的传输顺序。这在接收方比较容易实现,因为每个帧有一个序号,接收方要保证已经向上层协议传递了所有序号比当前帧小的帧,才向上传送该当前帧。即,接收方缓存了(即没有传送)错序的帧。本节描述的滑动窗口算法确实保持了帧的顺序,尽管我们可以想象一个变异,即接收方没有等待更早传送的帧都到达就将帧传给下一个协议。我们可以提出的一个问题是:我们是否确实需要滑动窗口协议来保持帧的顺序,或者,这样的功能在链路层是否是不必要的。不幸的是,我们还没有看到足够多的网络体系结构来回答这个问题我们首先需要理解的是,点到点链路序列如何由交换机连接而形成一条端到端的路径。滑动窗口算法的第三个功能是,它有时支持流量控制(f lo w c o n t r o l),它是一种接收方能够控制发送方使其降低速度的反馈机制。这种机制用于抑制发送方发送速度过快,即抑制传输比接收方所能处理的更多的数据。这通常通过扩展滑动窗口协议完成,使接收方不仅确认收到的帧,而且通知发送方它还可接收多少帧。可接收的帧数对应着接收方空闲的缓冲区数。在按序传递的情况下,在将流量控制并入滑动窗口协议之前,我们应该确信流量控制在链路层是必要的。2.3编程实现过程2.3.1开发环境操作系统:W i n d o w s 7旗舰版开发语言:C+/M FC编译环境:M S V i s u a l C+6.02.3.2程序界面设计第9页 共9 9页此程序由于功能需要,分别设计了发送端(图2-3-2T)和接收端(图2-3-2-2)两个MFC界面,实例如下:58 Sender b1s图 2-3-2T图 2-3T-2第10页 共9 9页2.3.3关键模块分析1.窗口初始化BOOL CSenderDlg:OnlnitDialog()(CDialog:OnlnitDialog();/Add*About./menu item to system menu./IDM_ABOUTBOX must be in the system command range.ASSERT(IDM_ABOUTBOX&OxFFFO)=IDM_ABOUTBOX);ASSERT(IDM_ABOUTBOX AppendMenu(MF_SEPARATOR);pSysMenu-AppendMenu(MF_STRING,IDM_ABOUTBOX,strAboutMenu);)/Set the icon for this dialog.The framework does this automatically/when the applications main window is not a dialogSetlcon(m_hlcon,TRUE);/Set big iconSetlcon(m_hlcon,FALSE);/Set small icon第11页 共9 9页/TODO:Add extra initialization here/初始化WinSockWSADATAwsa;if(WSAStartup(MAKEWORD(2,2),&wsa)(=0)(AfxMessageBox(Failed to initialize the winsock 2 stack);return FALSE;创建 UDP Sender Socketif(m_UDPSndrSocket=WSASocket(AF_INET,SOCK_DGRAM,IPPROTO_UDP,NULL,0,WSA_FLAG_OVERLAPPED)=INVALID_SOCKET)(AfxMessageBox(Failed to create UDPSocketn);return FALSE;)填充本地UDP Sender Socket地址结构SOCKADDRJN UDPSndrAddr;memset(&UDPSndrAddr,0,sizeof(SOCKADDRJN);UDPSndrAddr.sinJamily=AF_INET;UDPSndrAddr.sin_port=htons(3073);U D PS nd r Add r.si n_add r.S_u n.S_add r=inet_addr(127.0.0.1*);绑定 Sender UDP 端口if(bind(m_UDPSndrSocket,(sockaddr*)&UDPSndrAddr,sizeof(UDPSndrAddr)=SOCKET_ERROR)(AfxMessageBox(Failed to bind UDPSndrAddr);return FALSE;第 12页 共 9 9 页填充Receiver UDP地址memset(&m_UDPRcvrAddr,0,sizeof(SOCKADDRJN);m_UDPRcvrAddr.sin_family=AFJNET;m_U D P Rc vr Ad d r.s i n_po rt=htons(3074);m_UDPRcvrAddr.sin_addr.S_un.S_addr=inet_addr(n127.0.0.1);/创 建 UDP数据包接收线程DWORD dwThreadld;CreateThread(NULL,0,UdpReceiveThread,this,0,&dwThreadld);return TRUE;/return TRUE unless you set the focus to a control)void CSenderDlg:OnSysCommand(UINT nID,LPARAM I Param)(if(nID&OxFFFO)=IDM_ABOUTBOX)(CAboutDIg dlgAbout;dlgAbout.DoModal();)else(CDialog:OnSysCommand(nlD,IParam);)2.数据发送void CSenderDlg:OnStartSend()第13页 共9 9页/TODO:Add your control notification handler code here获取对话框数据if(!UpdateData(TRUE)return;初始化所有参数if(m_pOutBuf!=NULL)delete m_pOutBuf;m_pOutBuf=new framem_SendWndSize;mJBuffered=0;当前滑动窗口大小m_ackExpected=0;/发送窗 口左侧m_nextFrameToSend=0;发送窗口右侧+1for(int i=0;iMAX_SEQ+1;i+)错误模式初始均为 NO_ERRm_errArrayi=NO_ERR;/设置帧的错误模式,模拟传输错误。目前只支持手工设定char tmp256;char*token;char s e p s=int iSeq;if(!m_strFrameLost.lsEmpty()(strcpy(tmp,m_strFrameLost);token=strtok(tmp,seps);while(token!=NULL)(iSeq=atoi(token);token=strtok(NULL,seps);if(iSeq MAX_SEQ)第 14页 共 9 9 页AfxMessageBox(lnvalid seqno in LostFrame box,ignore it);continue;m_errArrayiSeq=LOST_ERR;)if(!m_strChksumErr.lsEmpty()strcpy(tmp,m_strChksumErr);token=strtok(tmp,seps);while(token!=NULL)iSeq=atoi(token);token=strtok(NULL,seps);if(iSeqMAX_SEQ)AfxMessageBox(lnvalid seqno in ChksumErr box,ignore it);continue;m_errArrayiSeq=CKSUM_ERR;)/启动网络层数据发送定时器SetTimer(ID_SEND_TIMER,m_SendInterval,NULL);窗口界面控制GetDlgltem(IDC_SEND_WND_SIZE)-EnableWindow(FALSE);第15页 共9 9页GetDlgltem(IDC_SENDNTERVAL)EnableWindow(FALSE);GetDlgltem(IDC_RESEND_TIMER)-EnableWindow(FALSE);GetDlgltem(IDC_RANDOM_ERR)-EnableWindow(FALSE);GetDlgltem(IDC_MANUAL_ERR)-EnableWindow(FALSE);GetDlgltem(IDC_CHKSUM_ERR)-EnableWindow(FALSE);GetDlgltem(IDC_FRAME_LOST)-EnableWindow(FALSE);GetDlgltem(IDC_START_SEND)-EnableWindow(FALSE);GetDlgltem(IDC_STOP_SEND)-EnableWindow();CString strMsg;strMsg.Format(d,m_ackExpected);GetDlgltem(IDC_BOTTOM)-SetWindowfext(strMsg);strMsg.Format(n%d,m_nextFramelbSend);GetDlgltem(IDC_TOP)-SetWindowText(strMsg);GetDlgltem(IDC_CUR_FRAME)-SetWindowText(On);)3.数据接收void CReceiverDlg:OnStartRecv()(/TODO:Add your control notification handler code here获取对话框数据if(!UpdateData(TRUE)return;初始化所有参数if(m_plnBuf!=NULL)delete m j)lnBuf;m_plnBuf=new framem_RecvWndSize;if(mjDArrived!=NULL)delete m_pArrived;第 16页 共 9 9 页m_pArrived=new BOOLm_RecvWndSize;for(int i=0;im_RecvWndSize;i+)m_pArrivedi=FALSE;m_frame Expected=0;接收窗口 左侧m_tooFar=m_RecvWndSize;接收窗口右侧+1for(i=0;iMAX_SEQ+1;i+)错误模式初始均为 NO_ERRm_errArrayi=N0_ERR;mJTDkenCount=m_RecvWndSize;m_bNoNak=TRUE;m_bRecving=TRUE;设置应答帧的错误模式,模拟传输错误。目前只支持手工设定char tmp256;char*token;char seps=int iSeq;if(!m_strAckLost.lsEmpty()(strcpy(tmp,m_strAckLost);token=strtok(tmp,seps);while(token!=NULL)(iSeq=atoi(token);token=strtok(NULL,seps);if(iSeq MAX_SEQ)(AfxMessageBox(lnvalid seqno in LostFrame box,ignore it);continue;)m_errArrayiSeq=LOST_ERR;第17页 共9 9页)启动网络层数据接收定时器,模拟接收速率限制SetTimer(ID_RECV_TIMER,m_Recvlnterval,NULL);窗口界面控制GetDlgltem(IDC_RECV_WND_SIZE)-EnableWindow(FALSE);GetDlgltem(IDC_RECV_INTERVAL)-EnableWindow(FALSE);GetDlgltem(IDC_AUX_TIMER)-EnableWindow(FALSE);GetDlgltem(IDC_RANDOM_ERR)-EnableWindow(FALSE);GetDlgltem(IDC_MANUAL_ERR)-EnableWindow(FALSE);GetDlgltem(IDC_EDIT_ERR_ACK)-EnableWindow(FALSE);GetDlgltem(IDC_EDIT_LOST_ACK)-EnableWindow(FALSE);GetDlgltem(ID_START_RECV)-EnableWindow(FALSE);GetDlgltem(IDC_STOP_RECV)-EnableWindow();CString str Msg;strMsg.Format(”d,mJTokenCount);GetDlgltem(IDC_CUR_TOKEN)-SetWindowText(strMsg);strMsg.Format(d,m_frameExpected);GetDlgltem(IDC_BOTTOM)-SetWindowlext(strMsg);strMsg.Format(%d,J m_tooFar);GetDlgltem(IDC_TOP)-SetWindowText(strMsg);GetDlgltem(IDC_CUR_RCVD)-SetWindowText(MOn);2.3.4结果演示与分析1.正常发送模式测试第1 8页 共9 9页&Sender参数设置发送窗口:忖一发送定时器:|1 0 0 0重发定时器:|1 0 0 0 0出错控制r随机错误6手工设定出偌数据帧:住格分隔)当前状态序列号:4位 当前发送帧:2 滑动窗口:Fr o m 3 T o 3丢失数据帧:01234560 8:2 9:4 7d a t as e n tn o r m a l0 8:2 9:4 8d a t as e n tn o r m a l0 8:2 9:4 9d a t as e n tn o r m a l0 8:2 9:5 0d a t as e n tn o r m a l0 8:2 9:5 1d a t as e n tn o r m a l0 8:2 9:5 2d a t as e n tn o r m a l0 8:2 9:5 3d a t as e n tn o r m a l心 土 在 s e n tn o r m a x08:29:56Q a c ka r r i v e d n o r m a l08:29:57d a a -R e r f f r a l-08:29:58d a t as e n tn o r m a l08:29:59d a t as e n tn o r m a l08:3 0:00d a t as e n tn o r m a l08:3 0:01d a t as e n tn o r m a l08:3 0:02d a t as e n tn o r m a l08:3 0:03d a t as e n tn o r m a l08:3 0:04d a t as e n tn o r m a l08:3 0:06a c ka r r i v e d n o r m a l08:3 0:07d a t as e n tn o r m a l08:3 0:08d a t as e n tn o r m a l0123455011A1*1A1A1x1X1*08:3 0:11 a c k a r r i v e d n o r m a l 2 开 哈 发 送1停 止 发 送I退出图2-3-4 T正常发送模式测试发送端王 Receiver参数设置接收窗口:|一接收定时器:|一辅助定时器:|一出错控制C随机错误G手工设定出错应答帧:陛格分隔)当前状态序列号:4位 令 牌 数:8当前接收帧:2接收窗口:F r o m 3 T o 1108:29:5408:29:47d a t aa r r i v e d08:29:47d a t a a c c e p t e d08:29:48d a t aa r r i v e d08:29:48d a t a a c c e p t e d08:29:49d a t aa r r i v e d08:29:49d a t a a c c e p t e d08:29:50d a t aa r r i v e d08:29:50d a t a a c c e p t e d08:29:51d a t aa r r i v e d08:29:51d a t a a c c e p t e d08:29:52d a t aa r r i v e d08:29:52d a t a a c c e p t e d08:29:53d a t aa r r i v e d08:29:53d a t a a c c e p t e d08:29:54d a t aa r r i v e d丢失应答帧:08:29:56 08:3 7:24d a t a a r r i v e d n o r m a l6t o k e n:808:3 7:24d a t aa c c e p t e d n o r m a l608:3 7:25d a t a a r r i v e d n o r m a l1t o k e n:808:3 7:25d a t aa c c e p t e d n o r m a l108:3 7:26d a t a a r r i v e d n o r m a l8t o k e n:808:3 7:26d a t aa c c e p t e d n o r m a l808:3 7:27d a t a a r r i v e d n o r m a l9t o k e n:808:3 7:27d a t aa c c e p t e d n o r m a l908:3 7:3 0a c ks e n t n o r m a l908:3 7:3 1d a t a a r r i v e d n o r m a l10t o k e n:8V图2-3-47 帧校验错测试接收端通过手工设置2 号帧的校验和错误来模拟信道传输中的误码情况。可以看到接收方在收到2 号错误帧后马上向发送方回送了一个n a k 2的否定应答帧,发送方在收到n a k 2后也立即重传了该帧,因此n a k 机制加速了错误帧的重传过程(否则如果接收方直接丢弃的话,就只能等到发送方2 号帧的重发定时器超时后进行重传)2)帧丢失测试第2 1页 共9 9页王Sender参数设置发送窗口:打发送定时器:|1000重发定时器:|15000出错控制C 随机错误出手工设定出错数据帧:史格分隔)丢失数据帧:当前状态序列号:4位 当前发送帧:1 滑动窗口:F r o m 2 T o 208:42:04 d a t a s e n t n o r m a l 008:42:05 d a t a s e n t n o r m a l 12322aakas e n ts e n ta r r i v e dr e-s e n t08:42:0608:42:0708:42:0708:42:07l o s tn o r m a ln o r m a ln o r m a l0 8:4 Z:0 8d a t as e n t n o r m a lq08:42:09d a t as e n t n o r m a l508:42:10d a t as e n t n o r m a l608:42:11d a t as e n t n o r m a l708:42:12d a t as e n t n o r m a l808:42:13 d a t as e n t n o r m a l908:42:16a c k a r r i v e d n o r m a l908:42:17 d a t as e n t n o r m a l 1008:42:18d a t as e n t n o r m a l 1108:42:19d a t as e n t n o r m a l 1208:42:20d a t as e n t n o r m a l 1308:42:21d a t as e n t n o r m a l 1408:42:22d a t as e n t n o r m a l 1508:42:23 d a t as e n t n o r m a l008:42:24d a t as e n t n o r m a l108:42:27a c k a r r i v e d n o r m a l1开 始 发 送|退出图2-3-43帧丢失测试发送端参数设置当前状态序列号:4位 令牌数:8当前接收帧:1接收窗口:F r o m 2 T o0接收窗口:8接收定时器:100008:42:04 d a t a a r r i v e d n o r m a l 0 t o k e n:808:42:04 d a t a a c c e p t e d n o r m a l 0AjV辅助定时器:08:42:05 d a t a a c c e p t e d n o r m a l 108:42:07 d a t a a r r i v e d n o r m a l 3 t o k e n:808:42:07 n a k s e n t n o r m a l 208:42:07 d a t a a r r i v e d n o r m a l 2 t o k e n:808:42:07 d a t a a c c e p t e d n o r m a l 2C 随机错误08:42:07 d a t a a c c e p t e d n o r m a l 3G 手工设定出错应答帧:Q 格分隔)08:42:08 d a t a a r r i v e d n o r m a l 4 t o k e n:?08:42:08 d a t a a c c e p t e d n o r m a l 408:42:09 d a t a a r r i v e d n o r m a l 5 t o k e n:708:42:09 d a t a a c c e p t e d n o r m a l 508:42:10 d a t a a r r i v e d n o r m a l 6 t o