Windows XP和Linux中的Telnet性能

时间:2010-09-29 02:27:48

标签: python windows linux sockets telnet

我有一个基于Python的telnetlib的图书馆。 最近,我注意到windows xp和Linux的性能是如此不同。

在脚本下方,我设计了三个操作,“获取单位”,“只需输入”,“获取带选项的单位”

“get units”有长字符串返回,“get units with options”返回更短的字符串,“只需按Enter键”将返回最短字符串。

让我们猜测,这将花费更多的时间,似乎它的顺序应该是“获取单位”,“获得带选项的单位”,然后“只需按回车”。

但是windows xp中的实际结果是:

获得单位:3.67200016975 s 获得带有期权的单位:10.0319998264 s 只需输入:10.0 s

在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

2 个答案:

答案 0 :(得分:0)

由于Nagle's algorithm,可能是因为发送短数据包而拖延。

你可以通过在XP机器上禁用Nagle算法来测试它(谷歌如何做到这一点)。

答案 1 :(得分:0)

谢谢大家。我已经解决了这个问题。有两种算法: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)