在一个典型的FTP对话中,用户使用一台主机向一台远程主机传输(或接收)文件。为了使能够访问它的远程账户,用户必须提供一个用户标识和口令。如下图所示:
用户通过一个FTP用户代理与FTP进行交互。用户首先提供远程主机的主机名,使本机的FTP客户进程创建一个到远程主机FTP服务器的TCP连接。然后再提供用户标识和口令,这是作为FTP命令的一部分在TCP连接上传送。一旦服务器授权,用户就可以将本地文件复制到远程文件系统。
FTP与HTTP都是文件传输协议,运行在TCP上,但是二者也有区别:
对于FTP传输而言,控制连接在整个用户会话期间一直存在,但是会话中的每一次文件传输都要建立一个新的数据连接(非持续)
因特网电子邮件系统由3个主要部分组成:用户代理,邮件服务器和简单邮件传输协议(SMTP)。如下图所示:
以用户A向用户B发送邮件为例:
通过A向B发送简单的ASCII报文来描述SMTP的基本操作:
SMTP一般不使用中间邮件服务器,即A在中国,B在美国,TCP连接也是直接相连的。
通过A的用户代理和B的邮件服务器间没有直接的SMTP对话。如图所示:
A的用户代理使用SMTP将报文推入它的邮件服务器,邮件服务器再用SMTP将邮件中继到B的邮件服务器。值得注意的是,B的用户代理不能使用SMTP取回报文,因为取报文是拉操作,而SMTP是推协议。这时引入特殊的邮件访问协议,如第三版的邮局协议(POP3),因特网邮件访问协议(IMAP)和HTTP。
POP3是一个极为简单的邮件访问协议。当用户代理打开一个到邮件服务器端口110上的TCP连接后,POP3开始工作。POP3按三个阶段进行工作:特许,事务处理和更新:
POP3服务器会保留一些状态信息,比如记录哪些报文被标记为删除,但是POP3服务器不会在POP3会话中携带状态信息。
使用远程服务器上的层级文件夹,可以使任何一台机器对所有报文进行访问。而POP3是没有提供该方法的,与POP3不同:
使用该服务时,用户代理就是普通的浏览器。A用户与它的邮件服务器间的通信通过HTTP进行,B拉取邮件时不再使用POP3或IMAP了,而是使用HTTP,但是邮件服务器间的通信还是用SMTP。
主机和人一样有着多种方式进行标识。一种标识方法是用主机名(如:www.baidu.com),但是主机名几乎没提供主机在因特网中的位置信息,并且路由器难以处理主机名的字母和数字。所以主机也可用IP地址标识,IP地址有层次结构,当从左向右扫描它时会得到越来越具体的关于主机位于因特网何处的信息。
人更喜欢主机名标识,而路由器喜欢IP地址,所以需要能将主机名转换为IP地址的目录服务,这就是**域名系统(DNS)**的主要任务。
DNS是:
DNS通常由其他应用层协议所使用,比如当浏览器请求www.psj.com/index.html时,为了使用户主机能够将该HTTP请求发送到Web服务器上,必须有www.psj.com的IP地址。方法如下:
DNS还提供其他主要服务:
基本的工作流程已在上一小节中介绍,注意所有DNS请求和回答报文使用UDP数据报经53号端口发送。如果DNS只使用一个DNS服务器,该服务器有所有的映射,尽管简单,但是有着许多的问题,简要说就是没有可扩展性:
如图所示:
为处理扩展性问题,DNS使用大量以层次方式组织,分布在世界范围内的DNS服务器,有3种类型服务器:根DNS服务器,顶级域(TLD)DNS服务器和权威DNS服务器。
还有一种重要的DNS:本地DNS服务器,严格来说它并不属于该服务器的层次结构。每个ISP(如一所大学,一个公司)都有一台本地DNS服务器。当主机发出DNS请求时,该请求被发往本地DNS服务器,它起着代理的作用,并将该请求转发到DNS服务器层次结构中。如图所示:
假设A主机cis.poly.edu想知道B主机gaia.cs.umass.edu的IP地址。A主机所在ISP的本地DNS服务器为dns.poly.edu,B主机的权威DNS服务器为dns.umass.edu。
其中,步骤③是根域名服务器注意到报文中要查询主机名gain.cs.umass.edu的edu前缀,然后它向本地DNS服务器返回负责edu的TLD的IP地址列表。步骤⑤是其中一台TLD服务器注意到umass.edu前缀,并用权威DNS服务器的IP地址进行响应。步骤⑦则是B的权威DNS服务器返回B主机的IP地址进行响应。
整个过程一共发送了8份DNS报文,后面介绍的DNS缓存可减少这种查询流。
图中的例子利用了递归查询和迭代查询。A主机发给本地DNS的查询是递归查询,因为该查询请求是以本地DNS自己名义获取映射。后面3个查询是迭代查询,因为所有回答都是直接返回给本地DNS服务器。
在第二种查询中,所有的查询都是递归的,实际中,通常为第一种查询。第二种查询如下图所示:
为改善时延性能并减少传输的DNS报文数,DNS广泛使用了缓存技术。当DNS服务器接收到一个DNS回答时,它能将该信息缓存到本地存储器,方便下次查询。由于主机和主机名的IP地址映射不是永久的,DNS服务器在一段时间后将丢弃缓存信息。本地服务器也能缓存TLD服务器的IP地址,因而允许本地DNS绕过根DNS服务器。
实现DNS分布式数据库的所有DNS服务器存储了资源记录(RR),RR提供了主机名到IP地址的映射。每个DNS回答报文包含了一条或多条资源记录。资源记录是一个包含了下列字段的4元组:(Name, Value, Type, TTL)
TTL:该记录的生存时间,决定了资源记录应当从缓存中删除的时间。
Name,Value:这两个的值取决于Type:
DNS只有DNS查询报文和回答报文,并且这两种报文有着相同的格式。DNS报文中各字段的语义如下图所示:
当你向某些注册登记机构注册域名psj.com时,需要向该机构提供你的基本和辅助权威DNS服务器的名字和IP地址。对这两个权威DNS服务器的每一个,该机构确保将一个类型NS和一个类型A的记录输入TLD服务器。
之前描述的应用如Web,电子邮件和DNS都采取了客户-服务器体系结构,极大地依赖基础设施服务器。而使用P2P体系结构,总是对打开的基础设施服务器有最小(或者没有)依赖。成对间歇连接的主机(称为对等方)彼此间直接通信,不为服务提供商所拥有。
考虑从单一服务器向大量主机(称为对等方)分发一个大文件的应用。在客户-服务器文件分发中,该服务器必须向每个对等方发送该文件的一个副本,服务器承受了极大的负担,且消耗了大量的服务器带宽。在P2P文件分发中,每个对等方能够重新分发它所有的该文件的任何部分,从而在分发过程中协助该服务器,即对等方除了是比特的消费者还是它们的重新分发者,这也使得P2P体系结构的应用程序能够是自扩展的。