Windows XP 和 Linux 中的 Telnet 性能
Posted
技术标签:
【中文标题】Windows XP 和 Linux 中的 Telnet 性能【英文标题】:Telnet performance in windows xp and Linux 【发布时间】:2011-04-18 14:46:07 【问题描述】:我有一个基于 Python telnetlib 的库。 最近,我注意到 windows xp 和 Linux 的性能差异很大。
在脚本下面,我设计了三个操作,“get units”、“just press enter”、“get units with options”
“get units”返回长字符串,“get units with options”返回较短字符串,“just press enter”返回最短字符串。
让我们猜一下,这将花费更多时间,似乎它的顺序应该是“获取单位”,“获取带有选项的单位”,然后“只需按 Enter”。
但在 windows xp 中的实际结果是:
获取单位:3.67200016975 s 获取带有选项的单位:10.0319998264 s 只需按 Enter:10.0 秒
在 Ubuntu 中进行相同的测试: 获取单位:3.91432785988 获取带有选项的单位:2.86995506287 只需按回车键:2.05337381363
windows xp在大IP包上似乎表现不错,但对于小包,就太差了。
我已经使用 Windows 的 telnet 客户端 putty 手动对其进行了测试。使用wireshark 捕获telnet 数据。并且发现对于小包,包延迟这么长,大概0.2s
我曾尝试更改 tcp 窗口,但没有帮助。
谁能给点建议?
try:
begin_g = time.time()
for i in range(50):
connection.write('ZUSI:OMU;')
ret = connection.read_until('<')
ret = connection.read_until('<')
end_g = time.time()
elapse_g = end_g-begin_g
clean_begin_t = time.time()
for i in range(50):
ret = ipa.get_units()
clean_end_t = time.time()
elapse_c = clean_end_t-clean_begin_t
begin_wu = time.time()
for i in range(50):
connection.write('')
ret = connection.read_until_prompt()
end_wu = time.time()
elapse_wu = end_wu-begin_wu
【问题讨论】:
【参考方案1】:可能因为Nagle's algorithm而延迟发送短数据包。
您可以通过在 XP 机器上禁用 Nagle 算法来测试它(谷歌如何做到这一点)。
【讨论】:
谢谢。我得到了它:)。 0.2s延迟是windows的“延迟ACK算法”造成的,默认0.2s【参考方案2】:谢谢大家。我已经解决了这个问题。有两种算法:Nagle算法,延迟ACK算法。我的问题是由“延迟的 ACK 算法”引起的。不幸的是,它不能在 Python 中设置。我必须修改寄存器,将值设置为 1,它完全可以工作。但我认为这还不够好。 Linux 支持 TCP_QUICKACK。但 Windows 没有。
[HKEY_LOCAL_MACHINE \SYSTEM \CurrentControlSet \Services \Tcpip \Parameters \Interfaces \Adapter-id]
TcpAckFrequency = 2 (Default=2, 1=Disables delayed ACK, 2-n = If n outstanding ACKs before timed interval, sent ACK)
More Info MS KB Q328890
More Info MS KB 815230 (XP/2003 needs hotfix or SP2 for it to work)
More Info MS KB 935458 (Vista needs hotfix or SP1 for it to work)
【讨论】:
你在远程登录什么?理想情况下,您的 Telnet 服务器将使用延迟 ACK。 我在 MS 的网站上搜索过。并且延迟的 ACK 在 RFC 中定义。但是Linux似乎有更好的性能。通过修改寄存器,windows可以禁用该功能。我认为对于 TCP_NODELAY,如果服务器和客户端都不能设置它,它将对我的情况有所帮助。 [HKEY_LOCAL_MACHINE \SYSTEM \CurrentControlSet \Services \Tcpip \Parameters \Interfaces \Adapter-id] TcpAckFrequency = 2(默认值=2,1=禁用延迟 ACK,2-n = 如果 n 未完成定时间隔前的 ACK,发送 ACK)子项:HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\Services\Tcpip\Parameters\Interfaces\以上是关于Windows XP 和 Linux 中的 Telnet 性能的主要内容,如果未能解决你的问题,请参考以下文章
200分!安装dos,windows xp或vista,linux三系统的方法