ポートが指定されていない場合、Telnet クライアントは奇妙に動作します。

ポートが指定されていない場合、Telnet クライアントは奇妙に動作します。

Debian Jessieでphp5.6とtelnetのバージョンを使用している場合:

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

着信TCP接続をポート23でリッスンするPHPスクリプトを作成しました。私はテストするために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クライアントで予想される動作ですか、それともノイズですか?とても一貫しています。いつも同じデータなので、一種の握手かもしれません。

より便利な場合に備えて、空白がある場合とない「noise」文字列は次のとおりです。

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オプションは無視されます。ポート番号の前にマイナス記号がある場合、初期オプションのネゴシエーションは完了です。

したがって、実装はtelnetポートを指定するとき(ポートが23の場合でも)オプションネゴシエーションを無効にし、ポートの前にマイナス記号がある場合はそれを再び有効にします。

より一般的に、telnet最近では忘れてしまうのが一般的です。netcat単純な一般的なTCPクライアント(またはサーバー)が必要な場合はそれを使用してください。

答え2

telnetポートを指定しないと、コマンドが TELNET セッションを開始する可能性が高くなります。ポートを指定すると、コマンドがネイティブTCP接続を開始する可能性が高くなります。

telnetもともとは、リモートユーザーがシステムにログインできるように設計されていました。したがって、プロトコル(RFC 854 - 最初のバージョンを参照)は、telnet接続が開始された直後にクライアントがサーバーと他のものを交渉するように設計されています。

関連情報