close
checksum 是為了保證 header 或 data 不被破壞而發展出來的機制

它的計算方式是這樣的

將要計算的對象以 16 bits 為單位以一的補數作相加(計算前的 checksum 是設為零)

最後相加的結果再取一的補數填入 checksum 這個欄位

觀念非常簡單容易

不過 checksum 計算對象依照不同的協定仍然不太一樣

(以下以 IPv4 為準)



(一)IP

IP header 中的 checksum 計算對象只有 IP header

因此所保證的欄位也就只有 IP header



(二)ICMP

ICMP 的 header 也有 checksum

其計算對象除了 header 外,也包含了 ICMP data



(三)TCP/UDP

TCP/UDP header 中 checksum 的計算對象

除了直覺上的 header 和 data 外,還包含所謂的虛擬表頭(psuedo-header)

此 psuedo-header 包含了 L3 的 SrcIP 、 DstIP 、 Packet Length 及 Protocol Num

之所以要增加 psuedo header

目的在於

封包在傳輸過程中,目的 IP 可能會被更改,而傳到錯誤的 host

不過 IP 的 checksum 隨時都在改變

因此可能會把被改過的 IP 當成是對的計算進去因而檢查不出來

但是 L4 的 checksum 在傳輸過程中並不會被更改

因此算進去的目的 IP 就是原本 sender 要送的對象

當 receiver 端拆解封包檢查 L4 的 checksum 即可知送錯對象

不過有一點要注意的是

UDP 的 checksum 是 optional 的

它可以被寫為 0 而被 disable 掉
arrow
arrow
    全站熱搜

    fantasymew 發表在 痞客邦 留言(1) 人氣()