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

2021-04-25 14:27:59 字數 1683 閱讀 5524

因為工作需要,要建立一種可靠的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位元組.所以我無法理解你的說法.如果發生在網路線路,不是程式設計能解決的.

高併發如何處理(架構層面)

高併發系統各不相同。比如每秒百萬併發的中介軟體系統 每日百億請求的閘道器系統 瞬時每秒幾十萬請求的秒殺大促系統。他們在應對高併發的時候,因為系統各自特點的不同,所以應對架構都是不一樣的。另外,比如電商平台中的訂單系統 商品系統 庫存系統,在高併發場景下的架構設計也是不同的,因為背後的業務場景什麼的都...

如何處理重複請求 併發請求的

你可能會想到的是,只要請求有唯一的請求編號,那麼就能借用redis做這個去重 只要這個唯一請求編號在redis存在,證明處理過,那麼就認為是重複的 string key req12343456788 請求唯一編號 long expiretime 1000 1000毫秒過期,1000ms內的重複請求會...

php如何處理大資料高併發

大資料解決方案 使用快取 使用方式 1,使用程式直接儲存到記憶體中。主要使用map,尤其concurrenthashmap。使用快取框架。常用的框架 ehcache,memcache,redis等。最關鍵的問題是 什麼時候建立快取,以及其失效機制。對於空資料的緩衝 最好用乙個特定的型別值來儲存,以區...