October 17,2007
Wireshark(Ethereal) 看到 TCP CHECKSUM INCORRECT 不一定有問題唷
前幾天提到 Wireshark 的文章,Jerry問到為什麼我抓到的一堆封包都顯示 "TCP CHECKSUM INCORRECT" (點這裡看圖, 1280 x 800)
其實之前我也懷疑過這個問題,不過後來確定應該是我的機器有 TCP checksum offload 這個功能,底下且聽我道來:
其實之前我也懷疑過這個問題,不過後來確定應該是我的機器有 TCP checksum offload 這個功能,底下且聽我道來:
要先強調,我的 packet sniffer 不是從網路線上抓的,我是在 source ip machine 上面抓的,也就是從 OS 的 TCP/IP stack 抓。
簡單的說,如果網卡支援的話,有的機器可以設定成,CPU本身不算 network packet checksum,封包要送出去的時候,讓網路卡晶片來算,也就是 Checksum offload ,讓 CPU 可以去做別的事。
我的環境是SUN的機器(型號懶得查:p),跑Solaris 8或9。以我的例子來說,我在 solaris 機器上面開 snoop ,抓到的封包是 CPU 準備好,要讓網卡丟出去的;因為我這台 solaris 有開啟 checksum offload 的功能,所以這個封包要到 網卡 那邊才會加上 checksum 。把packet 想成包裹的話,packet進到網路線的時候,才由網路卡加上 checksum 。
這些網路封包,你可以在 source ip machine 上面抓(好比我在SUN上面跑 snoop),也可以插一個 hub , sniff "over the wire"等到封包丟上網路再抓,或者到 destination ip machine 上面抓。後兩者就不會有這個錯誤訊息。
在我的例子裡面,對方機器收到的就沒有 checksum error ,可知我的網卡有正確加上 checksum 。當然,也不能排除 checksum 真的出狀況,所以要不就 sniff over the wire 要不就從對方機器 double check 要不就檢查自己機器/OS相關設定。
但是,像我這樣在這台封包來源機器上面跑 snoop /wireshark/tcpdump這類程式,只能抓到 CPU 處理好,送給網卡的封包,因此會產生這種 TCP CHECKSUM INCORRECT 的「嫌疑犯」 :p
參考資料:
Why am I seeing lots of packets with incorrect TCP checksums? Wireshark 官網的解說,另外還教大家怎麼樣設定 Wireshark 去忽略這種 TCP CHECKSUM INCORRECT 的訊息。
[Ethereal-users] Re: Does hardware checksum offload always cause incorrect checksums? 有位 ronnie sahlberg 覺得 TCP checksum offloading 其實減輕不了 CPU 多大的負擔
TCP 總和檢查卸載 這個 IBM AIX 的文件也有提到讓 CPU 來處理,負擔不見得重
TCP Offload Engine (TOE)說明為什麼 Linux Kernel 一直拒絕加進此功能。
Windows Network Task Offload 在 MS Windows 裡面如何設定,還有一篇簡體中文的 Tcp Checksum Offload by 人非章鱼
Kernel - checksum offloading 提到,SUN的機器有一些網卡不支援 TCP checksum offload:
有一些網卡有支援,而且這個功能預設值是啟用的:
Checksum offload 是 SUN Distinguished Engineer Sunay Tripathi 提到 Solaris 10 在硬體 checksum offload 方面的進步。
Hardware Checksumming Design
Hardware Checksumming Implementation
這兩篇是另一位 SUN 工程師 Priyanka寫的(題外話,從名字看來應該是印度裔的女性,還提到她是在家工作的 remote engineer)
SunSolve Patch Access 這邊可以撈 SUN 的 patch
有幾篇文章有提到如何關掉SUN的checksum offload ,基本上就是在 /etc/system 這個檔案裡面加上 set ip:dohwcksum = 0
Installation instructions for Solaris dom0/domU
[networking-discuss] IPFilter - do I still need to set ip:dohwcksum=0 ?
I'm using a Sun system with an eri or bge interface, and after setting up NAT, ICMP passes through fine, but TCP doesn't. Why?
How to replace Sun's Solaris 10 version of pfil/ipfilter, for Releases U3 and earlier, with Darren Reed's public-domain release
簡單的說,如果網卡支援的話,有的機器可以設定成,CPU本身不算 network packet checksum,封包要送出去的時候,讓網路卡晶片來算,也就是 Checksum offload ,讓 CPU 可以去做別的事。
我的環境是SUN的機器(型號懶得查:p),跑Solaris 8或9。以我的例子來說,我在 solaris 機器上面開 snoop ,抓到的封包是 CPU 準備好,要讓網卡丟出去的;因為我這台 solaris 有開啟 checksum offload 的功能,所以這個封包要到 網卡 那邊才會加上 checksum 。把packet 想成包裹的話,packet進到網路線的時候,才由網路卡加上 checksum 。
這些網路封包,你可以在 source ip machine 上面抓(好比我在SUN上面跑 snoop),也可以插一個 hub , sniff "over the wire"等到封包丟上網路再抓,或者到 destination ip machine 上面抓。後兩者就不會有這個錯誤訊息。
在我的例子裡面,對方機器收到的就沒有 checksum error ,可知我的網卡有正確加上 checksum 。當然,也不能排除 checksum 真的出狀況,所以要不就 sniff over the wire 要不就從對方機器 double check 要不就檢查自己機器/OS相關設定。
但是,像我這樣在這台封包來源機器上面跑 snoop /wireshark/tcpdump這類程式,只能抓到 CPU 處理好,送給網卡的封包,因此會產生這種 TCP CHECKSUM INCORRECT 的「嫌疑犯」 :p
參考資料:
Why am I seeing lots of packets with incorrect TCP checksums? Wireshark 官網的解說,另外還教大家怎麼樣設定 Wireshark 去忽略這種 TCP CHECKSUM INCORRECT 的訊息。
[Ethereal-users] Re: Does hardware checksum offload always cause incorrect checksums? 有位 ronnie sahlberg 覺得 TCP checksum offloading 其實減輕不了 CPU 多大的負擔
TCP 總和檢查卸載 這個 IBM AIX 的文件也有提到讓 CPU 來處理,負擔不見得重
TCP Offload Engine (TOE)說明為什麼 Linux Kernel 一直拒絕加進此功能。
Windows Network Task Offload 在 MS Windows 裡面如何設定,還有一篇簡體中文的 Tcp Checksum Offload by 人非章鱼
Kernel - checksum offloading 提到,SUN的機器有一些網卡不支援 TCP checksum offload:
The later drivers and nics have the tcp checksum feature
hme. le, be, qfe do Not.
有一些網卡有支援,而且這個功能預設值是啟用的:
The following ethernet devices i'm aware of that have this capability are enabled by default.
eri , ge , ce
Checksum offload 是 SUN Distinguished Engineer Sunay Tripathi 提到 Solaris 10 在硬體 checksum offload 方面的進步。
Hardware Checksumming Design
Hardware Checksumming Implementation
這兩篇是另一位 SUN 工程師 Priyanka寫的(題外話,從名字看來應該是印度裔的女性,還提到她是在家工作的 remote engineer)
SunSolve Patch Access 這邊可以撈 SUN 的 patch
有幾篇文章有提到如何關掉SUN的checksum offload ,基本上就是在 /etc/system 這個檔案裡面加上 set ip:dohwcksum = 0
Installation instructions for Solaris dom0/domU
[networking-discuss] IPFilter - do I still need to set ip:dohwcksum=0 ?
I'm using a Sun system with an eri or bge interface, and after setting up NAT, ICMP passes through fine, but TCP doesn't. Why?
How to replace Sun's Solaris 10 version of pfil/ipfilter, for Releases U3 and earlier, with Darren Reed's public-domain release
引用URL
http://cgi.blog.roodo.com/trackback/4317933