未指定端口时 telnet 客户端行为奇怪

未指定端口时 telnet 客户端行为奇怪

在 Debian Jessie 上,使用 php5.6 和 telnet 版本:

$ dpkg -l | grep telnet
ii  telnet                         0.17-36                      amd64        The telnet client

我编写了一个 php 脚本来侦听端口 23 上的传入 tcp 连接。为了测试,我通过 telnet 进入它,但是我注意到,如果我像这样 telnet 进入它,它实际上会产生不同:

$ telnet localhost 23

与这样的:

$ telnet localhost

但根据man telnet,它应该没有什么区别:

港口 指定要联系的端口号或服务名称。如果未指定,则使用 telnet 端口 (23)。

如果我不指定端口,那么我会在线路上收到一些奇怪的噪音。或者也许它不是噪音?但如果我确实指定了端口,那么我就不会在线路上收到此噪音。噪声是以下一组 ASCII 字符:

<FF><FD><03><FF><FB><18><FF><FB><1F><FF><FB><20><FF><FB><21><FF><FB><22><FF><FB><27><FF><FD><05>

以防万一这是由于我的服务器端代码中的错误造成的,这里是脚本的简化版本,它确实表现出了噪音(尽管我不认为代码中存在任何错误,我只是包括这是因为肯定有人会问):

#!/usr/bin/php
<?php

set_time_limit(0); // infinite execution time for this script
define("LISTEN_ADDRESS", "127.0.0.1");

$sock = socket_create(AF_INET, SOCK_STREAM, SOL_TCP);
socket_set_option($sock, SOL_SOCKET, SO_RCVTIMEO, array('sec' => 30, 'usec' => 0)); // timeout after 30 sec
socket_bind($sock, LISTEN_ADDRESS, 23); // port = 23
socket_listen($sock);
echo "waiting for a client to connect...\n";

// accept incoming requests and handle them as child processes
// block for 30 seconds or until there is a connection.
$client = socket_accept($sock); //get the handle to this client
echo "got a connection. client handle is $client\n";

$raw_data = socket_read($client, 1024);
$human_readable_data = human_str($raw_data);
echo "raw data: [$raw_data], human readable data: [$human_readable_data]\n";

echo "closing the connection\n";
socket_close($client);
socket_close($sock);

function human_str($str)
{
    $strlen = strlen($str);
    $new_str = ""; // init
    for($i = 0; $i < $strlen; $i++)
    {
        $new_str .= sprintf("<%02X>", ord($str[$i]));
    }
    return $new_str;
}

?>

脚本的输出(像这样连接:)telnet localhost是:

waiting for a client to connect...
got a connection. client handle is Resource id #5
raw data: [�������� ��!��"��'��], human readable data: [<FF><FD><03><FF><FB><18><FF><FB><1F><FF><FB><20><FF><FB><21><FF><FB><22><FF><FB><27><FF><FD><05>]
closing the connection

但是当连接像telnet localhost 23(并发出这个词你好)输出是:

waiting for a client to connect...
got a connection. client handle is Resource id #5
raw data: [hi
], human readable data: [<68><69><0D><0A>]
closing the connection

所以我的问题是这是否是 telnet 客户端的预期行为,或者这是否是噪音?它非常一致——它总是相同的数据——所以它可能是某种握手?

这是带有空格和不带空格的“噪音”字符串,以防它更有用:

FFFD03FFFB18FFFB1FFFFB20FFFB21FFFB22FFFB27FFFD05
FF FD 03 FF FB 18 FF FB 1F FF FB 20 FF FB 21 FF FB 22 FF FB 27 FF FD 05

答案1

telnet不是netcat。这telnet协议不仅仅是原始 TCP。除其他外,它可以有许多选项,您看到的“噪音”是您的客户端和服务器之间这些选项的协商。当您指定端口时,您不会看到任何噪音,因为根据手册:

连接到非标准端口时,telnet忽略任何自动启动 TELNET 选项。当端口号前面带有减号时,初始选项协商完成。

因此,显然,当您指定端口(即使端口为 23)时,您的实现telnet会禁用选项协商,并在端口前面带有减号时重新启用它。

更一般地说,忘记telnet这些日子通常是安全的。netcat如果您需要一个简单的普通 TCP 客户端(或服务器,就此而言),请使用它。

答案2

telnet如果您未指定任何端口,您的命令很可能会启动 TELNET 会话;如果指定了任何端口,则您的命令很可能会启动原始 TCP 连接。

telnet最初设计的目的是让远程用户登录系统。因此,协议(参见 RFC 854 - 第一个版本)的设计使得telnet客户端在连接启动后立即与服务器协商不同的事情。

相关内容