在 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
答案2
telnet
如果您未指定任何端口,您的命令很可能会启动 TELNET 会话;如果指定了任何端口,则您的命令很可能会启动原始 TCP 连接。
telnet
最初设计的目的是让远程用户登录系统。因此,协议(参见 RFC 854 - 第一个版本)的设计使得telnet
客户端在连接启动后立即与服务器协商不同的事情。