引言:在抓包分析時,經常出現校驗和錯誤,校驗和為什么出現錯誤?校驗和錯誤數據傳輸是否一定錯誤?本文詳細分析校驗和發生錯誤的原因及與數據傳輸的關系。
發送方在發送數據時,將發送的數據按一定的規則計算校驗和,并將校驗和與數據一起發送給接收方,接收方接收數據時也要計算校驗和,接收的結果所有位均為1,如果累加結果中有任何比特是0,表明傳輸有差錯。
如圖1所示,圖中出現了大量的校驗和錯誤,那是不是說數據在傳輸的過程中一定發生了錯誤呢?在解決這個問題之前首先要了解系統如何進行校驗和計算,TCP/IP協議棧和網卡都可以完成校驗和的計算,一般情況下校驗和由操作系統的TCP/IP協議棧完成,網卡的Checksum Offload屬性設置有Enable和Disable兩種狀態,如設置為Enable則意味著網卡開啟了硬件計算校驗和的功能而協議棧則不再進行校驗和的計算。

圖1 校驗和錯誤
對于Tx(來自Transmit一詞,意為發送),Windows的協議棧將隨機填充校驗和,這些數據在發送之前被抓包軟件捕獲,在本機上抓取的數據包是隨機填充的校驗和,因此抓包軟件會提示校驗和錯誤,網卡會自動計算正確的校驗和與數據一起發送,因此對方收到的仍然是正確的數據包。
對于Rx(來自Receive一詞,意為接收),網卡在接收數據時,由網卡完成數據校驗。一旦網卡由于某種原因計算失敗,則由TCP/IP協議棧來完成數據校驗。如果將Checksum Offload屬性設置為 Disable,將關閉網卡硬件計算校驗和而由協議棧完成,這樣雖然在抓包軟件中不再顯示錯誤的校驗和,但代價卻是增加了系統的開銷,降低了網絡性能。
當你發現網絡不暢時,不妨查看一下Checksum offload的設置,在網卡配置/高級/Rx Checksum Offload/Tx Checksum Offload中將Checksum offload設置為Disable。這也是為什么有經驗的網絡玩家在玩大型網絡游戲出現卡頓時將Checksum offload設置為Disable的原因。
抓包軟件提示校驗和錯誤時校驗和實際上并沒有發生錯誤,而是由于開啟了網卡硬件校驗和功能,協議棧并沒有計算校驗和,只是隨機填充了數據,所以抓到的包校驗和是錯的,而這個錯誤的校驗和在網卡發送出去前會被網卡改正過來,接收端收到的包是校驗和正確的包。
因此在發現校驗和錯誤時不能武斷的認為一定是傳輸出了問題,而要進一下分析,是因為Checksum offload設置的原因還是網絡傳輸真的出現了問題。