2017-08-27 248 views
0

我試圖手動計算各種UDP數據包的校驗和,但是我總是得到與Wireshark中顯示的結果相比的錯誤結果。下面是我如何做到這一點的例子:我的UDP校驗和計算每次都會給出錯誤的結果

Source Address: 192.168.0.103 (0xC0A8, 0x0067) 
Destination Address: 192.168.0.1 (0xC0A8, 0x0001) 

Source Port: 57090 (0xDF02) 
Destination Port: 8000 (0x1F40) 

Packet length: 19 (0x0013) 
Data: hello world (0x6865, 0x6C6C, 0x6F20, 0x776F, 0x726C, 0x6400) 

Expected checksum: 0xEDFD (from wireshark) 

據我所知,UDP校驗和與下列變量計算:

Source IP + Destination IP + 17 (0x0011 - protocol code) + 10 (0x000A - pseudoheader length) + Source Port + Destination Port + UDP Packet Length + Data 

所有這些羣體中的16位。

所以我的計算是(以相同的順序):

0xC0A8 + 0x0067 + 0xC0A8 + 0x0001 + 0x0011 + 0x000A + 0xDF02 + 0x1F40 + 0x0013 + 0x6865 + 0x6C6C + 0x6F20 + 0x776F + 0x726C + 0x6400 

上述款項的結果是:

0x511F4 

現在,因爲結果比0xFFFF的高我這樣做:

0x11F4 + 0x0005 = 0x11F9 

翻轉位之後,我得到的結果:

0xEE06 <- which, as you can see, it is different from the expected one 

所以我的問題是我做錯了什麼?我總是得到幾乎在wireshark中顯示的結果。

下面是Wireshark的裏面包的截圖,作爲參考 https://www.evernote.com/l/AWl0H1AGoxpGX4_zjgDlVBcytJM-HP_PvQE

+0

這裏有一個RFC。你讀過了嗎? – EJP

+0

是的,我讀了RFC768。 – Ibrahim

回答

0

我發現我在做什麼錯,以防其他人也有類似的問題。

我被計算所述僞報頭的方式是這樣的:

Source IP + Destination IP + 17 (0x0011 - protocol code) + 10 (0x000A - pseudoheader length) 

問題是在長度字節。它應該是UDP數據包的長度,而不是僞長度。

的最終公式是:

Source IP + Destination IP + 17 (0x0011 - protocol code) + UDP Packet Length + Source Port + Destination Port + UDP Packet Length + Data 

通知UDP包長度出現兩次。首先是僞首部,其次是實際的UDP首部。