資料連結層
網際網路檢查碼(Internet checksum)
想像一位收銀員,刷完一張長長的收據後,把所有價格加總,把總和寫在最下面。日後任何人都能把價格重加一次,和寫好的總和比對;若對不上,就表示某個數字抄錯了。網際網路檢查碼對資料做的就是同一件事。發送方把資料看成一串數字,用一套規定好的方式相加,再把這個和一起送出。接收方重加並比對。
IP、TCP、UDP 採用的精確方案,是 16 位元的一補數檢查碼。資料被切成一個個 16 位元的字(word);發送方把它們全部相加,並把從最高位溢出的進位繞回最低位(一補數加法),再對這個和取補數(每個位元都翻轉),存進檢查碼欄位。接收方把同樣這些字加上收到的檢查碼相加;若一切沒變,結果會是全部都是 1,接收方便認定通過。它刻意設計成在軟體中計算很便宜,這正是建在作業系統裡的 TCP 與 UDP 採用它的原因。
對它的強度要誠實。網際網路檢查碼能抓到所有單一位元錯誤與許多常見樣式,但由於加法會讓錯誤互相抵消,它可能漏掉某些組合——例如某個字裡的值升高、另一個字裡的值降低同樣的量。它比同樣大小的 CRC 弱得多,本就只當作一個輕量的合理性檢查,前提是底下的連結層已經跑過更強的檢查。它也對「竄改」毫無防護:任何人改了資料,只要重新算一次檢查碼即可。
TCP 與 UDP 各自帶一個 16 位元檢查碼欄位,對標頭與資料(外加一小段 IP 標頭)計算而得。接收方重新計算後若不符,會默默丟棄該區段——對 UDP 而言,這通常意味著應用程式根本不會看到那個資料報。
檢查碼不符就默默丟棄該區段;在這一層不會有人被要求重送。
檢查碼偵測的是意外的損壞,而非惡意竄改——攻擊者只要重算一次即可。它比同樣長度的 CRC 弱,並仰賴底下的連結層來扛重活。
又称
另见