当snoop遇上TCP CheckSum Offload

4478阅读 0评论2009-11-04 zenith518
分类:系统运维

很多时候,当你用snoop抓包存到一个文件,然后用wireshark打开它的时候,你会得到tcpbadchecksum的颜色警示。(wireshark 将相关的包标记为红色)

当你的客户深入挖掘该问题的时候,有时候,很难对这个现象进行富有逻辑性的解释。

 

在这里,根据多年的经验,我将对该问题进行深入的探讨,并说明隐藏在背后的原理。

 

1.       该现象的产生。

          首先你必须注意到,只有从本机发出的包才会被标上红色。Wireshark的解释是由Tcp Checksum Offload引起的。

          那么什么是Tcp Checksum Offload呢?

          Tcp Checksum tcp层的Checksum,确保包在传输过程中的完整性。

          最初,Tcp Checksum的计算由CPU完成。但在最新的网络接口适配器的设计实现过程中,网络适配器芯片已经具备在网络芯片硬件中进行tcp checksum的计算能力。这样可以减少主CPU的负载,从而提高网络数据的传输性能。所以,这就是tcp checksum offload功能诞生的原因。

 

2.       snoop遇到tcp checksum offload会发生什么情况?

          Snoopsolaris自带的原生网络抓包工具。

          Snoop的工作在内核和网络驱动之间。

 

          所以当数据包被内核tcp/ip 栈传递到驱动的时候,由于tcp checksum offload功能的缘故,内核tcp/ip栈并不会利用CPU来进行tcp checksum的计算。所以在这个时刻,这个tcp checksum的值是随机的脏数据。只要数据包传递到驱动后,由于网卡驱动运行在tcp checksum offload 模式,所以驱动会调用芯片的tcp checksum计算功能来完成高性能tcp checksum重新计算。并将数据包放到线路上。

snoop由于其工作的层次关系,它抓的包发生在被NIC芯片重新计算tcp checksum之前,所以这个脏数据会导致wireshark报告tcp checksum incorrect的告警。

 

3     影响和解决方法

         其实,该现象对实际应用没有任何影响。但是,有时候会对客户或工程师的产生误导。

       如果该情况,确实不排除有问题的话。

       可以在有流量镜像功能的交换机上,抓取镜像出来的流量,这样得到的包,如果没有问题的话,tcp checksum 一定是正确的。如果不正确,内核的TCP/IP栈一定会Drop这个包。对方会重发该包。

        希望本回答能对被此问题困惑的人有所启发。

Zenith

20091104

上一篇:JNLP CodeBase 本地磁盘的定位格式
下一篇:Cypress At2LP RC58 问题的解决