Extraño comportamiento del cliente telnet cuando no se especifica un puerto

En Debian Jessie, utilizando php5.6 y la versión de telnet:

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

Escribí un script php para escuchar en el puerto 23 las conexiones entrantes de tcp. Para las testings, uso telnet, sin embargo, me he dado count de que realmente hace la diferencia, ya sea que yo telnet lo haga así:

 $ telnet localhost 23 

vs así:

 $ telnet localhost 

Pero según el man telnet , no debería marcar la diferencia:

puerto Especifica un número de puerto o nombre de service para contactar. Si no se especifica, se usa el puerto telnet (23).

Si no especifico el puerto, entonces obtengo un ruido extraño en la línea. O tal vez no es ruido? Pero si especifico el puerto, entonces no consigo este ruido en la línea. El ruido es el siguiente set de caracteres 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> 

Y por si acaso esto se debe a un error en mi código del lado del server, aquí hay una versión networkingucida del script, que muestra el ruido (aunque no creo que haya ningún error en el código, solo incluyo esto porque alguien está obligado a preguntar):

 #!/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; } ?> 

Y el resultado de la secuencia de commands (de la connection como así: telnet localhost ) es:

 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 

Pero cuando se conecta como telnet localhost 23 (y emitiendo la palabra hi ) la salida es:

 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 

Entonces mi pregunta es si este es el comportamiento esperado del cliente de telnet, o si esto es ruido. Es muy consistente, siempre es la misma información, ¿podría ser algún tipo de apretón de manos?

Aquí está la cadena de "ruido" de nuevo con espacios y sin espacios, en caso de que sea más útil:

 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 

telnet no es netcat . El protocolo telnet es más que TCP sin procesar. Entre otras cosas, puede tener una cantidad de opciones , y el "ruido" que está viendo es la negociación de estas opciones entre su cliente y el server. Cuando especifica un puerto, no ve ningún ruido porque de acuerdo con el manual:

Cuando se conecta a un puerto no estándar, telnet omite cualquier inicio automático de las opciones de TELNET. Cuando el número de puerto está precedido por un signo less, se realiza la negociación de la opción inicial.

Aparentemente, su implementación de telnet desactiva la negociación de opciones cuando especifica un puerto (incluso cuando el puerto es 23) y lo vuelve a habilitar cuando el puerto está precedido por un signo less.

En una nota más general, generalmente es seguro olvidarse de telnet estos días. Use netcat en su lugar si necesita un simple cliente TCP simple (o server, para el caso).

Es muy probable que su command telnet inicie una session TELNET si no especifica ningún puerto e inicia una connection TCP sin procesar si se especificó algún puerto.

telnet fue diseñado originalmente para permitir a los usuarios distantes iniciar session en un sistema. Entonces, el protocolo (ver RFC 854 – primera versión) está diseñado de tal manera que el cliente telnet negocia diferentes cosas con el server justo después de que se haya iniciado la connection.