2. 应用层

1. 应用层协议原理

研发网络应用的核心是写出能够运行在不同端系统和通过网络彼此通信的程序;值得注意的是,我们不需要写在网络核心设备(如路由器或者链路层交换机)上运行的软件,因为网络核心设备并不在应用层起作用,而仅在较低层起作用。这种设计方式即将应用程序限制在端系统的方法,促进了大量网络应用程序的迅速研发和部署。

1.1 应用程序体系架构

应用程序的体系结构明显不同于网络的体系结构。从应用程序开发者的角度来看,网络体系结构是固定的,并为应用程序提供了特定的服务集合。另一方面,应用程序体系结构由应用程序研发者设计,规定了如何在各种端系统上组织该应用程序。目前主流的两种体系架构:客户-服务器体系架构、对等(P2P)体系架构。

(1)客户-服务器体系架构

在该体系结构中,有一个总是打开的主机,即服务器,它接收和服务来自其他许多被称为客户的主机请求;在该体系结构中,客户之间是不直接通信的;该服务器具有固定的、周知的地址,即IP地址。客户-服务器体系结构的著名应用有:Web、FTP、Telnet和电子邮件。

通常,如果仅有一台服务器处理所有请求,那么便会不堪重负,因此,需要配备大量数据中心,以用于创建强大的虚拟的服务器。一个数据中心可以有数十万台服务器,它们必须要供电和维护,此外服务提供商必须支付互联和带宽费用,以发送和接受到达/来自数据中心的数据。

(2)P2P体系架构

在该架构中,对位于数据中心的专用服务器有最小的(或者没有)依赖。应用程序在间断连接的主机对之间使用直接通信,这些主机对被称为对等方,其不为服务供应商所有。这种通信不需要通过专门的服务器。也被称为对等方到对等方结构。

P2P具有自扩展性,在一个P2P应用中,每个对等方都有雨请求文件产生工作负载,但每个对等方通过向其它对等方分发文件也为系统增加服务能力。P2P也有成本效率,通常不需要庞大的服务器基础设施和服务器带宽。未来,P2P应用由于高度非集中式结构,面临安全性、性能和可靠性等挑战。

1.2 进程通信

进行通信的实际上是进程,而不是程序。一个进程可以被认为是运行在端系统中的一个程序,当多个进程运行在相同的端系统上时,他们使用进程间通信机制相互通信。这个通信的规则又操作系统来定义。在两个不同端系统上的进程,通过跨越计算机网络交换报文而相互通信。

(1)客户和服务器进程

网络应用程序由成对的进程组成,这些进程通过网络相互发送报文。对每对通信进程,我们通常将这两个进程之一标识为客户(client),而另一个进程标识为服务器。在给定的一对进城之间,首先发起通信的进程被标记为客户进程,在会话开始时等待联系的进程被称为服务器进程。

对于Web而言,浏览器是一个客户进程,Web服务器是一台服务器进程。对于P2P文件共享,下载文件的对等方标识为客户,上载文件的对等方标识为服务器。

(2)进程与计算机网络之间的接口

从一个进程向另一个进程发送的报文必须通过下面的网络。进程通过一个称为套接字(sock, el)的软件接口向网络发送报文和从网络接收报文。套接字是同一台主机内应用层与运输层之间的接口。由于该套接字是建立网络应用程序的可编程接口,因此套接字也称为应用程序和网络之间的应用程序编程接口API

image-20221203164618982

应用程序开发者可以控制套接字在应用层端的一切,但是对该套接字的运输层端几乎没有控制权。应用程序开发者对于运输层的控制仅限于:①选择运输层协议;②设定部分运输层参数,如最大缓存、最大报文段长度。一旦应用程序开发者选择了一个运输层协议(如果可供选择的话),则应用程序就建立在由该协议提供的运输层服务之上。

(3)进程寻址

在一台主机上运行的进程为了向在另一台主机上运行的进程发送分组,接收进程需要有一个地址。为了标识该接收进程,需要定义两种信息:①主机的地址;②在目的主机中指定接收进程的标识符。IP地址是一个32比特的量且它能够唯一地标识该主机。

除了知道报文发送目的地的主机地址外,发送进程还必须指定运行在接收主机上的接收进程(更具体地说,接收套接字)。目的地端口号(port number)用于这个目的。一些常用的应用程序有着固定的端口号,比如Web服务器使用80端口、邮件服务器(运行SMTP协议)使用25端口。

1.3 可供应用程序使用的运输服务

前面讲过套接字是应用程序进程和运输层协议之间的接口。在发送端的应用程序将报文推进该套接字。在该套接字的另一侧,运输层协议负责从接收进程的套接字得到该报文。

包括因特网在内的很多网络提供了不止一种运输层协议。对于协议的选择,需要研究每个协议所提供的服务,选择一个最为应用需求提供恰当服务的协议。运输层协议对应用程序提供的服务,可以分为四类:可靠数据传输、吞吐量、定时和安全性。

(1)可靠数据传输:数据丢失可能会造成灾难性的后果。因此,为了支持这些应用,有必要做一些工作以确保由应用程序的一端发送的数据正确。如果一个协议提供了这样的确保数据交付服务,就认为提供了可靠数据传输。当一个运输层协议不提供可靠数据传输时,由发送进程发送的某些数据可能到达不了接收进程。这可能能被容忍丢失的应用接受,包括音频、视频等,能承受一定量的数据丢失。

(2)吞吐量:在沿着一条网络路径上的两个进程之间的通信会话场景中,可用吞吐量就是发送进程能够向接收进程交付比特的速率。该可用吞吐量将随时间波动。这些导致另一种服务:运输层协议能够以某种特定的速率提供确保的可用吞吐量。以此来确保应用程序能够请求r比特/秒的吞吐量。对于类似电因特网电话一类的应用而言,接收所需吞吐量的一半是几乎没有或根本没有用处的。具有吞吐量要求的应用程序被称为带宽敏感的应用弹性应用能够根据当时可用的带宽或多或少地利用可供使用的吞吐量,如电子邮件、文件传输。总体而言,吞吐量越多越好!

(3)定时:运输层协议也能提供定时保证。一个提供定时服务的例子是:发送方注入套接字中的每个比特到达接收方的套接字不迟于100ms。有些应用为了服务的有效性而对数据到达时间有严格的要求,常见的应用有:因特网电话、多方在线游戏等。

(4)安全性:运输协议能够为应用程序提供一种或多种安全性服务。例如,在发送主机中,运输协议能够加密由发送进程传输的所有数据,在接收主机中,运输层协议能够在将数据交付给接收进程之前解密这些数据。运输协议还能提供除了机密性以外的其他安全性服务,包括数据完整性和端点鉴别

1.4 因特网提供的运输服务

因特网(更一般的是TCP/IP网络)为应用程序提供两个运输层协议,即UDP和TCP。当软件开发者为因特网创建一个新的应用时,首先要选择UDP还是选择TCP。每个协议为调用它们的应用程序提供了不同的服务集合,以下是某些应用程序的服务要求。

image-20221204183226786

(1)TCP服务

TCP服务模型包括面向连接服务和可靠数据传输服务。当某个应用程序调用TCP作为其运输协议时,该应用程序就能获得来自TCP的这两种服务。

  • 面向连接的服务:在应用层数据报文开始流动之前,TCP让客户和服务器互相交换运输层控制信息。握手阶段后,一个TCP连接(TCP connection)就在两个进程的套接字之间建立了。这条连接是全双工的——双方的进程可以在此连接上同时进行报文收发。当结束报文发送时,必须拆除该连接。

  • 可靠的数据传送服务:通信进程能够依靠TCP,无差错、按适当顺序交付所有发送的数据。

TCP协议还具有拥塞控制机制,当发送方和接收方之间的网络出现拥塞时,TCP的拥塞控制机制会抑制发送进程(客户或服务器)

TCP和UDP不提供加密机制,这就是说发送进程传进其套接字的数据,与经网络传送到目的进程的数据相同。TCP的加强版本,称为安全套接字层(Secure Sockets Layer, SSL) ,相比于TCP额外提供了关键的进程到进程的安全性服务,包括加密、数据完整性和端点鉴别。

(2)UDP服务

UDP是一种不提供不必要服务的轻量级运输协议,它仅提供最小服务。UDP是无连接的,因此在两个进程通信前没有握手过程。UDP协议提供一种不可靠数据传送服务,无法保证发送的报文能被接受,也有可能是乱序到达。UDP没有包括拥塞控制机制,所以UDP的发送端可以用它选定的任何速率向其下层(网络层)注入数据。

(3)运输协议不提供的服务

从可靠数据传输、吞吐量、定时、安全性等四个角度来看运输层提供的服务,我们发现,运输层无法对吞吐量和定时做出保证。今天的因特网能够为时间敏感的应用提供满意的服务,但并不提供任何定时或者带宽保证;

1.5 应用层协议

应用层协议(application-layer protocol)定义了运行在不同端系统上的应用程序进程如何相互传递报文。特别是应用层协议定义了:

  • 交换的报文类型,例如请求报文和响应报文。
  • 各种报文类型的语法,如报文中的各个字段及这些字段是如何描述的。
  • 字段的语义,即这些字段中的信息的含义。
  • 确定一个进程何时以及如何发送报文,对报文进行响应的规则。

2 Web和HTTP

2.1 HTTP概况

HTTP(HyperText Transfer Protocol)是WEB的应用层协议,它是Web的核心;HTTP有两部分实现,一个客户端程序一个服务器程序;HTTP定义了客户和服务器进行报文交换的方法;

Web页面(Webpage)(也叫文档)是由对象组成的,一个对象(object)只是一个文件。客户和服务器交互的核心思想是客户通过HTTP请求对服务器发出对Web页面的请求报文,服务器收到该报文后将返回包含该对象的HTTP响应报文。每个URL地址由两部分组成:存放对象的服务器机名和对象的路径名。

例如,URL 地址 http://www. someSchool. edu/someDepartment/pic-ture. gif,其中的 www. someSchool. edu 就是主机名,/someDepartment/picture, gif 就是路径名

HTTP使用TCP作为它的传输层协议;HTTP客户首先发起一个与服务器的TCP连接,需要注意的是,服务器根据请求作出响应,但是不存储任何关于该客户的状态信息;也正因为这样,HTTP被称为无状态协议。同时,Web使用了客户端-服务器的应用体系结构;其中web服务器总是开着的。

2.2 非持续连接和持续链接

在因特网应用程序中,客户端和服务器将在很长的时间范围里通信;应用程序将根据自身的特点,选择以规则的间隔周期性性发出请求也可以间断性一个个发出请求。当通信是使用TCP协议时,服务器端需要做出一个决定:每个请求/响应都经一个单独的TCP连接发送,还是所有请求相应仅通过一个TCP连接发送。使用前一个方法,称应用程序使用非持续连接,如果使用后一种方式,则称为持续连接

HTTP既可使用持续连接也可以使用非持续连接。尽管HTTP在静默情况下使用持续连接,HTTP客户和服务器也能配置成使用非持续连接。

(1)非持续连接的HTTP

非持续连接的使用,其中每个TCP连接在服务器发送一个对象后关闭,即该连接并不为其他的对象而持续下来。值得注意的是每个TCP连接只传输一个请求报文和一个响应报文。

往返时间(Round Trip Time, RTF),是指一个短分组从客户到服务器然后再返回客户所花费的时间,包括分组传播时延、分组在中间路由器和交换机上的排队时延以及分组处理时延。

image-20221204183226786

客户端和服务器建立TCP连接的时候,会通过一个三次握手的过程来交换传输控制信息。三次握手的前两次占用了一个RTT,客户结合第三次握手通行会通过该连接发送一个HTTP请求报文,一旦该分组到达服务器,服务器便开始使用TCP传输HTML对象。因此,粗略地说,响应时间是两个RTT加上传输HTML的时间(不是传播)。

非持续连接的缺点:第一,必须为每一个请求的对象建立和维护一个全新的连接;第二,每一个对象经受两倍RTT的交付时延,即一个RTT用于创建TCP,另一个RTT用于请求和接收一个对象。

(2)持续连接的HTTP

如果使用持续连接,那么服务器在发送响应报文后将保持该TCP打开,后续客户端可以使用该连接来向服务器发出请求。不但一个完整的页面可以通过同一个连接传送,同一台服务器上的多个页面也可以通过同一个连接发送。这就提高了效率。

一般来说,如果一条连接在一定的时间间隔后没被使用的话,就会被关闭。HTTP默认使用的是带流水线的持续连接。

2.3 HTTP报文格式

HTTP报文有两种:请求报文和响应报文。

(1)HTTP请求报文
在这里插入图片描述
该报文由ASCII文本书写,每行由一个回车和换行符结束。HTTP请求报文的第一行叫作请求行(request line),其后继的行叫作首部行(header line)。请求行有3个字段:方法字段、URL字段和HTTP版本字段。方法字段可以取GET、POST、HEAD、PUT、DELETE,绝大部分采用GET方法。

首部行包含是否在发送完响应报文后关闭TCP连接的Connection;请求的主机地址(该头部信息被Web高速缓存所要求);浏览器版本;可接受的语言等头部信息。

在这里插入图片描述

在首部行之后一个空行,之后便是请求的“实体体”。该实体体可以在POST方法里传递Form表单内容或者传递其它一些二进制流数据等。值得注意的是,表单也不一定必须使用POST方法。如果使用get,实体体为空,会显示在url中。

Head类似于get方法,将会用一个http报文进行响应,但是不返回请求对象,经常用作调试跟踪。put方法允许用户上传对象到指定的Web服务器上指定的路径。Delete方法允许用户或应用程序删除Web服务器上的对象。

(2)HTTP响应报文格式

在这里插入图片描述

这个响应报文有三个部分:

  • 一个初始状态行(status line) , 包含HTTP版本、状态以及状态信息等内容;
  • 6个首部行(headerline),包含发送日期、服务器类型、上一次修改请求资源的时间、内容的类型等内容;
  • 实体体(entity body),实体体部分是报文的主要部分,即它包含了所请求的对象本身,状态行有3个字段:协议版本字段、状态码和相应状态信息。

2.4 用户与服务器的交互

HTTP是无状态协议,但是Web站点为了识别用户身份或者限制用户访问的时间或者将用户访问的内容同用户身份相关联,Web站点可以使用Cookie技术;

image-20230205215937331

Cookie技术包括四个组件:

  • HTTP响应报文里增加一个关于Cookie的首部行;
  • HTTP请求报文里增加一个关于Cookie的首部行;
  • 用户端系统保留一个Cookie文件,由浏览器保存维护;
  • Web站点建立Cookie和用户身份的关联;

Cookie可以用于标识一个用户,可以在无状态的HTTP之上建立一个用户会话层。但是它的使用存在争议,即隐私侵犯。

2.5 Web缓存

Web缓存器也被称为代理服务器,它代表初始web服务器来满足HTTP请求。它有自己的存储空间,并在存储空间里保持有最近请求过的对象的副本;可以通过配置浏览器,将所有指向初始服务器的请求首先指向代理服务器。

在这里插入图片描述

当代理服务器收到一个HTTP请求后,它将检查本地是否缓存过该对象,如果缓存过该对象,将检查是否过期,如果没有过期,则直接将该对象返回给浏览器;如果本地不存在或者存在已过期,则代理服务器将根据请求报文里的Host首部行以及请求行里的URL字段向初始服务器发出请求,然后将响应对象返回给浏览器并缓存在本地。

Web缓存器既是服务器又是客户,其通常由ISP购买并安装。Web缓存器可以大大减少对客户请求的响应时间;Web缓存器能够大大减少一个机构的接入链路到因特网的通信量;Web缓存器能从整体上大大减低因特网上的Web 流量,从而改善了所有应用的性能。

2.6 条件GET方法

高速缓存器能减少用户感受到的响应时间,但也引入了一个新的问题,即存放在缓 存器中的对象副本可能是陈旧的,但是HTTP协议有一种机制,允许缓存器证实它的对象是最新的,这种机制就是条件GET (conditional GET)方法。

如果:①请求报文使用GET方法;并且②请求报文中包含一个“ If Modified-Since: ”首部行。那么,这个HTTP请求报文就是一个条件GET请求报文。

如果所请求的资源在指定日期后被修改了,那么服务器将返回新的对象,否则服务器将返回一个包含空实体体的报文。这样代理服务器就可以确认缓存是否过期了。

3 因特网中的电子邮件

因特网电子邮件系统有三个核心组件:用户代理邮件服务器SMTP(简单邮件传输协议,Simple Mail Transfer Protocol)。

  • 用户代理允许用户阅读、回复、转发、保存和撰写报文。

  • 邮件服务器形成了电子邮件体系结构的核心。每个接收方(如Bob)在其中的某个邮件服务器上有一个邮箱(mailbox)。

一个典型的邮件发送过程是:从发送方的用户代理开始,传输到发送方的邮件服务器,再传输到接收方的邮件服务器,然后在这里被分发到接收方的邮箱中。

如果发送方的服务器不能将邮件交付给接收方的服务器,那么前者的邮件服务器将在一个报文队列(message queue)中保持该报文,并在以后间隔尝试发送,如果几天内仍然不能成功,服务器就会删除报文并且以电子邮件通知发送方。

  • SMTP是因特网中电子邮件的主要应用层协议,它使用TCP可靠数据传输从发送方的邮件服务器向接收方的邮件服务器发送邮件;在每台邮件服务器上同时运行SMTP服务器和SMTP客户端。当邮件服务器接收其他邮件服务器的邮件时,它表现为SMTP服务器,当邮件服务器向其他邮件服务器发送邮件时,表现为SMTP客户端。

3.1 SMTP

SMTP是因特网电子邮件的核心。端口为25。SMTP是持续链接的,传输的三个阶段:握手、传输、关闭连接。对每一报文,客户使用一个新的MAIL FROM:crepes.fr开始。当所有报文发送完后才发送QUIT,断开连接。

尽管电子邮件应用在因特网上的独特地位可以证明SMTP有着众多非常岀色的性质,但它所具有的某种陈旧特征表明它仍然是一种继承的技术。比如,它限制邮件报文的所有部分只能使用7比特的ASCII表示,这就导致二进制多媒体文件需要编码为ASCII,而且在发送方需要编码,接收方则需要解码。

在这里插入图片描述

值得注意的是,SMTP报文一般不使用中间邮件服务器发送报文,也就是邮件不会在中间某个邮件服务器保留,如果接收方的邮件服务器没有开机,该报文会一直停留在发送方的邮件服务器并进行尝试。在SMTP握手阶段,SMTP客户端将介绍发送方和接收方的邮箱地址;一旦介绍完毕后,SMTP客户端将开始发送报文。

3.2 对比HTTP

这两个协议都用于从一台主机向另一台主机传送文件:HTTP从Web服务器向Web客户(通常是一个浏览器)传送文件(也称为对象);SMTP从一个邮件服务器向另一个邮件服务器传送文件(即电子邮件报文)。在进行文件传送时,两者都采用持续连接。但两者也存在很多区别:

  • 首先HTTP被设计为一个Pull协议而SMTP被设计为一个Push协议。即用户通过HTTP主动向服务器请求内容,而SMTP则是客户将内容推向服务器端;
  • HTTP传输的数据不一定是用ASCII字符,但是SMTP则只能使用ASCII字符
  • HTTP将每个对象封装在自己的响应报文里,而SMTP则将所有的报文对象放到一个报文之中

3.3 邮件报文格式

邮件的相关环境信息包括在一系列首部行中,这些行由RFC 5322组成。

报文由两部分组成:一个包含环境信息的首部和一个包含邮件内容的报文体;首部和报文体之间使用空行分开;首部行的格式为关键字:及其值;每个首部必须包含一个From和To首部行。首部也可以包含其它信息,比如Subject等。在报文首部之后,紧接着一个空白行,然后是以ACSII格式表示的报文体。

在这里插入图片描述

3.4 邮件访问协议

邮件访问使用了一种客户-服务器体系结构,即典型的用户通过在用户端系统上运行的客户程序来阅读电子邮件。

在这里插入图片描述

值得注意的是Bob的用户代理不能使用SMTP得到报文,因为取报文是一个拉操作,而SMTP协议是一个推协议。通过引入一个特殊的邮件访问协议来解决这个难题,该协议将Bob邮件服务器上的报文传送给他的本地PC。目前常用的邮件访问协议有POP3(Post Office Protocol-Version 3)、因特网邮件访问协议IMAP,Internet Mail Access protocol)和HTTP

  • POP3

POP3是一个非常简单的协议,因为简单,所以功能有限。POP3使用端口110来建立TCP连接(SMTP使用端口25)。POP3按照三个阶段进行工作:特许、事务处理和更新。在特许阶段,用户代理发送密码和用户名,进行身份鉴别;第二阶段,用户代理取回报文,同时还可以做删除、取消删除等标记或者统计邮件信息;第三个阶段是在用户退出后,POP3结束会话,删除被标记的邮件。

在POP3的事务处理过程中,用户代理发出一些命令,服务器对每个命令做出回答。回答可能有两种:+0K(有时后面还跟有服务器到客户的数据),被服务器用来指示前面的命令是正常的;-ERR,被服务器用来指示前面的命令出现了某些差错。

用户代理首先请求邮件服务器列出所有存储的报文的长度。接着用户代理从邮件服务器取回并删除每封邮件。

一个需要注意的是,POP3用户代理可以使用两种事务处理模式:一种是下载并删除,另一种是下载保留;POP3代理发出的命令和其工作模式相关;下载并删除的方法存在的问题是,如果用户在一台设备上查看了邮件(下载了邮件)后,邮件将被删除,那么在其他设备上将无法查看邮件;这给用户带来一定的不便。使用下载保存方式,则用户下载邮件后,邮件还在服务器上。

在用户代理与邮箱服务器之间的POP3会话期间,该POP3服务器保留了一些状态信息,特别是标记了哪些用户报文被标记为删除了。但是POP3服务器并不在POP3绘画过程中携带状态信息,大大简化了POP3的服务。

  • IMAP

POP3协议没有给用户提供任何创建远程文件夹并为报文指派文件夹的方法,为了解决这一问题,IMAP诞生了。IMAP是一个邮件访问协议,比POP3要复杂的多,有更多的特色。

IMAP将每一份邮件和一个一个文件夹联系起来,当报文第一次到达服务器时,它与收件人的INBOX相关联。收件人可以将邮件移到新创建的文件夹,阅读邮件,删除邮件等。IMAP允许用户在不同文件夹里移动邮件并且查询邮件。

值得注意的是,IMAP服务器维护了IMAP会话的用户状态信息,但是POP3并不;IMAP协议还允许用户代理获取报文组件而不是报文整体。

  • 基于Web的电子邮件

这种方式主要是指,用户使用HTTP协议和邮件服务器通信。用户代理就是普通的浏览器,但是,邮件服务器之间还是使用SMTP协议。

4 DNS:因特网的目录服务

因特网上的主机和人类一样,可以使用多种方式进行标识。主机的一种标识方法是用它的主机名 (hostname), 如www. facebook.com;或者使用IP地址

在计算机网络里,我们通过IP地址来标记某一时刻网络中唯一的主机。IP地址(IPV4)由4个字节组成,有着严格的层次结果,每个字节使用点号分隔。同时,为了方便记忆,我们也通过为主机提供一个便于记忆的主机名来标志主机,这样主机之间的通信就变得方便了。

4.1 DNS提供的服务

上述引入一个问题:主机名和IP地址的转换问题。因为在信息的发送者一端,通常使用主机名来标识主机,但是在计算机网络里是使用IP地址来标机主机。计算机网络里有一种应用专门提供这样的服务,它就是DNS(Domain Name System)域名系统。DNS是一个由分层的DNS服务器组成的分布式数据库和一个使得主机可以查询分布式数据库的应用层协议组成;

DNS是:①一个由分层的DNS服务器(DNS server)实现的分布式数据库;②一个使得主机能够查询分布式数据库的应用层协议。DNS 服务器通常是运行 BIND 软件的 UNIX机器。DNS协议运行在UDP之上,使用53号端口。

与HTTP、FTP和SMTP协议一样,DNS协议是应用层协议,其原因在于:①使用客户-服务器模式运行在通信的端系统之间;②在通信的端系统之间通过下面的端到端运输协议来传送DNS报文。然而,在其他意义上,DNS的作用非常不同于Web应用、文件传输应用以及电子邮件应用。与这些应用程序不同之处在于,DNS不是一个直接和用户打交道的应用。相反,DNS是为因特网上的用户应用程序以及其他软件提供一种核心功能,即将主机名转换为其背后的IP地址。

用户主机上应该运行着DNS客户端。DNS通常被其他应用层协议使用,比如:HTTP、SMTP和FTP等。这些协议在正式工作以前,首先利用DNS提供的服务,将主机名转换为IP地址,可以发现的是,DNS为用户带来方便的同时,也为网络应用带来额外的时延——查询DNS服务器的时延。需要注意的是,缓存作为一种提高性能,特别是查询性能的手段,在DNS中同样适用。
除了进行主机名到IP地址的转换外,DNS还提供了一些重要的服务:

  • 主机别名:虽然,主机名比起IP地址好记多了,但是有时候我们的主机名仍然很长,很不好记忆,所以我们需要为主机名再起一个名字,这就是主机别名,DNS不但提供主机名到IP地址的转换服务,还提供主机名与主机别名的转换;此时主机名被称为规范主机名
  • 邮件服务器别名:DNS同样也提供邮件服务器主机名和别名的转换服务,实际上,公司的邮件服务器和Web服务器可以使用相同的主机别名;MX记录允许一个公司的邮件服务器和Web服务器使用相同的主机名。
  • 负载分配:DNS也被用在冗余的服务器之间分配负载。每个服务器有着不同的IP地址,但是它们都和同一个主机名相关联,也就是一个IP地址集合同一个规范主机名相联系;当某个DNS服务器收到DNS请求时,该服务器奖使用IP地址的整个集合作为相应,但是在每个应答中,循环这些地址的次序。因为客户端通常都是使用IP地址集合的首个元素,所以DNS就在冗余的Web服务器之间分配了负载。同理,多个邮件服务器可以具有相同的别名。

4.2 DNS工作原理概述

首先,DNS使用UDP作为其传输层协议;DNS服务使用53端口;当主机上的DNS客户端收到一个转换请求时,客户端将向网络发送一个DNS查询报文,然后客户端将收到一个包含相关信息的DNS回答报文,这个报文里有客户端想要的内容,之后DNS客户端将IP地址返回给请求的提出者即可。

4.2.1 分布式、层次数据库

DNS采用分布式的设计方案,实际上,DNS是一个在因特网实现分布式数据库的精彩范例!而之所以这样做,是因为,单一的DNS服务器无法解决单点故障、无法保证通信容量、无法临近所有的查询主机、维护困难等问题。

①单点故障:如果该DNS服务器崩溃,整个因特网随之瘫痪!②通信容量:单个DNS服务器不得不处理所有的DNS査询。③远距离集中式数据库:单个DNS服务器不可能“邻近”所有查询客户。④维护:单个DNS服务器将不得不为所有的因特网主机保留记录。

为了处理扩展性问题,DNS使用了大量的DNS服务器,它们以层次方式组织,并且分布在全世界范围内。没有一台DNS服务器拥有因特网上所有主机的映射。相反,这些映射分布在所有的DNS服务器上。大致有3种类型的DNS服务器:根DNS服务器、顶级域DNS服务器、权威DNS服务器。

其工作的普遍流程:一个DNS客户端,希望获得www.baidu.com的IP地址,粗略的说,DNS客户端首先和根DNS服务器取得联系,它将返回负责解析顶级域名com的服务器的IP地址(或者其集合),客户将同这些服务器之一取得联系,然后顶级域DNS服务器建返回baidu.com的权威服务器的IP集合,客户端通过与这些服务器之一取得联系,获得www.baidu.com的IP地址。

  • 根DNS服务器。有400多个根名字服务器遍及全世界。这些根名字服务器由13个不同的组织管理。

  • 顶级域(DNS)服务器。对于每个顶级域(如com、org、net、edu和gov)和所有国家的顶级域(如uk、fr、ca和jp),都有TLD服务器(或服务器集群)。

  • 权威DNS服务器。在因特网上具有公共可访问主机的每个组织机构,必须提供公共可访问的DNS记录,这些记录将这些主机的名字映射为IP地址。

    一个组织机构能够选择实现它自己的权威DNS服务器以保存这些记录;另一种方法是,该组织能够支付费用,让这些记录存储在某个服务提供商的一个权威DNS服务器中

还有一种不在DNS层次结构之中,但是很重要的DNS,是本地DNS服务器。本地DNS服务器通常邻近其所在网络的其他主机。当主机发出DNS请求时,该请求被发往本地DNS服务器,它起着代理的作用,并将请求转发到DNS服务器层次结构中。

严格说来,一个本地DNS服务器并不属于该服务器的层次结构,但它对DNS层次结构是至关重要的。每个ISP (如一一个机构的ISP)都有一台本地DNS服务器(也叫默认名字服务器)。当主机与某个ISP连接时,该ISP提供一台主机的IP地址,该主机具有一台或多台其本地DNS服务器的IP地址

image-20230207005257953

DNS查询有两种,一种是递归查询一种是迭代查询;实践中,查询通常满足这样的模式:从请求主机到本地DNS服务器的查询是递归的,其余查询是迭代的。所谓迭代就是,如果请求的接收者不知道所请求的内容,那么接收者将扮演请求者,发出有关请求,直到获得所需要的内容,然后将内容返回给最初的请求者。也就是说,在递归查询中,一定要给请求者想要的答案;迭代查询则是指,如果接收者没有请求者所需要的准确内容,接收者将告诉请求者,如何去获得,但是自己并不去发出请求。

4.2.2 DNS缓存

实际上,为了改善时延性能并减少在因特网上到处传输的DNS报文数量,DNS广泛使用了缓存技术。DNS缓存的原理非常简单。在一个请求链中,当某DNS服务器接收一个DNS回答(例如,包含某主机名到IP地址的映射)时,它能将映射缓存在本地存储器中。

这样,如果有相同的请求到达时,就不需要再去发出请求,直接使用缓存即可;因为有了缓存,本地DNS就可以直接提供一些经常被访问的主机名所对应的IP地址,而不需要询问根DNS服务器了。需要注意的是,缓存不可避免的一个问题:有效时间。如果缓存过时而未得到更新,那么就会导致一些请求失败。

4.3 DNS记录和报文

共同实现DNS分布式数据库的所有DNS服务器存储了资源记录(Resource Record, RR),RR提供了主机名到IP地址的映射。每个DNS回答报文包含了一条或多条资源记录。

一条RR是具有一下字段的4元组:(name, value, type, TTL);其中TTL是指该记录的生存时间,它决定了该条记录何时被删除。首先看看type,type有4种取值,包括:A、NS、CNAME、MX等。需要注意,Name和Value的值取决于Type。

type=A:则name为主机名,value为对应的IP地址;
type=NS:则name为域,value为如何获得该域下主机IP地址的权威DNS服务器的主机名;
type=CNAME:则value为name(本身为主机别名)所对应的主机的规范主机名;
type=MX:则value为那么所对应的邮件服务器的规范主机名;

如果为了获得邮件服务器的规范主机名,请求一条MX记录;为了获得其它服务器的规范主机名,请求一条CNAME记录。

所以如果一条记录为type=A,则它直接包含了需要的信息;如果是NS,需要进一步得到权威DNS服务器的IP地址(同时返回一条NS记录,并返回一条以该NS记录的value值为name的A记录)希望得到一条A记录;而type=CNAME和MX的记录则实现了主机别名到主机规范名的转换,可以通过该规范名继续构建查询链条,直到获得希望的IP地址。

DNS有两种报文:DNS查询和回答报文。并且,查询和回答报文有着相同的格式。

image-20230207012402201
  • 前12字节为首部区域。标识符是一个用来标记该查询的16比特数,该标志符会被复制到相应的回答报文里,以便匹配请求和回答;标志字段含有若干标志,用来指出报文的类型(请求还是响应)、查询类型(递归还是迭代)、是否是所请求名字的权威DNS服务器、以及4个有关数量的字段,用来指示4类数据区域出现的数量。
  • 问题区域包含了正在进行的查询信息,包括名字字段、查询类型。
  • 回答区域包含了对最初请求的名字的资源记录,回答报文的回答区域可以包含多条RR,因此一个主机名能有多个IP地址(例如冗余Web服务器)。
  • 权威地区包含了其它权威服务器的记录。
  • 附加区域包含了其它有帮助的记录,比如在对于一个MX类型的请求回答报文里,回答区域里指出了邮件服务器的规范主机名,而附加区域里就有可能包含一个类型为A的关于该规范主机名的的IP地址;

向DNS数据库中插入数据:需要在注册登记机构完成这一任务,当你注册一个域名时,需要向该机构提供你的基本和辅助DNS服务器的名字和IP地址;该注册机构将确保一个类型为NS和类型为A的记录输入对应的顶级域名服务器;这样就完成了插入数据。

5 P2P应用

在目前为止本章中描述的应用(包括Web、电子邮件和DNS)都采用了客户-服务器体系结构,极大地依赖于总是打开的基础设施服务器。而P2P对总是打开的基础设施服务器没有依赖,成对间歇连接的主机之间相互通信。

有两种典型因特网应用十分适合P2P体系结构,一种是文件分发(BitTorrent),另一种是大型对等方社区中的数据库;我们将探讨分布式散列表的概念。P2P体系结构有着良好的自扩展性。这种扩展性的直接成因是:对等方除了比特的消费者之外还是他们的重新分发者

BitTorrent 是一种用于文件分发的流行P2P协议;用BitTorrent的术语来说,参与一个特定文件分发的所有对等方的集合被称为一个洪流;在一个洪流中的对等方彼此下载等长度的文件块,典型的块长度为256KB;当一个对等方下载文件块的时候,也向其他对等方发送了多个块。可以随时离开洪流,也可继续向其他对等方传送文件。每个洪流都有一个追踪器。

image-20230207021908894

Alice加入某洪流时,会在追踪器里进行注册,周期性通知追踪器它仍在洪流中。我们称所有与ALICE成功的创建了一个TCP链接的对等方成为邻近对等方。追踪器随机地从参与对等方的集合中选择对等方的一个子集,将IP地址发送给Alice,ALick持有该列表,并试图与集合中的所有对等方创立TCP连接。

Alice周期性地(经TCP连接)询问每个邻近对等方它们所具有的块列表。 如果Alice具有L个不同的邻居,她将获得L个块列表。有了这个信息,Alice将对她当前还没有的块发出请求(仍通过TCP连接)。

Alice使用最稀缺优先技术,首先请求那些邻居们副本数量最少的块,便使得文件块迅速地纷纷,以均衡每个块在洪流中的副本数量。BitTorrent使用一种机灵的对换算法,Alice优先从像她传时速度最快的邻居(4个,每10s修改一次)那里获取文件块。

每过30s,Alice也要随机选择另外一个对等方Bob,向他发送块。若Alice是Bob最快的前四快,Bob也是Alice的前4快,则Bob和Alice互相发送数据。每过30s换一个新的对象,互相交换数据(一报还一报),为了使对等方能够找到彼此协调的速率上传

还有另一种P2P应用——分布式散列表(DHT),分布式散列表是一种简单的数据库,其数据库记录分布在一个P2P系统的多个对等方上。 DHT得到了广泛实现现(如在BitTorrent中),并成为大量研究的主题。

6 套接字编程

当发送进程能够将数据分组退出套接字之门之前,当使用UDP时,必须将目的地址(IP+端口号)附着在分组上。在分组传给发送方的套接字后,因特网将使用目的地址通过因特网为该分组选路到接受进程的套接字。发送方的源地址也是由IP和端口号组成。然而,将源地址附着在分组上通常是由底层操作系统自动完成的。

  • 3
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

⁠脱欢

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值