您的位置:首页 > 其它

第26章 Telnet和Rlogin:远程登录

2018-11-11 22:09 2663 查看

26.1 引言

远程登录(Remote Login)是Internet上最广泛的应用之一。我们可以先登录(即注册)到一台主机然后再通过网络远程登录到任何其他一台网络主机上去,而不需要为每一台主机连接一个硬件终端(当然必须有登录帐号)。

在TCP/IP网络上,有两种应用提供远程登录功能。

  1. Telnet是标准的提供远程登录功能的应用,几乎每个TCP/IP的实现都提供这个功能。它能够运行在不同操作系统的主机之间。Telnet通过客户进程和服务器进程之间的选项协商机制,从而确定通信双方可以提供的功能特性。
  2. Rlogin起源于伯克利Unix,开始它只能工作在Unix系统之间,现在已经可以在其他操作系统上运行。

在本章中,我们将介绍Telnet和Rlogin。首先介绍Rlogin,因为Rlogin比较简单。

Telnet是一种最老的Internet应用,起源于1969年的ARPANET。它的名字是“电信网络协议(telecommunication network protocol)”的缩写词。

远程登录采用客户-服务器模式。图26-1显示的是一个Telnet客户和服务器的典型连接图(对于Rlogin的客户和服务器连接图,我们可以画得更加简单)。

图26-1 客户-服务器模式的Telnet简图

在这张图中,有以下要点需要注意:

  1. Telnet客户进程同时和终端用户和TCP/IP协议模块进行交互。通常我们所键入的任何信息的传输是通过TCP连接,连接的任何返回信息都输出到终端上。
  2. Telnet服务器进程经常要和一种叫做“伪终端设备”(pseudo-terminal device)打交道,至少在Unix系统下是这样的。这就使得对于登录外壳(shell)进程来讲,它是被Te lnet服务器进程直接调用的,而且任何运行在登录外壳进程处的程序都感觉是直接和一个终端进行交互。对于像满屏编辑器这样的应用来讲,就像直接在和终端打交道一样。实际上,如何对服务器进程的登录外壳进程进行处理,使得它好像在直接和终端交互,往往是编写远程登录服务器进程程序中最困难的方面之一。
  3. 仅仅使用了一条TCP连接。由于客户进程必须多次和服务器进程进行通信(反之亦然),这就必然需要某些方法,来描绘在连接上传输的命令和用户数据。我们在后面的内容中会介绍Telnet和Rlogin是如何处理这个问题的。
  4. 注意在图26-1中,我们用虚线框把终端驱动进程和伪终端驱动进程框了起来。在TCP/IP实现中,虚线框的内容一般是操作系统内核的一部分。Telnet客户进程和服务器进程一般只是属于用户应用程序。
  5. 把服务器进程的登录外壳进程画出来的目的是为了说明:当我们想登录到系统的时候,必须要有一个帐号,Telnet和Rlogin都是如此。

294TCP/IP详解,卷1:协议

图26-2 Telnet/Rlogin/客户进程/服务器进程的源代码数量比较

现在,不断有新的Telnet选项被添加到Telnet中去,这就使得Telnet实现的源代码数量大大增加,而Rlogin依然变化不大,还是比较简单。

远程登录不是那种有大量数据报传输的应用。正如我们前面讲到的一样,客户进程和服务器进程交互的分组大多比较小。[Paxson 1993]发现客户进程发出的字节数(用户在终端上键入的信息)和服务器进程端发出的字节数的数量之比是 1:20。这是因为我们在终端上键入的一条短命令往往令服务器进程端产生很多输出。

26.2 Rlogin协议

Rlogin的第一次发布是在4.2BSD中,当时它仅能实现Unix主机之间的远程登录。这就使得Rlogin比Telnet简单。由于客户进程和服务器进程的操作系统预先都知道对方的操作系统类型,所以就不需要选项协商机制。在过去的几年中,Rlogin协议也派生出几种非Unix环境的版本。

RFC 1282 [Kantor 1991]详细说明了Rlogin协议。类似于选路信息协议(RIP)的RFC,它是Rlogin用了许多年后才发布的。[Stevens 1990]的第15章介绍了远程登录的客户进程及服务器进程端的编程,并且给出了Rlogin的客户进程及服务器进程的完整源代码。[Comer和Stevens 1993]的第25章和第26章给出了Telnet的客户进程的实现细节和源代码。

第26章 Telnet和Rlogin:远程登录295

图26-11 不同的Telnet客户进程和服务器进程之间默认的操作方式

从图中可以看出,只有当客户进程和服务器进程都是BSD/386或4.4BSD的时候才支持实行方式。当服务器进程的操作系统是这两者之一时,如果客户进程不支持实行方式,才会协商进入准行方式。从图中还可以看出,其实任何类型的客户进程和服务器进程都支持准行方式,但是一般都不把它作为默认方式,除非服务器进程指定。

306TCP/IP详解,卷1:协议

图26-12 Telnet双方选项协商的初始化过程

3)NAWS的意思是“协商窗口大小”,它在RFC 1073 [Waitzman]中有定义。如果服务器进程同意该选项(实际上不同意,见11行),客户进程就要发送终端窗口的行、列大小的子选项。而且只要窗口大小发生变化,客户进程随时都将向服务器进程发送这一子选项(这和图26-4中Rlogin的0x80命令类似)。

4)TSPEED选项允许发送方(通常是客户进程)发送它的终端速率,这在RFC 1079 [Hedrick 1988b]中有定义。如果服务器进程同意(实际上不同意,见12行),客户进程将发送其发送速率和接收速率的子选项。

5)LFLOW代表“本地流量控制”,这在RFC 1371 [Hedrick和Borman 1992]中定义。客户进程给服务器进程发送该选项,表示客户进程希望用命令方式激活或禁止流量控制。如果服务器进程同意(实际上不同意,见13行),只要Control_S和Control_Q进程需要在客户进程和服务器进程进行切换,客户进程都要向服务器进程发送子选项(这类似于图26-4中Rlogin的0x10和0x20命令)。正如在关于Rlogin的讨论中我们所提到的那样,由客户进程进行流量控制的效果比由服务器进程来完成要好。

6)LINEMODE代表在26.4中所说的实行方式。所有终端字符的处理由Telnet客户进程完成(例如回格,删除行等),然后整行发送给服务器进程。在本节后面,我们将介绍一个例子。该选项同样被服务器进程拒绝,如14行所示。

7)ENVIRON选项允许客户进程把环境变量发送给服务器进程,这在RFC 1408 [Borman 1993a]中有定义。这样就可以把客户进程的用户环境变量自动传播到服务器进程。在15行,服务器进程拒绝该选项(Unix中的环境变量通常是大写字母,紧跟一个等号,然后是一个字符串值,当然这只是一个惯例而已)。默认情况下,BSD/386 Telnet客户进程发送两个环境变量:DISPLAY和PRINTER,前提是这两个变量已经定义并且有效。Telnet用户可以定义其他一些要发送的环境变量。

308TCP/IP详解,卷1:协议

图26-13 Telnet服务器进程和客户进程选项协商初始化过程

报文段9包含客户进程发送的最后两个选项:20和22行。23行是报文段10的响应,也是服务器进程发送的最后一个选项数据。

从现在开始,双方就可以交互数据了。当然在交互数据的过程中还可以进行选项协商,我们在该例子中就不多介绍了。报文段12是服务器进程发送的提示符“login:”。报文段14是用户输入的登录用户名的第一个字符,它的回显在报文段15中。这和我们在19.2节中介绍的Rlogin交互类似:客户进程每次发送一个字符,服务器进程完成回显工作。

图26-12中的选项协商由客户进程初始化的,但是在本书中我们已经介绍了用Telnet客户进程连接某些标准服务器进程如:日间(daytime)服务器、回显(echo)服务器等情况。当然我们介绍这些的目的是为了描述TCP的各种特性。但考察这些例子中的分组交换,如图18-1,我们并没有看到客户进程发起的选项协商。为什么?这是因为在Unix系统中,除非使用标准的Telnet端口号23,否则客户进程不进行选项协商。这个特性使得Telnet客户进程可以使用标准的NVT同其他一些非Telnet服务器进程交换数据。我们已经在日间服务器、回显服务器和丢弃(discard)服务器中使用了这个特性,在后面章节介绍FTP和SMTP服务器的时候我们还将使用该特性。

310TCP/IP详解,卷1:协议

图26-14 Telnet行方式下客户进程向服务器进程发送命令的情况

把它和在Rlogin中输入同样命令(图19-2)时的情况进行一下比较。我们看到在Telnet行方式下只需要2个报文段(一个包含数据,另一个用于ACK,连同IP和TCP首部共86字节),而在Rlogin中要发送15个报文段(5个有键入的数据,5个有回显的数据,5个是ACK,共611字节)。可见节省的数据量是非常可观的。

如果在服务器端运行一个需要进入单个字符方式的应用程序(例如vi编辑器)会怎么样呢?实际上将发生如下的一些交互:

  1. 当服务器的应用程序启动了,并改变其伪终端方式时,Telnet服务器进程被通告需要进入单个字符方式。然后服务器发送WILL ECHO命令和行方式子选项,以告知客户不要再以行方式工作,转而进入单个字符方式。
  2. 客户响应以DO ECHO,并确认行方式子选项。
  3. 应用程序在服务器上运行。我们键入的每个字符将发送到服务器(当然要强制使用Nagle算法),此时服务器将处理必要的回显工作。
  4. 当应用程序终止时,就恢复其伪终端方式,并通告Telnet服务器。服务器将向客户发送WONT ECHO命令,同时发送行方式子选项,告诉客户恢复进入行方式。
  5. 客户响应DONT ECHO,确认进入行方式。

上述情况同我们键入口令之间的区别表明:回显功能和单个字符方式与一次一行方式没有依赖关系。当我们键入口令时,回显功能必须失效,但一次一行方式有效。对于一个全屏应用来讲,例如编辑器,回显必须失效而单个字符方式必须有效。

图26-15概括了Rlogin和Telnet不同方式之间的差异。

312TCP/IP详解,卷1:协议

图26-15 Rlogin和不同方式的Telnet之间的比较

26.5.3 一次一行方式(准行方式)

从图26-11可以看出,如果客户不支持行方式,那么较新的服务器支持行方式选项,它也将转入准行方式(Kludge line mode)。我们同时指出所有的客户进程和服务器进程都支持准行方式,但它不是默认方式,必须由客户进程或用户特地激活它。让我们来看看如何用Telnet选项激活准行方式。

首先介绍当客户进程不支持行方式时,BSD/386服务器进程如何协商进入该方式。

  1. 当客户进程不同意服务器进程激活行方式的请求时,服务器进程发送DO TIMING MARK选项。RFC 860 [Postel和Reynolds 1983f]定义了这个Telnet选项。它的作用是让收发双方同步,关于这个问题将在本节的后面讲到用户键入中断键时讨论。该选项只是用来判断客户进程是否支持准行方式。
  2. 客户响应WILL TIMING MARK,表明支持准行方式。
  3. 服务器发送WONT SUPPRESS GO AHEAD和WONT ECHO选项,告诉客户它希望禁止这两个选项。我们在前面已经强调:单个字符方式下是假定SUPPRESS GO AHEAD和ECHO选项同时有效的,所以禁止两个选项就进入了准行方式。
  4. 客户响应DONT SUPPRESS GO AHEAD和DONT ECHO命令。
  5. 服务器发送login:提示符,然后用户键入用户名。用户名是以整行的方式发送给服务器,回显由客户进程在本地处理。
  6. 服务器发送Password:提示符和WILL ECHO命令。这将使客户进程的回显失效,因为此时客户进程认为服务器进程将处理回显工作,所以用户键入的口令就不回显到屏幕上。客户响应DO ECHO命令。
  7. 我们键入口令。客户以整行方式发送到服务器。
  8. 服务器发送WONT ECHO命令,使得客户重新激活回显功能,客户响应DONT ECHO。从此以后的普通命令处理过程就和行方式相似了。客户进程负责所有的编辑和回显,并以整行的方式发送给服务器进程。

在图26-11中,我们已经强调:所有标注为“char”的记录都支持准行方式,只不过默认是单个字符方式罢了。如果要客户进入行方式,我们就能很容易看到选项协商的过程:

第26章 Telnet和Rlogin:远程登录313

这将使Telnet会话进入准行方式,此时SUPPRESS GO AHEAD和ECHO选项都是失效的。

如果在服务器端运行如vi编辑器这样的应用程序,同样会有行方式下遇到的问题。当要运行这样的应用程序时,服务器进程必须告诉客户进程从准行方式切换到单字符方式。当应用程序结束时,必须告诉客户进程返回到准行方式。下面是这个过程需要用到的技术要点。

  1. 当应用程序改变其伪终端方式并通知服务器进程时,服务器进程将进入单字符方式。服务器进程向客户进程发送WILL SUPPRESS GO AHEAD和WILL ECHO,这将使客户进程进入单字符方式。
  2. 客户进程回送DO SUPPRESS GO AHEAD和WILL ECHO。
  3. 应用程序开始在服务器端运行。
  4. 当应用程序结束并改变其伪终端方式时,服务器进程发送WONT SUPPRESS GO AHEAD和WONT ECHO命令,使得客户进程返回准行方式。
  5. 客户进程回送DONT SUPPRESS GO AHEAD和DONT ECHO命令,告诉服务器进程它已经回到了准行方式。

图26-16概括了单个字符方式及准行方式中不同的SUPPRESS GO AHEAD和ECHO选项设置。

图26-16 准行方式下Telnet选项的设置

26.5.4 行方式:客户中断键

看一下当用户键入中断键时Telnet将发生什么情况。假定在客户主机bsdi和服务器cangogh.cs.berkeley.edu之间建立了一个Telnet会话。图26-17显示了当用户键入中断键后的时间系列(去掉了窗口通告和服务类型)。

报文段1中显示的是中断键(通常是Control_C或DELETE)已经转换为Telnet的IP(中断进程)命令:<IAC,IP>。下面的3个字节:<IAC,DO,TM>,组成了Telnet的DO TIMING MARK选项。这个标志由客户进程发送,必须使用WILL或WONT响应。所有在响应前收到的数据都要丢弃(除非是Telnet命令)。这是服务器进程和客户机端的同步过程。报文段1没有采用TCP紧急方式。

Host Requirements RFC叙述了IP命令不能使用Te lnet的同步信号来发送。如果可以的话,那么<IAC,IP>的后面将跟随<IAC,DM>,同时紧急指针指向DM字节。大多数的Unix Telnet客户有一个选项来使用同步信号发送IP命令,但是这个选项默认是不用的(正如我们这里看到的)。

314TCP/IP详解,卷1:协议

图26-17 行方式下键入中断键后的情况

报文段2是服务器进程对DO TIMING MARK选项的响应。紧随其后的是报文段3和4中Telnet的同步信号:<IAC,DM>。报文段3中的紧急指针指向将在报文段4中发送的DM字节。

如果服务器进程到客户进程的窗口已满,那么客户进程发送了如报文段1中的IP命令后就丢弃收到的所有数据。即使服务器进程被TCP流量控制所终止而不能发送如报文段2、3和4中的数据,紧急指针仍然可以发送。这和图26-7中的Rlogin类似。

为什么同步信号要分为两个数据段发送(3和4)?原因就是我们在20.8节中详细讨论TCP紧急指针时提到的情况。有关主机需求的RFC中提到紧急指针应指向紧急数据的最后一个字节,而很多衍生于伯克利的系统中,紧急指针指向紧急数据的倒数第2个字节(回忆一下在图26-6中,紧急指针指向命令字节的前一个字节)。Telnet服务器进程故意把同步信号的第1个字节作为紧急数据,它知道紧急指针将指向下1个字节(即DM字节),而IAC字节和紧急指针必须立即发送,在下一步才发送DM字节。

最后一个报文段6发送的是数据,它是服务器进程发生的提示符。

26.6 小结

本章我们介绍了Rlogin和Telnet操作。两者都提供了从客户进程远程登录到服务器进程,是我们能够在服务器端运行程序的方法。

这两个应用是不同的。Rlogin假定连接的双方都是Unix系统,所以只提供一个选项,它是1个简单的协议。Telnet则不同,它用于在不同类型的主机之间建立连接。

为了支持这种多机环境,Telnet提供客户进程和服务器进程的选项协商机制。如果连接的双方都支持这些选项,则可以增强一些功能。对于比较简单的客户进程和服务器进程,它可以提供Telnet的基本功能,而当双方都支持某些选项时,它又可以充分利用双方的新特性。

我们介绍了Telnet的选项协商机制,也介绍了3种数据传输的方式:单字符方式、准行方式和实行方式。现在的趋势是只要有可能,就尽量工作在准行方式下。这样可以减少网络上的数据量,同时为交互用户提供更好的行编辑和回显的响应。

图26-18概括并比较了Rlogin和Telnet的不同特性。

第26章 Telnet和Rlogin:远程登录315

图26-18 Rlogin和Telnet的不同特性

Rlogin服务器和Telnet服务器通常都将设置TCP的保活选项以检测客户主机是否崩溃(如果服务器的TCP实现支持,见第23章)。这两种应用都采用了TCP紧急方式,以便即使从服务器到客户的数据传输被流量控制所终止,服务器仍然可以向客户发送命令。

习题

  1. 在图26-5中,标出所有延迟的ACK。
  2. 在图26-7中,为什么要发送报文段12?
  3. 我们说过Rlogin客户进程必须使用保留端口号(见1.9节)(通常Rlogin客户使用512~1023之间的保留端口)。这会给主机带来什么限制?有没有解决的办法?
  4. 阅读RFC 1097,它描述了Telnet的阈下报文(subliminal-message)选项。








内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: