转 udp模拟tcp滑动窗口实现数据安全可靠传输

转 udp模拟tcp滑动窗口实现数据安全可靠传输

ID:17386096

大小:37.13 KB

页数:14页

时间:2018-08-30

转 udp模拟tcp滑动窗口实现数据安全可靠传输_第1页
转 udp模拟tcp滑动窗口实现数据安全可靠传输_第2页
转 udp模拟tcp滑动窗口实现数据安全可靠传输_第3页
转 udp模拟tcp滑动窗口实现数据安全可靠传输_第4页
转 udp模拟tcp滑动窗口实现数据安全可靠传输_第5页
资源描述:

《转 udp模拟tcp滑动窗口实现数据安全可靠传输》由会员上传分享,免费在线阅读,更多相关内容在行业资料-天天文库

1、转UDP模拟TCP滑动窗口实现数据安全可靠传输(转)UDP模拟TCP滑动窗口实现数据安全可靠传输(C#)日期:2010-05-26

2、最近需要实现P2P也就是需要做NAT穿透,原来写的TCP传输就出现问题了,因为TCP不能很好的实现内网的穿透,因此最好用UDP来实现传输。可是UDP存在一些可靠性上的问题,主要是UDP是面向无连接的协议,传输中数据包丢失时没有重传,而且由于网络环境因素可能会出现数据包的乱序的情况。UDP的特点导致其不能方便的应用于需要保证数据可靠性的场合,比如文件传输等。现在一般P2P软件的做法应该是在应用层包装一下UDP协议,实现UDP的可靠传输。在网上搜了下

3、,本以为应该很多有现成的东西的,结果发现太少了。先搜到了一份Delphi版的,网址,可惜我基本不懂Delphi;然后还在sourceforge上发现一个叫UDT的开源项目,官方的网址是,这个用C++写的,封装成了DLL,但研究了下觉得我用C#还是很难调用。最后决定自己动手写一个了,无非是模拟一下TCP嘛此次实现采用了TCP的滑动窗口原理。在解释滑动窗口前先看看ACK的应答策略,一般来说,发送端发送一个TCP数据报,那么接收端就应该发送一个ACK数据报。但是事实上却不是这样,发送端将会连续发送数据尽量填满接受方的缓冲区,而接受方对这些数据只要发送一个ACK报文来回应就可以了,这

4、就是ACK的累积特性,这个特性大大减少了发送端和接收端的负担。滑动窗口本质上是描述接受方的TCP数据报缓冲区大小的数据,发送方根据这个数据来计算自己最多能发送多长的数据。如果发送方收到接受方的窗口大小为0的TCP数据报,那么发送方将停止发送数据,等到接受方发送窗口大小不为0的数据报的到来。原理基本上就是这样,在本程序里,接收放和发送方要事先约定好传输的每个包的数据大小及传输一组包的包数,也就是窗口大小。发送方发送一组数据后等待接收方的ACK确认,确认超时后重发,重发次数超过额定次数后视为连接中断。另外需要对每个数据包加了一个包的标识字节,我把这个字节放到了每个包的最后面,因此

5、发送方发送给接收方的每个包含传输数据的包内容长度肯定大于等于2字节,接收方收到1个字节的包会丢弃,这样设计正好可以利用发送一个字节的包来保持连接不中断,可以应用在某些暂时不需要数据传输但需要保持此次连接以便随时可以继续传输的情况(比如我的程序里)。然后说一个我的数据包标识字节的设计吧,一个byte共8bit,前四位(0-15)来表示组序号,中间三位表示组内包序号(0-9),最后一位是发送完毕标记12345678

6、

7、

8、

9、

10、

11、组序号组内包序号发送完毕标记接收端收到一个包后提取标识字节,如果组序号不是当前组序号则丢弃,否则根据组内包号记录该包,然后检查该组是否已经发送完毕,即窗口是

12、否塞满,是的话发送ACK确认包(确认包内容为当前组序号),然后当前组序号=(当前组序号+1)%16。基本就是这样了,测试了一下,本地传输的速度还行,传了个200M+的文件用了6.3秒。然后就是代码了,我把这个类封装成DLL来调用了。usingSystem;usingSystem.Collections.Generic;usingSystem.Linq;usingSystem.Text;usingSystem.Threading;usingSystem.Net;usingSystem.Net.Sockets;usingSystem.IO;namespaceTransfer{/*

13、SecuredUDPTransferClass--UDP安全传输类采用TCP滑动窗口原理在应用层解决UDP协议传输的丢包,乱序等问题,实现UDP可靠传输;要求传入的UdpClient实例为已连接的实例,即调用此类的方法前请先执行初始化实例并连接;发送接收的数据类采用Stream,可应用到其子类FileStream,MemoryStream等*/publicclassSUdpTransfer{privateconstintdefaultPacketSize=513,defaultGroupSize=7;//默认UDP包数据内容大小、组(窗口)大小privateconstintc

14、onfirmTimeOut=1000;//确认超时时间privateconstintmaxResendCount=4;//最大重发次数(超出则认为连接断开)privateconstintreceiveTimeOut=4000;//接收超时时间privateUdpClientclient;//已连接的UdpClient实例privateAutoResetEventconfirmEvent=newAutoResetEventfalse;//等待确认回复用的事件privateintgroupSeq;//当前传

当前文档最多预览五页,下载文档查看全文

此文档下载收益归作者所有

当前文档最多预览五页,下载文档查看全文
温馨提示:
1. 部分包含数学公式或PPT动画的文件,查看预览时可能会显示错乱或异常,文件下载后无此问题,请放心下载。
2. 本文档由用户上传,版权归属用户,天天文库负责整理代发布。如果您对本文档版权有争议请及时联系客服。
3. 下载前请仔细阅读文档内容,确认文档内容符合您的需求后进行下载,若出现内容与标题不符可向本站投诉处理。
4. 下载文档时可能由于网络波动等原因无法下载或下载错误,付费完成后未能成功下载的用户请联系客服处理。