文章來自: http://irw.ncut.edu.tw/peterju/internet.html#udpudp checksum的計算
提示:
1.UDP的Pseudo Header會用到 IP 封包中的 Sorurce Address, Destination Address, 與 Protocol。
2.UDP Length會在Pseudo Header與UDP Header中各出現1次,也就是說會被計算2次。《==
(注意
)
3.若Data的長度若非Word(2 Bytes)的倍數,則必須在最後面補一個 byte的padding「0」。
假設有一封包資料如下
// ------- BEGIN Ethernet HEADER ----------------------------<br />00 09 5b 4f 64 72 // Destination HW address<br />00 07 95 e7 79 2d // Src HW address<br />08 00 // Type (not really sure what this octet's for)<br />// ------- BEGIN IP HEADER ----------------------------<br />45 // IP version (IPv4)<br />00 // Differentiated Services Code Point (i have no idea what this octet is for)<br />00 38 // Total Length (of the packet?)<br />5d 02 // ID (not really sure what this octet's for)<br />00 00 // Fragmentation offset<br />80 // Time To Live (in network hops)<br />11 // Protocol (UDP)<br />33 d6 // IP Header Checksum<br />c0 a8 00 02 // Source IP<br />c0 f6 28 3c // Destination IP<br />// ------- BEGIN UDP HEADER ---------------------------<br />6d 38 // Source Port<br />6d 2e // Destination Port<br />00 24 // Length (of the UDP Packet?)<br />29 b5 // UDP Checksum<br />ff ff ff ff // Marker (part of the packet data, no idea what it's for)<br />67 65 74 73 65 72 76 65 72 73 20 38 32 20 66 75 6c 6c 20 65 6d 70 74 79 // Packet Data
將上述資料以2byte為一組(16 bits)予以加總(Pseudo Header, UDP Header, UDP Data)
c0a8 + 0002 + c0f6 + 283c + // Source IP, Dest IP<br />0011 + // Protocol<br />0024 + // UDP length<br />6d38 + 6d2e + // Source Port, Dest Port<br />0024 + // UDP length<br />0000 + // empty checksum<br />ffff + ffff + 6765 + 7473 + 6572 + 7665 + 7273 + 2038 + 3220 + 6675 + 6c6c + 2065 + 6d70 + 7479 // Data<br />= 8d642
進位的LSB必須再加回來
8 + d642 = d64a
對結果求補數,即為checksum值
~d64a = 29b5