Windows XP与Linux下的Telnet性能

1 投票
2 回答
1281 浏览
提问于 2025-04-16 04:43

我有一个基于Python的telnetlib实现的库。最近我发现,在Windows XP和Linux上的性能差别很大。

下面的脚本中,我设计了三个操作:“获取单位”、“只按回车”和“获取带选项的单位”。

“获取单位”会返回一个很长的字符串,“获取带选项的单位”返回的字符串较短,而“只按回车”返回的字符串是最短的。

我们来猜一下,哪个操作会花更多的时间,似乎应该是“获取单位”最慢,然后是“获取带选项的单位”,最后是“只按回车”。

但在Windows XP上的实际结果是:

获取单位: 3.67200016975秒
获取带选项的单位: 10.0319998264秒
只按回车: 10.0秒

在Ubuntu上进行同样的测试结果是:

获取单位: 3.91432785988秒
获取带选项的单位: 2.86995506287秒
只按回车: 2.05337381363秒

看起来Windows XP在处理大数据包时表现不错,但对于小数据包就很差。

我手动测试过,使用Windows的telnet客户端和putty,并用wireshark捕获telnet数据。发现对于小数据包,延迟很长,大约0.2秒。

我尝试过更改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

可能是因为 Nagle算法 导致发送一个小数据包的时间被延迟了。

你可以通过在XP电脑上关闭Nagle算法来测试一下这个情况(可以在网上搜索一下怎么操作)。

0

谢谢大家。我已经解决了这个问题。这里有两个算法:Nagle算法和延迟确认算法。我的问题是由“延迟确认算法”引起的。不幸的是,这个算法在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)

撰写回答