"> "> 计算机网络-应用层 | Yufei Luo's Blog

计算机网络-应用层

应用层协议原理

概述

应用层的作用是为用户提供服务。应用层是协议簇的最高层,因此应用层协议不为任何其他协议提供服务,它们只接收来自于传输层协议的服务。

应用层核心:写出能够运行在不同端系统和通过网络彼此通信的程序,不需要在网络核心设备上如路由器、链路层交换机上运行的软件。

应用层模式

客户-服务器体系结构

在该体系结构中,有一个总是打开的主机,即服务器,它接收和服务来自其他许多被称为客户的主机请求;在该体系结构中,客户之间是不直接通信的;该服务器具有固定的、周知的地址。

客户-服务器体系结构的常见应用有:Web、FTP、Telnet和电子邮件。

这一体系结构对于服务器的性能要求较高。

P2P体系结构

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

目前,流量密集型应用都是P2P体系结构的。这些应用包括文件共享(例如BitTorrent)、协助下载(例如迅雷)、因特网电话(例如Skype)和IPTV(例如迅雷看看)。一些应用也可能同时具有客户-服务器和P2P两种体系结构。

P2P的优点在于其自扩展性,同时不需要庞大的服务器基础设施和带宽。但是P2P模式的较为开放,安全性差;同时上传流量较大,给ISP带来压力;还需要激励用户提供带宽等资源。

混合模式

一个应用可以通过结合两种模式的优点将二者混合起来。例如轻量级的客户-服务器通信会寻找可以提供服务的对等结点的地址。当找到这个地址时,实际服务可以通过使用对等模式从对等结点中获得。

客户-服务器模式

客户与服务器进程

在客户-服务器模式中,应用层的通信时在两个运行着的应用程序之间进行的,这两个应用程序被称为进程。在两个不同端系统上的进程,通过跨越计算机网络交换报文而相互通信。发送进程生成并向网络中发送报文;接收进程接收这些报文并可能通过将报文发送回去进行响应。

对于每对通信进程,我们通常将这两个进程之一标识为客户,而另一个进程标识为服务器。从发起通信的顺序来定义它们:在给定的一对进程之间,首先发起通信的进程被标记为客户进程,在会话开始时等待联系的进程被称为服务器进程。服务器在开启之后需要一直运行,而客户只有在需要的时候才运行。

套接字接口

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

应用程序开发者可以控制套接字在应用层端的一切,但是对该套接字在运输层端几乎没有控制权。应用程序开发者对于运输层的控制权仅限于:

  • 选择运输层协议;
  • 设定运输层参数,如最大缓存和最大报文段长度等

因此也可以说,就应用层而言,客户进程与服务器进程间的通信是两个套接字间的通信。客户认为套接字是接收请求和发出响应的实体,服务器认为套接字是发出请求并且需要获得响应的实体。

套接字地址

客户和服务器的交互是双向通信,因此需要一对套接字地址:本地套接字地址和远程套接字地址。一个套接字地址包括两部分,一部分是32位的IP地址,另一部分是16位的端口号。

由于套接字定义了通信终端,因此我们可以说套接字是由一对套接字地址标识的。

使用传输层服务

因特网为应用层提供的常用传输层协议为UDP、TCP、SCTP。

  • TCP:包括面向连接的服务和可靠的数据传输功能,并提供拥塞控制机制。
  • UDP:不提供不必要服务的轻量级运输协议,UDP是无连接的(通信前没有握手),不保证数据可靠传输,也没有拥塞控制。
  • STCP:SCTP提供了面向连接的可靠服务,但是它不是面向字节流,而是面向报文的。同时它还可以提供多媒体流服务。

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

应用层协议

应用层协议定义运行在不同端系统上的应用程序进程如何相互传递信息。涉及的内容包括:交换的报文类型(请求或者响应)、报文中包含哪些字段、字段如何被解释、一个进程何时收发报文并如何对报文进行响应等内容。

常见的应用层协议:

  • HTTP:端口号80,用于浏览器浏览网页,但是网页内容为明文,容易篡改、容易劫持、网页内容容易泄露。
  • HTTPS:端口号443,在HTTP与TCP层之间加入一个SSL层用于安全加密,弥补了HTTP协议的缺点。但是可能会受中间人欺骗攻击(参考https://www.cnblogs.com/lulianqi/p/10558719.html)。
  • SMTP:端口号25,基于TCP协议,用于邮件发送,只能发送ASCII码。邮件扩充MIME可以发送二进制文件,增加邮件主题结构但是并未改变SMTP。
  • POP3:端口号110,基于TCP协议,用于邮件接收,用户从服务器读取邮件之后便删除服务器上的邮件。
  • IMAP:端口号143,基于TCP协议,用于邮件接收,客户端与服务器的邮件保持同步,允许用户随时随地访问服务器上的邮件。
  • DNS:端口号53,基于TCP/UDP协议,用于解析域名与ip地址。
  • DHCP:端口号67/68,基于UDP,用于主机动态获取ip地址、缺省网关、DNS服务器等参数。
  • FTP:端口号20(数据连接)/21(控制连接),基于TCP,用于实现交互式文件传输。
  • Telnet:端口号23,基于TCP,用于远程终端访问。

HTTP协议

万维网

结构

万维网简称WWW或Web,它是一个分布式客户-服务器服务。使用浏览器的用户可以访问一个正在服务器上运行的服务。这些服务分布在很多称为站点的地点上,每一个站点有一个或者多个文档,被称为网页。每个网页也可以包含一些到其他网页的链接,被链接的网页可以在同一个站点或是在其它站点。

客户通过使用浏览器来访问网页。每个浏览器通常包括三个部分:控制程序、客户协议和解释程序。控制程序接收来自键盘和鼠标的输入并使用客户端程序来访问文档。在文档被访问后,控制程序使用解释程序在屏幕上显示文档。客户协议包括HTTP、FTP等。

网页存储在服务器上,每当请求到达时,相应的文档就会被发送到客户。服务器通常将被请求的文件存储在缓存中,同时也可以通过多线程或多进程,从而提高效率。

URL

网页需要有一个唯一的标识符域其他网页区别开,这个标识符被称为统一资源定位符(Uniform Resource Locator, URL)。为了定义一个网页,需要如下四个标识符:

  • 协议:用来访问网页的客户-服务器程序。绝大多数情况下是HTTP协议,也可能会使用FTP等。
  • 主机:可以是服务器的IP地址,或是主机被给予的唯一名称(域名)。
  • 端口:是一个16位整数,通常情况下是为客户-服务器应用而预定义好的。
  • 路径:定义了操作系统中文件的位置和名称。

将这四部分组合在一起,便设计出了URL,它在四个部分之间使用三个不同的分隔符,如下所示:

1
2
protocol://host/path  #绝大多数情况下使用
protocol://host:port/path #当需要标识出端口号时使用

网上文档

万维网上的文档可以分为下面三大类:

  • 静态文档:在服务器中创建和存储的固定内容的文档。当客户访问文档时,将一个文档的副本发送给用户,然后用户可以用浏览器查看文档。
  • 动态文档:当浏览器请求文档时,网页服务器运行一个应用程序或者脚本来创建一个动态文档,返回程序或脚本的结果作为对浏览器请求文档操作的响应。动态文档的内容随着用户请求的不同而不同。
  • 活动文档:浏览器请求一个活动文档时,服务器发送文档或者脚本的一个副本,然后文档在客户站点(浏览器)上运行。例如一个与用户交互的程序或者是在屏幕上创建动画的程序。

HTTP

HTTP(HyperText Transfer Protocol)是Web的应用层协议,它是Web的核心;HTTP有两部分实现,一个客户端程序一个服务器程序;HTTP定义了客户和服务器进行报文交换的方法,它的核心思想是客户通过HTTP请求对服务器发出对Web页面的请求报文,服务器收到该报文后将返回包含该对象的HTTP响应报文。

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

HTTP可以采用持续连接或是非持续连接两种方式:使用非持续连接时,每个TCP连接在服务器发送一个对象后就会关闭,也就是每个TCP只传送一个请求报文和响应报文,这会使得服务器的负担很重,同时一个对象需要两个RTT(Round-Trip Time,一个短分组从客户端到服务器,然后再返回客户端所用的时间)的时延才能交付;如果使用持续连接,服务器在发送响应报文后将保持该TCP打开,后续客户端可以使用该连接来向服务器发出请求,不但一个完整的页面可以通过同一个连接传送,同一台服务器上的多个页面也可以通过同一个连接发送,这样提高了效率。HTTP默认使用的是带流水线的持续连接。

请求与响应报文

请求报文的示例:

1
2
3
4
5
6
7
8
9
10
11
GET /index.html HTTP/1.1\r\n  //第一行为请求行,包括:方法字段、URL字段和HTTP版本字段,方法字段包括GET、POST、HEAD、PUT和DELETE等;
Host: www-net.cs.umass.edu\r\n //从第二行开始至下面的空行之间全部为首部行,包含是否在发送完响应报文后关闭TCP连接的Connection;请求的主机地址;浏览器版本;可接受的语言等头部信息
User-Agent: Firefox/3.6.10\r\n
Accept: text/html,application/xhtml+xml\r\n
Accept-Language: en-us,en;q=0.5\r\n
Accept-Encoding: gzip,deflate\r\n
Accept-Charset: ISO-8859-1,utf-8;q=0.7\r\n
Keep-Alive: 115\r\n
Connection: keep-alive\r\n
\r\n
实体主体 //可以在POST方法里传递Form表单内容或者传递其它一些二进制流数据等

响应报文的示例:

1
2
3
4
5
6
7
8
9
10
11
12
HTTP/1.1 200 OK\r\n //包含HTTP协议版本、状态码字段、以及状态短语。100范围内的代码代表一个报告,200范围内的代码表示一个成功的请求,300范围内表示重定向,400范围内表示客户端发生错误,500范围内表示服务器端发生错误。
Date: Sun, 26 Sep 2010 20:09:20 GMT\r\n //从第二行开始到空格之间为响应头部行,包含服务器向客户端发送的额外信息。
Server: Apache/2.0.52 (CentOS)\r\n
Last-Modified: Tue, 30 Oct 2007 17:00:02 GMT\r\n
ETag: "17dc6-a5c-bf716880"\r\n
Accept-Ranges: bytes\r\n
Content-Length: 2652\r\n
Keep-Alive: timeout=10, max=100\r\n
Connection: Keep-Alive\r\n
Content-Type: text/html; charset=ISO-8859-1\r\n
\r\n
data data data data data ...

万维网最初被设计成无状态实体,客户发生请求,服务器响应,它们之间的关系便结束了。为了让Web实现更多的功能,便出现了Cookie机制。

创建与存储

  1. 当服务器从客户端接收到请求之后,将客户端的信息存储在文件或字符串中。这些信息可能包含客户端的域名、cookie内容(服务器收集到的关于客户端的信息)、时间戳以及与实现有关的其他信息。
  2. 服务器在响应中包含了它发给客户端的cookie。
  3. 当客户端接收到响应之后,浏览器在cookie目录中存储cookie,并根据服务器域名进行分类。

Cookie的使用

当客户向服务器发送请求时,浏览器在cookie目录中查询是否有从那个服务器发送过来的cookie。如果有则在请求中包含这个cookie。当服务器接收到这个请求后,它知道这是一个老客户。下面是cookie的一些使用场景:

  • 电子商务:当客户端选择商品,并放入购物车中后,包含这些商品信息的cookie就会被发送到浏览器。如果客户端选择第二个商品,就会更新cookie,以此类推。当客户端结束购物并付款时,就检索最后的cookie,然后计算总价格。
  • 用户注册:当客户端第一次注册时,网站向客户端发送一个cookie,网站通过这种方式限制注册用户访问。只有能发送正确cookie的用户才允许今后重复访问。
  • Web门户:当用户选择最喜欢的网页时,就生成一个cookie并发送到浏览器。当网站再次被访问时,这个cookie就发送给服务器说明客户端要查找的页面。
  • 广告代理:当用户访问网站主页并点击广告图标时,一个请求发送给广告代理,广告代理就会发送一个大字标题广告,同时也包含一个含有用户ID的cookie。将来对这个大字标题广告的任何使用都会加入到一个分析用户Web行为的数据库中。这种使用方法侵犯用户隐私,引起很多争议。

注意,cookie的内容不允许浏览器读取或者透露给用户,只能由服务器创建并回收。

代理服务器

HTTP支持代理服务器,代理服务器是一台计算机,能够保存最近请求的响应副本。HTTP客户端向代理服务器发送请求,代理服务器检查本地高速缓存。如果高速缓存中不存在响应报文,代理服务器就向相应的服务器发送请求。返回的响应会发送到代理服务器中并存储,以用于其他客户端未来的请求。

代理服务器降低了原服务器的负载,减少了通信量并降低了延迟。但是为了使用代理服务器,需要在客户端配置,使其访问代理服务器。

FTP

文件传输协议(File Transfer Protocol, FTP)是TCP/IP提供的标准机制,用于将文件从一个主机复制到另一个主机。在FTP的基本模型中,客户有三个组件:用户接口、客户控制进程和客户数据传输进程,服务器有两个组件:服务器控制进程和服务器数据传输进程。

在FTP协议中,控制连接是在控制进程之间进行的,而数据连接是在数据传输进程之间进行的。将命令和数据分开传输使得FTP效率更高。

控制连接和数据连接

连接的寿命

在整个交互的FTP会话期间,控制连接始终处于连接状态,数据连接则在每次传输文件时开启然后关闭。控制连接的端口是21,数据连接的端口是20。

控制连接

FTP的控制通信使用与TELNET相同的方法。FTP与TELNET一样使用NVT ASCII字符集,通信是通过命令和响应来完成的。这种简单方法适合控制连接,因为一次发送一条命令或响应,而每一条命令或响应都是一个短行。

在控制连接期间,命令从客户端发送到服务器,并且响应从服务器发送到客户端。从FTP客户控制进程发送的命令是ASCII大写字母形式的,某些带有参数。每个FTP命令至少产生一个响应,一个响应有两部分,包括文本与其后的一个三位数字。数字部分定义了编码,文本部分定义了需要的参数或是进一步的解释。数字中的第一位定义了命令状态,第二位定义了状态应用的区域,第三个数字提供了额外信息。

数据连接

数据连接的步骤如下:

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

在数据连接中,客户必须定义传输文件的类型、数据结构和传输模式。在通过数据连接发送文件之前,通过控制连接进行准备。

  • 数据结构:FTP可以使用文件结构、记录结构和页面结构中的一种。文件结构格式(默认)是连续的字节流;记录结构中将文件划分成一些记录;在页面结构中是将文件划分为多个页面,每个页面有一个页面号和页面头部。
  • 文件类型:可以是ASCII、EBCIDC和图像文件三种中的一种
  • 传输方式:包括流方式、块方式和压缩方式。流方式(默认)将数据作为连续字节流进行传递;块方式中数据按块传递,每个块前面包括块描述符和块大小。

文件传输

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

电子邮件

架构

通常情况下,电子邮件的发送者和接收者通过WAN或者LAN连接到两个邮件服务器上。管理员为每个用户创建了一个邮箱,接收到的报文被存储在邮箱里。邮箱是服务器硬盘的一部分,是一个带有限制的特殊文件,只有邮箱拥有者才能访问它。

一个电子邮件从发送者到接收者的过程如下图所示:

image-20201125210219177

用户代理

用户代理(User Agent, UA)是一个软件包,由读写、回答和转发报文组成。它也处理用户计算机的本地邮箱。现在的用户代理都是基于GUI型的,允许用户使用键盘和鼠标与软件进行交互。典型的例子有Outlook。

发送邮件

在发送邮件时,用户通过UA创建邮件,一封邮件包含一个信封和一个报文。信封包含发信人的地址、收件人的地址以及其他信息;报文包含头部和主体,头部定义了发信人、收件人、报文的主题以及其他信息,报文的主体包含了收件人要读取的真正信息。

接收邮件

用户或定时器触发用户代理检查邮箱。如果用户有邮件,UA就通过一个通知来告诉用户。如果用户准备读取邮件则会显示一个列表,列表每一行包含邮箱中一个特定报文的信息概要。用户可以选择其中任何一个报文阅读其内容。

地址

为了传递邮件,邮件处理系统使用具有唯一地址的寻址系统。在因特网中,地址包括两部分,本地部分和域名,并且用逗号隔开。它们组成如下的格式:本地部分@域名

本地部分定义了一个特定文件的名字,被称为用户邮箱,在其中存储了用户接收到的所有邮件,以便UA进行读取。第二部分是域名,一个组织机构通常使用一个或多个主机来接收和发送邮件,这些主机被称为邮件服务器或交换机。分配给每个邮件交换机的域名来自于DNS数据库或是一个逻辑名称。

报文传输代理:SMTP

在因特网中定义报文传输代理(Mail Transfer Agent, MTA)客户机和服务器的常用协议称为简单邮件传输协议(SMTP)。SMTP是一个推协议,它将报文从客户推入服务器。SMTP协议在发送放和接收方邮件服务器之间以及两个邮件服务器之间被使用两次。

命令和响应

SMTP使用一些命令和响应在MTA客户和MTA服务器之间传输报文。命令从MTA客户发生到MTA服务器;响应从MTA服务器发送到MTA客户。每一个命令或者响应都是以一个双字符(回车和换行)的行结束标记来终止的。

客户发给服务器命令的格式如下:关键词:变量。服务器发给用户的响应是一个三位数字码,后面可以跟着附加的文本信息。

邮件传输

传输一个邮件可以大体分为3个阶段:连接建立、邮件传输和连接终止:

  1. 连接建立:在客户创建了到端口25的TCP连接之后,SMTP服务器开始连接阶段。这个阶段的步骤包括:
    1. 服务器发送代码220(服务就绪)告知客户它准备好接收邮件。如果未准备就绪就发送代码421(服务不可用)。
    2. 客户发送HELO报文,使用自身域名地址来让服务器识别自身,需要将客户的域名告知服务器。
    3. 服务器以代码250(请求命令完成)响应,或者做其他响应。
  2. 邮件传输:在SMTP客户与服务器的连接建立之后,单个报文可以在一个发信人和多个收信人之间交换。这一阶段涉及8个步骤,如果收信人有多个则重复3和4:
    1. 客户发送MAIL FROM报文以介绍发信人,其中包括发信人的邮件地址。同时服务器向发信人提供回信地址,用于返回错误以及报告报文。
    2. 服务器用代码250或其他代码响应。
    3. 客户发送RCPT TO(收信人)报文,包含收信人的邮箱地址。
    4. 服务器用代码250或其它代码响应。
    5. 客户发送DATA报文,初始化报文传输。
    6. 服务器用代码354(开始邮件输入)或者其他代码响应。
    7. 客户以连续行的形式发送报文内容。每行用两个行结束标记终止。报文用一个只包含一个句点的行终止。
    8. 服务器用代码250或其他代码响应。
  3. 连接终止:在报文成功传送之后客户终止连接,这个阶段包括两步:
    1. 客户发送QUIT命令
    2. 服务器用代码221或其他代码响应

上述的整个过程可以用下图来表示:

邮件发送全过程

报文访问代理:POP和IMAP

在邮件传递的最后一个阶段,需要使用到报文访问代理(Mail Access Agent, MAA)。报文访问代理协议是一个拉协议,使得客户可以从服务器拉出报文。目前有两种报文访问代理协议:POP3和IMAP4。

POP3

POP3比较简单,但是功能上受到一定的限制。客户端的POP3软件安装在收信人的计算机中,服务器POP3软件安装在邮件服务器中。当用户需要从邮件服务器的邮箱中下载邮件时,客户端发起邮件访问操作。客户端开启与服务器110端口之间的TCP连接,然后发送用户名和口令来访问邮箱,用户便可逐条列出和读取邮件信息了。

POP3有两种模式,分别为删除模式和保存模式。删除模式中,当邮件从邮箱中读取完之后就会从邮箱中删除。在保存模式中,邮件经过读取之后仍然保存在邮箱中。

IMAP4

IMAP4比起POP3来说功能更强并且更加复杂,它提供了一些额外的功能,例如:

  • 下载电子邮件之前可以检查电子邮件头部
  • 下载电子邮件之前可以读取邮件内容中的特定字符串
  • 可以部分下载电子邮件
  • 可以在邮件服务器上创建或删除邮箱,也可以改变邮箱名字
  • 可以在文件夹中创建邮箱的层次结构以用于邮件存储

MIME

多用途因特网邮件扩充(Multipurpose Internet Mail Extensions, MIME)是一个辅助协议,允许非ASCII数据通过电子邮件传送。在发送方将非ASCII数据转换为NVT ASCII数据,并将其传递给MTA客户机通过因特网发送出去,接收方再转换为原来的数据。

远程登录

TELNET

TELNET(TErminaL NETwork)是一种原始的远程登录协议,虽然登录时需要用户名和口令,但是所有的数据全部采用明文传输,因此很容易遭受攻击。因此目前常常使用SSH(Secure Shell)代替它。

基本原理

当用户使用TELNET访问一个远程机器时,用户将击键发送给终端驱动程序,同时本地操作系统接收这些字符但是并不解释它们。这些字符被发送到TELNET客户机,它将这些字符转换成网络虚拟终端(Network Virtual Terminal, NVT)字符的通用字符集,然后将其传送给本地的TCP/IP协议堆栈。

采用NVT形式的命令或文本通过因特网传送到远程机器的TCP/IP堆栈,在那里字符传递给操作系统,然后传送给TELNET服务器,TELNET服务器将这些字符转换成远程计算机可以理解的字符。但是这些字符不能直接传递给操作系统,需要使用一个终端驱动程序的软件块,将这些字符伪装成是从一个终端发过来的,然后操作系统将这些字符传输给适当的应用程序。

安全Shell(SSH)

组件

SSH是一个有三个组件的应用层协议,包括:

  • SSH应用层协议:建立安全信道,提供数据完整性、服务认证、报文压缩、报文保密性服务
  • SSH认证协议:为服务器对客户进行认证
  • SSH连接协议:创建不同的逻辑信道用于实现不同的通信

应用

SSH是一个提供客户和服务器之间安全连接的通用协议,可以提供如下的应用:

  • 远程登录
  • 文件传输
  • 端口转发

域名系统

地址映射

在访问网址时,人们更喜欢用名字而不是数字IP地址,但是TCP协议却需要使用IP地址来唯一地确定一台主机到因特网的连接。因此,因特网需要一种能够将名字映射地址的目录系统。这个系统被称为域名系统(Domain Name System, DNS)

例如一个用户想访问一个文件传输服务器,将服务器的主机名映射到IP地址需要如下几个步骤:

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

域名空间

域名空间是一种层次名字空间,在这种设计方式中,所有的名字由根在底部的倒置树结构定义。该树最多有128级:0(根节点)~127级。

域名空间中一些概念的定义如下:

  • 标签:树上的每个节点有一个标签。标签是一个最多为63个字符的字符串,根节点的符号是空字符串。DNS要求每一个结点的子节点有不同的标签,这样便保证了域名的唯一性
  • 域名:树上的每一个节点都有一个域名。一个完整的域名是用点(.)分割的标签序列。域名总是从某一节点向上读到根节点。由于最后一个标签一定是根节点的空标签,因此完整域名的最后一个字符一定是一个点。如果一个标签以空字符串结束,则被称为全称域名;反之则被称为部分域名。
  • 域:一个域是域命名空间的子树,域的名称是子树顶端节点的名称。也就是说树中的每一个节点定义一个域。

域名空间被划分为三部分:通用域、国家域和反向域。反向域可以被用于在给定IP地址的情况下找到主机名,由于太复杂目前已经被废止。通用域按照已经注册主机的一般行为对主机进行定义,在通用域的一个层次允许有14个可能的标签,这些标签对应于不同的机构类型。国家域部分使用双字母的国家缩写,第二级标号由各个国家自己制定。

当一个新的域名需要加入到DNS中时,需要通过注册机构来完成。注册机构首先确认域名的唯一性,然后将它输入到DNS数据库中。

DNS服务器

域名空间中的信息被分布存储在多台DNS服务器中。一个服务器负责或者授权的域名空间被称为区域。一个区域可以是一个域,也可以是一个域的一部分。

根服务器的区域由整颗树组成,它通常不保存关于域的任何信息,只是将其授权委托给其他服务器,并保持与这些服务器的参照关系。目前有多个根服务器,每一台都覆盖了整个域名空间,它们分布于世界各地。

主服务器是存储了授权区域有关文件的服务器,它负责创建、维护和更新区域文件,并将区域文件存储在本地磁盘中。

辅助服务器负责从另一个服务器(主服务器或辅助服务器)传输一个区域的全部信息,并将文件存储在它的本地磁盘中。辅助服务器不创建也不更新区域文件,如果需要更新则从主服务器传到辅助服务器上。

地址解析

将名字映射为地址或是将地址映射为名字的过程被称为名字-地址解析。需要完成这一工作时,主机调用一个称为解析程序的DNS客户程序,解析程序用一个映射请求访问最近的一个DNS服务器。如果服务器含有该信息,就满足解析程序的请求;否则它将解析程序交付给其他服务器,或者查询其他服务器来提供这种服务。

DNS报文

为了获取关于主机的信息,DNS使用查询报文和响应报文,二者具有相同的格式。一个DNS报文的结构如下:

DNS报文

标识字段用来匹配对查询的响应;标记定义了报文是查询报文还是响应报文;查询部分包含在查询报文中,并且在响应中被重复,它包含一个或者多个问题记录;响应部分包含一个或多个资源记录,只出现在响应报文中;授权部分给出一个或多个负责查询的授权服务器的信息;额外信息部分提供了可能帮助解析程序的额外信息。

DNS使用的熟知端口号为53,当响应报文长度小于512字节时使用UDP连接,大于512字节时则使用TCP连接。如果事先无法确定报文长度,则先使用UDP端口,当超过512字节时服务器会截断这一报文,解析程序开启TCP连接并重复该请求。

DDNS

如果做了增加主机、改变IP地址等操作时,这些改变会使得DNS的主文件发生变化。由于因特网规模太大,如果手动进行更新几乎不可能,因此要求DNS主文件可以进行动态更新。在DDNS中,当名字和地址之间的绑定被确定时,这些信息通常由DHCP发送给主DNS服务器。主服务器更新这一区域,并以主动或被动方式通知辅助服务器。

参考

  1. 计算机网络:自顶向下方法
  2. https://blog.csdn.net/qq_39326472/article/details/88089747
  3. https://blog.csdn.net/qq_39384184/article/details/84033728
  4. https://beta.segmentfault.com/a/1190000023726278
  5. https://www.zhihu.com/question/50293200