计算机硬件基础教学中心Copyright©byNUPTAllrightsreserved.1TechnologyofNetworkProgramming网络编程技术第12章CSMA/CA算法模拟程序网络编程技术2概述无线局域网是网络技术研究与应用的热点,其中802.11协议是其中最基本和最重要的协议之一。通过模拟无线网络帧发送和接收的过程,读者能够深入理解无线网络数据发送流程与CSMA/CA的基本工作原理。网络编程技术3•编程训练目的•编程训练要求•相关知识介绍•程序设计分析•扩展与提高提纲网络编程技术4编程训练目的•掌握模拟无线网络帧发送和接收的过程•使读者了解无线网络数据发送流程,即CSMA/CA工作流程•掌握使用模拟程序分析问题和解决问题的能力•多线程编程技术网络编程技术5•编程训练目的•编程训练要求•相关知识介绍•程序设计分析•扩展与提高提纲网络编程技术6编程训练要求编写程序,模拟CSMA/CA的通信过程,要求:•使用两个线程分别模拟局域网中收发数据的两台主机A、B;•使用第三个线程模拟其他主机随机发送数据帧行为,制造冲突;•使用一个变量来模拟共享信道;•由A主机向B主机发送十个数据帧,并接收B主机发送的ACK帧,如果发送失败,则等待一段时间后进行重传,如重传超过指定次数后仍然失败,自动放弃该次数据传输;•输出相关提示信息;网络编程技术7程序运行界面示例网络编程技术8•编程训练目的•编程训练要求•相关知识介绍•程序设计分析•扩展与提高提纲网络编程技术9802.11协议概述•发展历史•特点•工作原理•与CSMA/CD的区别网络编程技术10•编程训练目的•编程训练要求•相关知识介绍•程序设计分析•扩展与提高提纲网络编程技术11工作流程装配帧随机等待发送数据检查信道信道忙?检查信道信道忙?随机等待接收ACK帧收到?发送结束随机等待超过重发次数上限?丢弃数据包YNYNNYYN网络编程技术12总体执行流程•定义变量dwBus,代表共享信道•将该变量置零•开启两个线程分别模拟接收数据的主机B和发送数据的主机A•在一个循环中模拟其他主机访问共享信道的情况网络编程技术131、定义常量参数,代表无线数据#defineSEND0xf0000000#defineACK0x0f000000#defineCONF0x00f00000//代表冲突#defineTimeSlot30#defineDIFS50//这里是为了模拟方便实际时间SIFS=28μs,PIFS=78μs,DIFS=128μs网络编程技术142、主线程代码int_tmain(intargc,_TCHAR*argv[]){dwBus=0;//代表共享信道DWORDThreadID=0;CreateThread(NULL,0,HostB,NULL,0,&ThreadID);//接收数据主机CreateThread(NULL,0,HostA,NULL,0,&ThreadID);//发送数据主机srand((unsigned)time(NULL));for(inti=0;i10000;i++)//模拟其它主机访问共享信道的情况{Sleep((rand()%20)*300);dwBus=dwBus|CONF;//模拟信道冲突Sleep(2000);//模拟其它主机发送行为,数据帧在信道上出现两秒,然后消失dwBus=0;//模拟信道空闲}return0;}网络编程技术152、主线程代码CreateThread(NULL,0,HostB,NULL,0,&ThreadID);//接收数据主机网络编程技术16数据接收线程•程序始终检测共享介质上是否有信号•如果检测到信号且接收数据准确无误(即传输过程中未发生冲突),则接收数据完毕后发送ACK数据帧•准备接收下一个数据帧•整个过程持续到接收完10个数据帧后结束网络编程技术173、数据接收线程DWORDWINAPIHostB(LPVOID){do{while((dwBus&0xfffffff0)!=SEND){Sleep(10);}dwBus=ACK+(dwBus&0x0000000f);//dwBus的最后4个比特位保存当前帧的序列号,所以与上F}while(dwBus!=SEND+9);//如果已经接收完10帧,停止接收return0;}网络编程技术18数据发送线程•监听信道,确定信道空闲后,随机等待一段时间再次确认信道状态,以便将冲突的概率降到最低•再次确认信道空闲后,发送数据帧•等待ACK帧,在指定时间内收不到ACK帧则随机等待一段时间后进行重传•如果重传超过次数上限,则放弃该数据帧的发送网络编程技术19退避时间计算方法802.11采用二进制指数退避算法,其第i次退避在22+i个时间片中随机选择一段进行退避,即实际退避时间为小于等于22+i的一个随机数乘以TimeSlot的积加上DIFS。(DIFS:分布协调功能帧间间隔,一般在调频扩频通信FHSS下为128us,程序设置50us)网络编程技术204、数据发送线程DWORDWINAPIHostA(LPVOID){while(i!=10)if(nSendTimes==0)//第一次发送某数据帧的情况//首先通过一个while循环等待信道空闲,然后再//尝试发送数据帧并等待ACK响应数据帧,如果没有收到ACK则重传{Wait:while(dwBus!=0)Sleep(100);Sleep(rand()%100);if(dwBus!=0)gotoWait;dwBus=SEND+i;Sleep(1000);//等待ACKif(dwBus==ACK+i){printf(发送第%d个数据包成功。\r\n,i+1);i++;nSendTimes=0;Sleep(1000);}网络编程技术214、数据发送线程Else//接收ACK失败,发生了冲突{nSendTimes++;if(nSendTimes10){printf(“未能收到第%d个数据包的ACK响应,第%d次重新发送。\r\n”,i+1,nSendTimes);//退避算法的时间设置intnSleepTime=GetBackTime(nSendTimes+2);Sleep(nSleepTime*50);//随机等待一段时间后继续发送}else//尝试次数大于10次{printf(放弃发送第%d个数据包。\r\n,i+1);i++;}}}return0;}网络编程技术225、退避时间计算方法intGetBackTime(intnSendTimes){intnRes=0;intnRange=(int)pow(2.0,nSendTimes);intnTimes=rand()%(nRange+1);nRes=nTimes*TimesSlot+DIFS;returnnRes;}网络编程技术23•编程训练目的•编程训练要求•相关知识介绍•程序设计分析•扩展与提高提纲网络编程技术24扩展与提高•无线局域网发展的历史;•IEEE802.11b主要优点:功能优点速度达到普通Ethernet水平,基本满足应用需求。动态速率转换在恶劣网络环境下,可以自动降低传输速度。使用范围100米到300米。可靠性与以太网类似的连接协议和数据帧确认提供可靠的数据传送和网络带宽的有效使用。互用性与以前的标准不同的是,802.11b只允许一种标准的信号发送技术。Wi-Fi将认证产品的互用性。电源管理支持休眠模式,可提高笔记本电池待机时间。漫游支持在主机移动过程中无缝接入网络。安全性内置安全加密协议。网络编程技术25IEEE802.11b无线网络包含组件•工作站•无线访问点•端口网络编程技术26IEEE802.11b运作•运作模式:•Adhoc模式•Infrastructure模式•运作基础:•无线网络接入技术