2011-09-07 46 views
4

在互聯網上有幾篇關於如何使udp可靠的文章。我一直沒能找到一個在C#上。所以也許我可以實現我的算法。c中可靠的udp#

從研究在互聯網上,我相信UDP有兩個問題:


  1. 它並不能保證所有的數據到達它的目的地。
  2. 數據可能會達到它是一個不同的順序目的地
  3. 也許有,我爲了讓可靠

,如果你有興趣知道爲什麼我想我缺少一個第三個問題使udp可靠,爲什麼我不使用tcp,而是看看this question。相信我,我一直在嘗試做tcp打孔鑽孔這麼久。

反正可能已經有一個庫,我可以使用C#,這將使我能夠做到這一點。因爲我注意到能夠找到一個圖書館中,我一直在思考下面的算法:


「想象一下,有計算機A和計算機B和計算機A爲文件發送到計算機B上的一個」;

這裏是我一直在思考的步驟:


1)計算機A打開文件進行讀取,並讓我們說這是5000個字節。這意味着計算機A將不得不向計算機B發送5000字節,以確保沒有字節丟失,並且順序也正確。


2)computer get是文件的前500個字節,它得到這些字節的散列。所以現在計算機A有兩件事情,即500字節的散列和字節。 (散列將是一個有效的算法,如MD5,以確保數據以正確的順序得到了好評。這是MD5(1,2,3)!= MD5(2,1,3))


3)將這些前500個字節的散列映射爲kj82lkdi930fi1。


4)計算機B應該監聽散列和字節。


5)計算機A將散列發送給計算機B,並且它也發送500字節。只要它發送它開始等待答覆。


6)計算機B現在應該接收哈希和字節。計算機b對接收到的字節執行相同的算法md5。如果該結果等於接收到的散列值,那麼它用{1,1,1,1,1,1}回答A,否則用{2,2,2,2,2,2,2}


6。5)假設計算機B獲得了正確順序的數據,所以它回覆{1,1,1,1,1,}它也將哈希碼保存在內存或數組上。


7)計算機A應該等待響應才能發送下一個500字節。假設它收到{1,1,1}。因爲它收到1,它知道它可以繼續併發送下一個500個字節,並使用這500個字節的新哈希碼。 8)計算機A發送下一個500字節的哈希代碼。


9)讓我們假設計算機B沒有接收到數據,因此不會回覆A.計算機B上仍將等待字節和哈希


8),因爲電腦A有在合理的時間內沒有收到1,1,1,1,1或2,2,2,2,2,那麼A將再次發送相同的字節和哈希值。 9)假設計算機B接收到散列和字節,但接收到的字節是按不同的順序收到的。當計算機B計算這些字節的散列值時,該散列值將與接收到的散列值不匹配。因此它會用{2,2,2,2,2,2}回覆


10)如果計算機A收到2,2,2,2,2,2,那麼它會發送相同的字節和散列。如果由於某種原因沒有收到2,2,2,2,2,那麼它會在一段時間後發送相同的字節和散列。讓我們假裝計算機A收到2,2,2,2,0


11)計算機A第3次發送相同的字節和散列。


12)計算機B以正確的順序接收散列和字節。結果它回覆1,1,1,1,1,1並將該先前的散列保存在內存中。 (回憶步驟6.5)


13)可讓假裝計算機A未接收到響應1,1,1,1從B.它將再發送相同的字節爲第四時間。


14)B計算機檢查散列並且如果它等於被接受的最後一個,然後它再次1,1,1,1回覆,而無需編寫這些字節到該文件。


15)算法繼續如此,直到文件被傳輸。


我的意思是顯然有一些其他的東西,我需要添加到這種算法,如讓計算機B知道什麼時候完成傳輸。也許檢查更多的錯誤。如果計算機A長時間斷開連接,會發生什麼情況。但主要協議將與我所描述的協議類似。

那麼你認爲我應該開始實施這個算法?我應該增加並且每次發送更多字節。我的意思是發送1000而不是500?互聯網上有很多關於幾種技術的文章,但只有很少的文章給出了你想要的語言的實例。在這種情況下,我需要在C#中。

+1

因爲這是很難做到的TCP衝入座!相信我,如果我可以用tcp協議連接不同nat上的兩個對等體,那麼我不會浪費我的時間來問這個問題。看看這個問題:http://stackoverflow.com/questions/7225150/forward-traffic-from-port-x-to-computer-b-with-c-udp-punch-hole-into-firewall。我無法在互聯網上找到一個例子來創建tcp punch holing。我發現了幾篇文章,解釋了這些如何工作,但是當我將這些文章翻譯成c#出於某種原因,他們不工作。 –

+0

不能與此爭論。 – 2011-09-07 02:57:13

回答

2

第三個問題是當您收到數據時可能會損壞數據。

您可以從閱讀TCP RFC開始,瞭解TCP如何使通信可靠。具有這些知識,您可以使用UDP作爲傳輸來實現其一些技術。

也看看這個UDP網絡庫http://code.google.com/p/lidgren-network-gen3/