用UDP传送文件时速度慢的问题以及如何提高稳定性 (300分)

  • 主题发起人 主题发起人 DoubleWood
  • 开始时间 开始时间
D

DoubleWood

Unregistered / Unconfirmed
GUEST, unregistred user!
我用UDP传送文件,在局域网中仅仅使用了3%的网络带宽,而直接使用网上邻居拷贝使用的带宽可以达到50%。使用的是indy9.14,传送时采用一问一答的方式来保证数据完整性。数据包大小为1400字节左右。请问有什么办法提高UDP传送的速度吗?300分候教。
该问题已经解决,分数分配见下,但是不尽满意,因为应用的环境网络不一定很稳定,
因为要跨网关传送,所以只能用UDP,但是由于网络不很稳定,经常丢包,有什么好办法吗。嗯,songguolong加30分吧,因为说的是一个因素,其实现在我是动态改变包的大小
的,马马虎虎还行。现在还剩120分,求在网络不很稳定的情况下,如何提高UDP传送
的稳定行?接近TCP的稳定性就好,同样的情况,TCP几乎没断过,但是UDP老丢包。
 
利用UDP协议传送文件的例子
http://www.aidelphi.com/6to23/docu/MyUDP(Delphi6_7).rar
你试试看这个效率怎么样,参考一下吧 :)
 
为什么用UDP,我用TCP做每秒在局网上可以到6~9M/s,你用UDP可以达到这个速度吗?
 
我也想知道
 
UDP理论上更快,因为不需要应答
 
UDP在大量数据安全稳定的发送上比TCP差很多,这个是经过很长时间测试的
 
当然,大数据高速传输时,在Windows下,UDP会有很多丢包
不用测试,从TCP和UDP的原理上就可以知道,
TCP是可靠传输,UDP是不可靠传输。
TCP传输的可靠性是由协议保证
UDP传输的可靠性是由应用程序自己保证
 
其实程序主要不是用在局网上用的,但是也会在局网上用,同时在internet上的传送也比较慢。
 
那为啥qq传文件时,情况好象还不错啊。它传文件用的是tcp连接?
 
一问一答能保证传输正确,但应该在拓展一下思路,采用滑动窗口能提高数据传输效率,
建议你去读一些关于网络协议的基础教程,才能从原理上明白。
其实TCP和UDP相比UDP传输数据更快,原因是: TCP数据包中TCP数据头要比UDP数据头大,
换句话说就是传输相同数据量情况下,TCP数据包的总字节数要比UDP数据包的总字节数要
多,结果可想而知了。 虽然UDP数据包携带的数据更多、更有效率,但为了传输数据的安
全准确,使数据总能准确的传输(或者报告传输错误),肯定要进行一些控制(楼主不是
采用一问一答的办法来进行差错控制吗?),进行控制的结果是安全性、可控制性提高了
但效率下降了,TCP就是很多研究人员研究传输过程后,制定出来的能够安全传输数据同时
尽量减少效率下降的方法。 因此你要提高速度而且仍要采用UDP方式,建议你采用Winsock
方式,不要采用控件方式;同时你要采用滑动窗口方式,而不是等到应答才发送下一个数据
帧,而是发出多个数据帧后,再等待,然后等到一个,发下一个,这样能使在传输途中的数据包始终保证在N个(N自己指定)
 
TK128讲得很不错,补充一句,滑动窗口方式的应答不是由程序应答,还是协议本身的应答,是TCP层的,不是应用层的
 
TO app2001:
那个程序对我而言没有多大价值,它主要是用ThreadedEvent提高效率,很遗憾我的程序
不可以采用这种方式,而且效率提升有限。
TO TK128:
滑动窗口考虑过,但是控制比较麻烦,所以放弃了……主要还是要增加丢包判定和重发,
比较麻烦的说。
TO SS2000:
滑动窗口方式的应答用程序来控制同样可行。
TO 张无忌:
如果只考虑速度不考虑其他的话,可以。
预分分数安排及理由:
app2001: 50分 虽然我的程序不能用ThreadedEvent方式,但是可以通过修改程序,达到
可以使用ThreadedEvent方式的目的,所以这也是可行的,有一定的参考价值。50分以资鼓
励。
TK128: 100分 理论上说,这应该是有效提升效率的方法,值得考虑。
还有150分,期待更多建议。
 
look:)
http://www.delphibbs.com/delphibbs/dispq.asp?lid=1548794
 
按照DFW的规矩,应该结贴了,可是还没有我比较满意的答案。我自己是用其他方式来
解决的。
再等十天,期待更精彩的建议,如果没有,则按上面的分配原则每人双倍放分。
另:爱元元的哥哥,没有必要转TK128的帖子来混分,虽然你很辛苦,可是你转的时候至
少说明一下,所以我就不打算给你分分了,呵呵
 
将包分成8192,一般情况下可取得比较好的效率,你的包似乎小了点.
 
我做过在公网上用UDP传输文件的程序,下面谈谈我的做法:
1. 文件数据分块
2. 发送文件前先把文件大小发给对方,对方计算数据块数量
3. 按顺序发送数据块到对方
4. 对方检测丢失块的序号,发到发送端要求重发
5. 重发丢失块
6. 重复4,5
 
>>TCP传输的可靠性是由协议保证
>>UDP传输的可靠性是由应用程序自己保证
同意

>>为啥qq传文件时,情况好象还不错啊。它传文件用的是tcp连接?
应该是!

我认为用 TCP 传文件好一样。
对于传文件可以这样,
先发出文件名与文件长度。等客户端回答
再直接发文件数据,
客户计算接收到的字节数。判断接收完成后就可以了。
因为数据的可靠性是由协议保证的。
 
TFTP 就是用UDP传文件的,INDY就有这个协议的控件,找来看看他的代码。
 
来自:张无忌, 时间:2003-12-3 10:52:00, ID:2330427
TFTP 就是用UDP传文件的,INDY就有这个协议的控件,找来看看他的代码。

这个人乱说!
你去看看 FTP 协议说明先。FTP 是基于 TCP 的,
只不过分为了两个通道,一是命令通道,一是数据通道。
SMTP,POP3 都是基于 TCP 的。
基于 UDP 的通用协议我还没有见过。
 
后退
顶部