檢驗和目的
目的是為了發現TCP首部和數據在發送端到接收端之間發生的任何改動。如果接收方檢測到檢驗和有差錯,則TCP段會被直接丟棄。
TCP在計算檢驗和時,要加上一個12字節的偽首部。
偽首部
偽首部共有12字節,包含IP首部的一些字段,有如下信息:32位源IP地址、32位目的IP地址、8位保留字節(置0)、8位傳輸層協議號(TCP是6,UDP是17)、16位TCP報文長度(TCP首部+數據)。
偽首部是為了增加TCP校驗和的檢錯能力:通過偽首部的目的IP地址來檢查TCP報文是否收錯了、通過偽首部的傳輸層協議號來檢查傳輸層協議是否選對了。
檢驗和計算過程
TCP首部校驗和計算三部分:TCP首部+TCP數據+TCP偽首部。
發送端:
首先,把偽首部、TCP報頭、TCP數據分為16位的字,如果總長度為奇數個字節,則在最后增添一個位都為0的字節。
把TCP報頭中的校驗和字段置為0。
其次,用反碼相加法(對每16bit進行二進制反碼求和)累加所有的16位字(進位也要累加,進位則將高位疊加到低位)。
最后,將上述結果作為TCP的校驗和,存在檢驗和字段中。
接收端:
將所有反碼相加,高位疊加到低位, 如計算結果的16位中每一位都為1,則正確,否則說明發生錯誤。
驗證示例:
校驗和 反碼求和過程
以4bit 為例
發送端計算:
數據: 1000 0100 校驗和 0000
則反碼:0111 1011 1111
疊加: 0111+1011+1111 = 0010 0001 高於4bit的, 疊加到低4位 0001 + 0010 = 0011 即為校驗和
接收端計算:
數據: 1000 0100 檢驗和 0011
反碼: 0111 1011 1100
疊加: 0111 + 1011 +1100 = 0001 1110 疊加為4bit為1111. 全為1,則正確
參考:https://www.cnblogs.com/zxiner/p/7203192.html
參考:https://www.bilibili.com/video/BV154411j7gm?from=search&seid=6568804261643548157&spm_id_from=333.337.0.0