关于用UDP进行文件传输

井朝天 2010-04-02 01:49:56
如题。现在进行实时传输视频都是基于UDP协议的。但是UDP是极不可靠的。通常是会发生丢包。我现在遇到这样的问题。比如
A:发送端(100Mbps内网,外出口为4M带宽)
B:接收端(外网,2M带宽)

这样进行传输,但是A端发送的速度很快(远远超过了4M),致使B端收不到这么多数据包,也不知道数据包到底丢在哪个地方。如何才能解决平衡问题哪?
因为UDP只管把数据发出去,根本不管数据流向,我考虑过两端一问一答的方式进行通信,但这样又会严重影响到网速,在实时传输中是不允许的。

最后提出最终问题,如何用UDP以最快速率,最低丢包和误码率传输数据那?

大家有什么好办法?
...全文
515 18 打赏 收藏 转发到动态 举报
AI 作业
写回复
用AI写文章
18 条回复
切换为时间正序
请发表友善的回复…
发表回复
iisbsd 2010-04-06
  • 打赏
  • 举报
回复
[Quote=引用 15 楼 guosha 的回复:]
虽然理论上UDP存在后发的包先到的情况,但根本原因是什么呢? 根本原因是中间路由寻址不稳定的情况,通常情况下这种情况是不存在的,也就是说不会后发的包先到。
[/Quote]

要是做广域网的UDP,绝对是有先发后到的。
快乐田伯光 2010-04-06
  • 打赏
  • 举报
回复
虽然理论上UDP存在后发的包先到的情况,但根本原因是什么呢? 根本原因是中间路由寻址不稳定的情况,通常情况下这种情况是不存在的,也就是说不会后发的包先到。

[Quote=引用 12 楼 laojing123 的回复:]
引用 9 楼 guosha 的回复:

你可以参考RTP的方法,就是发送的每个数据包都有一个序列号,收端能过检测序列号是否有丢失也判别有没有数据丢失,对有丢失的数据请求重传。
引用 8 楼 laojing123 的回复:
如果要想保证数据的正确传输,从对端发来的确认是必须的。但这个确认不能太频繁。不能影响到发送端发送数据。
还有就是必须用UDP。


关键是UDP不对数据包进行排序……
[/Quote]
iamybj 2010-04-06
  • 打赏
  • 举报
回复
9L的办吧可以,,对那些超过一定时间还没有收到的包,不管还能不能收到,都要求重发!
井朝天 2010-04-06
  • 打赏
  • 举报
回复
[Quote=引用 10 楼 linuxqqdaoapple 的回复:]

lz的情况,可以考虑使用sctp。
[/Quote]

SCTP? 这个是类似多端对多端的TCP啊。跟这个不搭尬阿
井朝天 2010-04-06
  • 打赏
  • 举报
回复
[Quote=引用 9 楼 guosha 的回复:]

你可以参考RTP的方法,就是发送的每个数据包都有一个序列号,收端能过检测序列号是否有丢失也判别有没有数据丢失,对有丢失的数据请求重传。
引用 8 楼 laojing123 的回复:
如果要想保证数据的正确传输,从对端发来的确认是必须的。但这个确认不能太频繁。不能影响到发送端发送数据。
还有就是必须用UDP。
[/Quote]

关键是UDP不对数据包进行排序阿。后发的数据可能先到,不可能一个一个检测序列号的。
ronliu 2010-04-06
  • 打赏
  • 举报
回复
QQ也是用UDP传文件。
首先肯定是要有确认包,然后对于局域网和广域网,确认的频率不一样,这需要算法去动态的学习。

另外,观察FTP之类的传文件协议,其发包速度都不是一下子就达到峰值,有一个渐变的过程,这是TCP协议的特点。你的协议一下子就以很快的速度发包是否合适?
快乐田伯光 2010-04-06
  • 打赏
  • 举报
回复
如果中间的路由寻址稳定就不会存在后发先到的情况!根本原因不过是数据包去往同一个地方的时候走了不同的路才会导致数据包后发先到。
[Quote=引用 16 楼 iisbsd 的回复:]
引用 15 楼 guosha 的回复:
虽然理论上UDP存在后发的包先到的情况,但根本原因是什么呢? 根本原因是中间路由寻址不稳定的情况,通常情况下这种情况是不存在的,也就是说不会后发的包先到。


要是做广域网的UDP,绝对是有先发后到的。
[/Quote]
dongjiawei316 2010-04-04
  • 打赏
  • 举报
回复
9楼说的方法可以,我尝试过。缺点在于收发两端的缓存巨大,且因此造成的时延很大。
问一下,从A端到B端需要多久时间,这就决定了你缓存的大小
linuxqqdaoapple 2010-04-04
  • 打赏
  • 举报
回复
lz的情况,可以考虑使用sctp。
快乐田伯光 2010-04-02
  • 打赏
  • 举报
回复
你可以参考RTP的方法,就是发送的每个数据包都有一个序列号,收端能过检测序列号是否有丢失也判别有没有数据丢失,对有丢失的数据请求重传。
[Quote=引用 8 楼 laojing123 的回复:]
如果要想保证数据的正确传输,从对端发来的确认是必须的。但这个确认不能太频繁。不能影响到发送端发送数据。
还有就是必须用UDP。
[/Quote]
井朝天 2010-04-02
  • 打赏
  • 举报
回复
如果要想保证数据的正确传输,从对端发来的确认是必须的。但这个确认不能太频繁。不能影响到发送端发送数据。
还有就是必须用UDP。
井朝天 2010-04-02
  • 打赏
  • 举报
回复
[Quote=引用 4 楼 vivo01 的回复:]

你定一个简单的确认协议,比如说发送完一个包后就等待接收端发送一个确认的信息过来,然后再发送下一个包。最好给包加个头,头的信息要包含包的编号。
这里给个简单的例子
我定义网络传输的包格式
#define START_PACK 0XFF1
#define ACK_PACK OXFF2
#define DATA_PACK 0XFF3
#define END_PACK 0xFF4……
[/Quote]
这个我以前试过,可以是可以,但是会严重拖慢传输速度。比如我在局域网,如果只发送和接手速度大概都在11M。如果加上你的一问一答的方式 马上变成2M的速度。这个肯定是不可行的。
井朝天 2010-04-02
  • 打赏
  • 举报
回复
[Quote=引用 3 楼 lijun_tian 的回复:]

自己做个缓冲发送
[/Quote]

这个我以前试过,可以是可以,但是会严重拖慢传输速度。比如我在局域网,如果只发送和接手速度大概都在11M。如果加上你的一问一答的方式 马上变成2M的速度。这个肯定是不可行的。
wesleyluo 2010-04-02
  • 打赏
  • 举报
回复
让他们双方做确认动作呢。
亦枫Leonlew 2010-04-02
  • 打赏
  • 举报
回复
你定一个简单的确认协议,比如说发送完一个包后就等待接收端发送一个确认的信息过来,然后再发送下一个包。最好给包加个头,头的信息要包含包的编号。
这里给个简单的例子
我定义网络传输的包格式
#define START_PACK 0XFF1
#define ACK_PACK OXFF2
#define DATA_PACK 0XFF3
#define END_PACK 0xFF4

typedef struct _my_packet{
int type; //包类型
unsigned int seq; //包的编号
void *buf; //数据域
}mypack;

这样接收端收到一个DATA_PACK,就回送一个ACK_PACK,接收端等待一定时间如果没有收到包(可能丢包),则重新发送ACK_PACK(因为没有收到END_PACK,表示传输没有结束)。
发送端最先发送START_PACK,并等待ACK_PACK,然后发送DATA_PACK,等待ACK_PACK....传输完毕,发送END_PACK,
实际上你还要考虑到发送端超时问题。
这里只是给你个简单的思路,希望对你有帮助/。
lijun_tian 2010-04-02
  • 打赏
  • 举报
回复
自己做个缓冲发送
iisbsd 2010-04-02
  • 打赏
  • 举报
回复
语音和视频数据丢掉就丢掉了,这是应用的特点。文件传输,还是TCP吧,如果没办法TCP,那就自己实现一下:

http://dev.csdn.net/author/huanghongbo/760eee4d4e7f48bbac43495ebd58a872.html
快乐田伯光 2010-04-02
  • 打赏
  • 举报
回复
在应用层实现TCP的窗口协议

23,217

社区成员

发帖
与我相关
我的任务
社区描述
Linux/Unix社区 应用程序开发区
社区管理员
  • 应用程序开发区社区
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

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