引言:在抓包分析時(shí),經(jīng)常出現(xiàn)校驗(yàn)和錯(cuò)誤,校驗(yàn)和為什么出現(xiàn)錯(cuò)誤?校驗(yàn)和錯(cuò)誤數(shù)據(jù)傳輸是否一定錯(cuò)誤?本文詳細(xì)分析校驗(yàn)和發(fā)生錯(cuò)誤的原因及與數(shù)據(jù)傳輸?shù)年P(guān)系。
發(fā)送方在發(fā)送數(shù)據(jù)時(shí),將發(fā)送的數(shù)據(jù)按一定的規(guī)則計(jì)算校驗(yàn)和,并將校驗(yàn)和與數(shù)據(jù)一起發(fā)送給接收方,接收方接收數(shù)據(jù)時(shí)也要計(jì)算校驗(yàn)和,接收的結(jié)果所有位均為1,如果累加結(jié)果中有任何比特是0,表明傳輸有差錯(cuò)。
如圖1所示,圖中出現(xiàn)了大量的校驗(yàn)和錯(cuò)誤,那是不是說數(shù)據(jù)在傳輸?shù)倪^程中一定發(fā)生了錯(cuò)誤呢?在解決這個(gè)問題之前首先要了解系統(tǒng)如何進(jìn)行校驗(yàn)和計(jì)算,TCP/IP協(xié)議棧和網(wǎng)卡都可以完成校驗(yàn)和的計(jì)算,一般情況下校驗(yàn)和由操作系統(tǒng)的TCP/IP協(xié)議棧完成,網(wǎng)卡的Checksum Offload屬性設(shè)置有Enable和Disable兩種狀態(tài),如設(shè)置為Enable則意味著網(wǎng)卡開啟了硬件計(jì)算校驗(yàn)和的功能而協(xié)議棧則不再進(jìn)行校驗(yàn)和的計(jì)算。
圖1 校驗(yàn)和錯(cuò)誤
對(duì)于Tx(來自Transmit一詞,意為發(fā)送),Windows的協(xié)議棧將隨機(jī)填充校驗(yàn)和,這些數(shù)據(jù)在發(fā)送之前被抓包軟件捕獲,在本機(jī)上抓取的數(shù)據(jù)包是隨機(jī)填充的校驗(yàn)和,因此抓包軟件會(huì)提示校驗(yàn)和錯(cuò)誤,網(wǎng)卡會(huì)自動(dòng)計(jì)算正確的校驗(yàn)和與數(shù)據(jù)一起發(fā)送,因此對(duì)方收到的仍然是正確的數(shù)據(jù)包。
對(duì)于Rx(來自Receive一詞,意為接收),網(wǎng)卡在接收數(shù)據(jù)時(shí),由網(wǎng)卡完成數(shù)據(jù)校驗(yàn)。一旦網(wǎng)卡由于某種原因計(jì)算失敗,則由TCP/IP協(xié)議棧來完成數(shù)據(jù)校驗(yàn)。如果將Checksum Offload屬性設(shè)置為 Disable,將關(guān)閉網(wǎng)卡硬件計(jì)算校驗(yàn)和而由協(xié)議棧完成,這樣雖然在抓包軟件中不再顯示錯(cuò)誤的校驗(yàn)和,但代價(jià)卻是增加了系統(tǒng)的開銷,降低了網(wǎng)絡(luò)性能。
當(dāng)你發(fā)現(xiàn)網(wǎng)絡(luò)不暢時(shí),不妨查看一下Checksum offload的設(shè)置,在網(wǎng)卡配置/高級(jí)/Rx Checksum Offload/Tx Checksum Offload中將Checksum offload設(shè)置為Disable。這也是為什么有經(jīng)驗(yàn)的網(wǎng)絡(luò)玩家在玩大型網(wǎng)絡(luò)游戲出現(xiàn)卡頓時(shí)將Checksum offload設(shè)置為Disable的原因。
抓包軟件提示校驗(yàn)和錯(cuò)誤時(shí)校驗(yàn)和實(shí)際上并沒有發(fā)生錯(cuò)誤,而是由于開啟了網(wǎng)卡硬件校驗(yàn)和功能,協(xié)議棧并沒有計(jì)算校驗(yàn)和,只是隨機(jī)填充了數(shù)據(jù),所以抓到的包校驗(yàn)和是錯(cuò)的,而這個(gè)錯(cuò)誤的校驗(yàn)和在網(wǎng)卡發(fā)送出去前會(huì)被網(wǎng)卡改正過來,接收端收到的包是校驗(yàn)和正確的包。
因此在發(fā)現(xiàn)校驗(yàn)和錯(cuò)誤時(shí)不能武斷的認(rèn)為一定是傳輸出了問題,而要進(jìn)一下分析,是因?yàn)镃hecksum offload設(shè)置的原因還是網(wǎng)絡(luò)傳輸真的出現(xiàn)了問題。