2014-06-25 279 views
-1

我想修改我擁有的數據包並通過網卡發送這些數據包。爲此,我需要計算我的UDP層Checksum計算UDP層校驗和

所以,我發現this函數,它接受一個數組並返回Checksum,但是我有兩個小的問題:

  1. UDP層具有8個字節:2源端口,2目的端口,2長度和2校驗和。 我找到的函數需要用數組調用,那麼我應該發送這個函數我的6字節數組有沒有2字節校驗和?

  2. 該函數提到它計算IP校驗和,這也適合計算UDP校驗和?

    編輯:

我發現this一篇文章,計算IP/TCP/UDP校驗和,我可以幫助轉換代碼計算UDP校驗到C#?

+0

您是否檢查維基百科?與algos和所有的好頁面。 – TomTom

+0

是的,我檢查了 – user3637066

+0

IP校驗和只使用頭。 TCP/UDP校驗和使用標題和數據。 – clcto

回答

0

該帖子的作者說,在他的評論

」 ......的第一個參數是包含IP報頭分組的字節陣列(已經形成的,但與所述校驗和字段設置爲零[兩個字節])。 「

所以你應該設置兩個校驗和字節(字節7和8)爲零,然後發送頭的全部8個字節來計算校驗和。

至於UDP/IP校驗和,它們是兩個不同的東西,作者聲明這個計算專門用於IP頭校驗和創建。

+0

所以我可以使用此功能的UDP校驗? – user3637066

+0

不可以。如最後一句所述,作者說這是IP頭校驗和。這無疑會爲UDP校驗和產生錯誤的值。請參閱此SO帖子,瞭解有關UDP校驗和的信息:http://stackoverflow.com/questions/1480580/udp-checksum-calculation – GEEF

+0

請參閱我的更新 – user3637066

0

您是否嘗試將其設置爲零?根據RFC 768,它是可選的。

http://tools.ietf.org/html/rfc768

「的所有零發送校驗和值意味着發送器不產生校驗和(調試或對於不關心更高級別的協議)」。

如果你真的想計算它,你可以試試看FreeBSD的assemble_udp_ip_header函數:http://svnweb.freebsd.org/base/head/sbin/dhclient/packet.c?view=markup

你不應該只用一個6字節的數組來調用它,因爲校驗和過程應該在僞頭上運行。雖然你可以使用你在僞頭文件中提到的函數,但是我懷疑它有一個錯誤,即如果length參數不是偶數,它可以訪問數組的末尾。

您計算的校驗和不正確,因爲它需要在psuedo頭上計算。您缺少諸如協議,IP地址源,IP地址目標以及實際有效負載等字段。你也只寫了你分配的8個字節中的6個。

+0

請參閱我的更新 – user3637066