网络协议之DNS
一、DNS概述
域名系统(Domain Name System,缩写:DNS)是互联网的一项服务。它作为将域名和IP地址相互映射的一个分布式数据库,能够使人更方便地访问互联网。DNS使用TCP和UDP端口53,通过递归查询请求的方式来响应用户的查询,为互联网的运行提供关键性的基础服务。
DNS协议是用来将域名转换为IP地址(也可以将IP地址转换为相应的域名地址)。例如,当用户在浏览器中输入网址“www.example.com”时,DNS会将这个域名转换为对应的IP地址,这样计算机才能访问到该网站。
DNS是一种可以将域名和IP地址相互映射的以层次结构分布的数据库系统。由于DNS的引入,互联网用户无需记住复杂的IP地址,只需记住易于记忆的域名即可。
二、DNS的历史与发展
1. ARPANET时代(1960s-1980s)
早期的互联网并没有一个全球的域名系统,而是使用主机名(hostname)来识别网络上的计算机。这些主机名存储在一个称为“hosts.txt”的文本文件中,该文件由网络管理员手动维护。随着互联网的增长,需要一种更有效的方法来管理和查找主机名与IP地址之间的映射关系。
2. DNS的创建(1983)
1983年,Paul Mockapetris和Jon Postel开始开发DNS。他们发布了RFC882和RFC883,其中详细说明了DNS的设计。DNS被设计成一个层次结构系统,由多个域名服务器组成,每个服务器负责管理特定区域内的域名和IP地址映射。
3. DNS的层次结构(1980s-1990s)
DNS系统采用分层、分布式的结构来管理域名与IP地址的映射关系。根域名服务器位于顶层,下面是顶级域名服务器(TLD),然后是权威域名服务器和缓存域名服务器。
4. 商业化和增长(1990s-2000s)
随着互联网的商业化,域名的注册数量急剧增加,导致DNS系统面临压力。为了满足需求,域名注册机构和托管服务商开始提供域名注册和管理服务。
5. DNSSEC的引入(2000s)
为了提高DNS安全性,DNSSEC(Domain Name System Security Extensions)被引入。它通过数字签名机制确保域名解析的完整性和真实性,防止DNS劫持和缓存投毒等攻击。
6. 新顶级域名的推出(2010s)
ICANN(互联网名称与数字地址分配机构)开始批准新的顶级域名,如“.app”、“.blog”等,丰富了互联网域名的多样性。
7. IPv6和DNS64/NAT64(2010s)
随着IPv6的推出,DNS也需要适应新的IP地址格式。DNS64/NAT64技术允许IPv6和IPv4之间的通信,使得IPv6网络可以访问IPv4网络上的资源。
8. 持续的发展(至今)
DNS仍在不断演进,以适应新的互联网需求和安全挑战。随着云计算、物联网等新兴技术的发展,DNS在网络生态中的作用变得越来越重要。
三、DNS的工作原理
1. 域名服务器的分类
域名服务器可以根据其角色和层级划分为以下四种不同类型:
-
根域名服务器(Root Name Servers)
根域名服务器位于DNS层次结构的最高层,共有13个不同IP地址的根域名服务器分布在全球各地。它们保存了顶级域名服务器的信息,负责管理顶级域名(如.com、.org、.net等)的域名服务器的IP地址。
-
顶级域名服务器(Top-Level Domain Servers)
顶级域名服务器负责管理特定顶级域(如.com、.org、.net等)下的域名和其子域的映射。例如,.com顶级域名服务器会存储所有使用.com域名结尾的域名映射信息。
-
权限域名服务器(Authoritative Name Servers)
权威域名服务器是每个特定域名的“官方”域名服务器,它们存储着该域名与IP地址的映射信息。当本地域名服务器需要解析特定域名时,它会向该域名的权威域名服务器发送查询请求。
-
本地域名服务器(Local Name Servers)
本地域名服务器位于用户的本地网络中,通常由互联网服务提供商(ISP)提供。当用户发起域名查询请求时,本地域名服务器首先被联系。如果本地域名服务器已经缓存了相应的映射信息,它会直接返回结果;否则,它会根据查询的域名层级结构,通过递归查询或迭代查询的方式,向根域名服务器、顶级域名服务器和权限域名服务器发起查询,以获取所需的映射信息。
2. DNS域名解析过程
DNS域名解析过程包含递归查询和迭代查询两种方式:
-
递归查询
客户端将查询请求发送给递归DNS服务器,服务器必须返回结果,不能简单把请求转发给其他服务器。如果递归服务器不能解析,它会向其他DNS服务器迭代查询,直到获取结果,然后再返回给客户端。整个过程对客户端透明,本地服务器负载重,但查询快。
-
迭代查询
本地域名服务器逐级向上查询,然后逐级向下查询,直到获得所需的IP地址。这种查询模式确保了每一步查询都是逐级完成的,保持了数据的一致性和正确性。同时,每个查询环节都可以被缓存,以提高查询效率,并减轻DNS服务器的负担。
具体步骤如下:
-
本地域名服务器启动查询
当用户在浏览器中输入一个域名,本地域名服务器(通常由互联网服务提供商提供)被触发进行域名解析。
-
本地域名服务器向根域名服务器发起查询
本地域名服务器向一个根域名服务器发起查询请求,该请求包含了所需解析的域名。
-
根域名服务器的响应
根域名服务器不会直接提供所需的IP地址,而是回复给本地域名服务器一个指向顶级域名服务器的IP地址。这个顶级域名服务器与所查询域名的顶级域相关联,例如“.com”、“.org”等。
-
本地域名服务器向顶级域名服务器发起查询
本地域名服务器向得到的顶级域名服务器发起新的查询请求,继续请求所需的域名映射。
-
顶级域名服务器的响应
顶级域名服务器回复给本地域名服务器一个指向权限域名服务器的IP地址。
-
本地域名服务器向权限域名服务器发起查询
本地域名服务器向权限域名服务器发送查询请求,获取最终的IP地址。
-
权限域名服务器的响应
权限域名服务器返回最终的IP地址给本地域名服务器。
-
本地域名服务器返回结果给客户端
本地域名服务器将最终的IP地址返回给客户端,客户端通过该IP地址访问目标网站。
3. DNS查询与响应的格式
DNS请求与响应的格式是一致的,其整体分为Header、Question、Answer、Authority、Additional 5部分:
-
Header部分
Header部分是一定有的,长度固定为12个字节。包含以下字段:
- ID:占16位。该值由发出DNS请求的程序生成,DNS服务器在响应时会使用该ID,这样便于请求程序区分不同的DNS响应。
- QR:占1位。指示该消息是请求还是响应。0表示请求;1表示响应。
- OPCODE:占4位。指示请求的类型,有请求发起者设定,响应消息中复用该值。0表示标准查询;1表示反转查询;2表示服务器状态查询。3~15目前保留,以备将来使用。
- AA(Authoritative Answer,权威应答):占1位。表示响应的服务器是否是权威DNS服务器。只在响应消息中有效。
- TC(TrunCation,截断):占1位。指示消息是否因为传输大小限制而被截断。
- RD(Recursion Desired,期望递归):占1位。该值在请求消息中被设置,响应消息复用该值。如果被设置,表示希望服务器递归查询。但服务器不一定支持递归查询。
- RA(Recursion Available,递归可用性):占1位。该值在响应消息中被设置或被清除,以表明服务器是否支持递归查询。
- Z:占3位。保留备用。
- RCODE(Response code):占4位。该值在响应消息中被设置。0表示没有错误条件;1表示请求格式有误,服务器无法解析请求;2表示服务器出错;3表示请求中的域名不存在(只在权威DNS服务器的响应中有意义);4表示服务器不支持该请求类型;5表示服务器拒绝执行请求操作;6~15保留备用。
- QDCOUNT:占16位(无符号)。指明Question部分的包含的实体数量。
- ANCOUNT:占16位(无符号)。指明Answer部分的包含的RR(Resource Record)数量。
- NSCOUNT:占16位(无符号)。指明Authority部分的包含的RR(Resource Record)数量。
- ARCOUNT:占16位(无符号)。指明Additional部分的包含的RR(Resource Record)数量。
-
Question部分
Question部分的每一个实体的格式:
- QNAME:字节数不定,以0x00作为结束符。表示查询的主机名。注意:主机名被".“号分割成了多段标签。在QNAME中,每段标签前面加一个数字,表示接下来标签的长度。例如,“www.example.com"会被表示成”\x03www\x07example\x03com\x00”。
- QTYPE:占16位。表示查询的资源记录类型。例如,A类型表示IPv4地址,AAAA类型表示IPv6地址,NS类型表示域名服务器,MX类型表示邮件交换服务器等。
- QCLASS:占16位。通常被设置为1,表示互联网类。
-
Answer、Authority、Additional部分
Answer、Authority、Additional部分都包含若干个RR(Resource Record),每个RR的格式如下:
- NAME:字节数不定,以0x00作为结束符。表示资源记录所属的主机名或域名。
- TYPE:占16位。表示资源记录的类型。
- CLASS:占16位。通常被设置为1,表示互联网类。
- TTL:占32位(无符号)。表示资源记录的生存时间,单位为秒。从资源记录被创建或更新开始计时,在这个时间内,资源记录可以被缓存。超过这个时间,资源记录必须被丢弃或重新查询。
- RDLENGTH:占16位(无符号)。表示资源记录数据部分的长度(字节数)。
- RDATA:字节数不定,长度由RDLENGTH指定。表示资源记录的具体数据。例如,对于A类型的资源记录,RDATA部分表示IPv4地址;对于MX类型的资源记录,RDATA部分包含邮件交换服务器的优先级和主机名。
4. DNS缓存机制
DNS缓存是一种用于存储DNS查询结果的技术,旨在提高DNS查询的效率和速度。通过缓存DNS查询结果,可以减少对DNS服务器的请求次数,从而降低网络负载和提高用户体验。
DNS缓存通常分为两类:客户端缓存和服务器缓存。
-
客户端缓存
客户端缓存位于用户设备(如计算机、智能手机等)上,由操作系统或浏览器管理。当用户发起DNS查询请求时,客户端会首先检查本地缓存中是否存在该域名的解析结果。如果找到匹配的结果,则直接使用该结果,无需向DNS服务器发起请求。这可以显著提高DNS查询速度,并减轻DNS服务器的负载。
客户端缓存的缺点是缓存结果可能不够准确。由于DNS记录的生存时间(TTL)有限,缓存结果可能会过期。如果用户在缓存结果过期后仍然使用它,则可能导致访问错误的IP地址。此外,如果DNS记录被更新(例如,域名对应的IP地址发生变化),客户端缓存中的旧结果也会导致访问问题。
-
服务器缓存
服务器缓存位于DNS服务器上,通常由DNS服务器软件管理。当DNS服务器收到查询请求时,它会首先检查本地缓存中是否存在该域名的解析结果。如果找到匹配的结果,则直接返回该结果给客户端,无需向其他DNS服务器发起请求。这可以加快DNS查询速度,并减少对其他DNS服务器的依赖。
服务器缓存的优点是缓存结果更加准确和可靠。由于DNS服务器通常与权威DNS服务器保持同步,因此服务器缓存中的结果通常是最新的。此外,服务器缓存还可以减少网络延迟和带宽消耗,提高DNS查询的效率和性能。
然而,服务器缓存也存在一些挑战。由于DNS记录的生存时间(TTL)有限,服务器缓存需要定期更新以确保结果的准确性。此外,如果DNS服务器受到攻击或出现故障,服务器缓存中的结果可能会受到影响,导致访问问题。因此,需要采取适当的安全措施来保护服务器缓存免受攻击和干扰。
四、DNS的应用与重要性
DNS作为互联网的基础服务之一,其应用广泛且重要。以下是DNS的一些主要应用:
1. 网站访问:
当用户输入网址时,DNS将域名解析为IP地址,使用户能够访问到目标网站。
2. 邮件发送:
DNS中的MX记录用于指定邮件交换服务器,确保邮件能够准确送达目标邮箱。
3. 负载均衡:
通过DNS的轮询或加权轮询等方式,可以将用户请求分发到不同的服务器上,实现负载均衡。
4. 故障转移:
当主服务器出现故障时,DNS可以将用户请求重定向到备用服务器上,确保服务的连续性。
5. 内容分发网络(CDN):
CDN提供商利用DNS将用户请求导向最近的缓存节点,提高内容的访问速度和可靠性。
6. 网络安全:
DNS可以用于过滤恶意网站、防止DNS劫持和钓鱼攻击等网络安全威胁。
DNS的重要性体现在以下几个方面:
- 提高网络访问效率:DNS通过解析域名和IP地址之间的映射关系,使用户能够更方便地访问互联网资源。
- 保障网络安全:DNS可以用于识别和过滤恶意网站,防止用户访问到受攻击或欺诈的网站。
- 支持互联网发展:DNS作为互联网的基础服务之一,其稳定性和可靠性对互联网的发展至关重要。随着物联网、云计算等新兴技术的兴起,DNS在网络生态中的作用将越来越重要。
五、DNS的未来发展趋势
随着互联网的不断发展,DNS也在不断演进和升级。以下是DNS的一些未来发展趋势:
1. DNS over HTTPS(DoH):
DoH是一种通过HTTPS协议传输DNS查询请求和响应的技术。它可以提高DNS查询的隐私性和安全性,防止DNS查询被窃听或篡改。
2. DNS over TLS(DoT):
DoT是一种通过TLS协议加密DNS查询请求和响应的技术。与DoH类似,DoT也可以提高DNS查询的隐私性和安全性。
3. IPv6和DNS64/NAT64:
随着IPv6的普及,DNS需要适应新的IP地址格式。DNS64/NAT64技术允许IPv6和IPv4之间的通信,使得IPv6网络可以访问IPv4网络上的资源。
4. 智能DNS:
智能DNS可以根据用户的地理位置、网络状况等因素,动态选择最优的DNS服务器和解析结果,提高网络访问速度和可靠性。
5. 区块链技术在DNS中的应用:
区块链技术可以用于构建去中心化的DNS系统,提高DNS的安全性和可扩展性。然而,区块链技术在DNS中的应用还处于研究和探索阶段,需要进一步的实验和验证。
总结
DNS是互联网的核心服务,它将域名与IP地址相互映射,简化网络访问。自ARPANET时代起,DNS经历了从hosts.txt到分层分布式系统的演变,现已支持全球域名解析。DNS通过递归和迭代查询,快速定位域名对应的IP地址。随着IPv6、DNSSEC、新顶级域名的引入,DNS不断升级以满足互联网需求。DNS不仅关乎网站访问和邮件发送,还涉及负载均衡、故障转移、CDN及网络安全。未来,DNS将向HTTPS/TLS加密、智能解析及区块链技术方向发展,进一步提升安全性、效率和可扩展性。
相关文章:
网络协议之DNS
一、DNS概述 域名系统(Domain Name System,缩写:DNS)是互联网的一项服务。它作为将域名和IP地址相互映射的一个分布式数据库,能够使人更方便地访问互联网。DNS使用TCP和UDP端口53,通过递归查询请求的方式来…...
.net6 使用 FreeSpire.XLS 实现 excel 转 pdf - docker 部署
FreeSpire.XLS && Aspose.Cells包都可以实现。实现过程中发现如下问题: 本地测试通过, docker部署服务器后报错: The type initializer for Spire.Xls.Core.Spreadsheet.XlsPageSetupBase threw an exception. 由于缺少依赖…...
QML学习 —— 28、3种等待指示控件(附源码)
效果如下 说明 BusyIndicator应用于指示在加载内容或UI被阻止等待资源可用时的活动。BusyIndicator类似于一个不确定的ProgressBar。两者都可以用来指示背景活动。主要区别在于视觉效果,ProgressBar还可以显示具体的进度(当可以确定时)。由于视觉差异,繁忙指示器和不确定的…...
flutter 专题十一 Fair原理篇Fair逻辑动态化架构设计与实现
数据逻辑处理布局中的逻辑处理Flutter类型数据处理 一、数据逻辑处理 我们接触的每一个Flutter界面,大多由布局和逻辑相关的代码组成。如Flutter初始工程的Counting Demo的代码: class _MyHomePageState extends State<MyHomePage> {// 变量 in…...
利用开源图床的技巧与实践
随着互联网的普及,图片的使用变得越来越广泛。无论是个人博客、社交媒体还是企业网站,都离不开图片的呈现。而图床作为图片存储和管理的工具,可以帮助开发者和内容创作者高效地管理图片资源。本文将探讨如何利用开源图床,并提供相…...
C++数据结构与算法
C数据结构与算法 1.顺序表代码模版 C顺序表模版 #include <iostream> using namespace std; // 可以根据需要灵活变更类型 #define EleType intstruct SeqList {EleType* elements;int size;int capacity; };// Init a SeqList void InitList(SeqList* list, int capa…...
Paddle Inference部署推理(三)
三:Paddle Inference推理 导出模型 Paddle Inference支持使用飞桨静态图模型进行推理,您可以通过以下两种方式获取静态图模型: (1)飞桨框架导出推理模型 飞桨框架在训练模型过程中,会在本地存储最终训练…...
python(四)os模块、sys模块
一、os模块 os 模块提供了很多程序与操作系统直接交互的功能 名称描述示例os.getcwd()得到当前工作目录,即当前Python脚本工作的目录路径‘D:\python’os.listdir()返回指定目录下的所有文件和目录名>>> os.listdir()os.remove()函数用来删除一个文件>…...
Oracle 数据库 IDENTITY 列
IDENTITY列是Oracle数据库12c推出的新特性。之所以叫IDENTITY列,是由于其支持ANSI SQL 关键字 IDENTITY,其内部实现还是使用SEQUENCE。 不过推出这个新语法也是应该的,毕竟MyQL已经有 AUTO_INCREMENT列,而SQL Server也已经有IDENT…...
【前端】js vue 屏蔽BackSpace键删除键导致页面后退的方法
【前端】js vue 屏蔽BackSpace键删除键导致页面后退的方法 方法一:通过全局事件监听阻止 Backspace 导致页面后退 在 main.js 或组件的 mounted 中添加以下代码: //【前端】js vue 屏蔽BackSpace键删除键导致页面后退的方法 document.addEventListener…...
深入解密 K 均值聚类:从理论基础到 Python 实践
1. 引言 在机器学习领域,聚类是一种无监督学习的技术,用于将数据集分组成若干个类别,使得同组数据之间具有更高的相似性。这种技术在各个领域都有广泛的应用,比如客户细分、图像压缩和市场分析等。聚类的目标是使得同类样本之间的…...
ArcGIS应用指南:ArcGIS制作局部放大地图
在地理信息系统(GIS)中,制作详细且美观的地图是一项重要的技能。地图制作不仅仅是简单地将地理数据可视化,还需要考虑地图的可读性和美观性。局部放大图是一种常见的地图设计技巧,用于展示特定区域的详细信息ÿ…...
非root用户安装CUDA
1.使用nvidia-smi查看当前驱动支持的最高CUDA版本: 表示当前驱动最多支持cuda12.1 2.进入cuda安装界面,https://developer.nvidia.com/cuda-toolkit-archive,选择想要安装的版本,例如想要安装CUDA11.4: 如果需要查看ub…...
单点修改,区间求和或区间询问最值(线段树)
【题目描述】 给定一个长度为n的非负整数序列,接下来有m次操作,操作共有3种:一是修改序列中某个元素的大小,二是求某个区间的所有元素的和,三是询问某个区间的最大值。整数序列下标从1开始。n<10^5, m<10^5。 …...
线性代数空间理解
学习线性代数已经很久,但是在使用过程中仍然还是不明所以,比如不知道特征向量和特征值的含义、矩阵的相乘是什么意思、如何理解矩阵的秩……。随着遇到的次数越来越多,因此我决定需要对线性代数的本质做一次深刻的探讨了。 本次主要是参考了3…...
Spring Boot教程之五:在 IntelliJ IDEA 中运行第一个 Spring Boot 应用程序
在 IntelliJ IDEA 中运行第一个 Spring Boot 应用程序 IntelliJ IDEA 是一个用 Java 编写的集成开发环境 (IDE)。它用于开发计算机软件。此 IDE 由 Jetbrains 开发,提供 Apache 2 许可社区版和商业版。它是一种智能的上下文感知 IDE,可用于在各种应用程序…...
C51相关实验
C51相关实验 LED //功能:1.让开发板的LED全亮,2,点亮某一个LED,3.让LED3以5Hz的频率闪动#include "reg52.h"#define LED P2 sbit led1 LED^1;void main(void) {LED 0xff;//LED全灭led1 0;while(1)//保持应用程序不退出{} }LED 输出端是高…...
docker离线安装linux部分问题整理
0:离线安装docker过程命令 echo $PATH tar -zxvf docker-26.1.4.tgz chmod 755 -R docker cp docker/* /usr/bin/ root 权限 vim /etc/systemd/system/docker.service --------- [Unit] DescriptionDocker Application Container Engine Documentationhttps://docs.do…...
ISUP协议视频平台EasyCVR萤石设备视频接入平台银行营业网点安全防范系统解决方案
在金融行业,银行营业厅的安全保卫工作至关重要,它不仅关系到客户资金的安全,也关系到整个银行的信誉和运营效率。随着科技的发展,传统的安全防护措施已经无法满足现代银行对于高效、智能化安全管理的需求。 EasyCVR视频汇聚平台以…...
递推概念和例题
一、什么是递推 递推算法以初始值为基础,用相同的运算规律,逐次重复运算,直至求出问题的解,它的本质是按照固定的规律逐步推出(计算出)下一步的结果 这种从“起点”重复相同的的方法直至到达问题的解&…...
Oracle查询表空间大小
1 查询数据库中所有的表空间以及表空间所占空间的大小 SELECTtablespace_name,sum( bytes ) / 1024 / 1024 FROMdba_data_files GROUP BYtablespace_name; 2 Oracle查询表空间大小及每个表所占空间的大小 SELECTtablespace_name,file_id,file_name,round( bytes / ( 1024 …...
在rocky linux 9.5上在线安装 docker
前面是指南,后面是日志 sudo dnf config-manager --add-repo https://download.docker.com/linux/centos/docker-ce.repo sudo dnf install docker-ce docker-ce-cli containerd.io -y docker version sudo systemctl start docker sudo systemctl status docker …...
使用分级同态加密防御梯度泄漏
抽象 联邦学习 (FL) 支持跨分布式客户端进行协作模型训练,而无需共享原始数据,这使其成为在互联和自动驾驶汽车 (CAV) 等领域保护隐私的机器学习的一种很有前途的方法。然而,最近的研究表明&…...
CocosCreator 之 JavaScript/TypeScript和Java的相互交互
引擎版本: 3.8.1 语言: JavaScript/TypeScript、C、Java 环境:Window 参考:Java原生反射机制 您好,我是鹤九日! 回顾 在上篇文章中:CocosCreator Android项目接入UnityAds 广告SDK。 我们简单讲…...
什么是EULA和DPA
文章目录 EULA(End User License Agreement)DPA(Data Protection Agreement)一、定义与背景二、核心内容三、法律效力与责任四、实际应用与意义 EULA(End User License Agreement) 定义: EULA即…...
MySQL 8.0 OCP 英文题库解析(十三)
Oracle 为庆祝 MySQL 30 周年,截止到 2025.07.31 之前。所有人均可以免费考取原价245美元的MySQL OCP 认证。 从今天开始,将英文题库免费公布出来,并进行解析,帮助大家在一个月之内轻松通过OCP认证。 本期公布试题111~120 试题1…...
(一)单例模式
一、前言 单例模式属于六大创建型模式,即在软件设计过程中,主要关注创建对象的结果,并不关心创建对象的过程及细节。创建型设计模式将类对象的实例化过程进行抽象化接口设计,从而隐藏了类对象的实例是如何被创建的,封装了软件系统使用的具体对象类型。 六大创建型模式包括…...
Python网页自动化Selenium中文文档
1. 安装 1.1. 安装 Selenium Python bindings 提供了一个简单的API,让你使用Selenium WebDriver来编写功能/校验测试。 通过Selenium Python的API,你可以非常直观的使用Selenium WebDriver的所有功能。 Selenium Python bindings 使用非常简洁方便的A…...
使用SSE解决获取状态不一致问题
使用SSE解决获取状态不一致问题 1. 问题描述2. SSE介绍2.1 SSE 的工作原理2.2 SSE 的事件格式规范2.3 SSE与其他技术对比2.4 SSE 的优缺点 3. 实战代码 1. 问题描述 目前做的一个功能是上传多个文件,这个上传文件是整体功能的一部分,文件在上传的过程中…...
【深度学习新浪潮】什么是credit assignment problem?
Credit Assignment Problem(信用分配问题) 是机器学习,尤其是强化学习(RL)中的核心挑战之一,指的是如何将最终的奖励或惩罚准确地分配给导致该结果的各个中间动作或决策。在序列决策任务中,智能体执行一系列动作后获得一个最终奖励,但每个动作对最终结果的贡献程度往往…...
