分层体系结构回顾
在本章中,我们学习有关网络应用的原理和实现方面的知识。
- 我们从定义关键的应用层概念开始,其中包括应用程序所需要的网络服务、客户和服务器、进程和运输层接口。
- 详细考察几种网络应用程序,包括Web、电子邮件、DNS、对等文件分发和视频流。
- 我们将涉及开发运行在TCP和UDP上的网络应用程序。特别是,我们学习套接字接口。
目录
📚应用层协议原理
🐇网络应用程序体系结构
🥕客户-服务器体系结构
🥕P2P体系结构
🐇进程通信
🥕客户和服务器
🥕进程与计算机网络之间的接口
🥕进程寻址
🐇可供应用程序使用的运输服务
🥕可靠数据传输
🥕吞吐量
🥕定时
🥕安全性
🐇因特网提供的运输服务
🥕TCP服务⭐
🥕UDP服务⭐
🥕传输层无法提供的服务
🐇应用层协议
🌈WEB和HTTP
🐇HTTP概况
🐇非持续连接和持续连接
🥕采用非持续连接的HTTP
🥕采用持续连接的HTTP
🐇HTTP报文格式
🥕请求报文
🥕响应报文
🐇Web缓存
🐇条件GET方法
🌈因特网中的电子邮件
🐇SMTP
🐇与HTTP的对比
🥕相同点
🥕不同点
🐇邮件报文格式
🐇邮件访问协议
🥕POP3
🥕IMAP
🥕基于Web的电子邮件
🌈DNS:因特网的目录服务
🐇DNS提供的服务
🐇DNS工作机理概述
🥕分布式层次的数据库
🥕DNS缓存
🐇DNS记录和报文
🥕DNS报文
🌈P2P应用
🐇BitTorrent
🌈视频流和内容分发网
🌈套接字编程:生成网络应用
🐇UDP套接字编程
🐇TCP套接字编程
📚应用层协议原理
🐇网络应用程序体系结构
从应用程序研发者的角度看,网络体系结构是固定的,并为应用程序提供特定的服务集合。两种常见的现代网络应用程序所采用的体系结构为:客户-服务器体系结构和对等体系结构。
🥕客户-服务器体系结构
具有客户-服务器体系结构的非常著名的应用程序包括Web、FTP、Telnet和电子邮件。
- 在客户-服务器体系结构中,有一个总是打开的主机称为服务器,它服务于来自许多其他称为客户的主机的请求。一个典型的例子是Web应用程序,其中总是打开的Web服务器服务于来自浏览器(运行在客户主机上)的请求。当Web服务器接收到来自某客户对某对象的请求时,它向该客户发送所请求的对象作为响应。
- 客户相互之间不直接通信。例如,在Web应用中两个浏览器并不直接通信。
- 服务器具有固定的、周知的地址,该地址称为IP地址。因为该服务器具有固定的、周知的地址,并且因为该服务器总是打开的,客户总是能够通过向该服务器的IP地址发送分组来与其联系。
通常,如果仅有一台服务器处理所有的请求,那么服务器系统将很快不堪重负。为此,配备大量主机的数据中心常被用于创建强大的虚拟的服务器。
🥕P2P体系结构
- 在一个P2P体系结构中,对位于数据中心的专用服务器有最小的(或者没有)依赖。相反,应用程序在间断连接的主机对之间使用直接通信,这些主机对被称为对等方。
- 这些对等方并不为服务提供商所有,相反却为用户控制的桌面机和膝上机所有,大多数对等方驻留在家庭、大学和办公室。因为这种对等方通信不必通过专门的服务器,该体系结构被称为对等方到对等方的。
- 许多目前流行的、流量密集型应用都是P2P体系结构的。这些应用包括文件共享(例如BitTorrent)、对等方协助下载加速器(例如迅雷)、因特网电话和视频会议(例如Skype)。
- P2P体系结构有自扩展性。例如,在一个P2P文件共享应用中,尽管每个对等方都由于请求文件产生工作负载,但每个对等方通过向其他对等方分发文件也为系统增加服务能力。
- P2P体系结构有成本效率,因为它们通常不需要庞大的服务器基础设施和服务器带宽(这与具有数据中心的客户-服务器设计形成鲜明对比)。然而,未来P2P应用由于高度非集中式结构,面临安全性、性能和可靠性等挑战。
需要提及的是,某些应用具有混合的体系结构,它结合了客户-服务器和P2P的元素。例如,对于许多即时讯息应用而言,服务器被用于跟踪用户的IP地址,但用户到用户的报文在用户主机之间(无须通过中间服务器)直接发送。
🐇进程通信
- 用操作系统的术语来说,进行通信的实际上是进程(process)而不是程序。一个进程可以被认为是运行在端系统中的一个程序。
- 当多个进程运行在相同的端系统上时,它们使用进程间通信机制相互通信。进程间通信的规则由端系统上的操作系统确定。
- 在两个不同端系统上的进程,通过跨越计算机网络交换报文(message)而相互通信。
- 发送进程生成并向网络中发送报文;接收进程接收这些报文并可能通过回送报文进行响应。
🥕客户和服务器
- 对于每对通信进程,我们通常将这两个进程之一标识为客户,而另一个进程标识为服务器。
- 需要注意的是,在某些P2P应用中,一个进程可能既是客户也是服务器,因为在一个文件共享应用中,一个进程的确既能请求文件也能发送文件。
- 所以从进程所扮演的角色来区分是客户进程还是服务器进程不够精确,所以我们从发起通信的顺序来定义它们:在给定的一对进城之间,首先发起通信的进程被标记为客户进程,在会话开始时等待联系的进程被称为服务器进程。
🥕进程与计算机网络之间的接口
- 多数应用程序是由通信进程对组成的,运行在不同端系统上的进程对之间通过计算机网络来实现通信。所以,在应用程序进程和计算机网络之间存在一个接口,该接口被称为套接字。
- 进程可类比于一座房子,而它的套接字可以类比于它的门。
- 更为准确的说,套接字是同一台主机内应用层和运输层之间的接口。由于该套接字是建立网络应用程序的可编程接口,因此套接字也被称为应用程序和网络之间的应用编程接口。
- 应用程序开发者可以控制套接字在应用层的一切内容,但是对于运输层的相关部分,几乎没有控制权,可以做的有:①选择传输层协议②设定几个传输层参数,比如最大缓存和最长传输层报文长度
🥕进程寻址
- 为了向特定目的进程发送报文,发送进程需要知道接收进程的标记。该标记包含两种信息:①主机的地址;②在目的主机中指定接收进程的标识符。
- 在因特网中,主机由IP地址标记,其中IP地址是一个32比特的量且它能够唯一地标识该主机。
- 而接收进程(或者说是其对应的套接字)使用端口号标记;一些常用的应用程序有着固定的端口号,比如Web服务器使用80端口、邮件服务器(使用SMTP协议)使用25端口等。所有因特网标准协议的周知端口号的列表能够在http://www.iana.org处找到。
🐇可供应用程序使用的运输服务
包括因特网在内的很多网络提供了不止一种运输层协议。一个运输层协议能够为调用它的应用程序提供什么样的服务呢?我们大体能够从四个方面对应用程序服务要求进行分类:可靠数据传输、吞吐量、定时和安全性 。
🥕可靠数据传输
- 分组在传输过程中可能会丢失。比如,分组因为路由器中的缓存溢出而被丢弃或者分组在传输的过程中发生了损坏等情况。
- 有些应用是不允许数据发生丢失的,比如电子邮件、文件传输、远程主机访问、Web文档传输以及金融应用等。为了支持这些应用,必须做一些工作以确保应用程序一段发送的数据正确、完全地交付给接收数据的进程。如果一个协议提供了这样的确保数据交付的服务,就认为该协提供了可靠数据传输。只要将要发送的数据传输进套接字就可以完全相信该数据可以完整无差错地到达接收方;
- 当一个运输层协议不提供可靠数据传输时,由发送进程发送的数据就可能到达不了接收进程。这可能能被容忍丢失的应用所接受,如交谈式音频/视频。
🥕吞吐量
- 在一条网络路径上的两个进程之间的通信会话中,可用吞吐量就是指能够向接收进程交付比特的速率。
- 因为会有其他会话共享该网络的路径的带宽,并且因为这些会话的到来和离开,可用吞吐量将发生变化;这就导致另一种自然的服务,即运输层协议能够提供确切的可用吞吐量。使用这种服务时,应用程序就能以明确的速度接收数据,并且运输层应当保证可用吞吐量必须总是至少为该速度;
- 对吞吐量有明确要求的应用程序被称为带宽敏感的应用。许多多媒体应用是带宽敏感的,比如因特网电话。而弹性应用则对吞吐量没有严格的要求。这类应用包括:电子邮件、文件传输以及web传送等。
- 吞吐量是越多越好,我们永远不会嫌吞吐量太多。
🥕定时
- 定时和吞吐量都是关于速度的。一个提供定时服务的例子是:发送方注入套接字中的每个比特到达接收方的套接字不迟于100ms。也就是说,定时是对数据从发送到到达所需时间的要求,而吞吐量是对数据交付速度的要求。打个比方,吞吐量是指一个小时内经过某个收费站的汽车数目,而定时则是第一辆车从出发到进入收费站的时间。有些应用为了服务的有效性而对数据到达时间有严格的要求,常见的应用有:因特网电话、多方在线游戏等;
🥕安全性
- 运输层可以提供一些安全服务,以防止传输的数据以某种方式在这两个进程之间被察觉到。这些安全服务包括:数据的加解密、数据的完整性和端点鉴别等。
🐇因特网提供的运输服务
因特网(更一般的是TCP/IP网络)为应用程序提供两个运输层协议,即UDP和TCP。每个协议为调用它们的应用程序提供了不同服务的组合。以下为常见的应用程序的服务要求:
🥕TCP服务⭐
- 面向连接的服务:在应用层数据报文开始流动之前,TCP会在客户端和服务器端相互交换传输层控制信息。这个握手过程将提示客户端和服务器端,让它们为即将到来的大量分组做好准备;握手阶段接收后将建立一个TCP连接。这条链接是全双工的,即连接双方使用该条链接可以同时进行报文的收发。这条连接将在通讯结束后拆除;
- 可靠的数据传输:应用程序使用TCP协议可实现无差错、按适当顺序交付所有发送的数据,没有字节的丢失和冗余;
- TCP服务还提供了拥塞控制机制。该机制不一定会给通行双方带来好处,但是会给网络带来整体好处;当发送方和接收方之间的网络出现拥塞时,TCP将使用拥塞控制机制来使网络恢复正常。
🥕UDP服务⭐
- UDP服务是一种不提供不必要服务的轻量级运输协议。它仅提供最小服务。
- UDP是无连接的也就是说通信之前没有握手;UDP不提供数据的可靠传输;UDP也没有拥塞控制机制。
- 有些应用场景下,UDP协议将带来更多的便利和效率,比如DNS和一些因特网电话服务(为了避免拥塞控制协议的控制而使用UDP)
🥕传输层无法提供的服务
- 从可靠数据传输、吞吐量、定时、安全性等四个角度来看运输层提供的服务,我们发现,运输层无法对吞吐量和定时做出保证。但是,今天的因特网能够为时间敏感的应用提供满意的服务,尽管它并不提供任何定时或者带宽保证;
🐇应用层协议
- 应用层协议定义运行在不同端系统上的应用程序进程如何相互传递信息。涉及的内容包括:交换的报文类型(请求或者响应)、报文中包含哪些字段、字段如何被解释、一个进程何时收发报文并如何对报文进行响应等内容。
- 需要注意的是,应用层协议是网络应用的一部分。
即将介绍的应用包括:Web、电子邮件、目录服务、P2P和视频流。Web部分将介绍HTTP协议,它比较简单和易于理解;电子邮件是比Web更为复杂的应用,因为它使用了多个应用层协议;大多数用户不会直接和DNS接触,但是DNS很好地说明了一种核心的网络功能是如何在应用层实现的。最后便是P2P应用的简单介绍了。
🌈WEB和HTTP
🐇HTTP概况
- Web的应用层协议是超文本传输协议(HTTP),它是Web的核心。
- HTTP由两个程序实现:一个客户端程序和一个服务器程序;HTTP定义了客户和服务器进行报文交换的方法;
- Web页面是由对象组成的,一个对象是一个文件,它们通过一个URL地址进行寻址。
- 每个URL地址由两部分组成:存放对象的服务器主机名和对象的路径名。例如URL地址:http://www.someSchool.edu/someDepartment/pic-ture.gif,其中www.someSchool.edu是主机名,/someDepartment/pic-ture.gif是路径名。
- 客户和服务器交互的核心思想:客户通过HTTP请求对服务器发出对Web页面的请求报文,服务器收到该报文后将返回包含该对象的HTTP响应报文。
- HTTP使用TCP作为它的传输层协议;HTTP客户首先发起一个与服务器的TCP连接,需要注意的是,服务器根据请求作出响应,但是不存储任何关于该客户的状态信息;也正因为这样,HTTP被称为无状态协议。
- 同时,Web使用了客户端-服务器的应用体系结构;其中web服务器总是开着的,具有一个固定的IP地址,且它服务于可能来自数以万计的不同浏览器的请求。
🐇非持续连接和持续连接
- 在因特网应用程序中,客户端和服务器将在很长的时间范围里通信;应用程序将根据自身的特点,选择以规则的间隔周期性性发出请求也可以间断性一个个发出请求。
- 当通信是使用TCP协议时,服务器端需要做出一个决定:这些请求是使用一个TCP连接完成还是通过独立的TCP连接完成。如果采取前一个方法,则称应用程序使用持续连接,如果使用后一种方式,则称为非持续连接。
- HTTP既可使用持续连接也可以使用非持续连接,HTTP在静默情况下使用持续连接。
🥕采用非持续连接的HTTP
使用非持续连接时,每个TCP连接在服务器发送一个对象后就会关闭,也就是每个TCP只传送一个请求报文和响应报文。
为了描述持续连接和非持续连接的特点,我们引入RTT(Round-Trip Time)。
- RTT指的是一个短分组从客户端到服务器,然后再返回客户端所用的时间。
- RTT包括分组的传播时延、排队时延、处理时延(因为是短分组,所以其传输时延可不计);
- 因为客户端和服务器建立TCP连接的时候,会通过一个三次握手的过程来交换传输控制信息。三次握手的前两次占用了一个RTT,客户结合第三次握手通行会通过该连接发送一个HTTP请求报文,一旦该分组到达服务器,服务器便开始使用TCP传输HTML对象。
- 因此,粗略地讲,响应时间是两个RTT加上传输HTML的时间(不是传播)。
🥕采用持续连接的HTTP
- 非连续连接的缺点:第一,必须为每一个请求的对象建立和维护一个全新的连接,这给Web服务器带来了严重的负担。第二,每个对象经受两倍RTT的交付时延,即一个RTT用于创建TCP,另一个RTT用于请求和接收一个对象。
- 如果使用持续连接,那么服务器在发送响应报文后将保持该TCP打开,后续客户端可以使用该连接来向服务器发出请求。不但一个完整的页面可以通过同一个连接传送,同一台服务器上的多个页面也可以通过同一个连接发送。这就提高了效率;
- 一般来说,如果一条连接在一定的时间间隔后没被使用的话,就会被关闭。HTTP默认使用的是带流水线的持续连接。
🐇HTTP报文格式
🥕请求报文
- 一个请求报文具有至少一行的内容。请求报文的第一行称为请求行,其后继的各行被称为首部行。请求行包含三个内容:方法字段、URL字段、HTTP版本;其中方法字段可为:GET、POST、PUT、DELETE、HEAD等。URL字段里可以传递请求对象的标志;
- 首部行包含,Host:请求的主机地址(该头部信息被Web高速缓存所要求);Connection:是否在发送完响应报文后关闭TCP连接;User-agent:浏览器版本;Accept-language:可接受的语言等头部信息;
- 在首部行之后一个空行,之后便是请求的“实体体”。该实体体可以在POST方法里传递Form表单内容或者传递其它一些二进制流数据等。值得注意的是,表单也不一定必须使用POST方法。如果使用get,实体体为空,会显示在url中。
- Head类似于get方法,将会用一个http报文进行响应,但是不返回请求对象,经常用作调试跟踪。put方法允许用户上传对象到指定的Web服务器上指定的路径。Delete方法允许用户或应用程序删除Web服务器上的对象。
🥕响应报文
- 响应报文总体上也分三个部分,第一部分是状态行,包含HTTP版本、状态以及状态信息等内容。
- 第二部分是首部行(6个),包含是否在发送完响应报文后关闭TCP连接(Connection)、发送日期(Date,从文件系统中检索到该对象,插入到响应报文,并发送该响应报文的时间。)、服务器类型(Server)、上一次修改请求资源的时间(Last-Modified)、被发送对象中的字节数(Content-Length)、指示实体体中的对象(Content-Type)。
- 第三部分是实体体,实体体包含请求对象本身。
⭐常见状态码
-
200:请求成功 。处理方式:获得响应的内容,进行处理
-
301:请求到的资源都会分配一个永久的URL,这样就可以在将来通过该URL来访问此资源。处理方式:重定向到分配的URL
-
400:非法请求。处理方式:丢弃
-
404:没有找到。处理方式:丢弃
-
505:服务器不支持请求报文使用的http版本。
🐇用户与服务器的交互:cookie
- 前面提到,HTTP是无状态协议,但是Web站点为了识别用户身份或者限制用户访问的时间或者将用户访问的内容同用户身份相关联,Web站点可以使用Cookie技术;
-
Cookie技术包含4个组件
-
HTTP响应报文里增加一个关于Cookie的首部行;
-
HTTP请求报文里增加一个关于Cookie的首部行;
-
用户端系统保留一个Cookie文件,由浏览器保存维护;
-
Web站点建立Cookie和用户身份的关联;
-
- 虽然,Cookie的使用方便了用户也方便了服务端,但是它的使用存在争议,因为使用Cookie被认为是对用户隐私的一种侵犯,因为Web站点可以通过Cookie得到很多用户的信息,并有可能将这部分信息卖给第三方等。
🐇Web缓存
- Web缓存器也被称为代理服务器,它代表初始web服务器来满足HTTP请求。
- 它有自己的存储空间,并在存储空间里保持有最近请求过的对象的副本;可以通过配置浏览器,将所有指向初始服务器的请求首先指向代理服务器。
- 当代理服务器收到一个HTTP请求后,它将检查本地是否缓存过该对象,如果缓存过该对象,将检查是否过期,如果没有过期,则直接将该对象返回给浏览器;如果本地不存在或者存在已过期,则代理服务器将根据请求报文里的Host首部行以及请求行里的URL字段向初始服务器发出请求,然后将响应对象返回给浏览器并缓存在本地。
- 通常,代理服务器与客户端的通信速度要快于初始服务器与客户端的连接速度;Web代理服务器可以大量减少对客户请求的响应时间;而且,缓存器能从整体上大大降低因特网上的web流量,从而有助于提高所有应用程序的性能;
- 通过使用内容分发网络(Content Distribution Network),Web缓存器正在因特网中发挥越来越重要的作用。
- Web缓存即是客户又是服务器。
🐇条件GET方法
尽管高速缓存能减少用户感受到的响应时间,但也引入了一个新的问题,即存放在缓存器中的对象副本可能是陈旧的。换句话说,保存在服务器中的对象自该副本缓存在客户上以后可能已经被修改了。
- 条件GET机制:允许缓存器证实它的对象是最新的。
- 如果:①请求报文使用GET方法;并且②请求报文中包含一个“If-Modified-Since:”首部行。那么,这个HTTP请求报文就是一个条件GET请求报文。
- 使用条件GET方法只需在使用GET方法的时候,增加一个If-Modified-Since首部行,其对应的内容是一个时间,如果所请求的资源在指定日期后被修改了,那么服务器将返回新的对象,否则服务器将返回一个包含空实体体的报文。这样代理服务器就可以确认缓存是否过期了。
🌈因特网中的电子邮件
- 因特网电子邮件系统有三个核心组件:用户代理、邮件服务器、SMTP(简单邮件传输协议,Simple Mail Transfer Protocol)。
- 邮件服务器形成了电子邮件体系结构的核心。每个收发方(如lalayouyi)在其中的某个邮件服务器上有一个邮箱。lalayouyi的邮箱管理和维护着发送给她的报文。
- 一个典型的电子邮件发送过程为:
- 发送方通过用户代理将邮件传送到发送方的邮件服务器,然后再传输到接收方的邮件服务器,然后邮件被分发到接收方的邮箱里;
- 接收方从邮件服务器里获取自己的邮件时需要通过邮件服务器的验证。
- 如果tutu的服务器不能将邮件交付给lalayouyi的服务器,tutu的邮件服务器在一个报文队列中保持该报文并在以后尝试再次发送。通常每30分钟左右进行一次尝试;如果几天后还不成功,服务器就删除该报文并以电子邮件的形式告诉tutu
(好可怜)
- SMTP是因特网中电子邮件的主要应用层协议,它使用TCP可靠数据传输从发送方的邮件服务器向接收方的邮件服务器发送邮件;在每台邮件服务器上同时运行SMTP服务器和SMTP客户端。当邮件服务器接收其他邮件服务器的邮件时,它表现为SMTP服务器,当邮件服务器向其他邮件服务器发送邮件时,表现为SMTP客户端。
🐇SMTP
值得注意的是,SMTP报文一般不使用中间邮件服务器发送报文,特别是,如果Bob的邮件服务器没有开机,该报文会保留在Alice的邮件服务器上并等待进行新的尝试。这意味着邮件不在中间某个邮件服务器保留;
传输的三个阶段:握手、传输、关闭链接
- 首先,客户SMTP(运行在发送邮箱服务器主机上)在25号端口建立一个到服务器SMPT(运行在接受邮件服务器主机上)的TCP连接。如果服务器没有开机,客户会稍后继续尝试连接。
- 一旦建立连接,服务器和客户执行某些应用层的握手。在SMTP握手阶段,SMTP客户端将介绍发送方和接收方的邮箱地址;一旦介绍完后,SMTP客户端将开始发送报文。
- 该客户如果有另外的报文要发送到该服务器,就在该相同的TCP连接上重复这种处理;否则,它将指示TCP关闭连接。
以下为一个在SMTP客户(C)和SMTP服务器(S)之间交换报文文本的例子。客户的主机名为crepes.fr,服务器的主机名为hamburger.edu。
- 作为对话的一部分,该客户发送了5条命令:HELO、MAIL FROM、RCPT TO、DATA以及QUIT。这些命令都是自解释的。该客户通过发送一个只包含一个句点的行,向服务器指示该报文结束了。
- SMTP是持续连接的。对每一报文,客户使用一个新的MAIL FROM:crepes.fr开始。当所有报文发送完后才发送QUIT,断开连接。
🐇与HTTP的对比
🥕相同点
- 这两个协议都用于从一台主机向另一台主机传送文件。HTTP从Web服务器向Web客户(通常是一个浏览器)传送文件(也称为对象);SMTP从一个邮件服务器向另一个邮件服务器传送文件(即电子邮件报文)
- HTTP和SMTP都是用TCP协议。
- 当进行文件传送时,持续的HTTP和SMTP都是用持续连接。
🥕不同点
HTTP | SMTP |
---|---|
HTTP主要是一个拉协议,即在方便的时候,某些人在Web服务器上装载信息,用户使用HTTP从该服务器拉取这些信息。特别是TCP连接是由想接受文件的机器发起的。 | SMTP基本上是一个推协议,即发送邮件服务器把文件推向接收邮件服务器。特别是,这个TCP连接是由要发送该文件的机器发起的。 |
HTTP传输的数据不一定是用ASCII字符,也没有7比特的ASCII限制。 | SMTP只能使用ASCII字符 ,且限制邮件报文的所有部分只能使用7比特的ASCII表示,这导致二进制多媒体文件需要编码为ASCII,而且在发送方需要编码,接收方则需要解码。 |
HTTP将每个对象封装在自己的响应报文里 | SMTP将所有的报文对象放到一个报文之中 |
🐇邮件报文格式
- 报文由两部分组成:一个包含环境信息的首部和一个包含邮件内容的报文体;
- 首部和报文体之间使用空行(即回车换行)分开;
- 每一个首部必须含有一个From:首部行和一个To:首部行;一个首部行也许包含一个Subject:首部行以及其他可选的首部行。
- 在报文首部之后,紧接着一个空白行,然后是以ACSII格式表示的报文体。
🐇邮件访问协议
- 需要注意的是,SMTP是邮件服务器之间发送邮件报文的协议,并不是用户通过代理和邮件服务器之间通信的协议;
- 用户代理使用邮件访问协议来从邮件服务器上获取邮件信息;目前常用的邮件访问协议有POP3(Post Office Protocol-Version 3)、IMAP(因特网邮件访问协议,Internet Mail Access protocol)和HTTP。
🥕POP3
- POP3是一个极为简单的协议,因为简单,所以功能有限;
- POP3使用端口110来建立TCP连接(SMTP使用端口25);
- POP3按照三个阶段进行工作:特许、事务处理和更新:
- 在第一个阶段即特许阶段,用户代理发送(以明文形式)密码和用户名,进行身份鉴别;特许阶段有两个主要的命令:user<user name>和pass<password>。
- 在第二阶段即事务处理阶段,用户代理取回报文,同时还可以对报文做删除标记、取消删除标记以及获取邮件统计信息;在POP3的事务处理过程中,用户代理发出一些命令,服务器对每个命令做出回答。回答可能有两种:+OK(有时后面还跟有服务器到客户的数据),被服务器用来指示前面的命令是正常的;-ERR,被服务器用来指示前面的命令出现了某些差错。
- 在第三个阶段即更新阶段,是在用户退出后,POP3结束会话,删除那些被标记为删除的报文;
针对user和pass命令,假设邮件服务器的名字为mailServer那么会有:
- POP3用户代理可以使用两种事务处理模式:一种是下载并删除,另一种是下载保留;POP3代理发出的命令和其工作模式相关;下载并删除的方法存在的问题是,如果用户在一台设备上查看了邮件(下载了邮件)后,邮件将被删除,那么在其他设备上将无法查看邮件;这给用户带来一定的不便。使用下载保存方式,则用户下载邮件后,邮件还在服务器上。
- 在用户代理与邮箱服务器之间的POP3会话期间,该POP3服务器保留了一些状态信息,特别是标记了哪些用户报文被标记为删除了。但是POP3服务器并不在POP3会话过程中携带状态信息,大大简化了POP3的服务。
🥕IMAP
POP3协议无法为用户提供邮件分类管理的功能,虽然用户可以通过将邮件下载到本地,然后由用户代理程序做分类管理,但是处理的结果是无法同步到其他查看设备上。为了解决这一问题,IMAP诞生了。IMAP是一个邮件访问协议,比POP3要复杂的多,当然也就有更多的特色了。
- (远程)IMAP将每个报文和与一个文件夹联系起来;当报文第一次到达服务器时,它与收件人的INBOX相关联。收件人则能够把邮件移到一个新的、用户创建的文件夹中,阅读邮件,删除邮件等。
- IMAP协议为用户提供一个创建文件夹以及将邮件从一个文件夹移动到另一个文件夹的命令。
- IMAP协议还为用户提供了在远程文件夹中查询邮件的指令,按指定条件去查询匹配的邮件。
- 值得注意的是,与POP3不同,IMAP服务器维护了IMAP会话的用户状态信息。
- IMAP协议还允许用户代理获取报文组件而不是报文整体。
🥕基于Web的电子邮件
- 这种方式主要是指,用户使用HTTP协议和邮件服务器通信。用户代理就是普通的浏览器,但是,邮件服务器之间还是使用SMTP协议 。
🌈DNS:因特网的目录服务
因特网上的主机和人类一样,可以使用多种方式进行标识。
- 主机的一种标识方法是用它的主机名,然后,主机名几乎没有提供关于主机在因特网中位置的信息。且主机名可能由不定长的字母数字组成,路由器难以处理。
- 由于以上原因,主机也可以使用所谓IP地址进行标识。
- IP地址(IPV4)由4个字节组成,有着严格的层次结构,每个字节使用点号分隔。
🐇DNS提供的服务
人们喜欢便于记忆的主机标识方式,而路由器则喜欢定长的、有着层次结构的IP地址。为了折中这些不同的偏好,我们需要一种能进行主机名到IP地址转换的目录服务。这就是域名系统(DNS)的主要任务。
- DNS是:①一个由分层的DNS服务器实现的分布式数据库;②一个使得主机可以查询分布式数据库的应用层协议;
- DNS通常是由其他应用层协议所使用的,包括HTTP、SMTP、FTP,将用户提供的主机名解析为IP地址。
- DNS为用户带来方便的同时,也为网络应用带来额外的时延——查询DNS服务器的时延。需要注意的是,缓存作为一种提高性能,特别是查询性能的手段,在DNS中同样适用。
除了提供主机名到IP地址的转换外,DNS还提供以下重要服务
- 主机别名:虽然,主机名相对于IP地址更好记,但也还是有很不好记的,所以我们需要为主机名再起一个名字,这就是主机别名,DNS不但提供主机名到IP地址的转换服务,还提供主机名与主机别名的转换;此时主机名被称为规范主机名。
- 邮件服务器别名:DNS同样也提供邮件服务器主机名和别名的转换服务,实际上,公司的邮件服务器和Web服务器可以使用相同的主机别名;MX记录允许一个公司的邮件服务器和Web服务器使用相同的主机名。
- 负载分配:DNS也被用在冗余的服务器之间分配负载。每个服务器有着不同的IP地址,但是它们都和同一个主机名相关联,也就是一个IP地址集合同一个规范主机名相联系;当某个DNS服务器收到DNS请求时,该服务器将使用IP地址的整个集合作为相应,但是在每个应答中,循环这些地址的次序。因为客户端通常都是使用IP地址集合的首个元素,所以DNS就在冗余的Web服务器之间分配了负载。同理,多个邮件服务器可以具有相同的别名。
🐇DNS工作机理概述
- 所有的DNS请求和回答报文使用UDP数据报经端口53发送。
- 当主机上的DNS客户端收到一个转换请求时,客户端将向网络发送一个DNS查询报文,然后客户端将收到一个包含相关信息的DNS回答报文,这个报文里有客户端想要的内容,之后DNS客户端将IP地址返回给请求的提出者即可。
- 从使用DNS服务的请求者来看,DNS就像一个简单的提供直接转换服务的黑盒子,实际上这个黑盒子非常复杂,由分布在全球的大量DNS服务器以及定义DNS服务器和查询主机之间如何通信的应用层协议组成;
- DNS采用分布式的设计方案,而之所以这样做,是因为,单一的DNS服务器无法解决单点故障、无法保证通信容量以及无法临近所有的查询主机和维护困难等问题
🥕分布式层次的数据库
为了处理扩展性问题,DNS服务器采用层次式组织,并且分布在全世界范围内;大致来说,存在三种DNS服务器:根DNS服务器、顶级域DNS服务器和权威DNS服务器;
- 举例说明,其工作的普遍流程:一个DNS客户端,希望获得www.baidu.com的IP地址,粗略的说,DNS客户端首先和根DNS服务器取得联系,它将返回负责解析顶级域名com的服务器的IP地址(或者其集合),客户将同这些服务器之一取得联系,然后顶级域DNS服务器建返回baidu.com的权威服务器的IP集合,客户端通过与这些服务器之一取得联系,获得www.baidu.com的IP地址。
- 根DNS服务器:有400多个根名字服务器遍及全世界。这些根名字服务器由13个不同的组织管理。根名字服务器提供TLD服务器的IP地址。
- 顶级域DNS服务器:负责顶级域名,如com,org,net,edu,gov以及各个国家的顶级域名的转换。 TLD服务器提供了权威DNS服务器的IP地址。
- 权威DNS服务器:因特网上,具有公共可访问主机的每个组织机构必须提供公共可访问的DNS记录,这些记录将主机名映射为IP地址。一个组织的权威DNS服务器收藏了这些DNS记录,多数大学和大公司实现和维护它们自己的基本和辅助(备份)权威DNS服务器;当然,也可以通过付费的方式,将相关的信息插入到其它权威服务器中;
除了上面三种DNS服务器,还有一种不在DNS层次结构之中,但是很重要的DNS,是本地DNS服务器。本地DNS服务器通常邻近其所在网络的其他主机。当主机发出DNS请求时,该请求被发往本地DNS服务器,它起着代理的作用,并将请求转发到DNS服务器层次结构中。
DNS查询有两种,一种是递归查询一种是迭代查询;实践中,查询通常满足这样的模式:从请求主机到本地DNS服务器的查询是递归的,其余查询是迭代的。
- 所谓迭代就是,如果请求的接收者不知道所请求的内容,那么接收者将扮演请求者,发出有关请求,直到获得所需要的内容,然后将内容返回给最初的请求者。
- 也就是说,在递归查询中,一定要给请求者想要的答案;迭代查询则是指,如果接收者没有请求者所需要的准确内容,接收者将告诉请求者,如何去获得,但是自己并不去发出请求。
🥕DNS缓存
- DNS缓存实际上是为了改善时延性能并且减少在因特网上传输的DNS报文数量而引入的。
- DNS缓存原理十分简单,每当DNS服务器发出请求后收到回答时,就将回答的内容缓存在它自己的主机空间上。这样,如果有相同的请求到达时,就不需要再去发出请求,直接使用缓存即可;因为有了缓存,本地DNS就可以直接提供一些经常被访问的主机名所对应的IP地址,而不需要询问根DNS服务器了。
- 需要注意的是,缓存不可避免的一个问题:有效时间。如果缓存过时而未得到更新,那么就会导致一些请求失败。
- 缓存技术就是一种典型的使用空间换时间的策略 。
🐇DNS记录和报文
共同实现分布式数据库的所有DNS服务器存储了资源记录(Resource Record),RR提供了主机名到IP地址的映射信息;,每个DNS回答报文包含了一条或多条资源记录。
一条RR是具有以下字段的4元组:(name, value, type, TTL);其中TTL是指该记录的生存时间,它决定了该条记录何时被删除。 在以下给出的记录例子中,我们忽略掉TTL字段,Name和Value的值取决与Type。
- 所以如果一条记录为type=A,则它直接包含了需要的信息;
- 如果是NS,需要进一步得到权威DNS服务器的IP地址(同时返回一条NS记录,并返回一条以该NS记录的value值为name的A记录)希望得到一条A记录;
- 而type=CNAME和MX的记录则实现了主机别名到主机规范名的转换,可以通过该规范名继续构建查询链条,直到获得希望的IP地址;
🥕DNS报文
DNS报文有两种,即查询报文和回答报文,并且两种报文有着相同的格式:
- 前12字节为首部区域。
- 标识符是一个用来标记该查询的16比特数。该标志符会被复制到相应的回答报文里,以便匹配请求和回答;
- 标志字段有若干标志,用来指出报文的类型(请求还是响应)、查询类型(递归还是迭代)、是否是所请求名字的权威DNS服务器
- 4个有关数量的字段,用来指示4类数据区域出现的数量;
- 问题区域包含了正在进行的查询信息,包括名字字段、查询类型;
- 回答区域包含了对最初请求的名字的资源记录,回答报文的回答区域可以包含多条RR,因此一个主机名能有多个IP地址;
- 权威区域包含了其他权威服务器的信息;
- 附加区域包含了其它有帮助的记录,比如在对于一个MX类型的请求回答报文里,回答区域里指出了邮件服务器的规范主机名,而附加区域里就有可能包含一个类型为A的关于该规范主机名的的IP地址;
向DNS数据库中插入数据,需要在注册登记机构完成这一任务,当你注册一个域名时,需要向该机构提供你的基本和辅助DNS服务器的名字和IP地址;该注册机构将确保一个类型为NS和类型为A的记录输入对应的顶级域名服务器;这样就完成了插入数据。
🌈P2P应用
- Web、电子邮件和DNS都采用了客户-服务器体系结构,极大地依赖于总是打开的基础设施服务器。P2P体系结构,对总是打开的基础设施服务器有最小的(或者没有)依赖,成对间歇连接的主机(称为对等方)彼此直接通信。
- 在本节中,我们将研究一种非常自然的P2P应用,即从单一服务器向大量主机(称为对等方)分发一个大文件。
- P2P体系结构有着良好的自扩展性。这种扩展性的直接成因是:对等方除了比特的消费者之外还是他们的重新分发者 。
🐇BitTorrent
- BitTorrent 是一种用于文件分发的流行P2P协议;用BitTorrent的术语来说,参与一个特定文件分发的所有对等方的集合被称为一个洪流;
- 在一个洪流中的对等方彼此下载等长度的文件块;当一个对等方下载文件块的时候,也向其他对等方发送了多个块;
- 一旦某对等方获得了完整文件,就可以自私地离开洪流或者大公无私地留下来继续向其他对等方发送文件。
- 每个洪流具有一个基础设施节点,称为追踪器。 当一个对等方加入某洪流时,它向追踪器注册自己,并周期性通知追踪器它仍在洪流中。
- 当一个新的对等方Alice加入该洪流时,追踪器随机地从参与对等方的集合中选择对等方的一个子集,并将这些对等方的IP地址发送给Alice。Alice维护这张对等方列表,试图与所有对等方建立并行的TCP连接。我们称所有与Alice成功地创建一个TCP连接的对等方为邻近对等方。
- 随着时间流逝,对等方中的某些可能离开,其他会补位,因此一个对等方的邻近对等方将随时间而波动。
- Alice周期询问每个邻近对等方(连上的)他们有的文件块列表,她随时知道邻居有哪些文件块。Alice使用最稀缺优先技术,首先请求那些邻居们副本数量最少的块,使该文件块迅速分发,以均衡每个块在洪流中的副本数量 。
- BitTorrent使用一种算法,Alice优先从向她传时速度最快的邻居(4个,每10s修改一次)那里获取文件块。用术语来说,这四个对等方被称为疏通。
- 每过30s,Alice也要随机选择另外一个对等方Bob,向他发送块。若Alice是Bob最快的前四快,Bob也是Alice的前4快,则Bob和Alice互相发送数据。 每过30s换一个新的对象,互相交换数据(一报还一报),使对等方能够找到彼此协调的速率上传,积极共享,实现激励。
🌈视频流和内容分发网
- 视频:视频是一系列图像以恒定的速率(每秒30张图像)来展示,一张图像由像素阵列组成,每个像素是由一些比特编码来表示亮度和颜色。视频的一个特征是能够压缩,所以比特率是权衡视频质量。
- HTTP流:存储在HTTP服务器中的一个普通视频文件,每个文件有特定的URL。
- DASH:经HTTP的动态适应性流:视频编码有多个不同版本,每个版本的比特率不同, 对应的视频质量不同。
- CDN:内容分发网,管理分布在各个地方的视频服务器。
- CDN可以是专用CDN,即它由内容提供商自己所有;
- 也可以是第三方CDN,它代表多个内容提供商分发内容。
- 当用户主机中的一个浏览器指令检索一个特定的视频时,CDN必须截获该请求,以便能够:①确定此时适合用于该用户的CDN服务器集群;②将客户的请求重定向到该集群的某台服务器。
- 大多数CDN利用DNS来截获和重定向请求。