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\ 条目:TcpAckFrequency 值类型:REG_DWORD,数字 有效范围:0-255 默认值:2

以上是关于Windows XP 和 Linux 中的 Telnet 性能的主要内容,如果未能解决你的问题,请参考以下文章

200分!安装dos,windows xp或vista,linux三系统的方法

linux下生成图片在XP下怎么打不开?

怎么实现用linux访问windows的共享文件

虚拟机中的xp系统安装vmware tools失败

windows xp系统如何转换linux系统传过来的文本内回车换行符的问题

Linux实验操作二