tcp/ip学习笔记--第26章 telnet and Rlogin:Remote Login

来源:互联网 发布:c语言ide 编辑:程序博客网 时间:2024/06/01 23:46

简介

远程登陆是internet上最广泛应用的程序。当你登陆上一台主机后(现在,通常主机和终端设备合为一起,比如现在流行的笔记本,台式机),可以通过这台主机远程登陆到任意一台你有权限登陆的机器,而不需要为每台主机配置一个终端。

远程登陆是一种客户端-服务器的模式,其典型的组成部分如图所示:


最重要的部分就是Telnet Server需要在远程机器上完成伪终端驱动注册,也就是说让远程机器认为Telnet Server程序是一个终端,从而就像终端一样与远程机器交互。


rlogin协议相对比较简单,起初只用于在UNIX系统之间通信。而Telnet工作于不同的操作系统之间,所以比rlogin要复杂许多。


Rlogin Protocol

启动过程如下:

客户端和服务端先建立TCP连接,然后开始如下过程:

1.客户端向服务端发送4个字符串

(a)一个值为0的字节,也就是二进制全为0,不是字符0.

(b)客户机登陆用户的用户名,以0结束。

(c)远程主机上要登陆的用户名,以0结束

(d)用户的终端类型,加斜杆,加终端速率,以0结束。

2.服务端回复一个值为0的字节。

3.服务器进程可以选择是否要求用户输入口令。用户输入的口令会以明文形式传送回服务端(早期版本,现在已经使用了加密模型),这个步骤的数据交互没有什么特别的协议,而被当作是普通的数据进行传输。

4.服务端一般会询问客户端的窗口大小(这个窗口大小就是程序界面的大小,而非前面的章节经常使用的缓冲区剩余空间大小)


一般来说,终端用户的输入会全部从客户端传送到服务端进行处理。服务端的输出会全部传送到客户端并在终端显示。

但是,还是需要一些特殊的命令。


特殊命令工作的场景

回到图26-1,一般来说,我们在终端输入的命令都被当做普通的数据,沿着终端->RloginClient->tcp管道->RloginServer->伪终端驱动->shell  的道路,最终传送给shell进行执行。

但是,有些场景,我们希望我们的命令能够被RloginClient和RloginServer所理解,并执行相应的动作,而不是进行简单的无脑转发。下面将介绍这些场景:

flow control

当某个程序正在产生大量输出到终端上时,这个时候你按下ctrl+s键,希望程序能够暂停输出。这个命令将被传送到rloginServer并暂停显示数据,如图所示:


在ctrl+s命令上传送的这个过程中,RloginServer还是会源源不断的产生数据,这将在屏幕上产生大量输出。这显然不是我们想要的结果,所以客户端需要理解ctrl+s这个命令,暂停向终端的输出,然后向RloginServer发起通知。


client interrupt

当我们想停止远程主机某个我们正在运行的程序时,比如说按下ctrl+c。客户端除了要将这个命令传送给服务端以外,还需要及时停止向终端输出。(至于这个命令被传送到server后进行的具体动作不太了解。)。这个场景跟flow control场景非常相似


window size change

当终端程序界面大小发生变化时,要能够主动通知服务端。


具体的命令

服务端到客户端的命令:


客户端到服务端只有一个窗口大小的命令:

以连续两个字节的0XFF+两个连续的字符s作为标志,然后跟4个16bit的整数,分别表示行数,列数,X方向的像素数,Y方向的像素数。

服务端向客户端发送命令采用的是紧急指针的模式,客户端只有在收到紧急指针后才需要查看对应的字节获取命令,这种方式称之为带外信令。

而客户端向服务端传送的命令并没有使用紧急指针的模式,服务端需要对每个字节进行检查,来发现连续的0xFF。因为一般来说,服务端到客户端的数据量与客户端到服务端的数据量相比为20:1,这样设计是有道理的。

值得一提的是,通过两个连续的0xFF作为命令的标记是有缺陷的,如果用户数据也包含连续的0XFF,就会被误当成命令。但是发生这种情况的可能性非常之小,因为用户输入的命令不太可能产生0XFF,注意,0xFF是二进制的255,而非字符FF。我自己想到一种可以避免这种bug的办法:每个数据前面加两个字节,第一个字节表示数据或者命令,第二个字节表示长度。


Telnet Protocol

感觉这部分有很多都没有看懂.....

与rlogin的设计目标不同,telnet被设计成可以在任意两个主机之间工作。为了达到这个目的,抽象出了NVT(network virtual terminal)的概念。NVT是带有键盘和打印机的字符设备。用户击键产生的数据被发送到服务器进程,服务器进程回送的响应则输出到打印机上。

telnet commands

telnet通信的两个方向都采用带内信令方式 。字节0xFF被称作IAC(interpret as command),紧跟的一个字节表示命令。用两个连续的0xFF来表示数据字节255。


option negotiation

为了满足能够在任意两台主机之间工作的要求,一个必不可少的功能就是选项协商,从而知道对方是否支持某些功能。

有4个协商动作的命令:

1)WILL:发送方自己想激活的选项。接收方可以同意这个请求,也可以拒绝这个请求。
2)DO:发送方想叫接收方激活的选项。接收方可以同意这个请求,也可以拒绝这个请求。
3)WONT:发送方本身想禁止选项。接收方必须同意。
4)DONT:发送方想让接收端去禁止选项。接收端必须同意。

所以总共有6种组合。


选项协商需要3个字节,表示命令的IAC字节,表示协商操作动作的字节(WILL WONT DO DONT),协商的选项。

而且有的选项紧紧用激活或者不激活不足以表达全部信息,就还需要要继续协商子选项。


半双工,一次一个字符,一次一行,或行方式

1.半双工

首先需要理解一下单工,半双工,全双工的概念。不懂的请戳这里:单工,半双工,全双工

也就是说,在以往那个古老的年代,telnet client 与telnet server采用的是半双工的通信方式。只有在telnet server向telnet client发送GO AHEAD命令之后,telnet client才会开始接收接收用户的输入,并将用户的输入传送到telnet server。(我猜测肯定还有停止输入的命令,这个时候用户将不能输入。直到等待到GO AHEAD命令才能继续输入,但是没看到虽书中有相关介绍)。虽然这是默认的模式,但是这个模式已经很少在使用。

2.一次一个字符

用户输入的每个字符都被传送到服务器端,大部分会回发到客户端进行显示。这样做的缺点很明显,就是在网络情况不好的时候,会引起显著的延迟。

进入此模式的方法:服务器端激活SUPPRESS GO AHEAD选项和ECHO选项。服务器端和客户端都可以发起激活这两个选项的协商。

3.一次一行

没太看懂一次一行与下面的行模式有什么区别。

进入此模式的方法:SUPPRESS GO AHEAD选项和ECHO选项任意一个选项未被激活。

4.行模式


同步信号

TCP紧急模式的最后一个字节就是DM(data mark)命令,表示回归普通处理模式。不明白为什么有紧急指针指示位置又还需要用这个DM命令。


客户端的转义符

输入ctrl+]进入与client交谈的模式,一般来说输入这个命令之后,会出现提示符“telnet> ”,最常用的命令就是help命令。



阅读全文
0 0
原创粉丝点击