2010-03-09 183 views
1

我在C#中構建UDP服務器應用程序。我遇到了一個包校驗問題。如你所知,每個數據包都應該帶有一些簡單的方法來告訴接收方數據包是否完好無損。什麼是校驗UDP數據包的正確方法

現在,UDP已經將2個字節的校驗和作爲頭部分的一部分,至少在IPv4世界中是可選的。另一種方法是將自定義校驗和作爲每個數據包中數據部分的一部分,並在接收方進行驗證。

我的問題歸結爲:依賴UDP數據包頭中的(可選)校驗和還是將自定義校驗和實現作爲數據包數據部分的一部分會更好?

也許正確的答案取決於環境(像往常一樣),所以這裏的一個情況是,即使代碼被寫入和.NET開發的Windows上,它威力必須在平臺獨立的單聲道運行。 NET,所以最終的解決方案應該與其他平臺兼容。我相信自定義校驗和算法會很容易移植,但我不太確定第一個。

有什麼想法?

另外,歡迎關於數據包校驗和的呼聲。

回答

1

你需要計數錯誤嗎?如果UDP校驗和錯誤,那麼任何路由器都可能丟棄數據包,並且你永遠不會得到任何東西。

當然,如果頭部有錯誤(如目標IP地址),你也不會得到它。

此外,UDP校驗和算法是完全標準化的,雖然打開或關閉校驗和的函數調用會因平臺而異,儘管它通常涉及到setsockopt。

+0

路由器不檢查校驗和;這就是爲什麼首先關閉它們的原因。 – 2010-03-09 01:57:53

+0

@Andrew:這是一個過於寬泛的主張,這是它是錯誤的主要原因。也許大多數路由器不驗證校驗和,但也有很多。例如,在基於linux的路由器中,netfilter的通常配置會丟棄校驗和不佳的數據包。 – 2010-03-09 05:18:29

+0

@Andrew:好點,我沒有想過之前計算錯誤。現在答案似乎很明顯。在跨平臺實現中,System.Net.Sockets.SocketOptionName.ChecksumCoverage似乎在所有平臺上都受支持。 – 2010-03-09 09:56:17

相關問題