Telnet 协议详解

2022-04-28 linux network

Telnet 是一个简单的远程终端协议,通过 TCP 连接登录到远端服务器,相比之前需要通过硬件终端连接服务器的方式要简单很多,但是因为没有加密容易导致信息泄漏,建议使用 SSH 而非 Telnet 协议。

协议内部使用 Network Virtual Terminal, NVT,也就是所谓的虚拟网络终端,然后两端根据各自字符集等进行转换。

简介

Telnet 的命令由三字节构成,分别为:A) IAC 固定前缀 255;B) 命令码;C) 选项码。

命令码如下。

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    发送方想让接收端去禁止选项

选项码如下。

1   回显
3   抑制继续运行
5   状态
6   定时标记
24  终端类型
31  窗口大小
32  终端速度
33  远程流量控制
34  行方式
36  环境变量

在协商时有六种情况。

发送方接收方说明
WILLDO发送方想激活某选项,接收方接受该选项
WILLDONT发送方想激活某选项,接收方拒绝该选项
DOWILL发送方希望接收方激活某选项,接受方接受该请求
DODONT发送方希望接收方激活某选项,接受方拒绝该请求
WONTDONT发送方希望使某选项无效,接受方必须接受该请求
DONTWONT发送方希望对方使某选项无效,接受方必须接受该请求

常用子协议

上面简单介绍了常见的开关选项,还可以通过子选项协商处理比较复杂的场景。

终端协商

RFC 1091 中规定了终端类型的子选项协商,其处理流程为。

----- 客户发送请求打开终端
<IAC WILL 24>
----- 正常服务器会同意该请求
<IAC DO 24>
----- 接着服务器发送请求客户给出终端类型,SB子选项开始,24终端类型,1发送你的终端类型
<IAC SB 24 1 IAC SE>
----- 其中0标识我的终端类型为
<IAC SB 24 0 'I' 'B' 'M' 'P' 'C' IAC SE>

窗口调整

由客户端将窗口大小发送给服务端,注意,该请求只作为参考,服务器可以选择接受或者拒绝该选项。

----- 可以服务器建议,然后客户端同意
<IAC DO NAWS>      --- 服务器请求
<IAC WILL NAWS>    --- 客户端同意
<IAC SB NAWS 0 50 0 18 IAC SE>  --- 客户端发送请求,窗口80字符宽,24字符高
----- 也可以是客户端建议,然后服务端同意
<IAC WILL NAWS>    --- 客户端请求
<IAC DO NAWS>      --- 服务端同意
<IAC SB NAWS 1 2C 0 18 IAC SE>  --- 客户端发送请求,窗口300字符宽,24字符高