Chinaunix首页 | 论坛 | 博客
  • 博客访问: 4841939
  • 博文数量: 930
  • 博客积分: 12070
  • 博客等级: 上将
  • 技术积分: 11448
  • 用 户 组: 普通用户
  • 注册时间: 2008-08-15 16:57
文章分类

全部博文(930)

文章存档

2011年(60)

2010年(220)

2009年(371)

2008年(279)

分类: LINUX

2009-01-16 11:25:26

   这几天在分析通讯报文的过程中发现WireShark里显示本机发出去的一些数据包Bad Checksum,并提示 maybe caused by “TCP checksum offload?”

Google了一下,发现这是网卡的一项功能,可以替代系统的TCP/IP协议栈来计算TCP包的校验和。

windows系统中的Checksum Offload过程如下:

如果网卡支持,在高级选项里可以设置Checksum Offload是否对Rx或Tx有效,也可以设置为对两者都有效。

对于Tx,设置Checksum Offload有效之后,Windows的传输层将随机填充TCP校验和,因此在本机上抓取的数据包是Bad CheckSum。然后,网卡会自动计算正确的校验码然后发送,因此对方收到的仍然是正确的TCP包。

对于Rx,设置Checksum Offload有效之后,网卡在接收数据时,会填充一个NDIS_TCP_IP_CHECKSUM_PACKET_INFO 结构并设置标志位;如果由于某种原因失败,则不设置标志位,由Windows里的TCP/IP协议栈来完成数据校验。

CheckSum Offload实际上是将传输层的一部分工作交给了硬件完成,以节约系统的CPU资源。微软的测试表明它可以最多节约30%的CPU资源。则指出:对于PCI接口的千兆网卡来说还不如让400Mhz以上的CPU来计算校验和,而PCI-X的千兆网卡启用此项后可以达到线路速度,从而节约CPU资源。

原文地址 : http://blog.rogerz.cn/archives/557

阅读(2196) | 评论(0) | 转发(0) |
0

上一篇:tcphdr结构详解

下一篇:VIM设置代码折叠

给主人留下些什么吧!~~