Chinaunix首页 | 论坛 | 博客
  • 博客访问: 322578
  • 博文数量: 78
  • 博客积分: 1547
  • 博客等级: 上尉
  • 技术积分: 842
  • 用 户 组: 普通用户
  • 注册时间: 2006-01-12 23:46
个人简介

music,code,dialog,rest

文章分类

全部博文(78)

文章存档

2022年(10)

2021年(6)

2020年(2)

2019年(6)

2018年(4)

2017年(5)

2016年(20)

2015年(4)

2014年(2)

2013年(1)

2012年(1)

2011年(1)

2010年(1)

2009年(2)

2007年(10)

2006年(3)

分类: 系统运维

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会发生什么情况?

          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

阅读(3518) | 评论(0) | 转发(0) |
给主人留下些什么吧!~~