名詞解釋:
WireShark分析數(shù)據(jù)包,網(wǎng)卡沒(méi)有dropped,正常的數(shù)據(jù)包居然出現(xiàn)了checksum incorrect。(傳輸中本身有問(wèn)題出現(xiàn)的 checksum incorrect本文中不做說(shuō)明) 分析原因: 正常情況下,系統(tǒng)的TCP/IP協(xié)議棧計(jì)算TCP包的校驗(yàn)和。然而從網(wǎng)卡屬性配置中,我們發(fā)現(xiàn)居然在高級(jí)選項(xiàng)里可以設(shè)置Checksum Offload是否對(duì)Rx或Tx有效,也可以設(shè)置為對(duì)兩者都有效。 對(duì)于Tx,設(shè)置Checksum Offload有效之后,Windows的傳輸層將隨機(jī)填充TCP校驗(yàn)和,因此在本機(jī)上抓取的數(shù)據(jù)包是Bad CheckSum。然后,網(wǎng)卡會(huì)自動(dòng)計(jì)算正確的校驗(yàn)碼然后發(fā)送,因此對(duì)方收到的仍然是正確的TCP包。 對(duì)于Rx,設(shè)置Checksum Offload有效之后,網(wǎng)卡在接收數(shù)據(jù)時(shí),會(huì)填充一個(gè)NDIS_TCP_IP_CHECKSUM_PACKET_INFO 結(jié)構(gòu)并設(shè)置標(biāo) 志位;如果由于某種原因失敗,則不設(shè)置標(biāo)志位,由Windows里的TCP/IP協(xié)議棧來(lái)完成數(shù)據(jù)校驗(yàn)。 CheckSum Offload實(shí)際上是將傳輸層的一部分工作交給了硬件完成,以節(jié)約系統(tǒng)的CPU資源。微軟的測(cè)試表明它可以最多節(jié)約 30%的CPU資源。IBM里AIX的文檔則指出:對(duì)于PCI接口的千兆網(wǎng)卡來(lái)說(shuō)還不如讓400Mhz以上的CPU來(lái)計(jì)算校驗(yàn)和,而PCI-X的千兆網(wǎng)卡 啟用此項(xiàng)后可以達(dá)到線路速度,從而節(jié)約CPU資源。 簡(jiǎn)單的總結(jié)下,就是WireShark抓到的數(shù)據(jù)包提示Checksum錯(cuò)誤,僅僅是因?yàn)樗孬@到的是操作系統(tǒng)胡亂填充的checksum,而千 兆網(wǎng)卡在開(kāi)啟Checksum Offload之后,會(huì)把這些計(jì)算的工作交給網(wǎng)卡去做,網(wǎng)卡最后還是會(huì)計(jì)算出正確的checksum并且發(fā)出去的。 解決方法: Windows下,如果網(wǎng)卡支持checksum offload,則可以再設(shè)備管理器->網(wǎng)絡(luò)適配器屬性->高級(jí) 里面通過(guò)設(shè)置checksum offload 為disabled即可。 Linux下,可以通過(guò)ethtool來(lái)關(guān)閉checksum offload,具體方法如下: #ethtool -K eth0 tx off rx off 修改結(jié)果: |
聯(lián)系客服