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 环境变量
在协商时有六种情况。
发送方 | 接收方 | 说明 |
---|---|---|
WILL | DO | 发送方想激活某选项,接收方接受该选项 |
WILL | DONT | 发送方想激活某选项,接收方拒绝该选项 |
DO | WILL | 发送方希望接收方激活某选项,接受方接受该请求 |
DO | DONT | 发送方希望接收方激活某选项,接受方拒绝该请求 |
WONT | DONT | 发送方希望使某选项无效,接受方必须接受该请求 |
DONT | WONT | 发送方希望对方使某选项无效,接受方必须接受该请求 |
常用子协议
上面简单介绍了常见的开关选项,还可以通过子选项协商处理比较复杂的场景。
终端协商
在 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字符高