网络协议设计

整理文档很辛苦,赏杯茶钱您下走!

免费阅读已结束,点击下载阅读编辑剩下 ...

阅读已结束,您可以下载文档离线阅读编辑

资源描述

1声明:仅仅用于交作业,小心与别人重复,被老师抓问题描述:设计一个简单的网络协议,要求有协议的功能、目标、协议的工作原理、协议算法,并编程实现文件传输协议协议功能:通过网络以字节形式传输文件协议工作原理:全双工先信道传输发送端一次发送4个字节32位。接收端一次发送1个字节8位。接收端缓冲区4个字节,平均分为4块。协议详细和协议算法1、建立连接先发送方端请求建立连接,字节流数据首部00表示请求连接。请求建立连接时2~31位无效。如:00111111接收端返回字节数据0~1位为00表示同意建立连接。不同意连接则不给予回应如:00111111发送端开始发送数据,接收端缓冲区一共有4块,每块大小为一个字节。发送的字节5~7位表示本次发送的数据大小单位byte当数据发送完时,发送端发送的字节流首部0、1位为11表示发送结束2发送端发送字节流首部01234567状态数据标记缓冲区块号本次数据长度8162431数据各位说明状态标识位00请求连接01正在发送11发送结束数据标记0发送的数据是源数据1发送的数据是加密后的数据缓冲区块号本次发送数据长度0~8个字节接收端发送字节流01234567标识位缓冲区块号标识为00同意建立连接01缓冲区已刷新10确认收到数据11确认结束2、开始发送发送端发送的字节状态标识位为013如:发送到第1块缓冲区、大小为8byte的数据源数据010011110101100011010100101010018byte数据保证数据的可靠性,发送时将源数据发一遍,将加密后的数据也发一遍,源数据和加密后的数据的差别由数据标记位区分。0表示发送的数据是源数据,1表示发送的数据是加密后的数据。接收端接收数据时将数据接收到的源数据加密与接收到在发送端加密的数据比较,不同则把接收到的数据丢弃。假如相同则给发送端回一个数据,表示该缓冲区块的数据接收成功,并且不再接收往该缓冲区块的数据。如:第2缓冲块10110111接收端接受数据后不再发那个字节数据。当缓冲区填满以后发送端不再发送,接收端将缓冲区的数据则写入设备,并给发送端一个回应。表示可以发送端继续发送数据了。如:01111111发送端在发送数据后假如接收不到接收端的确认信息,则等待一个时间后继续发送。3、发送完成发送端在数据发送完后发送的结束标识字节,并等待接收端回应,如一段世间还不回应则继续发送。如:11111111接收端回送确认结束如:11111111编程实现#includeiostreamusingnamespacestd;#defineSEND_SIZE32#defineBACK_SIZE84//用int型数组模拟数据的位voidSendEnd(constint*recData);//发送端处理函数voidRecevieEnd(constint*recData);//接收端处理函数voidencode(int*data);//加密函数intpool[4][SEND_SIZE-BACK_SIZE];intmain(){intdata[SEND_SIZE]={0,0};SendEnd(data);return0;}/*发送端请求00请求连接01正在发送11发送结束接收端回送00同意建立连接01缓冲区已刷新10确认收到数据11确认结束*///发送端处理函数voidSendEnd(constint*recData){//recData从接收端回送的的数据intsendData[SEND_SIZE];//往接收端发送的数据if(recData[0]==0&&recData[1]==0){//00同意建立连接//往第二块缓冲区发送的源数据sendData[0]=0;sendData[1]=1;sendData[2]=0;sendData[3]=1;sendData[4]=0;sendData[5]=0;sendData[6]=1;sendData[7]=1;intdata[24]={1,1,0,1,0,1,1,0,0,1,0,0,0,0,1,0,1,0,0,1,0,1,1,0};for(inti=0;iSEND_SIZE-BACK_SIZE;i++)sendData[i+BACK_SIZE]=data[i];cout开始给接收端发送源数据大小:sendData[5]*4+sendData[6]*2+sendData[7]+1B缓冲块:sendData[3]*2+sendData[4]endl;RecevieEnd(sendData);5//往第二块缓冲区发送加密后数据sendData[2]=1;encode(data);//将数据加密后在发一次for(inti=0;iSEND_SIZE-BACK_SIZE;i++)sendData[i+BACK_SIZE]=data[i];cout开始给接收端发送加密后的数据大小:sendData[5]*4+sendData[6]*2+sendData[7]+1B缓冲块:sendData[3]*2+sendData[4]endl;RecevieEnd(sendData);}elseif(recData[0]==0&&recData[1]==1){//01缓冲区已刷新cout发送端:好啊,继续发送...endl;cout文件传输结束,发送端请求结束endl;sendData[0]=1;sendData[1]=1;RecevieEnd(recData);}elseif(recData[0]==1&&recData[1]==0){//10确认收到数据cout发送端:我知道第recData[3]*2+recData[4]块缓冲区的数据成功接收了endl;cout文件传输结束,发送端请求结束endl;sendData[0]=1;sendData[1]=1;RecevieEnd(recData);}else{//11确认结束cout发送端:断开连接endl;}}//接收端处理函数voidRecevieEnd(constint*recData){//recData从发送端发送的数据intsendData[BACK_SIZE];//往发送端回送的数据if(recData[0]==0&&recData[1]==0){//00请求连接cout发送端请求连接endl;sendData[0]=0;sendData[1]=0;}elseif(recData[0]==0&&recData[1]==1){//01正在发送intpiece=recData[3]*2+recData[4];//缓冲块号intsize=recData[5]*4+recData[6]*2+recData[7]+1;//本次发送数据大小//coutpiecesfsfsfendl;if(recData[2]==0)6{//接收源数据cout接收到源数据数据大小:sizeB缓冲块:pieceendl;//将数据存到指定的缓冲区块cout收到的数据为:endl;for(inti=8;iSEND_SIZE;i++){pool[piece][i-8]=recData[i];coutrecData[i];}coutendl;}else{cout接收到加密后的数据大小:sizeB缓冲块:pieceendl;inttemp[SEND_SIZE-BACK_SIZE];inti;for(i=0;iSEND_SIZE-BACK_SIZE;i++)temp[i]=pool[piece][i];encode(temp);for(i=0;iSEND_SIZE-BACK_SIZE;i++){if(temp[i]!=recData[i+8])break;}if(SEND_SIZE-BACK_SIZE==i){cout接收端:正确成功接收endl;sendData[0]=1;sendData[1]=0;for(intj=2;jBACK_SIZE;j++)sendData[j]=recData[j];SendEnd(sendData);}else{cout接收端:没有正确接收,不给予回应endl;}}}elseif(recData[0]==1&&recData[1]==0){//}else{//11发送结束cout发送端发送结束,接收端回应结束endl;sendData[0]=1;sendData[1]=1;SendEnd(sendData);}}voidencode(int*data){intcode[SEND_SIZE-BACK_SIZE]={1,0,1,1,0,1,1,0,1,0,1,0,1,0,1,0,1,0,1,0,1,1,1,0};7for(inti=0;iSEND_SIZE-BACK_SIZE;i++)data[i]=data[i]&code[i];}编译环境windows编译器vc2008执行结果总结此文件传输协议还有很多不足的地方如:1、两次握手连接无法保证正确连接2、当缓冲去未满时无法继续发送3、程序也没有完全模拟出来

1 / 7
下载文档,编辑使用

©2015-2020 m.777doc.com 三七文档.

备案号:鲁ICP备2024069028号-1 客服联系 QQ:2149211541

×
保存成功