Chinaunix首页 | 论坛 | 博客
  • 博客访问: 2100966
  • 博文数量: 454
  • 博客积分: 10921
  • 博客等级: 上将
  • 技术积分: 5396
  • 用 户 组: 普通用户
  • 注册时间: 2006-06-15 15:20
个人简介

伪IT男

文章分类

全部博文(454)

文章存档

2016年(2)

2013年(6)

2012年(17)

2011年(29)

2010年(24)

2009年(54)

2008年(53)

2007年(202)

2006年(67)

分类: 网络与安全

2012-11-06 23:19:24

TCP本身属面向链接的通讯协议。通讯双方的每一个收发动作,需要以通讯链路正常为前提。因此TCP协议内部提供了默认的ACK验证机制。

假定A、B之间存在一条TCP通讯链路,某一时刻A第一次向B发送数据,而之后B未主动向A发送数据,则约200ms之后,B会自动向A回发一个长度为1的ACK确认包——这是由TCP内部默认机制决定的,而A在未收到ACK确认包之前,不允许第二次向B发送数据,因此B第二次收到数据时,会莫名其妙的产生一个约200ms的延时——这个延时不是别的,正是ACK确认包默认的发送时延。

当我们测试自行研发的服务端通讯框架时,一旦其发生广播,则此时处于接收方的客户端很有可能会因为通讯双方的收发不均而引发上述现象——这并非是由于你的服务端通讯框架性能不达标,而是由于TCP的内部机制导致的。

那么,我们应该如何避免这种情况呢?这里介绍一种最简单也最容易实现的方法——修改注册表,提高客户端ACK包默认的发送频率,也就是缩短ACK包的发送时延:

首先,点击你电脑屏幕左下角的“开始”菜单,打开“运行”,键入“regedit”打开你的注册表;
选择HKEY_LOCAL_MACHINE 项目开始一层层的往下点,一直到
HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\Services\Tcpip\Parameters\Interfaces\
这里是关于你网卡的数据,有很多项,且它们都有类似于{B796DCA-FFE8-4002-A28F-4D2B57AE8383}这样的名字,但是正确的那个会在右边窗口显示包括你的IP地址和你的服务器IP地址等等网络设定)。 你找到DhcpIPAddress项符合你的本机IP地址的那个,那么它就是你连接因特网的那个网卡的设定项,我们的任务目标就是改动它来提高客户端ACK包的发送频率。

其次,右键点击窗口右边的空白处,“新建”-“DWORD值”;
给它改名成“TcpAckFrequency”,然后右键点击它 ,选择"修改”,然后再那个"数值数据"的空白处填"1"(不用管是16进制,还是10进制)

最后,关闭注册表,重启电脑,修改完成。

注意:XP客户端可以通过上述操作直接达到目的,Win2003Server则需要事先安装一个补丁文件,这个文件可以到本人的资源页下载,记0分。另外,通过代理上网的客户端这种方式无效。

弊端:客户端无关痛痒,但却无形中加大了服务端的负担。

推荐:可以用这种方式大幅改善玩网游时的卡机现象。

有关TcpAckFrequency的补充说明:

TcpAckFrequency 值这个值确定了windows用TCP/IP 发送应答消息的频率,也就是决定了在发送“命令正确应答”之前将等候几个数据包;
默认值为 2,这时TCP/IP 将在接收到 2 个分段后发送应答,或是在接收了 1 个分段但在 200 毫秒内没有接收到其他分段的情况下发送应答
如果值为 3,则 TCP/IP 将在接收到 3 个分段后发送应答,或是在接收了 1 个或 2 个分段但在 200 毫秒内没有接收到其他分段的情况下发送应答,以此类推。
如果需要通过消除 TCP/IP 应答延迟来缩短响应时间,则将该值设为 1。在这种情况下,Windows将每收到一个TCP数据包就回送一个“命令正确应答”。

该值的有效范围是 0 到 255,其中 0 表示使用缺省值(2)。

 

 

采用Delayed ACK机制后,通常是服务端发送2个数据包后,客户端再进行确认,这样将极大的减少不必要的ACK数据包,同时也能提高访问速度,减少带宽浪费。
修改方法:
在注册表中添加键值进行修改;
HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\Services\Tcpip\Parameters\Interfaces\Adapter GUID
值名称:TcpDelAckTicks(不同的操作系统该值的名称不尽相同)
数据类型:REG_DWORD
值数据:将该值设置为 0 到 6 之间的值
默认情况下,延迟 ACK 计时器值为 200 毫秒。如果将 TcpDelAckTicks 值设置为 0,则禁用延迟确认。

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