第12章 网络与通信应用
12.1 TCP/IP网络相关概念
计算机网络是指将处在不同地理位置且相互独立的计算机或设备,通过传输介质和通信设备相互连接起来,在网络操作系统及网络通信协议的管理和协调下,实现信息传输和资源共享的计算机系统。
12.1.1 TCP/IP协议概述
网络上有各种各样的计算机,它们在硬件特性以及数据表示格式等方面可能有所不同。为了能够互相通信,彼此理解,它们必须共同遵循某些约定,这些约定称为协议。协议是指通信双方在进行通信时所遵循的规则的集合,它定义了通信信息的格式和这些格式的意义。
在互联网上的计算机之所以能够互联,是因为它们都遵循一种共同的协议,这就是TCP/IP协议。TCP/IP协议最早是在Unix系统上使用的。随着Unix的成功,TCP/IP逐步成为Unix系统的标准网络协议,并被Internet的前身ARPANET所采纳。Internet诞生后,TCP/IP自然就成为Internet的连接协议。Internet的成功在很大程度上要归功于TCP/IP的优秀设计,现在它已成为一种事实上的Internet互联标准。
网络互联是一个复杂的问题,需要提供适应各种硬件条件以及各种应用需求的连接规范,因而也就涉及到多种协议。所以,TCP/IP协议实际上包含了多种不同层次和面向不同应用的协议,它们统称为TCP/IP协议族。TCP/IP协议族采用了分层模型的组织结构,共分为5层,即应用层、传输层、互联层、链路层和物理层。下层协议为上层协议提供服务,上层协议通过接口使用下层协议。图11‑1所示是TCP/IP协议族的层次结构图。
物理层规定了网络接口和传输介质的规格与信号协议,实现了计算机之间的物理连接。在这一层上,计算机之间通过网络接口(网卡、Modem等)和传输介质(同轴电缆、双绞线、光缆、无线电波等)相互连接,传递物理信号。
链路层实现数据帧的发送和接收,帧(frame)是独立的网络信息传输单元。数据帧的头部列出了该帧的下一站物理地址。链路层利用物理层提供的传输手段,将要发送的帧发送到目标机的网络接口上。链路层采用某种数据链路协议控制帧的传送,提供流控、校验、重发等机制,实现点到点(point to point)的帧交换。常用的链路层协议包括以太网、光纤网、ATM、PPP拨号、无线网络连接等。
互联层协议的主体是IP协议(Internet Protocol,网际协议),IP协议将数据帧封装成Internet数据包进行传递,IP层传递的数据包也称为IP包(IP packets)。每个IP包的头部包含有信息传递的源地址和目的地址,称为IP地址。IP协议计算从源IP地址到目的IP地址之间的路由,利用链路层的点到点传输功能将数据包逐点地传递到指定的主机上。现在正广泛使用的IP协议是IPv4,而新一代的IP协议是IPv6。除了IP,此层还有IGMP、ICMP等协议,常用的ping命令就是通过ICMP协议工作的。
传输层协议在计算机之间提供端到端(end to end)的数据通信。传输层将数据流分成一个个小的数据段,封装成IP包,再利用IP层协议进行传输。根据数据传输方式的不同,主要有两种传输协议,即TCP(Transmission Control Protocol,传输控制协议)和UDP(User Datagram Protocol,用户数据报协议)。两者的机制有所不同,区别是:TCP是一个面向连接的、可靠的通信协议,它在应用程序之间建立起可靠的通信连接,利用流控制以及错误恢复等机制保证数据完整正确地到达目的地,TCP协议通常用于有连接要求和传输质量要求的应用,如文件下载、网页浏览等;UDP是无连接的通信协议,且不保证传送的可靠性。也就是说它不能保证数据包的接收顺序同发送顺序相同,甚至不能保证它们是否全部到达。不过UDP比较简单,它的包头比较小,因而比TCP传输的负载小。UDP适合于一次性传输少量数据,常用于一些要求不高的应用,如QQ等即时聊天服务。传输的可靠性则交给应用层来负责。
应用层协议提供应用程序之间的互联,应用程序通过传输层协议进行数据通信,共同实现某种网络应用。常用的应用协议有http、telnet、ftp、smtp等,分别用于WEB服务、远程终端、文件传输、邮件传输等应用。
链路层、互联层和传输层协议在操作系统的内核中实现,而应用层协议则是通过网络编程接口形式提供的。
12.1.2 IP地址与域名
在IP协议中,标识主机的方法是为每个主机赋予一个唯一的地址,即IP地址(IP address)。IP地址是IP层定位主机所必需的,每台以专线方式联入Internet的计算机都拥有至少一个唯一的IP地址。IPv4的IP地址是一个32位的二进制数,通常采用点分十进制格式表示,即将32位二进制数分为4个字节,每个字节用一个十进制数字表示,中间用“.”分隔,例如:192.168.0.3。
IP协议还定义了几个特殊地址,比如127.0.0.0为本机的IP地址,用于主机向自己发送数据,通常用于调试或测试网络应用程序。
由于数字形式的IP地址难以记忆,人们就给网络上的主机另起一个容易记忆的名字,这就是域名(domain name)。网上的每一台服务器主机都有一个域名,它是服务器在互联网上注册的名称。应用程序只需按域名访问服务器,系统会自动将其转换为该服务器的IP地址。域名并非每台上网的计算机都需要,只有那些要被作为服务器访问的计算机才需要域名。另外,一个IP地址可以有多个域名,一个域名也可以对应多个IP地址。
有了域名后,网络系统必须提供域名转换功能。早期的Internet规模较小,只需通过一个集中的数据库来管理域名到IP地址的映射关系。但随着Internet的迅速膨胀,重名的问题必须解决,于是就诞生了域名系统。Internet的域名系统是DNS(Domain Name System),它是一个全球范围的分布式数据库系统,管理着网络上所有主机的域名,并负责将域名转换为IP地址。DNS采用了分层分区的管理方式,它将网络上的所有主机划分为多个管理区域,称为域(domain),一个域内又可划分为多个子域,每个域有一个域名。主机的域名就是由主机名和其所在的域层次结构的各个域名组成。DNS保证每一个域内的子域名或主机名是唯一的,从而保证了整个网络内主机命名的唯一性。
域名的一般结构:主机名.三级域名.二级域名.顶级域名
如:mail.biti.edu.cn,它的顶级域名是cn(中国),二级域名是edu(教育网),三级域名是biti(北京信息科技大学),主机名是mail(邮件服务器)。
域名必须向专门的机构申请注册,并且要遵循一定的原则才能正常工作。
12.1.3 协议端口
在传输层上,TCP/UDP协议实现了主机与主机间的数据通信,将数据包从源主机传送到目的主机。但是,最终的数据接收者是主机上的应用程序。那么,目的主机应该把接收到的数据包传送给哪个应用进程呢?为了区分数据包的目标进程,引入了端口机制。
协议端口(protocol port)是一个软件结构,它提供了网络数据流到本机上运行的服务进程的衔接。每个需要接收数据的进程都有一个特定的端口,每个网络数据包的包头除了包含目标主机的IP地址外,还包含一个端口号。当数据包到达目标主机时,系统将根据包头中的端口号将其送给相应的进程。
如果将主机比作一幢楼,进程比作楼中的住户,那么IP地址就是楼的邮递地址,端口号就是各住户的邮件分箱。每个对外有联系的住户都有一个分箱号。同邮件通信的方式一样,数据按IP地址到达主机后,主机的数据包接收程序检查数据包的头部信息,确定它的端口号,然后送到该端口上。在实现上,端口其实就是队列,操作系统为不同的进程分配了不同的队,数据包按照目的端口被推入相应的队中,而与此端口相对应的那个进程将会在此队列上等待并领取数据。
系统需要给每个提供网络应用服务的进程分配端口,分配的根据是应用协议的种类。每个协议端口用一个正整数标识,如:80、139、445等。为了便于客户访问,TCP/IP定义了一些知名端口(well known ports)号,提供服务的进程默认地使用这些端口号。如:HTTP协议的默认端口号是80,FTP协议的默认端口号是21。客户程序(如浏览器)在访问服务器主机时只需指定应用协议的类型(如http://或ftp://等),目标系统就会默认地知道该将接收到的数据送到哪个端口了。
12.1.4 客户/服务器软件模型
大部分TCP/IP应用软件采用客户/服务器(Client/Server)模型。客户/服务器模型将应用软件划分为两个部分:一部分是客户端软件,它运行在用户本地机上;另一部分是服务器端软件,它运行在网络上的服务器主机上。客户与服务器都属于TCP/IP的应用层软件,它们利用TCP或UDP协议传输数据,并且遵照某种应用协议进行通信,共同实现特定的网络应用功能。图11‑2描述了一种典型的客户/服务器软件模型。
客户和服务器的交互方式是:服务进程启动后即持续运行,监听在其服务端口上,等待客户的服务请求。用户使用客户程序与服务进程交互。客户进程启动后,系统为它分配一个临时端口,供接收数据使用。客户向服务器主机的某个服务端口发出服务请求,监听在该端口上的服务进程响应客户的请求,完成指定的操作,然后按请求数据包中带的客户机IP地址和源端口号,将结果返回给客户程序。这样一个完整的交互过程称为一次会话。
客户和服务器之间的交互可以是面向连接的,也可以是面向非连接的。面向连接的方式是双方在通信前先建立一个TCP连接,通过这个连接进行连续的双向通信,待交互完成后再拆掉连接;面向非连接的方式是通信双方不建立连接,只是通过一次性地发送UDP数据包来实现交互。
以Internet的Web服务为例,提供Web服务的网站上存有大量的网页资源,并运行Web服务进程来管理这些资源,为客户提供资源服务。用户通过Web客户程序(通常是浏览器)访问Web服务器,访问时要先输入统一资源定位地址(URL)。URL指定了协议的类型、服务器的域名以及请求的资源(网页)的名称,如http://www.someone.com/page。其中,http是Web的应用协议,www.someone.com是一个Web服务器的域名地址,page是网页的文件名。当用户提交了一个URL后,浏览器根据这个URL与指定服务器的http端口建立连接,然后Web服务进程按客户的请求找到请求的网页,将它下载到浏览器中,浏览器再将网页显示出来。
如果服务进程使用的不是知名端口,而是自定义的一个端口号,则客户必须事先知道该端口号,并在URL中指明该端口号。比如,假如该服务器为http应用协议指定的端口是8080,而不是知名的80,则在访问时应使用的URL是http://www.someone.com:8080/page。
12.2 Linux网络应用技术
Linux系统上的网络应用软件十分丰富,而且方便易用。不过,本节介绍的只限于Linux系统直接提供的一组基本网络应用命令,这些命令的参数和选项很多,因而功能十分灵活、强大,能够实现远程登录、文件传输、电子邮件等各种网络应用。另外,由于篇幅所限,本节将只介绍网络的应用技术,也就是如何通过客户端工具使用网络服务,并不涉及网络服务器系统的搭建。表11-1列出了常用的网络应用及其使用的协议端口和客户端应用工具。
12.2.1 网络测试
当网络发生故障时,首先应查明故障的原因。对于网络管理员来说,需要掌握一些测试命令和工具软件,以便全面地检测网络各个部件的运行状况;对于普通用户来说,掌握几个简单而又实用的命令也可以了解网络的当前情况,避免盲目地工作。
1. ifconfig命令
ifconfig是用来配置网络接口(网卡)的命令行工具。用这个命令可以查看或更改网络接口的地址和状态。地址包括MAC地址、IP地址、网络掩码、广播地址;状态包括UP(激活)和DOWN(关闭)。
ifconfig命令
【功能】查看或更改网络接口的地址,激活或关闭网络接口。
【格式】ifconfig 接口 [地址] [up|down]
【说明】接口参数指定网络接口名,如eth0是Ethernet网卡的名称。地址参数设定接口的地址。up和down选项用于激活或关闭网络接口。
例12.1 显示和配置eth0网络接口:
# ifconfig eth0
eth0 Link encap:Ethernet HWaddr 00:0C:29:7F:25:7E
inet addr: 192.168.0.2 Bcast:192.168.0.255 Mask:255.255.255.0
inet6 addr: fe80::20c:29ff:fe0b:257e/64 Scope:Link
UP BROADCAST RUNNING MULTICAST MTU:1500 Metric:1
RX packets:1610 errors:0 dropped:0 overruns:0 frame:0
TX packets:388 errors:0 dropped:0 overruns:0 carrier:0
collisions:0 txqueuelen:1000
RX bytes:207057 (202.2 KiB) TX bytes:33649 (32.8 KiB)
Interrupt:16 Base address:0x2000
# ifconfig eth0 down #暂停eth0网络接口
# ifconfig eth0 128.138.243.151 netmask 255.255.255.192 up
#设置eth0地址
#
2. ping命令
ping命令用于检查本机到另一个主机的连通性,它向该主机发送探询数据包,并接收回应。如果收到回应则ping命令成功,表明本机与远程机在互联层上是连通的,也就是说网络的物理链路、路由、网关、主机等都在正常地工作。如果ping不通,则其他网络应用都不能运行了。
ping命令
【功能】探察本机与远程主机的连通性。
【格式】ping [选项] 域名/ IP地址
【选项】
-c 数目 在发送指定数目的探询包后停止。未使用此选项时将持续发送探询包直到用户按下Ctrl+c键。
-f 大量且快速地向对方主机发送探询包
(只限超级用户使用)。
-i 秒数 设定间隔几秒发送一个探询包,默认值
是一秒一个。
-q 不显示任何探询包的传送信息,只显示
最后的结果。
-s 字节数 指定探询包的字节数,默认值是56,加
上8字节的头,共64字节。
例12.2 pingIP地址“192.168.2.1”:
$ ping 192.168.2.1
PING 192.168.2.1(192.168.2.1)56(84) bytes of data.
64 bytes from 192.168.2.1: icmp-seq=0 ttl=30 time=0.305 ms
64 bytes from 192.168.2.1: icmp-seq=1 ttl=30 time=0.135 ms
64 bytes from 192.168.2.1: icmp-seq=2 ttl=30 time=0.225 ms
64 bytes from 192.168.2.1: icmp-seq=3 ttl=30 time=0.204 ms
<Ctrl+c>
------192.168.2.1 ping statistics -----
4 packets transmitted,4 packets received,0% packet loss,time 3012 ms
rtt min/avg/max/mdev = 0.135/0.217/0.305/0.061 ms
$
如果可以ping通对方主机,ping将输出每个包的探测结果数据。输出的结果包括包的序号icmp-seq、存在时间ttl(time to live)以及从发送请求到返回应答之间的时间量time(以毫秒为单位)。如果应答时间短,表示数据包通过的路由器少或网络连接速度比较快。如果包的序号连续,表示传输质量较好,不丢包。通过ttl的值还可以推算数据包通过了多少个路由器,算法是用源地点的ttl起始值(就是比返回ttl略大的一个2的乘方数)减去返回时的ttl值。如例12.2中,返回ttl值为30,那么可以推算数据包离开源地址的ttl起始值为32,而源地点到目标地点要通过两个路由器网段。
12.2.2 网络查询
1. 查询域名与IP地址
当需要查询一台主机的IP地址或域名时可以用host、dig或nslookup命令。它们的功能是与本域的域名服务器建立连接,查询某个主机的IP地址或域名。
host命令
【功能】查询主机的IP地址或域名。
【格式】host [域名| IP地址]
【参数】给定域名为参数时,显示其IP地址;给定IP地址为参数时,显示其域名。
例12.3 用host命令进行查询:
$ host mail.biti.edu.cn #根据域名查询IP地址
mail.biti.edu.cn has address 212.68.32.3
$ host 64.233.161.99 #根据IP地址查询域名
99.161.233.64.in_addr.arpa domain name pointer od-in-f99.google.com
$
2. 查询用户信息
finger命令的功能是查询本地或远程主机上用户的公开信息,可以得到的信息包括用户的登录名、真实姓名、办公室地址、电话、终端名及其写状态(写状态指是否可用write命令向其终端写即时消息)、主目录、停滞时间、登录时间、邮件状态、登录Shell等信息。这些信息来源于/etc/passwd文件、登录日志和邮箱等系统文件。finger还可以显示用户主目录下的.plan和.project文件,用户可以通过建立这两个文件来对外宣传自己的计划、思想等。但出于安全的考虑,许多主机只对finger系统提供部分信息,甚至关闭finger服务。
finger命令
【功能】查询本地或远程主机上的用户的信息。
【格式】finger [选项] [用户列表]
【选项】
-s 以短格式显示,即只显示用户的登录名、实际姓名、办公室地址、电话、终端名及写状态、停滞时间、登录时间等信息。
-l 以长格式显示,即除了-s选项显示的信息外,还显示用户主目录、登录Shell、邮件状态等信息,以及用户的~/.plan和~/.project文件的内容。这是缺省的显示格式。
【说明】查询远程机上的用户时,参数为“用户名@域名”。若以“@域名”为参数则显示该主机上所有用户的信息。没有指定用户参数时显示本地主机上所有用户的信息。
例12.4 finger命令的使用:
$ finger zhanli@cs05.biti.edu.cn #查询远程主机上的用户
Login: zhanli Name: (null)
Directory: /home/zhanli Shell: /bin/bash
On since Fri Apr 4 21:43 (CST) on tty1 34 minutes 21 seconds idle
No mail.
No Plan.
$ finger -s #查询本地主机上的所有用户
Login Name Tty Idle Login Time Office Office Phone
root root tty1 9 Nov 25 09:17
cherry *:0 Nov 25 11:12
cherry pts/0 Nov 25 11:12 (:0.0)
$
终端名前面的*号表示对该终端没有写权限,没有*号则表示该终端是可写的,也就是说可以向该用户发送即时消息(见12.2.5小节)。
12.2.3 远程执行命令
远程执行就是用户在本地机的终端上通过网络与另一台Linux主机连通,在那台主机上启动一个命令运行。用户通过本地终端与该命令交互,如同操作本地主机一样。这种跨网络的执行命令就称为远程执行命令。
远程执行的原理是,在远程主机上运行着一个提供远程执行服务的服务程序,在本地系统中运行着一个用于远程执行的客户程序。客户程序向服务程序发出请求,服务程序接受请求后,在本地与远程主机之间建立一个TCP连接,随后启动指定的命令运行。命令执行过程中,客户程序与服务程序相互通信,客户程序将本地的标准输入复制到远程命令的标准输入,服务程序将远程命令的标准输出复制到本地的标准输出。
目前用于远程执行命令的方式(协议)主要有telnet和ssh两种。
1. telnet
telnet是很经典也很流行的远程执行软件,它包含在远程主机上运行的telnet服务程序(一般是telnetd)和在本地执行的telnet客户程序两个部分。若用户需要在远程系统上进行某种操作,如检查电子邮件、编辑文件和运行程序等,可以使用telnet客户程序登录到远程主机上执行各种命令。Unix/Linux系统上的telnet客户程序是telnet命令,Windows系统上可以使用putty等软件。
telnet命令的一般格式为:telnet 域名/IP地址。
命令首先建立起本地客户程序与远程主机上的服务程序之间的TCP连接,连接成功后就可得到远程机的登录提示符。登录后,远程系统为用户启动一个Shell,一个telnet会话就开始了。用户可以像在本地系统一样在远程系统上工作,结束工作后,使用logout或exit命令退出远程系统,结束此次会话。
下面是一个典型的telnet会话过程:
$ telnet s05.localdomain
Trying 192.102.10.11…
Connected to s05.localdomain
Escape character is '?]'.
Linux Mandrade release 6.1 (Helios)
kernel 2.2.13 on an i686
login: zhanli
password:
Last login: Mon Nov l5 20:50:43 from hp1.localdomain
Linux 2.6.16. (Posix).
[zhanli@s05 ~]$
…
[zhanli@s05 ~]$ logout
Connection closed by foreign host.
$
telnet的弱点在于它所有的数据都是以明文的方式传输的,容易被人窃取口令和数据。所以,在未加防范的网络上使用telnet时存在安全隐患。但是在某些场合,如内部局域网络中,telnet还是非常有效的。
2. ssh
ssh(secure shell)是一个可以有效替代telnet的安全远程执行软件。ssh的服务程序是sshd,客户程序是ssh命令。与telnet不同,ssh客户与服务器通信时对所有通过网络传输的数据(包括用户名和口令)均进行了加密,从而大大提高了安全性。
ssh命令的一般格式为:ssh 用户名@域名/IP地址 [命令]
没有指定命令时,ssh的执行过程类似于telnet;指定了命令时,ssh只在远程主机上执行指定的命令,然后退出。
下面是ssh命令的典型用法:
$ ssh zhanli@s05.localdomain #远程登录
zhanli@s05.localdomain’s password:
[zhanli@s05 ~]$
…
[zhanli@s05 ~]$ logout
Connection to s05.localdomain closed.
$ ssh zhanli@s05.localdomain “ls project/hoc” #远程执行命令
zhanli@s05.localdomain’s password:
hoc hoc.c hoc.h init.c math.c makefile
$
3. 远程执行X应用程序
X系统是基于TCP/IP网络运行的,因此可以在本地系统上启动远程主机上的一个X应用程序,而将图形操作界面在本地显示出来。如果网络带宽允许的话,甚至可以将整个桌面调过来进行操作,就如同在主机前操作一样。
在本地系统运行X应用程序的前提是要在本地启动一个X Server。各种流行的操作系统都有X Server产品,Windows系统常用的X Server软件有x-win32、exceed、Xmanager等。
远程执行一个X应用的方法是:用telnet或ssh登录到远程主机,执行启动X应用的命令,在命令行中用-display选项将其输出设为本地X Server管理的屏幕。-display选项的具体格式参看8.3.4小节。远程登录图形桌面的方法是:用telnet或ssh登录到远程主机,启动一个显示管理器(如xdm、kdm等),将其输出设为本地X Server管理的屏幕。此时,在本地的X窗口中就会显示出远程系统的图形登录界面。多数系统默认对于远程X服务有所限制,使用时需要对系统进行一些配置,具体的设置方法请参考系统的相关资料。
12.2.4 文件传输
ftp是在计算机之间传输文件的简单有效的方法。Linux上常用的ftp服务程序有ftpd、vsftpd、wu-ftpd和proftpd,客户程序是ftp命令。当执行ftp命令时,它与远程主机上的服务程序建立起TCP连接,提示用户输入用户名和口令,随后一个ftp会话开始。在会话过程中,用户可以通过ftp提供的操作命令进行操作,如在目录中移动、列出目录内容、上传或下载文件等。传输文件的类型可以是ASCII的或二进制的。操作完成后,用户用退出命令退出,结束此次ftp会话。表11-2列出了常用的ftp操作命令。
大部分ftp站点要求用户拥有该站点的合法用户名和口令,也有很多站点允许用户匿名登录,即采用“anonymous”作为登录名,口令为“guest”。用户名和口令用来确认用户的身份,并确定用户对站点中文件的访问权限。
ftp命令的一般格式是:ftp 域名/IP地址。
以下是一个典型的ftp会话过程:
$ ftp fc9
Connected to fc9 (192.168.0.2).
220 (vsFTPd 2.0.5)
Name (fc9:cherry): anonymous
33l Please specify the password.
Password:
230 Login successful.
Remote system type is UNIX.
Using binary mode to transfer files.
ftp > cd pub
250 Directory successfully changed.
ftp > ls
227 Entering Passive Mode ( 192, 168, 0, 2, 168, 34 ).
l50 Here comes the directory listing.
-rw-r--r-- 1 0 0 1882 Ari 04 09:52 file1
-rw-r--r-- 1 0 0 140 Ari 02 19:01 file2
-rwxr-xr-x 1 0 0 5660 Ari 02 19:02 file3
226 Directory send ok.
ftp > binary
200 Switching to Binary mode.
ftp > get file3
local: file3 remote: file3
227 Entering Passive Mode ( 192, 168, 0, 2, 107, 163 ).
150 Opening BINARY mode data connection for file3 (5660 bytes).
226 File send OK.
5660 bytes received in 0.000423 secs (1.3e + 04 Kbytes/sec)
ftp > bye
22l Goodbye.
$
12.2.5 即时通信
Linux系统支持本地系统登录用户之间以及本地与远程系统登录用户之间的即时通信。命令方式的即时通信工具有talk和write命令。
1. talk命令
talk命令用于在两个用户之间进行即时“交谈”。交谈双方可以是处在同一主机上的用户,也可以是处在网络上的不同主机上的用户。只要知道交谈对象的地址,就可以邀请对方交谈。注意:提供talk功能的系统需要安装有xinetd和talkd软件包,并且开启了talk服务。
talk命令的一般格式是:talk 用户 [终端]
例如登录在主机fc9.localdomain上的用户cherry希望和登录在主机s05.biti.edu.cn上的用户zhanli交谈,可以输入下面的命令:
$ talk zhanli@s05.biti.edu.cn
s05.biti.edu.cn主机上的服务程序(talkd)会传送一条信息邀请zhanli来交谈,这时用户zhanli的屏幕上就会出现如下信息,并响铃提示:
Message from cherry@fc9.localdomain at 20:24 …
talk: connection requested by cherry@fc9.localdomain
talk: respond with: talk cherry@fc9.localdomain
这时,用户zhanli如果愿意与cherry交谈,就输入命令:
$ talk cherry@fc9.localdomain
之后,连接建立成功,两个用户就可以进行交谈了。这时,双方的终端屏幕上都将显示信息[Connection established]并响铃,同时屏幕被talk程序以一条水平线分割为上下两部分,上半部分用来显示用户自己输入的内容,下半部分用来显示对方输入的内容。两个用户可以同时输入,他们输入的内容将会立即显示在双方的屏幕上。如果要结束交谈,可由任何一方按下Ctrl+c键来中断连接。talk程序结束时,在屏幕上将显示一条信息:
[Connection closing. Exiting]
2. write命令
write命令用于向登录在同一系统上的另一个用户发送即时消息。发送的消息将立即出现在接收者的终端屏幕上。
例12.5 用户chao向用户cherry发送即时消息:
$ who | grep cherry #确定cherry是否登录,以及登录的终端
cherry pts/0 Nov 8 13:34 (0:0)
$ write cherry pts/0 #发送即时消息
cherry,
Come over and join us.
<Ctrl+d>
$
cherry的屏幕显示如下:
$
Message from chao@cs05.biti.edu.cn on tty1 at 14:26 …
cherry,
Come over and join us.
EOF
$
12.3 电 子 邮 件
电子邮件(E-mail)诞生于20世纪80年代初,最早在Unix系统上实现,以后逐渐在互联网上流行。而今电子邮件已是互联网上最重要的应用之一。与传统邮件相比,电子邮件具有快捷、廉价和环保的优点,因而是现代人的必备通信工具。
12.3.1 电子邮件的结构
电子邮件由消息头、消息体和可选附件3部分组成。消息头包含了一些标准的字段,用来提供必要的信息以便邮件系统对其进行分发处理;消息体是邮件的内容,采用文本方式书写;附件是随消息一起发送的文件,可以是文本的,也可以是二进制的各类文件。
消息头中包含有如下几个最重要的字段:
● To:接收方的邮件地址。
● From:发送方的邮件地址。
● Cc:抄送对象的邮件地址。
● Bcc:盲抄送对象的邮件地址。
● Subject:消息的主题。
● Attch:随消息发送的附件。
电子邮件的地址一般采用如下格式:
user_name@host_name.domian_name
其中user_name标识用户的邮箱,host_name.domian_name是邮箱所在的主机(即邮件服务器)的域名。例如,cherry@hotmail.com表示位于hotmail.com主机上的cherry的邮箱。如果是向处于同一主机的邮件用户发邮件,则只需写出user_name即可。
12.3.2 电子邮件系统的工作原理
1. 电子邮件系统的构成
从原理上讲,电子邮件系统由以下4部分软件组成:
1) 邮件用户代理
邮件用户代理(mail user agent,MUA)是供用户使用的邮件处理软件,主要功能包括接收和阅读邮件以及编写和发送邮件。Linux常用的MUA软件有命令行方式的mail、全屏方式的pine、图形化的kmai和qmail等。Windows系统上使用的是Outlook。
2) 邮件传输代理
邮件传输代理(mail transport agent,MTA)完成邮件在主机间的转发,它是邮件系统的核心成分。现在有许多可选的MTA邮件系统,使用最广泛的是sendmail。另外一些较新的邮件系统如qmail、postfix等在Linux上也有较多的应用。
3) 邮件投递代理
邮件传输代理收到邮件后检查收件人邮箱地址,如果不是本机的邮箱就向下一站转发邮件;如果是本机的,就交给本地的一个投递代理去处理。邮件投递代理(Mail Delivery Agent,MDA)负责将发给本地用户的邮件投递到用户的信箱中。复杂的MDA还具有邮件分类、垃圾邮件过滤以及将邮件投递给程序等功能。常用的MDA有sendmail自带的mail.local,此外还有smrsh和procmail等。
4) 邮件访问代理
邮件访问代理(Mail Access Agent,MAA)是一个可选的部件,它的功能是为用户提供访问邮箱的服务,包括对用户进行身份认证、邮件浏览、下载及删除等。Linux系统上常用的访问代理是imapd和spop。
通常的邮件系统实现方案是将邮件传输代理、邮件投递代理和邮件访问代理放在一台主机上,称为邮件服务器。邮件服务器上为每个本地用户都设有一个电子邮箱,用户在自己的计算机上运行邮件用户代理软件,收发邮件或访问邮件服务器上的邮箱。
2. 邮件协议
邮件系统的各个组成部件分布在网络上,它们之间需要通过某种协议相互通信。邮件协议属于TCP/IP的应用层协议,它们利用TCP/IP协议实现邮件的传递。
SMTP(Simple Mail Transfer Protocal)是简单邮件传输协议,它的目标是向用户提供高效、可靠的邮件传输。SMTP协议用于两种情况:一是将邮件从用户代理传输到传输代理;二是从一个传输代理传送给另一个传输代理。SMTP能够以接力方式传送邮件,即邮件可以通过网络上不同的主机逐站传送到目标主机,因此它十分适合在互联网上使用。SMTP的客户是发送邮件的MUA(如Outlook)或MTA(如sendmail),SMTP的服务器是接收邮件的MTA(如sendmail)。SMTP协议使用的端口是25。
一般来说,用户多是在客户机上处理各种电子邮件,因此需要一个服务程序(邮件访问代理)将邮箱中的邮件转交给客户机。提供邮件访问服务的方法有两种,一种是将邮件传送到用户的本地机器上处理,这是通过邮局协议POP3(Post Office Protocol v3)实现的;另一种是允许用户远程操作其邮箱实现对邮件的浏览和管理,这是通过IMAP(Internet Message Access Protocol)协议实现的。POP3/IMAP的客户是MDA(如Outlook),POP3/IMAP的服务器是MAA(如imapd)。POP3协议使用的端口是110,IMAP协议使用的端口是143。
3. 邮件系统工作原理
一个典型的邮件的传递过程如图11‑3所示。
(1) 编写和发送邮件:用户利用MUA软件编辑和发送邮件。有两种使用MUA的方式,一是用户登录到邮件服务器系统上,然后用系统的MUA(如mail命令)编写邮件并直接将邮件交给服务器上的MTA(如sendmail)来发送。另一种是用户在自己的计算机上用MUA(如outlook)编写邮件,然后将其发送给邮件服务器上的MTA。此时MUA与MTA位于不同的机器上,它们之间通过SMTP协议进行通信,传递要发送的邮件。
(2) 传输邮件:邮件服务器的MTA收到要发送的邮件后,查看邮件的目标地址,如果目标地址是本地,则将其交给本地的投递代理MDA(如mail.local);如果目标地址不是本地,则将该邮件发往下一个邮件服务器,或直接发往目标邮件服务器。
(3) 投递邮件:目标邮件服务器的MTA收到邮件后,将其交给本地的MDA,由MDA将消息投放到接收者的邮箱内,并告知接收者有新邮件到来。
(4) 接收和处理邮件:接收者通过MUA来查看和处理邮件。如果用户是登录到服务器上的,则可以直接用服务器上的MUA(如mail命令)来访问自己的邮箱,处理邮件;如果用户是在自己的计算机上接收邮件,则是通过本机上的MUA(如outlook)与服务器上的MAA(如imapd)建立连接,通过MAA来访问服务器上自己的邮箱。MUA与MAA之间使用POP3或IMAP协议进行通信。
12.3.3 在Linux中使用邮件
在Linux系统中,系统为每个用户建立了一个私人邮箱,系统将接收到的邮件保存在用户的邮箱内。用户邮箱是一个文本文件,用环境变量$MAIL表示,默认的邮箱文件是/var/spool/mail/$LOGNAME。Linux用户能够与系统中任何用户互发电子邮件。如果系统中安装了邮件传输代理(如sendmail),则用户就可以与网络上的用户互发电子邮件了。
用户可以使用很多方法来处理邮件,其中,mail命令是Linux系统中最简单、最基本、也是最快捷的邮件用户代理,在任何一个Unix/Linux系统中都可以使用。
1. 设置mail环境
mail是一个功能很强也很灵活的命令,用户可以通过配置文件来灵活地配置mail的运行选项,以达到不同的邮件处理功能。可配置的项目包括别名、邮件显示格式、使用的编辑器、发送邮件后是否保存、设置自动回复等。
当mail启动时,它首先执行配置文件来定制自己的行为。有两个配置mail环境的文件,一个是系统级mail配置文件/etc/mail.rc,用于定义全体用户的通用mail环境;另一个是用户级mail配置文件~/.mailrc,用于定义用户的特殊mail环境。一般情况下,系统给出的配置可以适合大多数用户的需求,用户自己可以不做任何配置。用户最常用的配置项是定义别名,格式是:
alias 别名 地址表
别名的作用相当于地址簿。如,创建一个~/.mailrc文件,将下面一行加入到文件中,则当需要向别名中定义的3个人发邮件时,接收地址只要写sales_team即可。
alias sales_team zhaoyang@yahoo.com limi87@hotmail.com liliu@tom.com
用户如需做其他配置可参考mail命令的man手册页。
2. 阅读和处理邮件
用户登录系统时,如果用户邮箱中有新到的邮件,系统会通知用户:You have mail。用户可以用mail命令来翻阅和处理邮件,命令格式是:mail。
不带参数和选项地执行mail命令,将会启动一个交互式的mail会话。mail首先会显示出邮箱中的邮件标题列表。缺省的列表格式是:
邮件状态 邮件编号 发送者地址 发送时间 邮件行数/字符数 邮件标题
其中,邮件状态的表示是:N为新到,U为未读,空格为已读。若前面带符号“>”,表示它是当前处理的邮件。
在列表后面,mail会显示“&”字符作为命令提示符。用户可以在其后输入mail的操作命令来处理邮件,如阅读、保存、删除、回复、转发等。常用的操作命令见表11-3。
以下是一个典型的mail会话过程:
$ mail
Mail version 8.1 6/6/93. Type ? for help.
“/var/spool/mail/cherry”: 4 messages 2 new 4 unread
U 1 root@fc9.localdomain Fri Jun 15 22:59 17/659 “Response”
U 2 zhao@rh9.localdomain Wed Dec 26 11:10 17/666 “Meeting Nots”
>N 3 linxx999@hotmail.com Wed Dec 26 11:30 16/656 “Files for you”
N 4 hal@mail.biti.edu.cn Wed Dec 26 12:25 16/655 “Hi“
& p4
Message 4:
From hal@mail.biti.edu.cn Wed Dec 26 12:25:37 2007
Date: Wed, 26 Dec 2007 12:25:37 2007 +0800
From: hao lin <hal@mail.biti.edu.cn>
To: cherry@fc9.localdomain
Subject: Hi
Hi, cherry, this is my new mailbox.
& r
To: cherry@fc9.localdomain hal@mail.biti.edu.cn
Subject: Re: Hi
Received.
.
Cc:<Enter>
& q
$
在以上交互过程中,用户用p4命令显示第4个邮件的内容,然后用r命令回复该邮件。回复时,系统自动生成To、From和Subject字段,用户输入信件内容,用仅有一个“.”字符的行结束输入。最后用户用q命令退出。
3. 撰写和发送邮件
发送邮件使用带参数和选项的mail命令,命令的一般格式是:
mail [-s标题] [-c 抄送地址] 收件人地址
mail命令根据-s和-c选项的内容生成Subject字段和Cc字段,根据收件人地址参数形成To字段,然后从标准输入中读入信件内容(以一个只含有一个“.”字符的行结束),最后将邮件发送给参数指定的用户。如果命令行中没有提供-s和-c选项,mail将提示用户输入Subject行和Cc地址行,以回车结束。
以下是几种常用的发送邮件方式:
$ mail xiaoli amy peter #向多个用户发送邮件
Subject: Congratulations
Congratulations on winning the football game. It’s great!
cherry
.
Cc: <Enter>
$ mail -s “Log file” root < logfile #将文件作为邮件内容
$ echo “Happy Birthday!” | mail mary #将命令输出作为邮件内容
$
习 题
11-1 TCP/IP协议族分成哪几层?IP、TCP、FTP分别位于网络协议的哪一层?
11-2 什么是IP地址?什么是域名?
11-3 DNS系统的功能是什么?
11-4 什么是端口?端口与IP地址有什么区别?
11-5 列举5种TCP/IP应用协议,说明它们的应用以及使用的端口。
11-6 用ifconfig命令查看网卡的MAC地址和IP地址。
11-7 用host命令确定经常访问的几个网站的IP地址。
11-8 用ssh命令登录一个远程系统,执行一些Shell命令后退出。
11-9 用write命令与系统中另一个用户交谈。
11-10 电子邮件系统由哪几部分构成?它们的功能分别是什么?
11-11 用mail命令阅读一个邮件,并将它转发给另一个用户。