本文为阅读总结个人认为书里概念性的、对本人有帮助的内容,仅供参考。
网络应用是计算机网络存在的理由,如果我们不能构想出任何有用的应用,也就没有任何必要去设计支持它们的网络协议了。
研发网络应用程序的核心是写出能够运行在不同的端系统和通过网络彼此通信的程序。
当进行软件编码之前,应当对应用程序有一个宽泛的体系结构计划。
从应用程序研发者的角度看,网络体系结构是固定,并为应用程序提供了特定的服务集合。
应用程序体系结构由应用程序研发者设计,规定了如何在各种端系统上组织该应用程序。
现代网络应用程序中所使用的两种主流体系结构之一:客户-服务器体系结构或对等(peer-to-peer,P2P)体系结构。
在客户-服务器体系结构中,有一个总是打开的主机称为服务器,它服务于来自许多其他称为客户的主机的请求。在该体系结构中,客户相互之间不直接通信;该体系结构的另一个特征是该服务器具有固定的、周知的地址,该地址称为IP地址。
在客户-服务器应用中,常常会出现一台单独的服务器主机跟不上它所有客户请求的情况。
在一个P2P体系结构中,对位于数据中心的专用服务器有最小的(或者没有)依赖。相反,应用程序在间断连接的主机对之间使用直接通信,这些主机对被称为对等方。
许多目前流行的、流量密集型应用都是P2P体系结构的,包括文件共享、对等方协助下载加速器(迅雷)、因特网电话(skype)、IPTV(迅雷看看)。
P2P体系结构的最引人入胜的特性之一是它们的自扩展性。
在操作系统的术语中,进行通信的实际上时进程而不是程序。在两个端系统上的进程,通过跨越计算机网络交换报文而相互通信。
网络应用程序由成对的进程组成,这些进程通过网络相互发送报文。对每对通信进程,我们通常将这两个进程之一标识为客户,而另一个进程标识为服务器。
我们定义客户和服务器进程如下:在给定的一对进程之间的通信会话场景中,发起通信(即在该会话开始时发起与其他进程的联系)的进程被标识为客户,在绘画开始时等待联系的进程时服务器。
进程通过一个称为套接字(socket)的软件接口像网络发送报文和从网络下载报文。
套接字是同一台主机内应用层和传输层之间的接口。由于该套接字是建立网络应用程序的可编程接口,因此套接字也称为应用程序和网络之间的应用程序编程接口(Application Programming Interface,API)。
应用程序开发者可以控制套接字在应用层端的一切,但是对该套接字的运输层端几乎没有控制权。应用程序开发者对于运输层的控制权仅限于:1、选择运输层协议;2、也许能设定几个运输层参数,如最大缓存和最大报文段长度等。
一台主机上运行的进程为了向另一台主机上运行的进程发送分组,接收进程需要有一个地址。为了标识该接收进程,需要定义两种信息:1、主机的地址;2、定义在目的主机中的接收进程的标识符。
在因特网中,主机由其IP地址标识。IP地址是一个32比特的量且它能够唯一地标识该主机。
目的主机的端口号用于标识运行在接收主机上的接收进程。
包括因特网在内的很多网络提供了不止一种运输层协议。当开发一个应用时,必须选择一种可用的运输层协议。
一个运输层协议能够为调用它的应用程序提供的服务大体从四个方面分类:可靠的数据传输、吞吐量、定时、安全性。
如果一个协议确保应用程序一段发送的数据正确、完全地交付给该应用程序的另一端,就认为该协议提供了可靠数据传输。
当一个运输层协议不提供可靠数据传输时,由发送进程发送的某些数据可能不能够到达接收进程。这可能能被容忍丢失的应用所接受。
运输层协议能够以某种特定的速率提供确保的可用吞吐量。
具有吞吐量要求的应用程序被称为贷款敏感的应用。
带宽敏感的应用具有特定的吞吐量要求,而弹性应用能够根据情况或多或少地利用可供使用的吞吐量。
运输层协议能够为应用程序提供一种或多种安全性服务。
运输协议除了提供机密性的安全服务以外,还提供了包括数据完整性和端点鉴别的其他安全服务。
因特网(更一般的是TCP/IP网络)为应用程序提供两个运输层协议:UDP和TCP。
TCP服务模型包括面向连接服务和可靠数据传输服务。
- 面向连接的服务:在应用层数据报文开始流动前,TCP让客户和服务器互相交换运输层控制信息。这个所谓握手过程提示客户和服务器,使它们为大量分组的到来做好准备。在握手阶段后,一个TCP连接就在两个进程的套接字之间建立了。这条连接时双全工的,即连接双方的进程可以在次连接上同时进行报文收发。当应用程序结束报文发送时,必须拆除该连接。
- 可靠的数据传送服务:通信进程能够依靠TCP,无差错、按适当顺序交付所有发送的数据。当应用程序的一端将字节流传进套接字时,它能够依靠TCP将相同的字节流交付给接收方的套接字,而没有字节的丢失和冗余。
TCP协议还具有拥塞控制机制,这种服务不一定能为通信进程带来直接的好处,但能为因特网带来整体好处。
TCP拥塞控制也试图限制每个TCP连接,使它们达到公平共享网络宽带的目的。
无论TCP还是UDP都没有提供任何加密机制,这就是说发送进程传进其套接字的数据,与经网络传送到目的进程的数据相同。
安全套接字层(Secure Socket Layer,SSL)。用SSL加强后的TCP不仅能够做传统TCP所作的一切,而且提供了关键的进程到进程的安全性服务,包括加密、数据完整性和端点鉴别。
SSL不是与TCP和UDP在相同层次上的第三种因特网运输协议,而是一种对TCP的加强,这种强化是在应用层上实现的。
UDP是一种不提供不必要服务的轻量级运输协议,它仅提供最小服务。
UDP是无连接的,因此在两个进程通信前没有握手过程。
UDP协议提供一种不可靠数据传输服务,也就是说,当进程将一个报文发送仅UDP套接字时,UDP协议并不保证该报文将到达接收进程。不仅如此,到达接收进程的报文也可能时乱序到达的。
UDP没有包括拥塞控制机制。
应用层协议定义了运行在不同端系统上的应用程序进程如何相互传递报文。特别是应用层协议定义了:1、交换的报文类型(请求报文,响应报文);2、各种报文类型的语法(报文中的各个字段及这些字段是如何描述的);3、字段的语义(字段包含信息的含义);4、一个进程何时以及如何发送报文,对报文进行响应的规则。
有些应用层协议是由RFC文档定义的,因此它们位于公共域中。
区分网络应用和应用层协议是很重要的。应用层协议只是网络应用的一部分。
应用 | 应用层协议 | 支撑的运输协议 |
电子邮件 | SMTP [RFC 5321] | TCP |
远程终端访问 | Telnet [RFC 854] | TCP |
Web | HTTP [RFC 2616] | TCP |
文件传输 | FTP [RFC 959] | TCP |
流式多媒体 | HTTP | TCP |
因特网电话 | SIP [RFC 3261]、RTP [RFC 3550] 或专用的(如skype) | UDP或TCP |
本章中详细讨论5种重要的应用:Web、文件传输、电子邮件、目录服务、P2P。
Web是一个引起公众注意的因特网应用,它极大地改变了人们与工作环境内外交流的方式。
也许对大多数用户来说,最具有吸引力的就是Web的按需操作。
Web的应用层协议是HTTP(超文本传输协议)。它是Web的核心,在[RFC 1945]和[RFC 2616]中进行了定义。
HTTP由两个程序实现:客户程序、服务器程序。客户程序和服务器程序运行不同的端系统中,通过交换HTTP报文进行会话。
HTTP定义了这些报文的结构以及客户和服务器进行报文交换的形式。
Web页面是由对象组成的,一个对象只是一个文件,如一个HTML文件、一个JEPG文件、一个Java小程序等,且它们可通过一个URL地址寻址。
每个URL地址由两部分组成:存放对象的服务器主机名和对象的路径。
HTTP定义了Web客户向Web服务器请求Web页面的方式,以及服务器向客户传送Web页面的方式。
HTTP使用TCP作为它的支撑运输协议。
服务器向客户发送被请求的文件,而不存储任何关于该客户的状态信息。
因为HTTP服务器不保存关于客户的任何信息,所以我们说HTTP是一个无状态协议。
非持续连接:客户发出一系列请求并且服务器对每个请求进行响应,每个请求/相应对经一个单独的TCP连接发送。
持续连接:客户发出一系列请求并且服务器对每个请求进行响应,所有的请求及响应经相同的TCP连接发送。
在非持续连接中,每个TCP连接咋服务器发送一个对象后关闭,即该连接并不为其他的对象而持续下来。每个TCP连接只传输一个请求报文和一个响应报文。
往返时间(Round-Trip Time,RTT):一个短分组从客户到服务器后再返回客户所花费的时间。
非持续连接有一些缺点:1、必须为每一个请求的对象建立和维护一个全新的连接,对每个这样的连接,在客户和服务器中都要分配TCP的缓冲区和保持TCP变量,这给Web服务器带来了严重的负担;2、每一个对象经受两倍RTT的交付时延,即一个RTT用于创建TCP,另一个RTT用于请求和接收一个对象。
采用持续连接的情况下,服务器在发送响应后保持该TCP连接打开。在相同的客户与服务器之间的后续请求和响应报文能够通过相同的连接进行传送。
一般来说,如果一条连接经过一定时间间隔仍未被使用,HTTP服务器就关闭该连接。
HTTP报文有两种:请求报文和响应报文。
HTTP请求报文的第一行叫做请求行,其后继的行叫做首部行。
请求行有3个字段:方法字段、URL字段、HTTP版本字段。
方法字段:GET、POST、HEAD、PUT、DELETE。
绝大部分的HTTP请求报文使用GET方法。
使用POST报文时,用户仍可以向服务器请求一个Web页面,但Web页面的特定内容依赖于用户在表单字段中输入的内容。
用表单生成的请求报文不是必须使用POST方法。
HEAD方法类似于GET方法。当服务器收到使用HEAD方法的请求时,将会用一个HTTP报文进行响应,但是并不返回请求对象。应用程序开发者常用HEAD方法进行调试跟踪。
PUT方法常与Web发行工具联合使用,它允许用户上传对象到指定的Web服务器上指定的路径。
DELETE方法允许用户或者应用程序删除Web服务器上的对象。
响应报文有三个部分:初始状态行、首部行、实体体(entity body)。
实体体部分是报文的主要部分,即它包含了所请求的对象本身。
状态行:协议版本字段、状态码、相应状态信息。状态码及其相应的短语指示了请求的结果。
常见状态码和相关短语:200 OK(请求成功,信息返回在响应报文中)、301 Moved Permanently(请求的对象已被永久转移,新的URL定义在响应报文的Location:首部行中。客户软件将自动获取新的URL。)、400 Bad Request(一个通用差错代码,指示该请求不能被服务器理解。)、404 Not Found(被请求的文档不在服务器上)、505 HTTP Version Not Supported(服务器不支持请求报文使用HTTP协议版本。)
一个Web站点通常希望能够识别用户,可能是因为服务器希望限制用户访问,或者因为它希望把内容与用户身份联系起来。为此,HTTP使用了cookie。cookie在[RFC 6265]中定义,它允许站点对用户进行跟踪。
cookie技术有4个组件:1、在HTTP响应报文中的一个cookie首部行;2、在HTTP请求报文中的一个cookie首部行;3、在用户端系统中保留一个cookie文件,并由用户的浏览器进行管理;4、位于Web站点的一个后端数据库。
cookie可以用于标识一个用户。
尽管cookie常常能简化用户的因特网购物活动,但是它的使用仍具有争议,因为它们被认为是对用户隐私的一种侵害。
Web缓存器也叫代理服务器,它是能够代表初始Web服务器来满足HTTP请求的网络实体。
Web缓存器既是服务器又是客户。当它接收浏览器的请求并发回响应时,它时一个服务器。当它向初始服务器发出请求并接收响应时,它是一个客户。
在因特网上部署Web缓存器有两个原因:1、Web缓存器可以大大减少对客户请求的响应时间,特别是当客户与初始服务器之间的瓶颈带宽远低于客户与Web缓存器之间的瓶颈带宽时更是如此。2、Web缓存器能够大大减少一个机构的接入链路到因特网的通信量。通过减少通信量,该机构就不必基于增加带宽,因此降低了费用。Web缓存器能从整体上大大降低因特网上的Web流量,从而改善了所有应用的性能。
通过内容分发网络(Content Distribution Network,CDN),Web缓存器正在因特网在发挥着越来越重要的作用。
条件GET方法:1、请求报文使用GET方法;并且 2、请求报文中包含一个“If-Modified-Since:”首部行。
HTTP和FTP都是文件传输协议,并且有很多共同的特点。例如,它们都运行在TCP上。然而这两个应用层协议也有一些重要的区别。
FTP使用了两个并行的TCP连接来传输文件,一个是控制连接,一个是数据连接。
控制连接用于在两主机之间传输控制信息,如用户标识、口令、改变远程目录的命令以及“存放(put)”和“获取(get)”文件的命令。
数据连接用于世纪发送一个文件。
因为FTP协议使用一个独立的控制连接,所以我们也称FTP的控制信息是带外(out-of-band)传送的。相对的,HTTP也可以说是带内(in-band)发送控制信息的。
对FTP传输而言,控制连接贯穿了整个用户会话期间,但是对会话中的每一次文件传输都需要建立一个新的数据连接(即数据连接是非持续的)。
FTP服务器必须在整个会话期间保留用户的状态。特别是,服务器必须把特定的用户账户与控制连接联系起来,随着用户在远程目录树上徘徊,服务器必须追踪用户在远程目录树上的当前位置。
从客户到服务器的命令和从服务器到客户的回答,都是以7比特ASCII格式在控制连接上传送的。
FTP一些较为常见的命令如下:USER(用于向服务器传送用户标识)、PASS(用于向服务器发送用户口令)、LIST(用于请求服务器回送当前远程目录中的所有文件列表)、RETR(用于从远程主机当前目录检索文件)、STOR(用于在远程主机的当前目录上存放文件)。
电子邮件是当今因特网最重要和实用的应用程序之一。
电子邮件系统的3个主要组成部分:用户代理、邮件服务器和简单邮件传输协议(Simple Mail Transfer Protocol,SMTP)。
邮件服务器形成了电子邮件体系结构的核心。
SMTP是因特网电子邮件中主要的应用层协议。它使用TCP可靠数据传输服务,从发送方的邮件服务器向接收方的邮件服务器发送邮件。
SMTP有两个部分组成:运行在发送方邮件服务器的客户端和运行在接收方邮件服务器的服务器端。
SMTP是因特网电子邮件应用的核心。
尽管电子邮件应用在因特网上的独特地位可以证明SMTP有着众多非常出色的性质,但它所具有的某种陈旧特征表明它仍然是一种继承的技术。例如,它限制所有邮件报文的体部分只能采用简单的7比特ASCII表示。
SMTP一般不使用中间邮件服务器发送邮件,即使这两个邮件服务器距离很远也是这样。两个邮件服务器直接相连,如果接收邮件服务器没有开机,则报文会保留在发送邮件服务器上等进行新的尝试。
SMTP使用持续连接:如果发送邮件服务器有几个报文发往同一个接收邮件服务器,它可以通过同一个TCP连接发送这些所有的报文。
HTTP和SMTP对比:1、均用于从一台主机向另一台主机传送文件(HTTP:Web服务器向Web客户传送对象;SMTP:一个邮件服务器向另一个邮件服务器传送报文);2、都使用持续连接;3、HTTP主要是一个拉协议(pull protocol),而SMTP基本上是一个推协议(push protocol);4、SMTP要求报文必须使用7比特ASCII码格式,而HTTP没有这个要求;5、对于如何处理既包含文本又包含图形的文档,HTTP把每个对象封装到它自己的HTTP响应报文中,而SMTP则把所有保温对象放在一个报文中。
目前有一些流行的邮件访问协议:第三版的邮局协议(Post Office Protocol-Version 3,POP3)、因特网邮件访问协议(Internet Mail Access Protocol,IMAP)、HTTP。
SMTP用于将邮件从发送方的用户代理传输到发送方的邮件服务器,且从发送方的邮件服务器传输到接收方的邮件服务器;邮件访问协议用于将邮件从接收方的邮件服务器转送到接收方的用户代理。
POP3的hi一个极为简单的邮件访问协议,因此其功能相当有限。
POP3按照三个阶段进行工作:特许、事务处理、更新。第一阶段:用户代理发送用户名和口令以鉴别用户。第二阶段:用户代理取回报文,同时可对报文做删除标记、取消报文删除标记、获取邮件的统计信息。第三阶段:客户发出quit命令后,结束该POP3对话,这是该邮件服务器删除那些被标记删除的报文。
POP3协议没有给用户提供任何创建远程文件夹并为报文指派文件夹的方法。
IMAP服务器把每个报文与一个文件夹联系起来;当报文第一次到达服务器时,它与收件人的INBOX文件夹相关联。
IMAP协议为用户提供了创建文件夹以及将邮件从一个文件夹移动到另一个文件夹的命令。IMAP还为用户提供了在远程服务器中查询邮件的命令,按指定条件去查询匹配的邮件。
与POP3不同,IMAP服务器维护了IMAP会话的用户状态信息。
IMAP允许用户代理获取报文组件的命令。
域名系统(Domain Name System,DNS)能进行主机名到IP地址转换的目录服务:1、一个由分层的DNS服务器实现的分布式数据库;2、一个使得主机能够查询分布式数据库的应用层协议。
DNS协议运行在UDP之上,使用53号端口。
DNS通常是由其他应用层协议所使用的,包括HTTP、SMTP、FTP,将用户提供的主机名解析为IP地址。
除了进行主机名到IP地址的转换外,DNS还提供了一些重要服务:主机别名、邮件服务器别名、负载分配。
从用户主机上调用应用程序的角度看,DNS是一个提供简单、直接的转换服务的黑盒子。但事实上,实现这个服务的黑盒子非常复杂,它由分布于全球的大量DNS服务器以及定义了DNS的服务器与查询主机通信方式的应用层协议组成。
事实上,DNS是一个在因特网上实现分布式数据库的精彩范例。
为了处理扩展性问题,DNS使用了大量的DNS服务器,它们以层次方式组织,并且分布在全世界范围内。
大致来说,有3种类型的DNS服务器:根DNS服务器、顶级域(Top-Level Domain,TLD)DNS服务器、权威DNS服务器。
尽管我们将根DNS服务器中的每个都视为单个的服务器,但每台“服务器”实际上是一个冗余服务器的网络,以提供安全性和可靠性。
顶级域DNS服务器负责顶级域名(com、org、net、edu、gov等)和多有国家的顶级域名(uk、fr、ca、jp等)。
在因特网上具有公共可访问主机的每个组织机构必须提供公共可访问的DNS记录,这些记录将这些主机的名字映射为IP地址。一个组织的权威DNS服务器收藏了这些DNS记录。
根、TLD和权威DNS服务器都处在该DNS服务器的层次结构中。
还有另一类重要的DNS,称为本地DNS服务器。
一个本地DNS服务器严格来说并不属于该服务器的层次结构,但它对DNS层次结构是重要的。每个ISP都有一台本地DNS服务器。
当主机发出DNS请求时,该请求被发往本地DNS服务器,它起着代理的作用,并将该请求转发到DNS服务器层次结构中。
实际上,为了改善时延性能并减少在因特网上到处传输的DNS报文数量,DNS广泛使用了缓存技术。
由于主机和主机名与IP地址间的映射并不是永久的,DNS服务器在一段时间后(通常设置为两天)将丢弃缓存的信息。
本地DNS服务器也恩公缓存TLD服务器的IP地址,因而允许本地DNS绕过查询链中的根DNS服务器(这经常发送)。
共同实现DNS分布式数据库的所有DNS服务器存储量资源记录(Resource Record,RR),RR提供了主机名到IP地址的映射。
资源记录是一个包含了下列字段的4元组:(Name,Value,Type,TTL)。
TTL是该记录的生存时间,它决定了资源记录应当从缓存中删除的时间。Name和Value的值取决于Type。
- 如果Type=A,则Name是主机名,Value是该主机名对应的IP地址。因此一条类型为A的资源记录提供了标准的主机名到IP地址的映射。
- 如果Type=NS,则Name是个域,而Value是个知道如何获得该域中主机IP地址的权威DNS服务器的主机名。
- 如果Type=CNAME,则Value是别名为Name的主机对于的规范主机名。
- 如果Type=MX,则Value是别名为Name的邮件服务器的规范主机名。
DNS查询和回答报文有相同的格式。
文件分发清晰地揭示了P2P体系结构的自扩展性。
BitTorrent是一种用于文件分发的流行P2P协议。
参与一个特定文件分发的所有对等方的集合被称为一个洪流。在一个洪流中的对等方彼此下载等长度的文件块(chunk),典型的块长度为256KB。
每个洪流具有一个基础设施结点,成为追踪器。当一个对等方加入某洪流时,它向追踪器注册自己,并周期性地通知追踪器它仍在该洪流中。
当一个新的对等方加入洪流时,追踪器随机地从参与对等方的集合中选择对等方的一个子集,并将该子集中对等方的IP地址发送给新加入的对等方。
我们称与某对等方成功建立TCP连接的对等方为“邻近对等方”。
分布式散列表(Distributed Hash Table,DHT)
研究表明,DHT能被设计称每个对等方的邻居数量以及每个请求的报文数量均为O(logN),其中N是对等方的数量。这种设计给出了使用网状和环形覆盖网络拓扑的两种极端解决方案之间的一种满意折中方案。
再P2P系统中,对等方能够不加警示地到来和离去。因此,当设计一个DHT时,我们也必须关注存在这种对等方扰动时维护DHT的情况。
我们要求每个对等方周期性地证实它的两个后继是存活的。
网络应用程序有两类。一类是实现在协议标准(如一个RFC或某种其他标准文档)中所定义的操作;这样的应用程序又称为“开放”的,因为定义其操作的这些规则人所共知。另一类网络应用程序是专用的网络应用程序;这种情况下,由客户和服务器程序应用的应用层协议没有公开发布在某RFC中或其他地方。
在研发阶段,开发者必须最先做的一个决定是,应用程序是运行在TCP上还是运行在UDP上。
在使用UDP套接字的两个通信进程之间的交互中,发送进程为分组附上的目的地址是由目的主机的IP地址和目的地套接字的端口号组成的。此外,发送方的源地址也是由源主机的IP地址和源套接字的端口号组成,该源地址也要附在分组上。
将源地址附在分组之上通常并不是UDP应用程序代码所为,而是由底层操作系统自动完成的。
与UDP不同,TCP是一个面向连接的协议。这意味着在客户和服务器能够开始互相发送数据之前,它们先要握手和创建一个TCP连接。TCP连接的一端与客户套接字相联系,另一端与服务器套接字相联系。
第一,与在UDP中的情况一样,TCP服务器在客户试图发起接触前必须作为进程运行起来。第二,服务器程序必须具有一扇特殊的门,更精确地说是一个特殊的套接字,该门欢迎来自运行在任意主机上的客户进程的某些初始接触。