toBeTheLight.github.io 荒原

阅读:《计算机网络教程》(2)应用层

2018-03-04
toBeTheLight

整个因特网、硬件以及软件的设计和开发就是为应用层提供服务。TCP/IP协议簇的第五层正是这些服务的所在位置。其他四层协议使这些服务成为可能。 因特网中的应用使用客户-服务器模式或对等模式。

  • 模式
    • 客户-服务器模式中,一个提供服务的应用程序称为服务器,一个接受服务的应用程序称为客户。
    • 对等模式中,一个对等结点既可以是一个客户也可以是一个服务器。
  • 标准客户-服务器应用:
    • 万维网WWW:超文本和超媒体文档通过指针互相连接。超文本传输协议HTTP是用于访问数据的主要协议。
    • 文件传输协议FTP是一个TCP/IP客户-服务器应用,用于从一个结点向另一个结点拷贝文件,要求为数据传输提供两个连接:控制连接和数据连接,非近似系统之间的通信中FTP使用 NVT ASCII。
    • 电子邮件:体系结构包括几部分,用户代理(UA)、报文传输代理(MTA)、报文访问代理(MAA)。实现MTA的协议称为简单邮件协议(SMTP),两个协议用于实现MAA:邮局协议版本3(POP3)和因特网邮件访问协议4(IMAP4).
    • 远程登录:SSH 和 TCP/IP TELNET。
    • 域名系统:用唯一的名称标识因特网中的主机,以层次结构组织命名空间,并以此将命名中所涉及的责任分散。
  • 对等网络:分享资源的结点组成了网络。在中心化网络中,目录系统使用客户-服务器模式,文件存储和下载通过对等模式完成。。分布式网络中,都通过对等模式完成。

2.1 介绍

应用层的通信是由逻辑连接提供的。两台主机之间“有”一条假象的双向逻辑信道,可以通过这条信道发送接收报文。实际上通信通过了若干设备和若干物理信道。

2.1.1 提供服务

  • 早期开始运营的所有通信网络大多都被设计为提供一种特定服务,如电话网络。
  • TCP/IP协议簇的层次结构使得因特网比其他网络更加灵活。协议簇的每一层原先又一个或多个协议组成,但是可以加入新的协议。
  • 加入的新协议应当被设计成使用底层协议提供的服务,删去协议时,因为其上层可能使用了它提供的服务,应改写其上层协议。应用层位于协议簇的最高层,所以可以较为轻易的被删除或添加。
  • 由于位于最高层,应用层是唯一向因特网用户提供服务的层次。
  • TCP/IP协议簇的前四层所用的协议通常成为包的一部分(包含在windows/UNIX里),所以前四层所使用的协议需要标准化和归档。
  • 每个标准协议是一对程序,与用户和传输层进行交互。同样,可以写两个程序做为非标准协议。

2.1.2 应用层模型

  • 传统模式:客户-服务器
  • 新模式:对等
  • 混合模式

2.2 客户-服务器模式

应用层的通信在两个运行着的应用程序之间,称为客户进程和服务器进程。服务器进程需要一直运行等待客户,客户进程通常发送有限的请求,接收响应然后停止。

2.2.1 应用程序接口

  • 计算机程序通常是由预定义了指令集的计算机语言编写的,这个指令集告诉计算机要做什么。
  • 这样的指令集通常成为应用程序接口(Application Programming Interface)API。
  • 通信API有三个很常见:套接字接口、传输层接口、STREAM。

套接字

  • 套接字接口是提供应用层和操作系统之间通信的指令集。
  • 套接字是提供应用程序创建和使用的数据结构。
  • 就应用层而言,客户进程和服务器进程之间的通信是两个套接字间的通信。
  • 客户认为套接字是接收请求和给出响应的实体,服务器认为套接字是发出请求并且需要获得相应的实体。(此处可以理解为服务器接口地址和主机地址)

套接字地址

  • 客户和服务端是双向通信的,我们需要一对地址:本地地址和远程地址。
  • 由于客户-服务器模式的通信是在套接字之间的,我们需要一对套接字地址。
  • 我们需要用TCP/IP协议簇的标识符来定义套接字地址。
  • 套接字地址应该是IP地址+端口号的组合。

寻找套接字地址

服务器和客户站点都需要一个本地(服务器/客户)和一个远程(客户/服务器)套接字地址来通信。

  • 服务器站点
    • 本地(服务器)套接字地址由操作系统提供。操作系统知道运行着服务器进程的计算机IP,端口号则需要被分配。标准进程一般都固定端口号,非标准进程则在设计时指定。
    • 远程(客户套)套接字地址包含在发送给服务器的请求报文中。
  • 客户站点
    • 本地(客户)套接字地址也由操作系统提供。操作系统知道运行着客户进程的计算机的IP地址。而端口号是每次进行通信时分配给客户进程的一个临时16位整数。
    • 使用IP地址进行通信时我们知道远程套(服务器)接字地址。使用如域名、邮件地址(应用层标识符)进行通信时,需要通过域名系统DNS(Domain Name System)解析获得IP地址,而端口号客户进程通常知道。

2.2.2 使用传输层的服务

由于应用层没物理通信,这一对进程需要使用传输层提供的服务来通信。对传输层协议的选择将严重影响应用进程的性能。常见传输层协议有:UDP、TCP、SCTP。

  • UDP:提供了无连接的、不可靠的数据包服务。
    • 两个交换报文的终端之间没有逻辑连接。
    • 每个报文都是独立的实体,被封装在一个称为数据报的分组中。
    • 无法得知发送是否完整安全到达。
  • TCP:提供了面向连接的可靠的字节流传输。
    • 两个终端首先通过交换一些连接建立分组来建立一个逻辑连接,有时称为握手
    • 建立连接后,两个终端可以向彼此的方向以报文段形式发送数据块,检测字节的连续性,在字节丢失和损坏时可要求重发。
  • SCTP:组合UDP和TCP。
    • 面向报文的,面向连接的可靠的服务。
    • 可以通过提供多媒体网络层连接提供多媒体流服务。

2.3 标准客户-服务器应用

介绍6个标准应用:HTTP和万维网、文件传输和电子邮件应用、通过TELNET和SSH协议实现远程登录、DNS。

2.3.1 万维网和HTTP

与web相关的最常见的客户-服务器应用程序。

万维网

  • web的流行和两个术语有关:分布式的和链接的。
  • 分布式允许web增长。链接使使得一个网页与另一个存储在世界某个地方的主机上的网页相互引用。
  • 网页的链接通过使用一个称为超文本(hypertext)的概念而实现。

结构

  • WWW是一个分布式客户-服务器服务。
  • 服务分布在很多称为站点(site)的地点上。
  • 每个站点上有一个或多个文档,称为网页。
  • 每个网页可以包含一些到其他网页的链接。

网络客户(浏览器)

  • 每个浏览器通常包含三部分:控制程序,客户协议和解释程序。
  • 控制程序接收来自键盘和鼠标的输入并使用客户端程序来访问文档。
  • 访问后,控制程序使用解释程序来显示文档。

网络服务器

网页时存储在服务器上的,为了提高效率,服务器通常将被请求的文件存储在内存的缓存中。

  • 统一资源定位符(Uniform Resource Locator, Url) 为了定义一个网页,我们需要三个标识符:主机、端口、路径。在定义网页之前,我们需要告知浏览器我们想使用哪个客户-服务器应用,这称为协议。形式通常位protocol://host:port/path,port默认可省略。
    • 协议:这个标识符是我们使用的来访问网页的客户-服务器程序的缩写。
    • 主机:主机标识符可以是服务器的IP地址或主机被给予的唯一名称。IP地址可以按点分割的十进制数表示法定义。名称通常是唯一定义主机的域名。
    • 端口:端口是一个16位整数,通常为客户-服务器应用预定义。如http默认80,否则将会被显示。
    • 地址:定义了下层的操作系统中文件的位置和名称。
  • 网上文档:可分为三大类,静态文档/动态文档/活动文档。
    • 静态文档:在服务器中创建和存储的固定内容的文档。用户不能改变他们,通常使用html、xhtml、xsl等编写。
    • 动态文档:对每个请求都要创建一个全新的文档,因此动态文档的内容随着请求不同而不同。使用jsp、phtml、asp等编写。
    • 活动文档:创建工作移到浏览器端,如使用javascript在浏览器端生成。

超文本传输协议(HTTP)

用来定义客户服务器程序如何编写和如何从万维网获取网页的协议。一个HTTP客户发送一个请求;HTTP服务器返回响应。服务器使用80端口,客户使用一个临时的端口号。HTTP使用TCP传输层服务。意味着进行任何事务之前,服务器和客户之间必须建立连接,事务之后连接应当终止。

非持续与持续连接

当要获取的对象位于同一台服务器,我们可以每次使用一个全新的TCP连接来获取一个对象,也可以创建一个TCP链接获取全部对象。分别称为非持续连接和持续连接,在HTTP1.1之后持续连接是默认的。

  • 非持续链接
    1. 客户开启一个TCP连接并发送请求。
    2. 服务器发送响应并关闭连接。
    3. 客户读取数据直到它遇到了文件结束标记,然后关闭连接。

    如果文件包含了N个位于不同文件的图片连接(位于同一服务器),那么就必须开启和关闭N+1次。会有高额开销(握手时间、缓冲区、变量等)。

  • 持续链接
    • 服务器在发送一个响应后,为响应更多的请求儿将连接置为打开状态。
    • 服务器可以在客户的请求下或超时情况下将连接关闭。

报文格式

HTTP协议定义了请求报文和响应报文的格式。每一种报文由四部分组成。请求报文的第一部分称为请求行,响应报文的第一部分称为状态行。其他三部分都称为首部行,空行和主体。

  • 请求报文
    • 请求行:请求报文的第一行,由三部分由空格隔开并且被两个字符(回车和换行)终止。这些字段称为方法、URL、版本。
      • 方法字段:定义了请求类型。

        类型 作用 特征
        get   报文主体是空的
        head 获取网页信息 响应报文只有头部,主体是空的
        put 讲一个新的页面发送到服务器  
        post 发送信息到服务器,用于加入网页或修改网页  
        trace 用于调试  
        delete 用于删除服务器上的网页  
        options 允许客户询问网页属性  
      • url:定义了相关网页的地址和名称。
      • 版本:给出协议的版本
    • 请求头部:可以有一个或多个请求头部行。每一个头部都从客户端向服务器发送格外信息。每个头部行有头部名字、一个冒号、一个空格和一个头部值。
    • 主体:出现在请求报文中,通常使用post和put时,包含要发送的评论和发布到网站上的文档。
  • 响应报文
    • 状态行:响应报文的第一行,有空格分割并且被两个字符(回车和换行)种植。有三个字端:版本、状态码、短语。
      • 版本:HTTP协议的版本。
      • 状态码:定义了请求的状态。

        状态码 含义
        100范围 代表一个报告,代表请求已被接受,需要继续处理
        200范围 表示这是成功的请求
        300范围 表示客户端重定向到另一个URL,客户端采取进一步的操作才能完成请求
        400范围 通常是在客户端发生了错误
        500范围 通常代表了服务器在处理请求的过程中有错误或者异常状态发生
      • 短语:文本格式解释了状态码。
    • 响应头:可以有一个或多个响应头部行。每一个头部行都从服务器向客户端发送额外的信息。每个头部行都有一个头部名称、一个冒号、一个空格和一个头部值。
    • 主体:包好了从服务器发送给客户的文档,除非响应是一个错误报文,否则主体是存在的。
  • 条件请求:客户可以在请求中加入条件,如果条件满足,服务器将会发送被请求的网页或者通知用户。
  • Cookie
    • 创建和存储cookie
      1. 当服务器从客户端收到请求后,将客户端的信息存储在文件或字符串中,可能包含客户端的域名、cookie内容。
      2. 服务器在响应中包含了它发送给客户端的cookie
      3. 当客户端接收到响应后,浏览器在cookie目录中存储cookie,并根据服务器域名进行分类。
    • 使用cookie:当客户向服务器发送请求时,浏览器在cookie目录中查询是否有从那个服务器发送过来的cookie。如果有,则在请求中包含这个cookie。

万维网高速缓存:代理服务器

HTTP支持代理服务器(proxy server)。代理服务器是一台能保存最近请求的响应副本的计算机。代理服务器检查本地高速缓存,如果本地高速缓存中不存在响应报文,则向相应的服务器发送请求,返回的响应会发送到代理服务器,并进行存储。

代理服务器位置

  • 通常位于客户站点。
  • 客户计算机也可以用作小容量代理服务器,存储着与客户经常调用的请求相应的响应。
  • 公司中,一个代理服务器可能安装在计算机LAN中来减少进出LAN的负载。
  • 带有很多客户的ISP可以安装一台代理服务器来减少进出ISP的负载。

缓存更新

  • 每天定时更新。
  • 加入头部来显示信息的最近修改时间,代理服务器可以使用这些头部的信息去判断。

HTTP安全

HTTP本质上并不安全。HTTP可以在安全套接层(SSL)上运行,这种情况下称为HTTPS,HTTPS提供保密性、客户和服务器鉴别以及数据完整性。

2.3.2 FTP

文件传输协议(File Transfer Protocol)是TCP/IP提供的标准机制,用于将文件从一个主机复制到另一个主机。尽管我们可以使用HTTP进行文件传输,但是FTP是传送大文件或使用不同格式传送文件的更好选择。

  • 模型:本地文件系统<—>客户机<—>服务器<—>远程文件系统。
  • 客户有三个组件:用户接口、客户控制进程、客户数据传输进程。
  • 服务器有两个组件:服务器控制进程、服务器数据传输进程。
  • FTP将命令和数据传输分开。

两种连接的寿命

  • 整个监护的FTP会话期间,控制连接始终处于连接状态。数据连接则在每次传输文件时开启然后关闭。
  • FTP使用两个熟知的端口:21用于控制连接,20用于数据连接。

控制链接

  • 控制通信,FTP和TELNET使用相同的方法,使用NVTASCII字符集。
  • 通信是通过命令和响应完成的。一次发送一条命令,每一条命令或响应都是一个短行。
  • 从FTP客户端控制进程发送的命令是ASCII大写字母形式的,可能带有也可能不带有参数。
  • 每个FTP命令至少产生一个响应,一个响应有两部分:跟随在文本后的一个三位数字。文本部分定义了需要的参数或进一步的解释。第一个数字定义了命令状态,第二个数字定义了状态应用的区域,第三个数字提供了额外信息。

数据连接

数据连接使用服务器的20端口。 连接步骤:

  1. 客户,使用临时的端口发起一个被动打开。
  2. 客户使用PORT命令发送这个端口到服务器。
  3. 服务器接收到端口号,使用数值端口20发出主动打开并且接收临时端口号。

通过数据连接的通信

数据连接的目的和实现与控制连接是不同的。我们通过数据连接来传输文件。客户必须定义传输文件的类型、数据结构、传输模式。在通过数据连接发送文件之前,我们通过控制连接进行准备。

  • 数据结构:FTP可以使用下列数据结构中的一种在数据连接中传送文件:文件结构、记录结构、页面结构。
    • 文件结构格式:(默认使用)没有结构,是连续的字节流。
    • 记录结构:把文件划分成一些记录,只能用于文本文件。
    • 页面结构:把文件划分成页面,每一个页面有一个页面号和页面头部。
  • 文件类型:可以在数据连接上传送下列文件中的一种:ASCII文件、EBCDIC文件和图像文件。
  • 传输方式:可以使用流方式、块方式和压缩方式在数据连接上传送文件。
    • 流方式:默认方式,数据作为连续的字节流从FTP传递给TCP。
    • 块方式:数据可以按块从FTP传递给TCP,这种情况下,每个块前面有一个3字节的头部。第一个字节称为块描述符,后两个字节以字节为单位定义块的大小。

文件传输

文件传输是在控制连接上发送出来的命令的控制下,在数据连接上进行的。FTP的文件传输表示三件事情之一:读取文件(服务器到客户)、存储文件(客户到服务器)、目录列表(服务器到客户)。

FTP安全

FTP密码是明文发送,数据传输连接也用明文传输数据。为了安全,我们可以把安全套接层加入到FTP应用层和TCP层之间,这种情况下,FTP称为SSL-FTP。

2.3.3 电子邮件

与其他应用服务的不断运行不同,电子邮件是一个单向事务。使用介于通信双方的计算机(服务器),当用户想要发送邮件的时候他只运行客户程序并且中间服务器提供客户/服务器模式。

架构

从Alice到Bob的一份简单的电子邮件需要九个不同步骤。Alice和Bob使用三个不同的代理:用户代理(User Agent,UA)、报文传输代理(Mail Tansfer Agent,MTA)以及报文访问代理(Message Access Agent,MAA)。

UA->MTA客户->(MTA服务器->池->MTA客户)->Internet->MTA服务器->箱->MAA服务器->MAA客户->UA

用户代理

电子邮件系统的第一个组件,向用户提供服务,使发送和接收一个报文变的容易。用户代理是一个软件包(程序),由读写、回答和转发报文组成。

  • 发送邮件:
    • 邮件有一个信封和一个报文。
    • 信封包含发件人地址和收件人地址和其他信息。
    • 报文包含头部和主体。头部定义了发信人、收件人、报文的主题和其他信息。主体包含了收件人要读取的真正信息。
  • 接收邮件:
    • 用户或定时器触发用户代理检查邮箱。如果有邮件,UA就用通知告诉用户。
    • 用户准备读取邮件,则会显示一个列表。
    • 列表中的每一行包含了邮件中关于特定报文的信息概要。
  • 地址:
    • 在因特网中电子邮件地址由两部分构成:本地地址(local part)和域名(domain name)构成,并且由@隔开。
    • 本地部分定义了一个特定文件的名字,称为用户邮箱,在用户邮箱中存储了用户所有接收到的邮件。
    • 分配给每一个邮件交换机的域名或者来自DNS数据库或者是一个逻辑名字。

报文传输代理:SMTP

在因特网中定义MTA客户机和服务器的常用协议称为简单邮件传输协议(SMTP)。 在发送方和接收方邮件服务器之间以及两个邮件服务器之间被使用两次。在邮件服务器和接收器之间还需要另一个协议。 SMTP只定义了如何来回发送命令和响应。

  • 命令和响应:SMTP使用一些命令和响应在MTA客户和MTA服务器之间传输报文。
  • 传输一个邮件共有三个阶段:连接建立、邮件传输和连接终止。

报文访问代理:POP和IMAP

邮件投递的第一和第二阶段使用SMTP。因为SMTP是一个推(push)协议,第三阶段需要客户端从服务器拉出报文所以需要一个拉(pull)协议,所以使用报文访问代理协议。 目前有两种报文访问代理协议:邮局协议版本3(POP3)和因特网邮件访问协议(IMAP4)。

MIME

电子邮件有一个简单的结构。但是它的简单是有代价的,只能发送使用NVT7位ASCII格式的报文。多用途因特网邮件扩充(Multipurpose Internet Mail Extensions, MIME)在发送方将非ASCII数据转换成NVT ASCII数据。

基于Web的邮件

在基于Web的邮件架构下,http使用在客户和邮件服务器之间,邮件服务器之间仍然使用SMTP。

2.3.4 TELNET

我们把允许客户端的用户登录到服务器站点上的计算机并且使用那里的可用服务的这种通用客户-服务器程序对称为远程登录(remote login)应用。
原始的远程登录协议之一是TELNE,是终端网络(TErminal NETwork)的缩写。因为他使用明文发送所有数据,包括口令,不安全,所以让位于另一种协议—-安全人机界面(Secure Shell, SHH)。

本地登录

登录到本地系统,称为本地登录。终端驱动程序接收用户击键,将字符传递给操作系统,操作系统解释字符的组合,调用所需的应用程序或实用工具。

远程登录

当用户想访问远程机器上的一个应用程序或使用工具时,需要进行远程登录(remote login)。

  1. 用户将击键发送给终端驱动程序,同时本地操作系统接收字符,不解释他们。
  2. 这些字符被发送到TELNET客户机,将这些字符转换成网络虚拟终端(Network Virtual Terminal,NVT)字符的通用字符集。
  3. 然后将其传送给本地TCP/IP协议堆栈。
  4. 采用网络虚拟终端(NVT)形式的命令或文本通过因特网传送到远程机器的TCP/IP堆栈。
  5. 传递给操作系统,然后传递给TELNET服务器,TELNET服务器将这些字符转换为远程计算机可以理解的字符。
  6. 因为远程的操作系统不能接收来自TELNET服务器的字符,只能接收来自终端驱动程序的字符,需要通过一个叫未中断驱动程序(pseudo terminal driver)的软件块,将这些字符伪装成好像是从一个终端发来的。
  7. 然后操作系统将这些字符传送给适当的应用程序。

网络虚拟终端(NVT)

TELNET为解决异构系统的问题(需要知道要连接的计算机的类型,需要安装计算机所用的终端仿真程序),定义了一个通用的接口,称为网络虚拟终端。通过这个接口,客户TELNET将来自本地终端的字符(数据或命令)转换成NVT形式,传给网络。服务器TELNET将来自NVT形式的数据或命令转换成远程计算机可接受的形式。

2.3.5 安全shell

组件

SSH是一个有三个组件(SSH连接协议、SSH认证协议、SSH传输协议)的应用层协议。

  • SSH应用层协议(SSH-TRANS)

    建立安全信道,认证服务器,是传输协议。SSH在TCP顶部创建安全链路的协议,称为SSH-TRANS,当执行这个协议的程序被调用时,客户和服务器首先使用TCP协议建立一个不安全的连接。然后交换几个安全参数在TCP顶部建立安全信道。这个协议提供的服务有:

    1. 隐私或交换报文的保密性。
    2. 数据完整性,防篡改。
    3. 服务认证,确认无服务器冒充。
    4. 报文压缩,提高效率和进攻成本。
  • SSH认证协议(SSH-AUTH)

    认证客户。客户和服务器之间的安全信道建立以及客户端认证服务器之后,SSH调用另一个流程,进行服务器对客户进行认证,过程与安全套接层(SSL)类似。认证过程以报文传输数据。

  • SSH连接协议(SSH-CONN)

    真正的应用协议。允许用户创建多个逻辑信道,用于不同的目的。

应用

尽管SSH是用来替代TELNET的,但是除用于远程登录外还用于文件传输。

端口转发

SSH协议提供了一个端口转发的服务,SSH端口转发机制创建了一个隧道,属于其他协议的报文可以穿过这个隧道。

SSH分组的格式

长度(4字节) + 填充(1-8字节) + 类型(1) + 数据(变长) + CRC(4字节)

  • 长度字段:定义了分组的长度,但是不包括填充字符。
  • 填充字符:被加入到分组使攻击更困难。
  • 循环冗余校验字段:用于错误检测。
  • 类型字段:指明在不同SSH协议中使用的分组类型。
  • 数据字段:不同协议中分组传输的数据。

2.3.6 域名系统

为了识别一个实体,TCP/IP协议使用IP地址唯一确定一台主机到因特网的连接。人们更喜欢使用名字(域名)而不是ip。DNS就是使用分布在世界上的很多台计算机完成域名到IP地址映射的一种系统。

映射步骤

  1. 用户将主机名传递给文件传输客户端。
  2. 文件传输客户端将主机名传递给DNS客户端。
  3. 启动后,每一台电脑都知道DNS服务器的地址,DNS使用DNS服务器地址向DNS服务器发送附有查询的报文。
  4. DNS服务器进行响应,发回客户想要获得的文件传输服务器的IP地址。
  5. DNS客户端将IP地址传递到文件传输服务器。
  6. 文件传输客户端使用接收到的IP地址访问文件传输服务器。

访问因特网的目的就是在文件传输客户端和服务器端之间建立连接。我们至少需要两个连接。第一个用于将名称映射到IP地址,另一个连接用于传输文件。

命名空间

为实现无二义性,分配给机器的名字必须从命名空间中仔细选择。命名空间按两种方式进行组织,平面和层次。

  • 平面命名空间:一个名字分配给一个地址。空间的名字是无结构的字符序列。
  • 层次命名空间:名字由几个部分组成。

域名空间

为了获得层次命名空间,设计了域名空间,这种设计方式中,所有的名字由根在顶部的倒置树结构定义。

  • 标签:树上的每个结点有一个标签。根结点的符号是空字符串。DNS要求每一个节点的子节点有不同的标签。
  • 域名:树上的每一个节点都有一个域名,一个完整的域名是用点(.)分隔的标签序列。域名总是从结点向上读到根结点。最后一个标签是根节点的空标签。如果一个标签以一个空字符串结尾则称为全称域名(fully qualified domain name),如 ‘//空’ ->edu.->top.edu.->beijing.top.edu.

域(Domain)是域命名空间的子树,域的名称是子树顶端结点的名称,如com、edu等。域本身仍可能被分割成多个域。

命名空间的分布

必须将域名空间所包含的信息存储起来,但是单台计算机存储如此大容量的信息效率非常低(响应世界上的所有请求)且不可靠(宕机完蛋)。

解决方法是将信息分布在多台称为DNS服务器的计算机中。一种方法是将整个空间划分成多个基于第一级的域,然后可以继续划分,每台计算机负责一个域。与建立名字的层次结构一样,也建立了服务器的层次结构。

区域

  • 一个服务器负责或授权的方位称为区域(zone)。
  • 我们可以将一个区域定义为整个树中的一个连续部分。
  • 如果服务器负责一个域,而这个域没有进一步被划分成更小的域,此时域和区域是相同的。
  • 服务器有一个数据库,称为区域文件。
  • 如果域被划分为多个子域,并将部分授权委托给其他服务器,那么域和区域就不同了。

根服务器

  • 根服务器(root server)的区域由整个树组成。根服务器通常不保存关于域的任何信息,只是将其授权委托给其他服务器,并保持与这些服务器的参照关系。目前有多个根服务器分布在世界各地。

  • 主服务器和辅助服务器

    • 主服务器(primary server)是指存储了授权区域有关文件非服务器,创建维护和更新区域文件,并将区域文件存储在本地磁盘中。
    • 辅助服务器(secondary server)负责从另一个服务器(主或辅)传输一个区域的全部信息,并将存储在本地磁盘。辅助服务器既不创建也不更新区域文件,更新由主服务器完成,由主服务器发送更新的版本到辅助服务器。
    • 主服务器和辅助服务器对它们所服务的区域都有控制权。一台服务器既能是一个区域的主服务器同时也是另一个区域的辅助服务器。

因特网中的DNS

DNS是一种可以用在不同平台上俄协议。因特网中域名空间被划分成三个部分,通用域、国家域、反向域(废除)。

通用域

generic domain。按照已经注册主机的一般行为对主机进行定义。是到域名空间数据库的一个索引。

国家域

country domain。部分使用双字母的国家缩写,第二级标号可以使机构或由各国家自定,如:uci.ca.us。

解析

将名字映射为地址或将地址映射为名字的过程称为名字-地址解析(name-address resolution)。主机需要调用一个称为解析程序(resolver)的DNS客户程序。

  • 递归解析
    • 源主机调用DNS解析程序着目的主机的IP地址。
    • 解析程序不知道,请求发送到本地DNS服务器。
    • 本地DNS服务器不知道目的主机的IP地址,发送请求到根DNS服务器(知道根DNS服务器的IP地址)。
    • 根DNS服务器不保存名字到IP地址的映射,但是知道每个顶级域中的一台主机,于是查询被发送到这台顶级域服务器,(如.com服务器)。
    • 顶级域服务器不知道特定目的的映射,但是知道目的主机的DNS服务器的IP,于是查询发送到这台DNS服务器。
    • 然后一路返回,本地服务器可能会缓存这个地址以待将来查询。
  • 迭代解析
    • 每个不知道映射的服务器将下一台服务器的IP地址发回到请求查询的主机上,源主机再向这个地址重新发起查询

高速缓存

为了缩短查询时间提高效率,DNS服务器使用称为高速缓存的机制。当一台服务器向另一个服务器请求映射并得到回应时,再将这一回应返回客户端之前,会存储在高速缓存中。

为了表明这一响应来自高速缓存,服务器会将响应标志位非授权性。

为了防止长期缓存返回过时映射,有两种解决方式。授权服务器总是将生存时间(TTL)添加到映射上,超时必须再次发送到授权服务器。或DNS要求服务器对每个映射保留一个TTL计数器,定期检查,并清除过期缓存。

资源记录

与某个服务器相关的区域信息以资源记录(resource record)集的形式实现。资源记录是一个5元组结构:

  • 域名:标识资源记录
  • 类型:数值应该被如何解释
  • 类别:网络的类型
  • TTL:信息有效的时间,以秒为单位
  • 数值:保存的关于域名的信息

DNS报文

两种报文:查询报文和响应报文。

  • 头部
    • 标识字段:匹配查询的响应
    • 标记字段:定义了报文是查询报文还是响应报文,也包含差错状态
    • 剩余4个字段:报文中每个记录类型的数目
  • 查询部分:包含一个或多个问题记录
  • 响应部分:包含了一个或多个资源记录
  • 授权部分:给出一个或多个负责查询的授权服务器的信息(域名)
  • 额外部分:提供了可能帮助解析程序的额外信息

查询报文只包含查询部分,响应报文包含查询部分、响应部分,也可能包含其他两部分。

封装

DNS只用TCP或UDP协议。因为UDP分组有512字节分组大小的限制,那么响应报文小于512字节时,使用UDP,大于时只能使用TCP。

  • 如果预先知道超过512,会直接使用TCP连接。
  • 如果使用了UDP端口,但是响应报文超过了512字节,服务器会截断这一报文,解析程序会开启TCP连接,并重复该请求,从服务器中获得完整的响应。

注册机构

由注册机构(registrar)来完成,首先确认询问的域名是唯一的,在将他输入到DNS数据库中。需要提供域名和ip地址。

DDNS

由于地址的多变,手动操作更新数据不适用,也不再被允许。DNS主文件必须能动态更新,动态域名系统(Dynamic Domain Name System,DDNS)就是为满足这种需求而设计的。在DDNS中,当名字和地址之间的绑定被确定时,这些信息通常由DHCP发送给主DNS服务器,主服务器更新这一区域后,以主动或被动方式通知辅助服务器,辅助服务器更新时会请求整个区域的信息。

DNS安全

几种攻击方式:

  • 读取DNS服务器的响应,可被用来找到用户信息,可将DNS报文保密来防止。
  • 截获DNS服务器的响应并加以改变,甚至创造一个新的伪造的响应。可使用报文起源鉴别和报文完整性来进行预防。
  • 泛洪共计淹没DNS服务器,使之瘫痪,可采取预防拒绝服务攻击的措施。

DNS安全(DNS Security,DNSSEC),使用数字签名(digital signature)的安全服务提供报文起源鉴别以及报文完整性,不提供DNS报文机密性,没有针对拒绝服务攻击进行特定的保护。

2.4 对等模式

2.4.1 P2P网络

准备共享资源的用户成为对等结点,并且组成一个网络。一个感兴趣的对等结点可以连接到存储这个文件的计算机并下载它,且下载后能为其他对等结点提供下载。由于对等结点列表可能增长也可能萎缩,因此待解决的问题是,这个模式如何记录忠实用户以及文件的位置。

集中式网络

  • 目录系统:列出对等结点以及它们所提供的内容,使用客户-服务器模式。
  • 存储和下载系统:使用对等模式完成。

所以集中式P2P网络有时称为混合P2P网络。

  • 对等结点首先在中心服务器进行注册,之后对等结点提供自身IP地址以及将要分享的文件列表。
  • 一个寻找特定文件的对等结点向中心服务器发送一个查询,服务器搜索其目录,将含有所需要文件副本的多个结点的IP地址作为相应返回对等结点。
  • 当有结点加入或离开时,目录立即进行更新。

分散式网络

不依赖中心化目录系统,对等结点将自身置于覆盖网(overlay network)中。是一个逻辑网,在物理网的顶层创建,依照覆盖网中结点连接方式,分散式P2P网络又分为非结构化和结构化两种。

  • 非结构化网络:结点随机连接,搜索效率不高,因为对一个文件的查询必须通过网络进行泛洪。
  • 结构化网络:采用一组预先确定的规则来连接结点,有效并高效的解决查询,最常用的技术是分散式散列表(Distributed Hash Table,DHT)

2.4.2 分散式散列表

根据预先定义的规则将数据(或引用数据)分发到一组结点上。基于DHT的网络,每个对等结点负责一系列的数据项。为了避免在非结构化P2P网络中讨论的泛洪开销,基于DHT的网络允许每个结点对整个网络做部分了解,对网络的了解可用于把对某数据项的查询路由到负责该资源的结点上。

地址空间

基于DHT的网络中,每个数据项和对等结点都被映射到大小为2^m的地址上,m大多使用160。

  • 散列对等结点标识符:将所有对等结点放入地址空间环中,使用结点ID = hash(对等结点IP地址)的散列函数。
  • 散列对象标识符:被共享的对象名称(例如一个文件)也被散列成相同地址空间上的一个m位整数,使用关键字 = hash(对象名)
  • 存储对象
    • 直接方法:环中哪个结点ID与对象的关键字最接近,就存储在哪个结点上。
    • 间接方法:由于效率问题,绝大多数DHT系统使用间接方法。用用对象的对等结点保存对象,对象的引用被创建并存储在另一个结点上。这个结点的ID最接近关键字,即物理对象以及其引用被存储在两个不同地点。
    • 不同:直接方法中,我们创建了存储对象的那个结点的ID和对象关键字之间的关系;简介方法中,我们创建了对象引用与存储引用的那个结点之间的关系。
  • 路由:DHT的主要功能是将一个查询路由到负责存储这个对象引用的结点上。依照一种思想,每个结点必须对整个环有部分了解,从而将查询路由到与负责结点最接近的一个结点上。
  • 结点的到达和离开:DHT的实现需要一种清晰、有效的策略来处理结点的到达和离开,并处理对其余结点的影响。绝大多数DHT实现将结点失效看做结点离开。

2.4.3 协议

有很多实现了DHT系统的协议,如Chord、Pastry、Kademlia


Content