2012-12-11 44 views
1

由於UDP是無連接協議,所以我們知道不能保證數據將被接收器接收。但是,如果收到數據報,數據是否可能部分/完全損壞?如果數據集由udp客戶端接收到,我們可以信任數據完整性嗎?

UDP標頭還包含CRC,所以這讓我覺得如果接收到數據報,數據將是可靠的?這是否正確?

爲了更詳細說明我從Java UDP服務器發送數據,如

// Sending in Java 
InetAddress group = InetAddress.getByName("230.0.0.1"); 
    //buf is a String.getBytes(); 
DatagramPacket packet = new DatagramPacket(buf, buf.length, group, 4446); 
//socket is DatagramSocket in Java 
socket.send(packet); 

的問題,並獲得在C#中的客戶數據這樣

 // client is UdpClient of C# 
     Byte[] data = client.Receive(ref localEp);       
     strData = Encoding.ASCII.GetString(data); 

我沒有操縱CRC自己,在接收器結束我得到的數據是用buf發送的,所以我在這裏檢查CRC,因爲我有一組字節數據。或以爲它會是正確的(我可以用那些極端的情況下,CRC將匹配即CRC和數據都奇蹟般地活腐敗)

回答

0

您可以相信,該數據報是完整的,如果它的校驗和(技術上不是CRC)是正確的,但是,這並不意味着你可以信任的數據。校驗和公式沒有任何魔力,所以改變數據的過程只能重新計算校驗和,你永遠不會知道。

+0

我進一步闡述了我的問題,我收到一個字節數組,就像我從java發送它們一樣。我不是自己放任何crc。 BUt我不知道如何檢查給定的字節[] – Ahmed

+0

您不必驗證校驗和。它將在幾個層面上爲您驗證。如果'UdpClient.Receive()'返回一個數據報,你可以假設校驗和與那個數據報內容匹配。 –

0

默認情況下OS拒絕與無效的校驗數據包。這意味着你將收到比正確的更少的壞包。但您可以配置套接字以允許部分/損壞的數據包傳播到用戶空間。

+0

對不起我得到的說法感到困惑,「這意味着你將獲得較少的壞包比那些正確」?你是說我只會在應用層獲得好的數據包嗎? – Ahmed

+0

我的意思是你只會得到那些已通過校驗和驗證的數據包。當然,這樣的分組可能不是相同的端發,但你會擺脫那些被運輸過程中因自然原因損壞的大部分的。 – Basilevs

1

假設工作的硬件,操作系統和IP堆棧,單包完整性通過IP校驗和保證。

我提到了這個假設,因爲出於性能原因或者作爲實現缺陷,我已經看到許多IP校驗和被關閉的情況(在總是返回「OK」的意義上):一些NIC可以在硬件中執行校驗和,但錯誤的驅動程序參數可能會毀了你的一天。

+0

我收到一個byte []在接受電話,但這些字節只包含數據,我應該在CRC自己匹配?或者假設byte []是正確的 – Ahmed

+0

你只能得到數據包的有效載荷,而不是數據包本身(你需要一個'原始'套接字),我認爲你應該直接使用它,但是建立一些彈性進入你的應用程序,以防萬一發生。 –

相關問題