Telnet
是标准的提供远程登陆功能的应用。它能够运行在不同的操作系统的主机之间。
Telnet
通过客户进程和服务器进程之间的选项协商机制,从而确定通信双方可以提供的功能特性。
( 1 ) Telnet 客户进程同时和终端客户及 TCP/IP 协议模块进行交互。通常我们所键入的任何信息的传输是通过 TCP 连接,连接的任何返回信息都输出到终端上。
( 2 ) Telnet 服务器进程经常要和 " 伪终端设备 " 打交道。
( 3 ) 仅仅使用了一条 TCP 连接。
1 、 协议介绍:
一种通用字符终端叫网络虚拟终端 NVT ,连接的客户机和服务器,都必须把他们的物理终端和 NVT 进行相互转换。不管客户进程终端是什么类型,操作系统必须把它转换 NVT 格式,同时,不管服务器进程的终端是什么类型,操作系统必须能够将 NVT 格式转换为终端所能够接收的格式。
(1) NVT ASCII :
NVT ASCII 代表 7 位的 ASCII 字符集,网间协议族都使用 NVT ASCII , 每个 7 位的字符都以 8 位格式发送,最高位为 0 。行结束符以两个字符 CR (回车)和紧接着的 LF (换行)这样的序列表示以 /r/n 表示。单独的一个 CR 表示为 /r/0 。
( 2 ) Telnet 命令:
命令以字节 0xff 开头,后面的一个字节是命令字节。如果要发送数据 255 ,就必须连续发送两个 255 (设置选项才可以发送)。
( 1 ) Telnet 客户进程同时和终端客户及 TCP/IP 协议模块进行交互。通常我们所键入的任何信息的传输是通过 TCP 连接,连接的任何返回信息都输出到终端上。
( 2 ) Telnet 服务器进程经常要和 " 伪终端设备 " 打交道。
( 3 ) 仅仅使用了一条 TCP 连接。
1 、 协议介绍:
一种通用字符终端叫网络虚拟终端 NVT ,连接的客户机和服务器,都必须把他们的物理终端和 NVT 进行相互转换。不管客户进程终端是什么类型,操作系统必须把它转换 NVT 格式,同时,不管服务器进程的终端是什么类型,操作系统必须能够将 NVT 格式转换为终端所能够接收的格式。
(1) NVT ASCII :
NVT ASCII 代表 7 位的 ASCII 字符集,网间协议族都使用 NVT ASCII , 每个 7 位的字符都以 8 位格式发送,最高位为 0 。行结束符以两个字符 CR (回车)和紧接着的 LF (换行)这样的序列表示以 /r/n 表示。单独的一个 CR 表示为 /r/0 。
( 2 ) Telnet 命令:
命令以字节 0xff 开头,后面的一个字节是命令字节。如果要发送数据 255 ,就必须连续发送两个 255 (设置选项才可以发送)。
名称
|
代码(
10
进制)
|
描述
|
EOF
|
236
|
文件结束符
|
SUSP
|
237
|
挂起当前进程
|
ABORT
|
238
|
异常终止进程
|
EOR
|
239
|
记录结束符
|
SE
|
240
|
子选项结束
|
NOP
|
241
|
无操作
|
DM
|
242
|
数据标志
|
BRK
|
243
|
中断
|
IP
|
244
|
中断进程
|
AO
|
245
|
异常终止输出
|
AYT
|
246
|
对方是否还在运行
|
EC
|
247
|
转义字符
|
EL
|
248
|
删除行
|
GA
|
249
|
继续进行
|
SB
|
250
|
子选项开始
|
WILL
|
251
|
选项协商
|
WONT
|
252
|
选项协商
|
DO
|
253
|
选项协商
|
DONT
|
254
|
选项协商
|
IAC
|
255
|
数据字节
255
|
(
4
)
协商选项
Telnet 连接双方首先进行交互的信息是选项协商数据。选项协商是对称的,也就是说任何一方都可以主动发送选项协商请求给对方。
◆ WILL :发送方将激活 enable 选项。
◆ DO :发送方想叫接收端激活选项
◆ WONT :发送方本身想禁止选项
◆ DON''T :发送方想让接收端去禁止选项。
对于激活选项请求,有权同意或不同意。而对于使选项失效请求,必须同意。
选项协商需要 3 个字节,一个 IAC 字节 (0xff) ,接着一个字节是 WILL 、 DO 、 WONT 、 DON''T 四者之一,最后一个 ID 字节指明激活或禁止选项。
Telnet 连接双方首先进行交互的信息是选项协商数据。选项协商是对称的,也就是说任何一方都可以主动发送选项协商请求给对方。
◆ WILL :发送方将激活 enable 选项。
◆ DO :发送方想叫接收端激活选项
◆ WONT :发送方本身想禁止选项
◆ DON''T :发送方想让接收端去禁止选项。
对于激活选项请求,有权同意或不同意。而对于使选项失效请求,必须同意。
选项协商需要 3 个字节,一个 IAC 字节 (0xff) ,接着一个字节是 WILL 、 DO 、 WONT 、 DON''T 四者之一,最后一个 ID 字节指明激活或禁止选项。
选项标识(
10
进制)
|
名称
|
1
|
回显
|
3
|
抑制继续进行
|
5
|
状态
|
6
|
定时标记
|
24
|
终端类型
|
31
|
窗口大小
|
32
|
终端速率
|
33
|
远程流量控制
|
34
|
行方式
|
36
|
环境变量
|
(
5
)
子选项协商
以指定终端类型为例。首先连接的一方发送 3 个字节的字符序列来请求激活该选项: <IAC,WILL,24> ,如果收端同意,那么响应数据就是 <IAC,DO,24> ,然后服务器进程再发送如下字符串 <IAC,SB,24,1,IAC,SE> ,该字符串询问客户进程的终端类型。 SB 是子选项协商的其实命令标记, 24 表示这是终端类型选项的子选项, 1 表示发送你的终端类型,子选项协商的结束命令标记也是 IAC SE 。如果终端类型是 ibmpc ,客户的响应将是 <IAC,SB,24,0 , ''I'',''B'',''M'',''P'',''C'',IAC,SE> ,其中 0 表示我的终端类型是。
( 6 ) 半双工、一次一字符、一次一行或行方式
◆ 半双工: NVT 默认是一个半双工设备,在接收用户输入之前,它必须从服务器进程获得 GA 命令。用户的输入在本地回显,方向是从 NVT 键到 NVT 打印机,所以客户进程到服务器进程只能发送整行的数据。
◆ 一次一字符:每一个键入的字符都单独发送到服务器进程,服务器进程回显大多数的字符。
◆ 一次一行:准行方式,带远程回显的一次一个字符。
◆ 行方式:客户进程和服务器进程协商确定。
( 7 ) 同步信号
Telnet 以 Data Mark(DM) 命令作为同步信号,该同步信号是以 TCP 紧急数据形式发送的。 DM 命令是随数据流传输的同步标记,它告诉收端回到正常的处理进程上来。当一端收到随访已进入紧急方式的通知后,它将开始读数据,一边读一边丢弃数据,直到读到 Telnet 命令紧急数据的最后一个字节就是 DM 字节。
( 8 ) 客户的转义符号
Telnet 客户进程也可以使客户直接和客户进程进行交互,而不是发送到服务器进程。通常客户的转义字符是 Ctrl+] ,这使得客户显示它的提示符,通常是 telnet> 。
以指定终端类型为例。首先连接的一方发送 3 个字节的字符序列来请求激活该选项: <IAC,WILL,24> ,如果收端同意,那么响应数据就是 <IAC,DO,24> ,然后服务器进程再发送如下字符串 <IAC,SB,24,1,IAC,SE> ,该字符串询问客户进程的终端类型。 SB 是子选项协商的其实命令标记, 24 表示这是终端类型选项的子选项, 1 表示发送你的终端类型,子选项协商的结束命令标记也是 IAC SE 。如果终端类型是 ibmpc ,客户的响应将是 <IAC,SB,24,0 , ''I'',''B'',''M'',''P'',''C'',IAC,SE> ,其中 0 表示我的终端类型是。
( 6 ) 半双工、一次一字符、一次一行或行方式
◆ 半双工: NVT 默认是一个半双工设备,在接收用户输入之前,它必须从服务器进程获得 GA 命令。用户的输入在本地回显,方向是从 NVT 键到 NVT 打印机,所以客户进程到服务器进程只能发送整行的数据。
◆ 一次一字符:每一个键入的字符都单独发送到服务器进程,服务器进程回显大多数的字符。
◆ 一次一行:准行方式,带远程回显的一次一个字符。
◆ 行方式:客户进程和服务器进程协商确定。
( 7 ) 同步信号
Telnet 以 Data Mark(DM) 命令作为同步信号,该同步信号是以 TCP 紧急数据形式发送的。 DM 命令是随数据流传输的同步标记,它告诉收端回到正常的处理进程上来。当一端收到随访已进入紧急方式的通知后,它将开始读数据,一边读一边丢弃数据,直到读到 Telnet 命令紧急数据的最后一个字节就是 DM 字节。
( 8 ) 客户的转义符号
Telnet 客户进程也可以使客户直接和客户进程进行交互,而不是发送到服务器进程。通常客户的转义字符是 Ctrl+] ,这使得客户显示它的提示符,通常是 telnet> 。
示例代码如下:
BYTE
byCmd
[3];
byCmd
[0] = 255;
byCmd
[1] = 254;
byCmd
[2] = 1;
send
(
sConnect
, (
char
*)
byCmd
, 3, 0);
BYTE
byBuf
[32];
memset
((
char
*)
byBuf
, 0, 32);
recv
(
sConnect
, (
char
*)
byBuf
, 32, 0);