포트가 지정되지 않으면 Telnet 클라이언트가 이상하게 동작합니다.

포트가 지정되지 않으면 Telnet 클라이언트가 이상하게 동작합니다.

Debian Jessie에서 php5.6 및 telnet 버전을 사용하는 경우:

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

들어오는 TCP 연결을 포트 23에서 수신 대기하는 PHP 스크립트를 작성했습니다. 테스트하기 위해 텔넷으로 연결했지만 다음과 같이 텔넷으로 연결하면 실제로 차이가 있다는 것을 알았습니다.

$ 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

그래서 내 질문은이는 텔넷 클라이언트에서 예상되는 동작입니까, 아니면 소음입니까? 매우 일관적입니다. 항상 동일한 데이터이므로 일종의 악수일 수도 있습니다.

더 유용한 경우를 대비해 공백이 있거나 없는 "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연결이 시작된 직후 클라이언트가 서버와 다른 사항을 협상하도록 설계되었습니다.

관련 정보