计算机网络之应用层 - littleboy12580/learning_python GitHub Wiki
现代网络应用程序中有两种主流体系结构:客户机/服务器体系结构(C/S)和对等体系结构(P2P);
典型的例子是Web应用程序,在该体系中,客户机之间不直接通信;服务器具有固定的、周知的地址,称为IP地址。
对于一个流行的社会网站,若只有一台服务器来处理所有客户机请求,很快会变得不堪重负,因此在C/S体系中经常用主机群集(服务器场)创建强大的虚拟服务器;对于C/S体系而言,其应用服务通常是基础设施密集的
大多数流量密集型应用程序都是基于P2P体系的,例如文件分发、文件搜索/共享、因特网电话等等;P2P体系最突出的特性是其自扩展性;例如,在一个P2P文件共享应用中,尽管每个对等方都由请求文件产生负载,但每个对等方向其他对等方分发文件也为系统增加了服务能力;P2P通常不需要庞大的服务器基础设施和带宽
两个端系统进行通信,真正进行通信的其实是进程而不是程序;不同端系统上的进程通过跨越计算机网络交换报文而相互通信;
网络应用程序是由成对的进程组成的,对每对通信进程,通常将进程分为客户机和服务器,在Web中,浏览器是一个客户机进程,Web服务器是一个服务器进程;对于P2P文件共享,下载文件的对等方被视为客户机,上传文件的对等方被视为服务器;其具体定义为:在给定的一对进程之间的通信会话中,发起通信的进程被视为客户机,在会话开始时等待联系的进程是服务器
对于一对通信进程,进程通过被称为套接字的软件接口在网络上发送和接收报文;套接字是同一台主机内应用层与运输层之间的接口;由于该套接字是在网络上建立网络应用程序的可编程接口,因此也将该套接字称为应用程序和网络之间的应用程序编程接口(API);应用程序开发者可以控制套接字在应用层端的所有东西,但是对该套接字的运输层端几乎没有控制;应用程序开发者对于运输层的控制仅限于:1.选择运输层协议;2.设置一些运输层参数(如最大缓存,最大报文长度)
可以大体从四个方面对对应用程序服务要求进行分类:可靠数据传输、吞吐量、定时和安全性
在进程通信过程中,分组可能会在计算机网络中丢失(例如路由器缓存溢出或分组中某些比特损坏后被遗弃),对于一些应用,必须确保应用程序的一端发送的数据正确地、完全地交付给该应用程序的另一端;如果一个协议提供了这样的确保数据交付服务,则提供了可靠数据传输
两个进程在一条网络路径上进行通信会话时,可用吞吐量就是发送进程能够向接收进程交付比特的速率;由于其他会话将共享沿着该网络路径上的带宽,且这些会话都会到达和离开,因此可用吞吐量会随时间波动,由此也产生了运输层的另一种服务:运输层可以以某种特定速率提供确保的可用吞吐量,该服务保证了可用吞吐量总是至少为某个特定数值;具有吞吐量要求的应用程序称为带宽敏感的应用,与之对应的能够根据需要充分利用可供使用的带宽的应用程序被称为弹性应用
有些应用程序(如电视会议,因特网电话,多方实时游戏)为了有效性而对数据交付有严格的时间限制,此时可以选择提供定时保证服务的运输层协议
运输层可为应用程序提供一种或多种安全性服务,如在发送主机方加密发送进程传输的所有数据,在接收进程接收这些数据之前解密这些数据
目前因特网上的应用使用了两种运输层协议:TCP和UDP;在计算机网络之运输层里详解
对于两个通信的进程,发送进程需要定义两种信息来识别接收进程,即:
1. 该接收进程主机的名称或地址
2. 该接受进程的标识
在因特网中,主机用IP地址进行标识(在计算机网络之网络层里详解),发送进程通过端口号来识别目的主机上的接收进程;一些流行的应用程序有特定的端口号,例如Web服务进程默认80端口,邮件服务进程(使用SMTP协议的)默认25端口,当开发者创建一个新的应用程序时,必须为该应用程序分配一个新的端口号
应用层协议定义了运行在不同端系统上的应用程序进程如何相互传递报文,其定义了如下规范:
- 交换的报文类型,如请求报文和响应报文
- 各种报文类型的语法,如报文中的各个字段及其详细描述
- 字段的语义,即包含在字段中的信息的含义
- 进程何时,如何发送报文及对报文进行响应的规则
Web的应用层协议是超文本传输协议(HTTP),HTTP协议由两部分程序实现:一个客户机程序和一个服务器程序,他们运行在不同端系统中,通过交换HTTP报文进行会话;HTTP定义了这些报文的格式以及客户机与服务器是如何进行报文交换的;
Web页面是由对象组成的;对象简单来说就是文件,如HTML文件,JPEG文件,Java小程序或视频片段文件,这些文件可通过一个URL地址寻址;多数Web页面含有一个基本HTML文件以及几个引用对象;例如一个一个Web页面包含HTML文本和5个JPEG文件,那么这个Web就有6个对象;每个URL地址由两部分组成::存放对象的服务器主机名和对象的路径名;
HTTP使用TCP作为其运输层协议;服务器在向客户机发送被请求的文件时,并不存储任何关于该客户机的状态信息,即HTTP是一个无状态协议;有时为了能够使Web站点识别用户,可以使用cookie;
客户机向服务器发起请求的时候,应用程序的研发着需要确定每个请求/响应对是经一个单独的TCP连接发送,还是所有的请求/响应对都经相同的TCP连接发送;使用前者的被称为非持久连接,使用后者的被称为持久连接,一般默认方式下HTTP使用持久连接
一个典型的HTTP请求报文如下:
GET /somedir/page.html HTTP/1.1
Host: www.someschool.edu
Connection: close
User-agent: Mozilla/4.0
Accept-language: fr
HTTP请求报文的第一行叫做请求行,其后继的行叫做首部行;请求行有3个字段:方法字段、URL字段和HTTP协议版本字段;方法字段可以取值GET、POST、HEAD、 PUT和DELETE;
Host首部行定义了目标所在的主机(Web代理缓存需要);
Connection首部行值为close表示HTTP使用非持久连接 ;
User-agent首部行用来定义用户代理(即浏览器类型);
Accept-language首部行表示用户想要得到该对象什么语言版本
HTTP还有很多可选首部行,在此不细述;HTTP请求报文的通用格式如下所示:
该通用格式与前面的例子密切对应,其中使用GET方法时实体主体为空,使用POST方法时(例如用户提交一个表单)实体主体中包含的就是用户在表单字段中输入的值;当然,HTML表单经常使用GET方法,讲输入数据传送到正确的URL,例如一个表单使用GET方法,他有两个字段,分别填写monkeys和bananas,那么得到的URL结构为www.somesites.com/animalsearch?monkeys&bananas;HEAD方法类似与GET方法,党服务器收到使用HEAD方法的请求,会用一个HHTP报文进行响应,但是不返回请求对象;PUT方法一般用来向Web服务器上传对象;DELETE方法用来删除对象
针对上面的请求报文所产生的响应报文如下所示:
HTTP/1.1 200 OK
Connection: Close
Data: Thu, 03 Jul 2003 12:00:15 GMT
Server: Apache/1.3.0 (Unix)
Last-Modified: Sun, 6 May 2007 09:23:24 GMT
Content-Length: 6821
Content-Type: text/html
(data data data data data)
该响应报文同样分成3个部分:一个初始状态行,6个首部行,然后是实体主体;实体主体部分是报文的主体,包含了所请求的对象本身;状态行有3个字段:协议版本、状态码和相应状态信息;Date首部行表示服务器产生并发送该响应报文的日期和时间;Server首部行表示该报文是由什么服务器产生的(类似请求报文里的User-agent);Last-Modified首部行表示对象创建或者最后修改的日期和时间;Content-Length首部行表明了被发送对象的字节数;Content-Type首部行表示实体主体中的对象类型;HTTP响应报文的通用格式如下所示:
cookie的实现有4方面:
1. HTTP响应报文中有一个cookie首部行
2. HTTP请求报文中有一个cookie首部行
3. 在用户端系统中保留有一个cookie文件(由浏览器管理)
4. 在Web站点有一个后端数据库
一个cookie的使用的方式如下实例:
Web缓存器也叫代理服务器,是能够代表初始Web服务器来满足HTTP请求的网络实体;Web缓存器有自己的磁盘存储空间,并在该存储空间中保存最近请求过的对象的拷贝;Web缓存器可以大大减少对客户机请求的响应时间;
尽管高速缓存能减少用户感受到的响应时间,但也存在一个问题。即存放在缓存器中的对象拷贝可能是陈旧的;不过HTTP存在一种机制可以允许缓存器证实其对象是最新的:条件GET;一个条件GET请求报文需满足以下条件:1. 请求报文使用GET方法 2. 请求报文中包含一个If-modified-since首部行
在典型的FTP会话中, 用户通过本地主机向远程主机上传文件或从远程主机下载文件;为使用户能访问远程主机的账户,用户必须提供一个用户标识和口令,在提供了授权信息后,用户就能从本地文件系统向远程主机文件系统传送文件,反之亦然
FTP与HTTP都是文件传输协议,它们都运行在TCP上;但二者也有一些重要的区别,其中最显著的就是FTP使用两个并行的TCP连接来传输文件,一个是控制连接,一个是数据连接;控制连接用于在两个主机之间传输控制信息(如用户标识、口令、改变远程目录的命令以及 “put”, “get” 文件的命令 ),数据连接用于实际传输一个文件;
因为FTP协议使用一个分离的控制连接,所以我们也称FTP的控制信息是带外传送,相对的HTTP协议是在传输文件的TCP连接中发送请求和响应首部行的,因此HTTP可以说是带内发送控制信息的
当用户主机与远程主机开始一个FTP会话前,客户机首先在21号端口发起一个用于控制的与服务器的TCP连接;客户机通过该控制连接发送用户的标识和口令,也发送改变远程目录的命令;当服务器端从该连接上收到一个文件传输的命令后,就发起一个到客户机的数据连接,FTP在该数据连接上准确的传送一个文件并关闭该连接;如果在同一个会话期间,用户还需要传输另一个文件,FTP则打开另一个数据连接;即对于FTP而言,控制连接贯穿了整个用户会话期间,但针对会话中的每一次文件传输都需要建立一个新的数据连接(即数据连接是非持久的)
FTP服务器必须在整个会话期间保留用户的状态信息,而HTTP则是无状态的
- USER :用于向服务器传送用户标识
- PASS :用于向服务器传送用户口令
- LIST:用于请求服务器返回远程主机当前目录的所有文件列表(文件列表在数据连接上传送)
- RETR :用于从远程主机的当前目录检索文件
- STOR :用于向远程主机的当前目录存放文件
- 331 Username OK,Password required
- 125 Data connection already open;transfer starting
- 425 Can't open data connection
- 452 Error writing file
因特网电子邮件系统有3个主要组成部分:用户代理、邮件服务器和简单邮件传输协议;用户代理允许用户阅读、回复、转发和撰写报文;邮件服务器组成了电子邮件体系结构的核心;SMTP则是因特网电子邮件中的主要应用层协议(使用TCP传输);一个典型的邮件发送过程是:从发送方的用户代理开始,传输到发送方的邮件服务器(使用SMTP协议),再传输到接收方的邮件服务器(使用SMTP协议),然后在这里被分发到接收方的邮箱里(POP3或IMAP)
SMTP有两个部分,运行在发送方邮件服务器的客户机端和运行在接收方邮件服务器的服务器端;每个邮件服务器上既有SMTP的客户机端运行也有SMTP的服务器端运行;当一个邮件服务器向其他邮件服务器发送邮件时,它就表现为SMTP客户机,当邮件服务器从其他邮件服务器上接收邮件时,它就表现为SMTP服务器
首先,SMTP客户机在25号端口建立一个到服务器的TCP连接,如果服务器未开机,客户机会在稍后继续尝试连接;一旦连接建立,服务器与客户机就执行一些应用层的握手,在SMTP握手的阶段,客户机指名发送方的邮件地址和接收方的邮件地址;一旦该SMTP客户机和服务器彼此介绍后,客户机就发送该报文,使用TCP将邮件传输到接收服务器(该连接是持久的)
二者都使用持久连接;但是HTTP是一个拉协议,即客户端使用HTTP从服务器拉取信息,TCP连接是由想获取文件的机器发起的;而SMTP是一个推协议,即发送邮件服务器把文件推向接收邮件服务器,TCP连接是由要发送文件的机器发起的;
SMTP要求每个报文(包括主体部分)都使用7位ASCII码格式,若某报文包含了非7位ASCII码或二进制数据,则该报文必须按照7位ASCII码进行编码;HTTP数据则没有此限制
报文有主体和首部行;首部行由RFC 822定义,每个首部行都必须含有一个From:首部行和一个To:首部行,可以包含一个Subject:首部行或其他可选首部行
为了发送非ASCII文本的内容,发送方的用户代理必须在报文中使用附加的首部行,其中MIME(多用途因特网邮件扩展)中就有一些支持多媒体的首部
- Content-Type:首部行:允许接收用户代理对报文采取适当的动作;例如通过指出报文主体包含一个JPEG图形,接收用户代理可以为报文主体启用一个JPEG图形的解压缩程序
- Content-Transfer-Encoding:首部行:提示接收用户代理该报文主体已经使用了ASCII编码,并指出所用编码类型
接收服务器一旦接收到具有RFC 822和MIME首部行的报文,就在该报文的顶部添加一个Received:首部行,该首部行定义了发送该报文的服务器名称(from),接受该报文的服务器名称(by),以及接收服务器接收到的时间
因为接收方上的用户代理从邮件服务器上取到其邮件是一个拉操作,而SMTP协议是一个推协议,因此需要邮件访问协议来解决该问题,目前比较流行的邮件访问协议有POP3、IMAP和HTTP
当用户代理(客户机)打开了一个到服务器端口110上的TCP连接后,POP3就开始工作;随着TCP连接的创建,POP3按照三个阶段进行工作:特许,事务处理以及更新;在特许阶段,用户代理发送(以明文形式)用户名和口令以鉴别用户;在事务处理阶段用户代理取回报文,在该阶段用户代理还能进行如下操作:对报文做删除标记、取消报文删除标记以及获取邮件的统计信息;更新阶段出现在客户机发出了quit()命令之后,目的是结束POP3会话,此时邮件服务器会删除那些被标记为删除的报文
IMAP相比于POP3具有更多功能。IMAP服务器把每个报文和一个文件夹相联系,当报文第一次到达服务器时,它会被放到收件人的收件箱文件夹里;收件人可以把邮件移动到一个新的、用户创建的文件夹中、或阅读邮件、删除邮件等;IMAP协议为用户提供了创建文件夹以及在文件夹之间移动邮件的命令,IMAP还为用户提供了在远程文件夹中查询邮件的命令,按指定条件去查询匹配的邮件;与POP3不同的是,IMAP服务器维护了IMAP会话的用户状态信息
IMAP的另一个重要特性是它具有允许用户代理获取报文组件的命令;例如用户代理可以只读取一个报文的报文首部,或只是一个多方MIME报文的一部分
对于基于Web的电子邮件,用户代理就是浏览器,用户和其远程邮箱之间的通信则通过HTTP进行
域名系统(DNS)的主要任务就是进行主机名到IP地址的转换;DNS协议运行在UDP之上,使用53号端口;DNS通常由其他应用层协议使用,用于将用户提供的主机名解析为IP地址
除了进行主机名到IP地址的转换外,DNS还提供了一些重要的服务
- 主机别名:有着复杂主机名的主机可以拥有一个或多个别名,应用程序可以调用DNS来获得主机别名对应的规范主机名以及主机的IP地址
- 邮件服务器别名:电子邮件应用程序调用DNS可以对提供的邮件服务器别名进行解析以获得该主机的规范主机名及其IP地址
- 负载分配:DNS也用于在冗余的服务器之间进行负载分配;繁忙的站点被冗余分布在多台服务器上,有着不同的IP地址;对于这些冗余的Web服务器,一个IP地址集合对应于同一个规范主机名;DNS数据库中存储着这些IP地址集合,当客户机为映射到这个IP地址集合的名字发出一个DNS请求时,该服务器用包含全部这些地址的报文进行回答,但在每个回答中旋转这些地址排放的顺序;因为客户机通常总是向IP地址排在最前面的服务器发送HTTP请求报文,所以DNS就在所有这些冗余的Web服务器之间旋转分配负载
DNS采用了分布式的设计方案,有以下类型的DNS服务器
- 根DNS服务器:在因特网上有13个根DNS服务器
- 顶级域(TLD)服务器:这些服务器负责顶级域名(如com、org、net、edu等)和所有国家的顶级域名(如uk、jp、cn等)
- 权威DNS服务器:在因特网上具有公共可访问主机(如Web服务器和邮件服务器)的每个组织机构必须提供公共可访问的DNS纪录,这些纪录将这些主机的名字映射为IP地址,由组织机构的权威DNS服务器来保持这些记录
- 本地DNS服务器:本地DNS服务器严格来说并不属于DNS服务器的层次结构,但它对DNS层次结构很重要;它起着代理作用,将附近主机发给它的DNS请求转发到DNS服务器层次结构中
DNS服务器的交互示例如下:
当一个DNS服务器接收一个DNS回答时,DNS服务器能将回答中的信息缓存在本地存储器,在一段时间后再丢弃缓存的信息
实现DNS分布式数据库的所有DNS服务器共同存储着资源纪录(RR),RR提供了主机名到IP地址的映射,每个DNS回答报文包含了一条或多条资源纪录,资源纪录是一个包含了下列字段的4元组:(Name,Value,Type,TTL);TTL是该记录的生存时间,他决定了资源纪录应当从缓存中删除的时间,Name和Value的值取决于Type
- 若Type=A,则Name是主机名,Value是该主机名的IP地址;因此一条类型为A的资源纪录提供了标准的主机名到IP地址的映射
- 若Type=NS,则Name是域,而Value是知道如何获得该域中主机IP地址的权威DNS服务器的主机名;这个记录用于沿着查询链路进一步路由DNS查询
- 若Type=CNAME,则Value是别名为Name的主机对应的规范主机名;该纪录能向请求主机提供一个主机名对应的规范主机名
- 若Type=MX,则Value是别名为Name的邮件服务器的规范主机名;MX纪录允许邮件服务器的主机名具有简单的别名;通过使用MX纪录,一个公司的邮件服务器和其他服务器可以使用相同的别名
DNS有查询和回答报文,这两种报文有着相同的格式,如下图所示
- 在首部区域中,第一个字段是一个16比特的数,用于标识该查询,该标识符会被复制到对查询的回答报文中,以便让客户机用它来匹配发送的请求和接收到的回答;标识字段中含有若干标志,1比特的 “查询/回答”标志位指出报文是查询报文(0)还是回答报文(1);当某DNS服务器正好是被请求主机的权威DNS服务器时,1比特的“权威的”标志位被置在回答报文中;如果客户机希望DNS服务器执行递归查询,将设置1比特的“希望递归”标志位;如果该服务器支持递归查询,在它的回答报文中会有1比特的“递归可用”标志位;在该首部中,还有4个数量字段,这些字段指出了在首部后4类数据区域出现的数量
- 问题区域包含着正在进行的查询信息,该区域包括:1.名字字段,用于指出正在被查询的主机名字;2.类型字段,用于指出正被询问的问题类型
- 在来自DNS服务器的回答报文中,回答区域包含了对最初请求的名字的资源纪录
- 权威区域包含了其他权威DNS服务器的记录
- 附加区域包含了其他一些有帮助的记录