music,code,dialog,rest
分类: 系统运维
2009-11-04 01:29:59
很多时候,当你用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会发生什么情况?
Snoop是solaris自带的原生网络抓包工具。
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