论坛: 系统集成 标题: 探讨XP在100M网卡下拷贝文件慢的原因 复制本贴地址    
作者: guang0701 [guang0701]    论坛用户   登录
复制文件的时候,使用100M的网卡反倒慢了,换网卡就好了,初步判断不是系统的问题,经过查资料发现是某些网卡的设置问题,IEEE 802.3 规范规定,工作站必须等待 9.6 微秒(帧间间隔)后才可以在网线上传输数据。为了获取较高的数据传输率,一些适配器制造商将他们的适配器设计为较小的帧间间隔。这个较小的帧间间隔就可能导致较高的冲突率。

当两个工作站在网线上同时传输数据时,就会产生“冲突”。“早期冲突”是 512 位帧在网线上传输之前产生的任何冲突。在正常运行的 Ethernet 网络上也可能出现早期冲突。硬件没有故障,工作站也没有错误现象。

IEEE 802.3 规范规定,工作站必须等待 9.6 微秒(帧间间隔)后才可以在网线上传输数据。为了获取较高的数据传输率,一些适配器制造商将他们的适配器设计为较小的帧间间隔。这个较小的帧间间隔就可能导致较高的冲突率。

冲突的可能性也受上层协议行为的影响。TCP/IP 规范是收到两个数据帧发送一个 ACK(确认)。也就是说,当 TCP 主机收到两个数据帧后,该 TCP 主机才会向发送方发出一个 ACK。如果已经收到两个数据包的客户端尝试发出一个 ACK,但同时发送方也在尝试向客户端发送更多数据,这种情况下冲突的可能性就比较高。

分析 Windows XP 中的 Windows Explorer 文件复制
使用命令行或 Windows XP 中的 Windows Explorer 启动同一文件复制时,数据传输的模式是不一样的。此种情况下,转发程序将发出一个 60 千字节 (KB) 的“块读取”或“原始读取”。数据传输模式如下所示: 10 CLIENT SERVER  SMB C read & X, FID = 0x1004, Read 0xf000
11 SERVER CLIENT  SMB R read & X, Read 0xf000
12 SERVER CLIENT  NBT SS:Session Message Cont., 1460 Bytes
13 SERVER CLIENT  NBT SS:Session Message Cont., 1460 Bytes
14 SERVER CLIENT  NBT SS:Session Message Cont., 1460 Bytes
15 SERVER CLIENT  NBT SS:Session Message Cont., 1460 Bytes
16 CLIENT SERVER  TCP .A...., len:0, seq:404791-404791, ack
17 CLIENT SERVER  TCP .A...., len:0, seq:404791-404791, ack
18 SERVER CLIENT  NBT SS:Session Message Cont., 1460 Bytes
19 SERVER CLIENT  NBT SS:Session Message Cont., 1460 Bytes
20 SERVER CLIENT  NBT SS:Session Message Cont., 1460 Bytes
   
TCP 级: 10 CLIENT SERVER  TCP len:64, seq:404727-404790, ack:  6992081
>客户端发送 64 字节数据(SMB 命令以读取 4KB);

11 SERVER CLIENT  TCP len:1460, seq:6992081-6993540, ack:    404791
>服务器发送 Piggyback ACK,SMB 使用一些数据响应;

12 SERVER CLIENT  TCP len:1460, seq:6993541-6995000, ack:    404791
13 SERVER CLIENT  TCP len:1460, seq:6995001-6996460, ack:    404791
>服务器将其余数据发送给客户端。

>**可能在此时发生冲突,因为客户端尝试发送 ACK。

14 SERVER CLIENT  TCP len:1460, seq:6996461-6997920, ack:    404791
15 SERVER CLIENT  TCP len:1460, seq:6997921-6999380, ack:    404791
>但服务器将获得网线使用权并发送更多数据。

16 CLIENT SERVER  TCP len:0, seq:404791-404791, ack:  6996461
>客户端将获得网线使用权并针对第 12 帧和第 13 帧数据发送 ACK。

17 CLIENT SERVER  TCP len:0, seq:404791-404791, ack:  6999381
>客户端将获得网线使用权并针对第 14 帧和第 15 帧数据发送 ACK。

18 SERVER CLIENT  TCP len:1460, seq:6999381-7000840, ack:    404791
19 SERVER CLIENT  TCP len:1460, seq:7000841-7002300, ack:    404791
>服务器继续发送数据。

>**可能在此时发生冲突,因为客户端尝试发送 ACK。

20 SERVER CLIENT  TCP len:1460, seq:7002301-7003760, ack: 404791
>但服务器将获得网线使用权并发送更多数据。
   
使用 TCP/IP 协议时,TCP 确认 (ACK) 将会影响冲突。但是,此问题并不是 TCP/IP 或 Windows Explorer 可以进行 60 KB 块读取这项改进引起的。此问题也可以用 FTP 来说明。TCP/IP、转发程序和 Windows Explorer 绝对无法控制帧间间隔。帧间间隔处于物理层,它是由适配器上的芯片控制的。因此,如果您的网络冲突率太高,请联系网络适配器制造商。


解决方案

要解决此问题,请联系您的网络适配器制造商,以了解有关增加帧间间隔的信息。

方法1:

Intel EtherExpress 100B 网络适配器有一个注册表参数可以用来控制帧间间隔的长度。如果您使用 Intel EtherExpress 100B 网络适配器,要修改此参数,请执行以下步骤:
启动注册表编辑器 (Regedit.exe)。
在注册表中找到以下注册表键,其中 x 是网络适配器的编号:
HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\Services\e100bx\Parameters

单击编辑,单击添加数值,然后键入以下信息:
数值名称:Adaptive_ifs
数值类型:REG_DWORD
数据:1(启用自适应算法)

默认情况下,用于检测冲突和调整帧间间隔的自适应算法是启用的。将此数值设置为 0 可以禁用自适应算法。一个介于 2 到 200 之间的数值设置了预定义的帧间间隔。开始时,请将此值设置为 20,然后以 20 为单位逐渐递增。在此过程中,测量冲突次数同时注意性能,然后设置一个具有较小冲突率又不影响性能的最终值。


变通办法:

要解决此问题,您可以创建一个 TcpWindowSize 注册表参数,这样,发送方必须收到接收方的 ACK 才会发送更多数据。进行此更改可减少冲突发生的可能性。按照下列步骤操作:
启动注册表编辑器 (Regedit.exe)。
在注册表中找到下面的项:
HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\Services\Tcpip\Parameters

单击添加,单击数值,然后添加以下信息:
数值名称:TcpWindowSize
数值类型:REG_DWORD
数据:2920(十进制数)-- 字节数

对于 Ethernet,请将此数值设置为十进制数 2920;对于其他网络拓扑,将其设置为最大 TCP 数据大小的两倍。但是,对于其他网络可以不必修改此设置,因为基于令牌环或“光纤分布数据接口” (FDDI) 的网络的冲突率没有 Ethernet 网络那么高。

请注意,修改此参数可能会严重影响性能。一般说来,根据网络拓扑的不同,广域网 (WAN) 或常规 10 MB 网络上的发送方和接收方之间通常存在一定的滞后。因此,由于 TCP/IP 确认 (ACK) 而导致冲突的可能性是不存在的。此种情况下,调整 TcpWindowSize 只是减少吞吐量。


地主 发表时间: 04-07-11 10:50

回复: lionet67 [lionet67]   论坛用户   登录
太长了,看不完啊

B1层 发表时间: 04-07-12 08:08

论坛: 系统集成

20CN网络安全小组版权所有
Copyright © 2000-2010 20CN Security Group. All Rights Reserved.
论坛程序编写:NetDemon

粤ICP备05087286号