在TCP/IP网络上,有两种应用提供远程登录功能。
远程登录采用客户-服务器模式。下图显示的是一个Telnet客户和服务器的典型连接图。
图中有以下要点需要注意:
下面的表格概括并比较了Rlogin和Telnet的不同特性。
FTP是用于文件传输的Internet标准。我们必须分清文件传送(file transfer)和文件存取(file access)之间的区别,前者是FTP提供的,后者是如NFS(Sun的网络文件系统)等应用系统提供的。由FTP提供的文件传送是将一个完整的文件从一个系统复制到另一个系统中。使用FTP需要有登录服务器的注册帐号,或者通过允许匿名FTP的服务器来使用。
与Telnet类似,FTP最早的设计是用于两台不同的主机,这两个主机可能运行在不同的操作系统下、使用不同的文件结构、并可能使用不同字符集。但不同的是,Telnet获得异构性是强制两端都采用同一个标准:使用7比特ASCII码的NVT。而FTP是采用另一种方法来处理不同系统间的差异。FTP支持有限数量的文件类型(ASCII,二进制,等等)和文件结构(面向字节流或记录)。
FTP采用两个TCP连接来传输一个文件。
下图描述了客户与服务器以及它们之间的连接情况。
从图中可以看出,交互式用户通常不处理在控制连接中转换的命令和应答。这些细节均由两个协议解释器来完成。正是这两个协议解释器根据需要激活文件传送功能。
FTP使用NVT ASCII码做跨越控制连接的所有远程登录命令和应答。数据传输的默认方式通常也是NVT ASCII码。较新的Unix客户进程会自动发送命令来查看服务器是否是8 bit字节的Unix主机,并且如果是,那么就使用二进制方式来传输所有文件,那将带来更高的效率。
下图显示了一个用TCP/IP交换电子邮件的示意图。
用户与用户代理(user agent)打交道,可能会有多个用户代理可供选择。常用的Unix上的用户代理包括MH,Berkeley Mail, Elm和Mush。用TCP进行的邮件交换是由报文传送代理(Message Transfer Agent, MTA)完成的。用户通常不和MTA打交道,由系统管理员负责设置本地的MTA。通常,用户可以选择它们自己的用户代理。
本章研究在两个MTA之间如何用TCP交换邮件。我们不考虑用户代理的运行或实现。RFC 821 [Postel 1982] 规范了SMTP协议,指定了在一个简单TCP连接上,两个MTA如何进行通信。
两个MTA之间用NVT ASCII进行通信。客户向服务器发出命令,服务器用数字应答码和可选的人可读字符串进行响应。客户只能向服务器发送很少的命令:不到12个(相比较而言, FTP超过40个)。
SMTP命令
最小SMTP实现支持8种命令。
还有附加和可选命令。
信封、首部和正文
电子邮件由三部分组成:
MAIL From: <[email protected]>
RCPT To: <[email protected]>
用户接收正文的部分,加上一些首部字段,并把结果传到MTA。MTA加上一些首部字段,加上信封,并把结果发送到另一个MTA。
中继代理
在28.2.1节的例子中,本地MTA的信息输出的第1行是:“Connecting to mailhost via ether”(即通过以太网连接到邮件主机)。这是因为作者的系统已被配置成把所有非本地的向外的邮件发送到一台中继机上进行转发。
这样做的原因有两个。首先,简化了除中继系统MTA外的其他所有MTA的配置(配置一个MTA并不简单)。第二,它允许某个机构中的一个系统作为邮件集线器,从而可能把其他所有系统隐藏起来。
NVT ASCII
SMTP的一个特色是它用NVT ASCII表示一切:信封、首部和正文。正如在26.4节中提到的,这是一个7 bit的字符码,以8 bit字节发送,高位比特被置为0。
重试间隔
当用户把一个新的邮件报文传给它的MTA时,通常立即试图交付。如果交付失败, MTA必须把该报文放入队列中以后再重试。Host Requirements RFC推荐初始时间间隔至少为30分钟。发送方至少4~5天内不能放弃。
网络文件系统(Network File System, NFS),它为客户程序提供透明的文件访问。NFS的基础是Sun RPC:远程过程调用(Remote Procedure Call)。客户程序使用NFS不需要做什么特别的工作,当NFS内核检测到被访问的文件位于一个NFS服务器时,就会自动产生一个访问该文件的RPC调用。
一般来说,客户发送命令给服务器,服务器向客户发送应答。目前为止,我们讨论过的所有应用程序——Ping,Traceroute,选路守护程序、以及DNS、TFTP、BOOTP、SNMP、Telnet、FTP和SMTP的客户和服务器—都是采用这种方式实现的。
远程过程调用RPC是一种不同的网络程序设计方法。客户程序编写时只是调用了服务器程序提供的函数。这只是程序员所感觉到的,实际上发生了下面一些动作:
网络程序设计是通过残桩和使用诸如插口或TLI的某个API的RPC库例程来实现的,但是用户程序——客户程序和被客户程序调用的服务器过程——不会和这个API打交道。客户应用程序只是调用服务器的过程,所有网络程序设计的细节都被RPC程序包、客户残桩和服务器残桩所隐藏。
一个RPC程序包提供了很多好处:
使用NFS,客户可以透明地访问服务器上的文件和文件系统。这不同于提供文件传输的FTP。FTP会产生文件一个完整的副本。NFS只访问一个进程引用文件的那一部分,并且NFS的一个目的就是使得这种访问透明。
NFS是一个使用Sun RPC构造的客户服务器应用程序。NFS客户通过向一个NFS服务器发送RPC请求来访问其上的文件。访问一个NFS文件必须对客户透明。因此, NFS的客户调用是由客户操作系统代表用户进程来完成的。出于效率的考虑, NFS服务器在服务器操作系统中实现。下图显示了一个NFS客户和一个NFS服务器的典型配置。
文件句柄
NFS中一个基本概念是文件句柄(file handle)。它是一个不透明(opaque)的对象,用来引用服务器上的一个文件或目录。不透明指的是服务器创建文件句柄,把它传递给客户,然后客户访问文件时,使用对应的文件句柄。客户不会查看文件句柄的内容——它的内容只对服务器有意义。每次一个客户进程打开一个实际上位于一个NFS服务器上的文件时, NFS客户就会从NFS服务器那里获得该文件的一个文件句柄。每次NFS客户为用户进程读或写文件时,文件句柄就会传给服务器以指定被访问的文件。
安装协议
客户必须在访问服务器上一个文件系统中的文件之前,使用安装协议安装那个文件系统。一般情况下,这是在客户主机引导时完成的。最后的结果就是客户获得服务器文件系统的一个文件句柄。
NFS过程
NFS服务器提供的15个过程:
这些过程都有一个前缀NFSPROC_。
NFS最初是用UDP写的,所有的厂商都提供了这种实现。最新的一些实现也支持TCP。TCP支持主要用于广域网,它可以使文件操作更快。NFS已经不再局限于局域网的使用。
其他常见的TCP/IP应用程序包括: