第10章 滑动窗口协议-1

合集下载
  1. 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
  2. 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
  3. 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
//创建UDP数据包接收线程 DWORD dwThreadId; CreateThread(NULL, 0, UdpReceiveThread, this, 0, &dwThreadId);
22
网络编程技术
1、发送端的接收线程
//接收UDP应答包 if ((BytesReceived=recvfrom(m_UDPSndrSocket, buf, sizeof(buf), 0, NULL, NULL)) == SOCKET_ERROR) { //AfxMessageBox("Failed to recvfrom UDPSndrSocket"); } ASSERT(BytesReceived>=sizeof(frame_hdr) && BytesReceived<=sizeof(frame)); if (BytesReceived>=sizeof(frame_hdr) && BytesReceived<=sizeof(frame)) { frame* pFrame = (frame*)buf; if (pFrame->hdr.err == NO_ERR) { frame* p = new frame; memcpy(p, buf, BytesReceived); PostMessage(FRAME_ARRIVAL, (WPARAM)p); } }
6
网络编程技术
程序运行的参考界面(发送端)
7
网络编程技术
程序运行的参考界面(接收端)
8
网络编程技术
提纲
• • • • •
编程训练目的 编程训练要求 相关知识介绍 程序设计分析 扩展与提高
9
网络编程技术
滑动窗口协议原理 • 滑动窗口协议的流量控制
– 发送方窗口内的序列号代表已经发送但尚未 确认的帧,一旦窗口达到最大值,发送方的 数据链路层必须强行关闭网络层直到有一帧 缓冲区可用为止。 – 接收方数据链路层的窗口对应于允许接收的 帧。任何落在接收窗口之外的帧都不加说明 地丢弃。
19
网络编程技术
程序流程说明
• Sender和Receiver之间使用UDP协议模拟通信过 程 • 发送端需要模拟的网络事件:
– network_layer_ready事件。 – frame_arrival事件。 – timeout事件。
• 接收端需要模拟的网络事件:
– frame_arrival事件。 – cksum_error事件。 – ack_timeout事件。
– 实验在以太网环境下使用UDP协议通信,错误 几乎不会发生,因此需要人工模拟信道出错和 丢包情况。 – 在数据帧内增加一个错误类型字段,指明该数 据帧是正常到达,还是在信道中出错或丢失 。 – 可以使用伪随机函数的方法为错误类型赋值, 也可以手工设定某一帧的出错类型。
17
网络编程技术
协议模拟过程分析(5)
23
网络编程技术
2、定义滑动窗口公共数据结构
#define MAX_PKT 1024 typedef UINT seqNum; typedef enum { DATA, ACK, NAK } frameKind; typedef enum { NO_ERR, CKSUM_ERR, LOST_ERR } errMode; typedef struct { UCHAR data[MAX_PKT]; } packet; typedef struct { frameKind kind; seqNum seq; seqNum ack; int size; //数据长度,不包括帧头 errMode err; //该字段用于模拟信道出错 } frame_hdr; typedef struct { frame_hdr hdr; packet info; } frame; 24
2
网络编程技术
提纲
• • • • •
编程训练目的 编程训练要求 相关知识介绍 程序设计分析 扩展与提高
3
网络编程技术
编程训练目的
• 掌握滑动窗口协议的概念、原理与基本 算法。 • 理解3种典型的数据链路层滑动窗口协议: l位滑动窗口协议、使用退后n帧的滑动 窗口协议与使用选择性重传的滑动窗口 协议。 • 了解传输层与数据链路层滑动窗口协议 的区别与联系,了解TCP滑动窗口协议 的实现原理。
11
网络编程技术
两种差错控制策略的收发过程比较
12
网络编程技术
提纲
• • • • •
编程训练目的 编程训练要求 相关知识介绍 程序设计分析 扩展与提高
13
网络编程技术
协议模拟过程分析(1) • 划分为发送端和接收端两部分 • 并使用UDP协议来模拟底层的通信信道, • 滑动窗口的模拟在应用层进行。
//填充本地UDP Sender Socket地址结构 SOCKADDR_IN UDPSndrAddr; memset(&UDPSndrAddr, 0, sizeof(SOCKADDR_IN)); UDPSndrAddr.sin_family = AF_INET; UDPSndrAddr.sin_port = htons(3073); UDPSndrAddr.sin_addr.S_un.S_addr = inet_addr("127.0.0.1");
网络编程技术
3、发送端的协议代码
void CSenderDlg::OnStartSend() { //启动网络层数据发送定时器 SetTimer(ID_SEND_TIMER, m_SendInterval, NULL); void CSenderDlg::OnTimer(UINT nIDEvent) { switch(nIDEvent) { case ID_SEND_TIMER: if (m_iBuffered < m_SendWndSize) PostMessage(NETWORK_LAYTER_READY); break; default: //case timeout int framePos = nIDEvent - ID_TIMER_USER; ASSERT(framePos>=0 && framePos<m_SendWndSize); ReSendFrame(framePos); break; } 网络编程技术 25 }
10
网络编程技术
滑动窗口协议原理(续) • 滑动窗口协议的差错控制
– 使用后退n帧技术
接收端丢弃出错帧后所有的帧,而不管这些帧是 正确的还是出错的。 对应于接收窗口的尺寸为1的情况。 如果信道错误率高,将会浪费大量的带宽。
– 选择性重传策略
信道出错时,接收方将存储所有跟在坏帧之后的 正确帧,并只要求发送方重传出错的帧。 对应于接收窗口大于1的情况
3、发送端的协议代码
处理NETWORK_LAYTER_READY消息函数
afx_msg LRESULT OnNetworkLayerReady(WPARAM wParam, LPARAM lParam); LRESULT CSenderDlg::OnNetworkLayerReady(WPARAM wParam, LPARAM lParam) { m_iBuffered++; //扩展滑动窗口大小 FromNetworkLayer(&m_pOutBuf[m_nextFrameToSend % m_SendWndSize].info); //从网络层取得数据 SendFrame(DATA, m_nextFrameToSend); //发送数据帧 Inc(m_nextFrameToSend); //扩展滑动窗口右沿
26
网络编程技术
3、发送端的协议代码
18
网络编程技术
协议模拟过程分析(6) • 对否定的确认帧(nak)的理解。
– 当接收方怀疑出现了错误时,它就给发送方送 回一个否定的确认帧NAK。 – 有两种情况值得怀疑:接收到一个受损的帧, 或者到达了一个并非所期待的帧。 – 否定的确认帧(nak)也具有确认帧(ack)的 功能,即它可以对其所携带重传序列号之前的 帧进行确认。
20
网络编程技术
1、UDP通信端口设置
//创建UDP Sender Socket if ((m_UDPSndrSocket = WSASocket(AF_INET, SOCK_DGRAM, IPPROTO_UDP, NULL, 0, WSA_FLAG_OVERLAPPED)) == INVALID_SOCKET) { AfxMessageBox("Failed to create UDPSocket"); return FALSE; }
网络编程技术 Technology of Network Programming
第10章 滑动窗口协议模拟程序
Copyright © by NUPT All rights reserved.
1
计算机硬件基础教学中心
概述
滑动窗口协议通常用于实现流量控 制和差错控制、保证数据传输的可 靠性和有效性。它既可以作为基本 的数据链路层协议,也可用于传输 层的TCP协议中。
15
网络编程技术
协议模拟过程分析(3) • 关于接收方接收速率的模拟。
– 在接收方设置一个接收定时器,速率可设定。 – 使用令牌桶算法调节数据接收的平均速率。 – 令牌桶算法既可保证在接收窗口允许范围内产 生短暂的数据突发流量,同时又在较长时间范 围内控制接收速率的大小。
Hale Waihona Puke Baidu16
网络编程技术
协议模拟过程分析(4) • 模拟通信信道出现的状况。
21
网络编程技术
1、UDP通信端口设置
//绑定Sender UDP端口 if (bind(m_UDPSndrSocket, (sockaddr*)&UDPSndrAddr, sizeof(UDPSndrAddr)) == SOCKET_ERROR ) { AfxMessageBox("Failed to bind UDPSndrAddr"); return FALSE; } //填充Receiver UDP地址 memset(&m_UDPRcvrAddr, 0, sizeof(SOCKADDR_IN)); m_UDPRcvrAddr.sin_family = AF_INET; m_UDPRcvrAddr.sin_port = htons(3074); m_UDPRcvrAddr.sin_addr.S_un.S_addr = inet_addr("127.0.0.1");
• 协议中一些值及它们之间的关系。
– 帧序列号用n位表示,则序列号范围为0~2n-1。 – 用MAX_SEQ表示帧的最大序列号,则不同序列号的个 数为MAX_SEQ+1。 – 发送方窗口的最大尺寸不应超过MAX_SEQ。 – 接收方窗口的尺寸应该不超过序列号范围的一半,即 (MAX_SEQ+1)/ 2。 – 发送方所需缓冲区和重发定时器的数量等于发送窗口的 尺寸而不是序列号的范围。 – 接收方所需缓冲区的数量等于接收窗口的尺寸,辅助定 时器只需1个。 – 辅助定时器的超时间隔应该明显短于与数据帧相关联的 重发定时器的超时间隔。
4
网络编程技术
提纲
• • • • •
编程训练目的 编程训练要求 相关知识介绍 程序设计分析 扩展与提高
5
网络编程技术
编程训练要求
编程实现使用选择性重传策略的滑动窗口协议 模拟程序 :
• 所有功能应可视,具有简单的界面。 • 由一台PC向另一台PC发送数据包,界面中应动态显 示数据帧的发送和接收情况,以表明协议模拟程序的 正确运作过程。 • 当发送方速度过快或帧丢失时,接收方应发送消息, 要求暂停或者重传。接收方应按序向网络层提交接收 到的帧。 • 发送方应可设置发送速度、滑动窗口数目、停止等待 等的超时时间间隔以及发送类型(用于模拟信道错误 如正常发送,帧校验错,帧丢失)等参数。
14
网络编程技术
协议模拟过程分析(2) • 关于发送端网络层数据流量的模拟。
– 为了使协议模拟尽量简化,事先做两个假设:
• 假设1:发送方的网络层总有数据需要发送; • 假设2:接收方没有反向流量,因此不能捎带确认, 每次等待辅助定时器超时之后发送一个单独的确认 帧(ACK或NAK)。
– 可以在发送方设置一个发送定时器模拟发送端 网络层数据流量。 – 通过调节时间间隔控制发送方的速率
相关文档
最新文档