目录
6.3 文件传输协议:FTP
6.3.1 FTP命令和回答
6.4 因特网中的电子邮件
6.4.1 SMTP
6.4.2 与HTTP的对比
6.4.3 邮件报文格式和MIME
6.4.4 邮件访问协议
6.4.4.1 POP3
6.4.4.2 IMAP
6.5 DNS:因特网的目录服务
6.5.1 DNS提供的服务
6.5.2 域名的特点
6.5.3 DNS的概念性划分名称空间
6.5.3.1 顶级域名
6.5.3.2 资源记录
6.5.3.3 名称服务器区
6.5.3.4 名称服务器的类型
6.5.4 解决一个查询
6.5.5 HOSTS File
6.5.6 DNS安全
在一个典型的FTP会话中,用户坐在本地主机前面,向一台远程主机传输(或接收)文件。用户要想访问它的远程账户就必须提供一个用户标识和口令。在提供了这种授权信息后,用户就能从本地文件系统向远程主机文件系统传送文件,反之亦然。如图所示,用户通过一个FTP用户代理与FTP交互。
HTTP和FTP的共同特点
它们都运行在TCP上
HTTP和FTP的重要区别
其中最显著的就是FTP使用了两个并行的TCP连接来传输文件,一个是控制连接(control connection),一个是数据连接(data connection)。
控制连接
控制连接用于在两主机之间传输控制信息,如用户标识、口令、改变远程目录的命令以及“存放(put)” 和“获取(get)” 文件的命令。
数据连接
数据连接用于实际发送一个文件。
带外(out-of-band)传送
因为FTP协议使用一个独立的控制连接,所以我们也称FTP的控制信息是带外传送的。
带内(in-band)传送
HTTP协议是在传输文件的同一个TCP连接中发送请求和响应首部行的。因此,HTTP 也可以说是带内发送控制信息的。
FTP 协议的控制连接和数据连接如图所示。
我们通过简要地讨论几个常见的FTP命令和回答。从客户到服务器的命令和从服务器到客户的回答,都是以7比特ASCII格式在控制连接上传送的。因此,与HTTP协议的命令类似,FTP协议的命令也是人可读的。为了区分连续的命令,每个命令后跟回车换行符。每个命令由4个大写字母ASCII字符组成,有些还具有可选参数。一些较为常见的命令如下:
USER username | 用于向服务器传送用户标识 |
PASS password | 用于向服务器发送用户口令 |
LIST | 用于请求服务器回送当前远程目录中的所有文件列表。该文件列表是经一个(新建且非持续连接)数据连接传送的,而不是在控制TCP连接上传送 |
RETR filename | 用于从远程主机当前目录检索(即get)文件。该命令引起远程主机发起一个数据连接,并经该数据连接发送所请求的文件 |
STOR filename | 用于在远程主机的当前目录上存放(即put)文件 |
贯穿控制连接,在用户发出的命令和FTP发送的命令之间通常有一一对应关系。每个命令都对应着一个从服务器发向客户的回答。回答是一个3位的数字,后跟一个可选信息。这与HTTP响应报文状态行的状态码和状态信息的结构相同。一些典型的回答连同它们可能的报文如下所示:
331 Usermame OK | 用户名OK,需要口令 |
125 Data connection already open; transfer starting | 数据连接已经打开,开始传送 |
425 Can't open data connection | 无法打开数据连接 |
452 Error writing file | 写文件差错 |
我们将讨论位于因特网电子邮件的核心地位的应用层协议。下图给出了因特网电子邮件系统的总体情况。
从该图中我们可以看到它有3个主要组成部分:用户代理(user agent)、邮件服务器(mail server)和简单邮件传输协议(Simple Mail Transfer Protocol,SMTP)。
用户代理
用户代理允许用户阅读、回复、转发、保存和撰写报文。当Alice完成邮件撰写时,她的邮件代理向其邮件服务器发送邮件,此时邮件放在邮件服务器的外出报文队列中。
邮件服务器
邮件服务器形成了电子邮件体系结构的核心。每个接收方在其中的某个邮件服务器上有一个邮箱。Bob的邮箱管理和维护着发送给他的报文。一个典型的邮件发送过程是:
从发送方的用户代理开始,传输到发送方的邮件服务器,再传输到接收方的邮件服务器,然后在这里被分发到接收方的邮箱中。
邮件服务器会通过用户名和口令来鉴别Bob。
Alice 的邮箱也必须能处理Bob的邮件服务器的故障。如果Alice的服务器不能将邮件交付给Bob的服务器,Alice的邮件服务器在一个报文队列(message queue)中保持该报文并在以后尝试再次发送。通常每30分钟左右进行一次尝试;如果几天后仍不能成功,服务器就删除该报文并以电子邮件的形式通知发送方。
SMTP
SMTP是因特网电子邮件中主要的应用层协议。它使用TCP可靠数据传输服务,从发送方的邮件服务器向接收方的邮件服务器发送邮件。像大多数应用层协议一样,SMTP也有两个部分:运行在发送方邮件服务器的客户端和运行在接收方邮件服务器的服务器端。
每台邮件服务器上既运行SMTP的客户端也运行SMTP的服务器端。当一个邮件服务器向其他邮件服务器发送邮件时,它就表现为SMTP的客户;当邮件服务器从其他邮件服务器上接收邮件时,它就表现为一个SMTP的服务器。
SMTP是因特网电子邮件应用的核心。如前所述,SMTP用于从发送方的邮件服务器发送报文到接收方的邮件服务器。SMTP问世的时间比HTTP要长得多。
它限制所有邮件报文的体部分(不只是其首部)只能采用简单的7比特ASCII表示。在20世纪80年代早期,这种限制是明智的。然而,在今天的多媒体时代,7位ASCII的限制的确有点痛苦。
即在用SMTP传送邮件之前,需要将二进制多媒体数据编码为ASCII码,并且在使用SMTP传输后要求将相应的ASCII码邮件解码还原为多媒体数据。
使用HTTP传送前不需要将多媒体数据编码为ASCII码。
为了描述SMTP的基本操作,我们观察一种常见的情景。假设Alice想给Bob发送一封简单的ASCII报文。
我们现在仔细观察一下,SMTP是如何将一个报文从发送邮件服务器传送到接收邮件服务器的。我们将看到,SMTP与人类面对面交往的行为方式有许多类似性。
接下来我们分析一个在SMTP客户(C)和SMTP服务器(S)之间交换报文脚本的例子。客户的主机名为crepes.fr,服务器的主机名为hamburger.edu。以C:开头的ASCII码文本行正是客户交给其TCP套接字的那些行,以S:开头的ASCII码则是服务器发送给其TCP套接字的那些行。一旦创建了TCP连接,就开始了下列过程。
“Do you like ketchup? How about pickles?"
是客户从邮件服务器crepes.fr向邮件服务器hamburger.edu发送的报文。
HELO(是HELLO的缩写)、MAIL FROM、RCPT TO、DATA、QUIT
客户发送的5条命令,这些命令都是自解释的。
一个句点的行
客户向服务器指示该报文结束了(按照ASCII码的表示方法,每个报文以CRLF. CRLF结束,其中的CR和LF分别表示回车和换行)。
服务器对每条命令做出回答,其中每个回答含有一个回答码和一些(可选的)英文解释。我们在这里指出SMTP用的是持续连接:如果发送邮件服务器有几个报文发往同一个接收邮件服务器,它可以通过同一个TCP连接发送这些所有的报文。对每个报文,该客户用一个新的MAIL FROM:crepes.fr开始,用一个独立的句点指示该邮件的结束,并且仅当所有邮件发送完后才发送QUIT。
我们简要地比较一下SMTP和HTTP。
共同点
这两个协议都用于从一台主机向另一台主机传送文件:
HTTP从Web服务器向Web客户(通常是一个浏览器)传送文件(也称为对象)。
SMTP从一个邮件服务器向另一个邮件服务器传送文件(即电子邮件报文)。当进行文件传送时,持续的HTTP和SMTP都使用持续连接。
区别
第一个区别是,HTTP 主要是一个拉协议(pull protocol),即在方便的时候,某些人在Web服务器上装载信息,用户使用HTTP从该服务器拉取这些信息。特别是TCP连接是由想接收文件的机器发起的。SMTP基本上是一个推协议(push protocol),即发送邮件服务器把文件推向接收邮件服务器。特别是,这个TCP连接是由要发送该文件的机器发起的。
第二个区别就是我们前面间接地提到过的,SMTP 要求每个报文(包括它们的体)使用7比特ASCII码格式。如果某报文包含了非7比特ASCII字符(如具有重音的法文字符)或二进制数据(如图形文件),则该报文必须按照7比特ASCII码进行编码。HTTP数据则不受这种限制。
第三个重要区别是如何处理一个既包含文本又包含图形(也可能是其他媒体类型)的文档。HTTP把每个对象封装到它自己的HTTP响应报文中,而SMTP则把所有报文对象放在一个报文之中。
当一个人给另一个人发送电子邮件时,一个包含环境信息的首部位于报文体前面。这些环境信息包括在一系列首部行中,这些行由RFC5322定义。首部行和该报文的体用空行(即回车换行)进行分隔。RFC5322定义了邮件首部行和它们的语义解释的精确格式。
如同HTTP协议,每个首部行包含了可读的文本,是由关键词后跟冒号及其值组成的。某些关键词是必需的,另一些则是可选的。
必需的首部行:From:首部行和一个To:首部行
可选的首部行:一个首部也许包含一个Subject:首部行以及其他可选的首部行。
注意到下列事实是重要的:这些首部行不同于SMTP命令(即使那里也包含了某些相同的词汇,如from和to)。上面学的命令是SMTP握手协议的一部分;本节中研究的首部行则是邮件报文自身的一部分。
一个典型的报文首部看起来如下:
From: [email protected]
To: [email protected]
Subject: Searching for the meaning of life.
在报文首部之后,紧接着一个空白行,然后是以ACSII格式表示的报文体。
MIME:多用途互联网邮件扩展
在电子邮件的早期,信息是英文的,并且只使用ASCII码。RFC 822反映了这些简单的限制。随着时间的推移,RFC822的局限性变得很明显。
局限性:
MIME有5个额外的信息头:
MIME-Version | 识别MIME版本 |
Content-Description | 描述内容的人可读性 |
Content-Id | 唯一的标识符 |
Content-Transfer-Encoding | 内容如何被包装以便传输 |
Content-Type | 内容的类型和格式 |
MIME的Content-Types包括:
之前我们说,Bob是通过登录到服务器主机,并直接在该主机上运行一个邮件阅读程序来阅读他的邮件的。而在今天,邮件访问使用了一种客户—服务器体系结构,即典型的用户通过在用户端系统上(即本地主机)运行的客户程序来阅读电子邮件。
假设Bob在其本地PC上运行用户代理程序,那么本地PC上就要有邮件服务器。这种情况会有一个问题。那么为了能够及时接收可能在任何时候到达的新邮件,Bob的PC必须总是不间断地运行着并一直保持在线。这对于大多数因特网用户而言是不现实的。相反,典型的用户通常在本地PC上运行一个用户代理程序,而它访问存储在总是保持开机的共享邮件服务器上的邮箱。该邮件服务器与其他用户共享,并且通常由用户的ISP进行维护(如大学或公司)。
SMTP被设计成将电子邮件从一台主机推到另一台主机。然而,通常Alice的用户代理和Bob的邮件服务器之间并没有一个直接的SMTP对话。相反,如下图所示:
Alice的用户代理用SMTP将电子邮件报文推入她的邮件服务器,接着她的邮件服务器(作为一个SMTP客户)再用SMTP将该邮件中继到Bob的邮件服务器。为什么该过程要分成两步呢?
主要是因为不通过Alice的邮件服务器进行中继,Alice的用户代理将没有任何办法到达一个不可达的目的地接收服务器。通过首先将邮件存放在自己的邮件服务器中,Alice的邮件服务器可以重复地尝试向Bob的邮件服务器发送该报文,如每30分钟一次,直到Bob的邮件服务器变得运行为止。
那么,像Bob这样的接收方,是如何通过运行其本地PC上的用户代理,获得位于他的某ISP的邮件服务器上的邮件呢?值得注意的是Bob的用户代理不能使用SMTP取回报文,因为取报文是一个拉操作,而SMTP协议是一个推协议。
通过引入一个特殊的邮件访向协议来解决这个难题,该协议将Bob邮件服务器上的报文传送给他的本地PC。目前有一些流行的邮件访问协议,包括第三版的邮局协议(Post OfficeProtocol-Version 3,POP3)、因特网邮件访问协议(Internet Mail Access Protocol,IMAP)以及HTTP。
SMTP的作用:
- 用来将邮件从发送方的邮件服务器传输到接收方的邮件服务器
- 用来将邮件从发送方的用户代理传送到发送方的邮件服务器
如POP3这样的邮件访问协议
用来将邮件从接收方的邮件服务器传送到接收方的用户代理
POP3是一个极为简单的邮件访问协议,由RFC1939进行定义。文档RFC1939简短且可读性强。因为该协议非常简单,故其功能相当有限。当用户代理打开了一个到邮件服务器端口110上的TCP连接后,POP3就开始工作了。随着建立TCP连接,P0P3 按照三个阶段进行工作:特许( authorization)、事务处理以及更新。
特许阶段
用户代理发送(以明文形式)用户名和口令以鉴别用户。
事务处理阶段
用户代理取回报文;同时在这个阶段用户代理还能进行如下操作,对报文做删除标记,取消报文删除标记,以及获取邮件的统计信息。
更新阶段
它出现在客户发出了quit 命令之后,目的是结束该P0P3会话;这时,该邮件服务器删除那些被标记为删除的报文。
在POP3的事务处理中,用户代理发出一些命令,服务器对每个命令做出回答。回答可能有两种:
+OK(有时后面还跟有服务器到客户的数据),被服务器用来指示前面的命令是正常的;
-ERR,被服务器用来指示前面的命令出现了某些差错。
特许阶段有两个主要的命令:user
现在我们来看一下事务处理过程。使用POP3的用户代理通常被用户配置为“下载并删除”或者“下载并保留”方式。POP3用户代理发出的命令序列取决于用户代理程序被配置为这两种工作方式的哪一种。使用下载并删除方式,用户代理发出list、retr 和dele命令。举例来说,假设用户在他的邮箱里有两个报文。在下面的对话中,C:是用户代理,S:是邮件服务器。事务处理过程将类似于如下过程:
C: list
S: 1 498
S: 2 912
S: .
s: (blah blah ...
s: ..............
s: .........blah)
s: .
C: dele 1
C: retr 2
s: (blah blah ...
s: ..............
s: .........blah)
s: .
C: dele 2
C: quit
S: +OK POP3 server signing off
用户代理首先请求邮件服务器列出所有存储的报文的长度。接着用户代理从邮件服务器取回并删除每封邮件。注意在特许阶段以后,用户代理仅使用四个命令: list、 retr、dele和quit,这些命令的语法定义在RFC 1939中。在处理quit命令后,POP3服务器进入更新阶段,从用户的邮箱中删除邮件1和2。
下载并删除方式将对Bob的邮件报文根据这3台机器进行划分,一个机器收取了邮件,另一台机器就不能再收取该邮件。使用下载并保留方式,用户代理下载某邮件后,该邮件仍保留在邮件服务器上。这时,Bob 就能通过不同的机器重新读取这些邮件。
使用POP3访问的好处有:
Bob将邮件下载到本地主机后,他就能建立邮件文件夹,并将下载的邮件放入该文件夹中。然后Bob可以删除报文,在文件夹之间移动报文,并查询报文。
POP3的不足:
但是这种文件夹和报文存放在本地主机上的方式,会给移动用户带来问题,因为他更喜欢使用一个在远程服务器上的层次文件夹,这样他可以从任何一台机器上对所有报文进行访问。POP3不可能做到这一点,POP3协议没有给用户提供任何创建远程文件夹并为报文指派文件夹的方法。
为了解决这个或其他一些问题,由RFC 3501定义的因特网邮件访问协议(IMAP)应运而生。和POP3一样, IMAP是一个邮件访问协议,但是它比POP3具有更多的特色,不过也比POP3复杂得多。
IMAP服务器把每个报文与一个文件夹联系起来;当报文第一次到达服务器时,它与收件人的INBOX文件夹相关联。收件人则能够把邮件移到一个新的、用户创建的文件夹中,阅读邮件,删除邮件等。IMAP协议为用户提供了创建文件夹以及将邮件从一个文件夹移动到另一个文件夹的命令。IMAP还为用户提供了在远程文件夹中查询邮件的命令,按指定条件去查询匹配的邮件。值得注意的是,与POP3不同,IMAP 服务器维护了IMAP会话的用户状态信息(POP3是无状态的,IMAP是有状态的),例如,文件夹的名字以及哪些报文与哪些文件夹相关联。
IMAP的另一个重要特性是它具有允许用户代理获取报文组件的命令。例如,一个用户代理可以只读取一个报文的报文首部,或只是一个多部分MIME报文的一部分。当用户代理和其邮件服务器之间使用低带宽连接的时候,这个特性非常有用(如一个低速调制解调器链路)。使用这种低带宽连接时,用户可能并不想取回他邮箱中的所有邮件,尤其要避免可能包含如音频或视频片断的大邮件。
因特网上的主机和人类一样,可以使用多种方式进行标识。主机的一种标识方法是用它的主机名(hostname)。然而,主机名几乎没有提供(即使有也很少)关于主机在因特网中位置的信息。(以国家码.fr结束,告诉我们该主机很可能在法国,仅此而已)况且,因为主机名可能由不定长的字母数字组成,路由器难以处理。由于这些原因,主机也可以使用所谓IP地址(IP address)进行标识。
一个IP地址由4个字节组成,并有着严格的层次结构。例如121.7.106.83这样一个IP地址,其中的每个字节都被句点分隔开来,表示了0~255的十进制数字。我们说IP地址具有层次结构,是因为当我们从左至右扫描它时,我们会得到越来越具体的关于主机位于因特网何处的信息(即在众多网络的哪个网络里)。
我们刚刚看到了识别主机有两种方式,通过主机名或者IP地址。人们喜欢便于记忆的主机名标识方式,而路由器则喜欢定长的、有着层次结构的IP地址。为了折衷这些不同的偏好,我们需要一种能进行主机名到IP地址转换的目录服务。这就是域名系统(Domain Name System,DNS)的主要任务。
DNS是:
- 一个由分层的DNS服务器(DNSserver)实现的分布式数据库;
- 一个使得主机能够查询分布式数据库的应用层协议。
DNS:通过客户—服务器模式提供的重要网络功能
与HTTP、FTP 和SMTP协议一样,DNS协议是应用层协议,其原因在于:
- 使用客户—服务器模式运行在通信的端系统之间;
- 在通信的端系统之间通过下面的端到端运输协议来传送DNS报文。
然而,在其他意义上,DNS的作用非常不同于Web应用、文件传输应用以及电子邮件应用。与这些应用程序不同之处在于,DNS不是一个直接和用户打交道的应用。相反,DNS是为因特网上的用户应用程序以及其他软件提供一种核心功能,即将主机名转换为其背后的IP地址。因特网体系结构的复杂性大多数位于网络的“边缘”。DNS通过采用了位于网络边缘的客户和服务器,实现了关键的名字到地址转换功能,它还是这种设计原理的另一个范例。
DNS通常是由其他应用层协议所使用的,包括HTTP、SMTP和FTP,将用户提供的主机名解析为IP地址。举一个例子,考虑当某个用户主机上的一个浏览器(一个HTTP客户)请求URL www.someschool.edu/index.html页面时会发生什么现象。为了使用户的主机能够将一个HTTP请求报文发送到Web服务器www.someschool.edu,该用户主机必须获得www.someschool.edu的IP地址。其做法如下:
DNS会给使用它的因特网应用带来了额外的时延,有时还相当可观。想获得的IP地址通常就缓存在一个“附近的”DNS服务器中,这有助于减少DNS的网络流量和DNS的平均时延。
四个要素构成了DNS
- 域名空间:DNS使用一个树状结构的名称空间来识别互联网上的资源。
- DNS数据库:名称空间树中的每个节点/叶命名一组信息,这些信息包含在一个资源记录(RR)中。所有RR的集合被组织到一个分布式数据库。
- 名称服务器:服务器程序,持有关于域名树结构的一部分和相关RR的信息。
- 调解器:这些是响应客户请求而从名称服务器中提取信息的程序。
域名:
- 不区分大小写
- 每个成分最多可以有63个字符
- 每个路径最多可以有255个字符
- 可以国际化(自1999年起):造成安全问题
命名惯例通常遵循组织或物理边界,例如:
- au.ibm.com / uk.ibm.com(用于电子邮件)
- ibm.com.au / ibm.co.uk(用于网络)
资源记录实例:
绝对域名以". "结尾。
相对应的域名以一个成分结尾,例如:.com
分区:
- DNS名称空间被划分为重叠的区域。名称服务器对该地区具有权威性:通常一个区有两个名称服务器
- 名称服务器以分层的方式排列,从一组根服务器延伸出来
根名称服务器:
- 根服务器构成查询的权威集群。无法解析名称的本地名称服务器与根服务器联系。
- 全球共有13个"根名称服务器"。
- 一个"根服务器"可能是一个地理上分散的服务器集群:F-ROOT 252个站点;J-ROOT 162个站点
顶级域域名服务器:负责 com,org,net,edu 等,以及所有顶级国家域名 uk,fr,au,jp。
权威 DNS 服务器:组织 DNS 服务器,为组织服务器(例如 Web、邮件)提供权威的主机名到 IP 映射。
本地 DNS 服务器:通常,每个 ISP(住宅 ISP,公司,大学)都有一个“默认名称服务器”来处理 DNS 查询
一个解析器客户端向本地DNS询问域名到IP的映射。
查询受制于定时器,以避免超过必要的响应时间。
硬编码映射
本地DNS供应商
例子:
# ad blocking
原始设计中没有安全性
解决方案