並發UDP發送,引起丟包如何處理?

因為工作需要,要建立一種可靠的UDP數據傳輸的需求。而UDP是非可靠的連接,我的想法是用發送-應答的機制來讓數據可靠。而我的做法是定一個發送隊列,發送線程檢查發送隊列,有數據時就發送出去。而接收線程收到數據後回復一個ACK.如果發送端收到這個ACK就把相應的發送隊列中的數據刪除,表示這個包已應收到了。而發送線程也會定時檢查看發送隊列裡的數據是否超時,超時就重發。而現在我遇到的問題是因為在發送時,隊列裡的數據可能比較多,一次發送時,會丟一大部份。我就像每發一次包sleep(5)也沒有解決多大的問題。而我在任務管理器中發現,網絡寬帶才被利用了一小部份。才0.2.為什麼只利用到如些小的寬帶,丟包還這樣嚴重呢?
答:不准备自己设计的话,就先看看别人的做法www.codeproject.com/internet/udt.aspAUDP-basedReliableDataTransferLibrary
答:利用UDP发送大块数据,在接收端必须检查接受到的数据是否完整再应答。因为中间网络可能出现IP分包,因此不能保证UDP的数据包一定以发送时数据包大小到达目的机器简易解决方案:1、在发送数据中包含数据包长度字段,接收端接收完整再应答。2、**最大数据包大小,即将大数据分断发送。小数据包可以降低分包导致接收不完整的概率性。
答:要解决丢包就用TCP首先你要确定你的网络环境,看看是否与包的大小有关,一般的情况下在公网发UDP包大小不超过512字节
答:UDT,是做得不錯,不過現在有兩個問題1,它差不多是在UDP上再實現一個TCP。它必須先連接,再發送接收,再斷開。2.它是用C來做的,生成一個MFCDLL,而我希望在Delphi裡用。我現在的需求。我想保持UDP的,一對多地址發送的功能。就是我只開一個端口就可以與多個地址通訊。但又要保證數據的穩定性。現在我做了一點。可靠性解決了,但效率還是不高。丟包率太高了。
答:简易解决方案:1、在发送数据中包含数据包长度字段,接收端接收完整再应答。2、**最大数据包大小,即将大数据分断发送。小数据包可以降低分包导致接收不完整的概率性。-------------------現在我也是這樣做的,把數據分成很多小包,每個小包最大是1400字節負載因為IP協議的最大分包是1460,我這樣保證一個包可以不被分片。而現在的問題,是在大並發時,還是分有丟包的。因為我的設計是一個端口對應於多個地址,(可以同時對多個地址發數據)。這樣,我是定一個發送隊列,一個發送線程,發送線程檢查隊列裡的分包,打包後發送。接收端收到自己想要的包後回應ACK.發送端收到這個ACK後,發下一個分包。現在的問題是同時發多個分包時丟包比較多。比如同時發1000個100K的數據包,在局址網裡要丟100多個。而同時發1000個10K的數據包要丟得更多。(這個我也不明白)但網絡的利用率,只是太開始發送時達到了最大值,而後面也就最多30左右。我想是因為網絡擁塞造成的。太多小包的並發發送,讓自己或對方的系統Socket緩沖溢出,而造成的丟包。我看了一下別人的解決方法都有一個比較復雜的擁塞處理機制。誰能告訴我應該如何處理?
答:即使不并发,UDP报文还是要丢的在应用层需要加应答机制,发送放发送一个报文后,对方接收后要给一个应答,如果没有应答,发送放需要重发
答:樓上的沒有看我的發言吧
答:使用别的方法检查丢包是发生在自己机器上还是发生在网络线路上.如果发生在机器上,比如send成功返回,但是事实内核缓冲已满,所以报文被内核丢弃.这种情况你只能减慢发送速度,增大发送缓冲.上面你提到发送10K甚至100K的UDP包,这是错误的作法.UDP报文最大64K,不明白你是怎么做到100K的.不要发送超过8K的UPD包.但是你又提到分包为1400字节.所以我无法理解你的说法.如果发生在网络线路,不是编程能解决的.
答:使用别的方法检查丢包是发生在自己机器上还是发生在网络线路上.如果发生在机器上,比如send成功返回,但是事实内核缓冲已满,所以报文被内核丢弃.这种情况你只能减慢发送速度,增大发送缓冲.上面你提到发送10K甚至100K的UDP包,这是错误的作法.UDP报文最大64K,不明白你是怎么做到100K的.不要发送超过8K的UPD包.但是你又提到分包为1400字节.所以我无法理解你的说法.--------------------这位大侠说话,我爱听,的确是我没有说的太清楚。我是这样设计的。我把我的程序结构分成两层。最上面是用户层,下面是数据传输层¦----------------------------¦¦用户逻辑层¦¦¦¦----------------------------¦¦数据传输层¦<--------我现在在做这部份¦¦------------------------------用户层不管通讯的事,它只是告诉传输层,我有什么数据要传,传到哪个IP,哪个端口。数据传输层收到命令后就开始发送,发送成功或失败,再通知用户层.这样就有两种数据包,一种是用户发给传输层的,我把这叫用户数据包,最大我定成120K而真在发送时,会把用户数据包,分成一小个一小个的传输数据包,这个包我定成固定的1400,定成1400是为了让数据包在IP层不被分片。我在用户层,可以同时与多个IP之间通讯。这由传输层来控制。你说的丢包是发生在网络上还是机器上,这个才是我的确想要解决的问题,我认为现在丢包应该发生在机器上。就是我send成功,但可能被内核给丢了。但这时我如何知道内核缓冲满了呢?我现在的Socket缓冲是定到140k左右。我这样说的原因是我在本机测试时,速度居然只有400K左右,而在网络上(公司),就可以到2M到4M.说明在本机时大部份数据都是发送后确认超时等待上了。我想在想大侠给我个方法,如何得知内核Socket缓冲满了没?
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值