******讨论如何达到UDP的速度极限******

softrain 2005-07-21 06:26:40
在内网穿透后,要用UDP实现文件下载,请大家讨论用什么方案可以让UDP传输的速度达到极限。
我想到的方案是:
AB双方保存一个消息队列,A连续发送一系列的数据包(比如连续发送16个1K的包)且包头都有携带数据总量和包序号以及是否是最后一个包的标志,然后期待对方确认回复。B保持一个接收队列,并且只有当整个系列都接受完毕再发送确认,或者发生了丢包向A报告丢失的序列,A把丢失的序列重发。反复直到这一系列包成功传输完成。。丢包是这样判断:收到最后一个包而前面还有包没有收到或者达到超时时间最后一个包还没有到达。
问题1:这一系列包到底要多少个为好?太多的话丢包会非常严重,太少会因为AB交互太多而影响速度。
问题2:超时时间设置多少为好?

请问如何解决这两个问题,并提出您的方案大家讨论。
...全文
426 19 打赏 收藏 转发到动态 举报
写回复
用AI写文章
19 条回复
切换为时间正序
请发表友善的回复…
发表回复
softrain 2005-08-03
  • 打赏
  • 举报
回复
看来只有参考TCP了。
flashboy 2005-08-02
  • 打赏
  • 举报
回复
超时的长度设置是门艺术, 可以参考TCP协议实现中关于几钟超时的判断算法实现.
gohappy_1999 2005-07-31
  • 打赏
  • 举报
回复
顶一下
softrain 2005-07-31
  • 打赏
  • 举报
回复
还有没有了?
shenming123 2005-07-26
  • 打赏
  • 举报
回复
UDP的数据控制在1472字节以下为好.
这只是理论,实际上,考虑调用开销,这未必是好的办法.
如果要传送30K,本来可以一次发送
分片却要20多次,最合适的值只能在实际环境中测试得出.
softrain 2005-07-26
  • 打赏
  • 举报
回复
大家有没有什么方案可以解决这两个问题?
oyljerry 2005-07-25
  • 打赏
  • 举报
回复
局域网内一般按照以太网数据帧等来划分
oyljerry 2005-07-25
  • 打赏
  • 举报
回复
按照工程理论值等,UDP一般就是576字节等
dragonyjd 2005-07-25
  • 打赏
  • 举报
回复
引用一下:

轮子学习笔记一:浅谈以太网中的UDP编程

1.在进行UDP编程的时候,我们最容易想到的问题就是,一次发送多少bytes好?
当然,这个没有唯一答案,相对于不同的系统,不同的要求,其得到的答案是不一样的,我这里仅对
像ICQ一类的发送聊天消息的情况作分析,对于其他情况,你或许也能得到一点帮助:
首先,我们知道,TCP/IP通常被认为是一个四层协议系统,包括链路层,网络层,运输层,应用层.
UDP属于运输层,下面我们由下至上一步一步来看:
以太网(Ethernet)数据帧的长度必须在46-1500字节之间,这是由以太网的物理特性决定的.
这个1500字节被称为链路层的MTU(最大传输单元).
但这并不是指链路层的长度被限制在1500字节,其实这这个MTU指的是链路层的数据区.
并不包括链路层的首部和尾部的18个字节.
所以,事实上,这个1500字节就是网络层IP数据报的长度限制.
因为IP数据报的首部为20字节,所以IP数据报的数据区长度最大为1480字节.
而这个1480字节就是用来放TCP传来的TCP报文段或UDP传来的UDP数据报的.
又因为UDP数据报的首部8字节,所以UDP数据报的数据区最大长度为1472字节.
这个1472字节就是我们可以使用的字节数。:)

当我们发送的UDP数据大于1472的时候会怎样呢?
这也就是说IP数据报大于1500字节,大于MTU.这个时候发送方IP层就需要分片(fragmentation).
把数据报分成若干片,使每一片都小于MTU.而接收方IP层则需要进行数据报的重组.
这样就会多做许多事情,而更严重的是,由于UDP的特性,当某一片数据传送中丢失时,接收方便
无法重组数据报.将导致丢弃整个UDP数据报。

因此,在普通的局域网环境下,我建议将UDP的数据控制在1472字节以下为好.

进行Internet编程时则不同,因为Internet上的路由器可能会将MTU设为不同的值.
如果我们假定MTU为1500来发送数据的,而途经的某个网络的MTU值小于1500字节,那么系统将会使用一系列的机
制来调整MTU值,使数据报能够顺利到达目的地,这样就会做许多不必要的操作.

鉴于Internet上的标准MTU值为576字节,所以我建议在进行Internet的UDP编程时.
最好将UDP的数据长度控件在548字节(576-8-20)以内.
softrain 2005-07-24
  • 打赏
  • 举报
回复
你们只是重复我提出问题,我要的是一个解决方案,,要的是答案。
lamputa_lito 2005-07-24
  • 打赏
  • 举报
回复
其实TCP就是解决了这样的问题。针对你的两个问题,TCP的解决方法是
1、流量控制机制,包的值不是固定的,而是动态变坏的,通过测试而得。
2、超时控制,该值不是固定的,而是动态计算的。

我曾经也想着要做这样一个东西,了解了之后,在UDP上做可靠传输,除非在特定情况下,否则还不如用TCP,因为你会发现,其复杂性跟TCP是一样的,而且TCP提供了很好的解决方案,况且是基于IP协议,我想做出来的效率应该不会高于TCP的,除非在质量上打折。当然,某些场合TCP是不能应用的,所以也只好用UDP。
yexingren 2005-07-24
  • 打赏
  • 举报
回复
学习!如果真对特定的应用的话,也许udp 能比tcp性能要好!还是要考虑具体的网络环境!
softrain 2005-07-22
  • 打赏
  • 举报
回复
如何测?我要的方案要对一般的网络都可行。就象TCP可以适应任何网络一样。
oyljerry 2005-07-22
  • 打赏
  • 举报
回复
需要根据网络条件等,测试得到一个比较适中的包的大小
VCSQLVB 2005-07-22
  • 打赏
  • 举报
回复
UDP传输的速度达到极限,但还有带宽限制呀。
ddgfei 2005-07-22
  • 打赏
  • 举报
回复
我做过最大得能在瞬间传输432个19字节得包,如果使用队列得方式,相当于你现在得算法,是462个19字节得包。
softrain 2005-07-22
  • 打赏
  • 举报
回复
在同样的网络带宽下,如何达到传输速度最大
hucaiyu 2005-07-21
  • 打赏
  • 举报
回复
漫漫测试吧。找到最大值。等你好消息
AntonlioX 2005-07-21
  • 打赏
  • 举报
回复
up

18,356

社区成员

发帖
与我相关
我的任务
社区描述
VC/MFC 网络编程
c++c语言开发语言 技术论坛(原bbs)
社区管理员
  • 网络编程
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧