TCP-IP详解笔记3
TCP-IP详解笔记3
地址解析协议
- IP协议的设计目标是为跨越不同类型物理网络的分组交换提供互操作。
- 网络层软件使用的地址和底层网络硬件使用的地址之间进行转换。
- 对于TCP/IP网络,地址解析协议(ARP)提供了一种在IPv4地址和各种网络技术使用的硬件地址之间的映射。
- ARP仅能用于IPv4,IPv6使用邻居发现协议,它被合并于ICMPv6。
- 网络层地址和链路层地址由不同部门分配的;
- 硬件地址,主地址由设备制造商定义,并存储在设备的永久性内存中,它不会改变。
- 网络接口的IP地址可能改变,是由用户或网络管理员分配,并且可以按需选择。
- 地址解析是发现两个地址之间的映射关系的过程。
- ARP提供从网络层地址到相关硬件地址的动态映射(自动执行并随时间变换)。
- ARP(Address Resolution Protocol)的反向映射的协议称为RARP.
直接交互和ARP
- 直接交互发生在一个IP数据报被发送到一个IP地址,而该地址与发送方具有相同IP前缀的情况下。
- ARP用于运行IPv4的多接入链路层网络,每个主机都有自己首选的硬件地址。
- 点到点链路不使用ARP。
- 当这些链路被建立后,在链路两端通知正在使用的地址,不涉及硬件地址,就不需要地址解析或ARP。
ARP缓存
- ARP高效运行的关键是维护每个主机和路由器上的ARP缓存(或表)。
- 该缓存使用地址解析为每个接口维护从网络层地址到硬件地址的最新映射。
- 当IPv4地址映射到硬件地址时,它对应与高速缓存中的一个条目,其正常到期时间是条目创建开始后的20分钟。
arp
命令可以查看ARP缓存。
- Linux系统中,每个映射是一个包含5个元素的条目: 主机名(对应一个IP地址),硬件地址类型,硬件地址,标志和本地网络接口。
ARP帧格式
- 以太网中转换一个IPv4地址时常用的ARP请求和应答分组的格式。
- MAC(以太网)头部 ---- 14字节。
- DST, SRT, 长度或类型。
- 固定大小 ---- 8字节。
- 硬件类型,协议类型,硬件大小,协议大小。
- 可变大小 ---- 取决于协议,以太网/IPv4为20字节。
- 发送方的硬件地址,发送方的协议地址,目的硬件地址,目的协议地址。
- 填充 ---- 不按比例。
- FCS --- 帧校验序列(Frame Check Sequence,FCS),采用32位CRC循环冗余校验对从"目标MAC地址"字段到"数据"字段的数据进行校验。
- MAC(以太网)头部 ---- 14字节。
代理ARP
- 代理ARP使一个系统(通常是一台专门配置的路由器)可回答不同主机的ARP请求。
- 代理ARP也被称为混杂ARP或ARP黑客。
- 两个物理网络相互隐蔽自己,这种情况下,两个物理网络可使用相同的IP前缀,只要将中间的路由器配置为一个代理ARP,在一个网络中由代理响应对其他网络中主机的ARP请求。
- 有些系统无法进行子网划分;
- 有些系统使用比较旧的广播地址(全0的主机ID, 而不是当前的全1的主机ID)。
- linux支持一种称为自动带路ARP的功能,它可通过文件
/proc/sys/net/ipv4/conf/*/proxy_arp
进行配置。
免费ARP和地址冲突检测
- ARP的另一个功能被称为免费ARP,它发生在一台主机发送ARP请求以寻找自己的地址时。
tcpdump -n
--- 打印数字化的点分十进制地址而不是主机名。
- 免费ARP需要达到两个目标:
- 允许一台主机确定另一台主机是否配置相同的IPv4地址。
- 如果发送免费ARP的主机已改变硬件地址,该帧导致任何接收广播并且缓存中该条目的其他主机,该条目的旧硬件地址更新为与该帧一致。
- ARP服务器是内核的TCP/IP的一部分,但并不是所有的TCP/IP实现都提供RARP服务器。
- ARP是TCP/IP实现中的一个基本协议,但它通常在应用程序或用户没有察觉的情况下运行。
- ARP缓存是其运行的基础,可以使用
arp
命令查看和处理缓存,缓存中每个条目都有一个定时器,用于清除不完整的条目和完整的条目。arp
命令可以显示和修改缓存中的条目。
Internet协议
- IP并不维护任何关于后续数据报的状态信息,每个数据报都是独立的。
- IP数据报都可以不按序列接收,每个数据报独立地进行路由。
- IP是TCP/IP协议族中的核心协议,所有TCP、UDP、ICMP、IGMP数据都通过IP数据报传输。
- IP提供了一种尽力而为、无连接的数据报交互服务。
- 尽力而为的含义是不保证IP数据报能成功到达目的地;
- IP提供一个简单的错误处理方法: 丢弃一些数据(通常是最后到达的数据报)。
- 任何可靠性必须由上层(TCP)提供。
- 无连接意味着IP不维护网络单元(即路由器)中数据报相关的任何连接状态信息,每个数据报独立于其他数据报来处理。
- B可能在A之前到达。
- IPv4数据报:
- IP头部字段:
- 版本字段 --- 4位,IPv4为4, IPv6为6;
- Internet头部长度(IHL)字段保存IPv4头部中32位字的数量,包括任何选项。
- IPv6中不存在这个字段,其头部固定为40字节。
- 一组RFC字段,前6位被称为区分服务字段(DS字段),后两位是显示拥塞通知(ECN)字段或指示位。
- 这些字段被用于数据报转发时的特殊处理。
- 总长度字段是ipv4数据报的总长度(以字节为单位),通过该字段和IHL字段,我们知道数据报的数据部分从哪里开始,以及它的长度。
- 由于这个字段是一个16位的字段,所以IPv4数据报的最大长度为65536字节。
- 由于一些携带IPv4数据报的底层协议不能(精确)表达自己封装的数据报大小,所以需要在头部中给出总长度字段。
- 尽管可发送一个65535字节的IP数据报,但大多数链路层(以太网)不能携带这么大的网络,除非将它拆分成更小的片。
- 当一个IPv4数据报被分为多个更小的分片时,每个分片自身仍是一个独立的IP数据报,总长度字段反映具体的分片长度。
- IPv6头部不支持分片,其长度有负载长度字段获得,这个字段提供IPv6的数据报长度,不包含头部长度,但扩展头部包含在负载长度中。
- 标识字段帮助标识有IPv4主机发送的数据报,为了避免将一个数据报分片和其他数据报分片混淆,发送主机通常在每次发送数据报时都将一个内部计时器加1,并将该计数器值复制到IPv4标识字段。
- 这个字段对分片很重要,标志和分片偏移字段。
- IPv6中,这个字段显示在分片扩展头部中。
- 生存期(TTL)字段用于设置一个数据报可经过的路由器数量的上限。
- 发送方可将其初始化为某一个值,一般为64。
- 每台路由器在转发数据报是就将该值减1.
- 当该字段值达到0时,该数据报被丢弃,并使用一个ICMP消息通知发送方。
- 这可以防止由于出现不希望的路由环路而导致数据报在网络中永远循环。
- IPv4头部中的协议字段包含一个数字: 表示数据报有效符合部分的数据类型。
- 最常用的UDP是17, TCP是6.
- 这提供了多路分解的功能,以便ip协议可用于携带多种协议类型的有效负荷.
- 最初仅用于指定数据报封装的传输层协议,但现在用于识别其中封装协议是否为一种传输层协议。
- IPv4-in-IPv4的值为4。
- 头部校验和字段仅计算IPv4头部;
- 这意味着IP协议不检查IPv4数据报有效载荷的正确性。
- 为了确保IP数据报的有效载荷部分已正确传输,其他协议必须通过自己的数据完整性检验机制来检查重要数据。
- ICMP/IGMP/UDP/TCP在自己头部中都有一个涵盖其头部和数据的校验和,也涵盖了他们认为重要的ip头部的某些部(一种违反了分层的形式)。
- IPv6头部没有任何校验和字段。
- Internet校验和。
- 每个ip数据报包含发送者的源IP地址和接收者的目的IP地址,通常标识一台计算机的一个接口。
- IP头部字段:
- IPv6数据报:
Internet校验和
- Internet校验和是一个16位的数字和,它能以相当高的概率确定接收的消息或其中部分内容是否与发送相匹配。
- Internet校验和算法与常见的循环冗余校验(CRC)不同,CRC提供更强的保护功能。
- 具体计算步骤:
- 先把数据报的校验和字段值设置为0.
- 然后对头部(整个头部被认为是一个16位字的序列)计算16位二进制反码和。
- 反码和被存储在校验和字段中。
- 二进制反码加法可通过循环进位加法实现。
- Internet校验和是一个呗校验数据的16位反码和的砝码。
- 没有错误校验和为0.
- 当发现一个头部出错(计算的校验和不为0), IPv4将丢弃接收到的数据报,但是不会生成差错信息,更高层以某种方式监测丢失的数据报,并在必要时进行重新传输。
- Internet校验和的数学性质:
- 16位进制集合与其反码和运算共同形成一个阿贝尔群:
- 闭包;
- 结合性;
- 存在一个恒等元素;
- 交换性;
- 存在可逆。
- 16位进制集合与其反码和运算共同形成一个阿贝尔群:
DS字段和ECN字段(IPv6流量类别)
- IPv4头部的第3和第4字段(IPv6头部的第2和第3字段)分别是区分服务(DS字段)和ECN字段。
- 区分服务(Diff service)是一个框架和一组标准,用于支持Internet某种方式被标记,使它们的转发不同于其他数据报。
- 这样做可以导致网络中排队延时的增加或减少,出现其他特殊效果。
- DS中的数字称为区分服务代码点(DSCP), 预定义的具有特殊含义的位。
- 头部的2位ECN位用于为数据报标记拥塞标识符。
- 一台持续拥塞的具有ECN感知能力的路由器在转发分组时会设置这两位。
- 发送方会降低发送速率。
- 区分服务(Diff service)是一个框架和一组标准,用于支持Internet某种方式被标记,使它们的转发不同于其他数据报。
- D、T和R子字段表示数据报在延时、吞吐量和可靠性方面得到良好的处理。
- 基于一个称为多优先级与抢占的方案(MLPP)。
- 3位类别选择器提供了8个定义的代码点,他们对应与一个指定最小功能集的PHB.
- 加速转发(EF)提供了非拥塞的网络服务,也就是说,EF流量应享受较低的延时、抖动和丢包率。
- 路由表为一个网络指定一个路由器,而不必为每个主机指定一个路由器;
- 在路由传输过程中,数据报的目的IP地址时钟不变,所有路由决策都是基于这个目的IP地址的。
- 链路层的目的地址始终指的是下一站的链路地址。
IP选择
- IP路由选择 ---> 最长匹配原则 ---> 搜索路由表。
- IP路由器接收到一个包含选项的数据报,通常需要对该数据报进行特殊处理。
- 在某些情况下,IPv6可以处理扩展头部,但很多头部被设计为仅由终端主机处理。
- 在有些路由器中,带选项或扩展的数据报不会像普通数据报那样被快速转发。
- 路由警告选项提示可能由于在Internet上使用其他选项而有异常问题。
- IPv6扩展头部:
- IPv4提供的特殊功能,在IPv6头部之后增加扩展头部实现。
- IPv6必须按接收的顺序处理扩展头部。
- 扩展选项:
- 逐跳选项;
- 目的地选项;
- 类型--长度--值集合(TLV).
- 填充1和填充N,IPv6需要8字节对齐的偏移量对齐,较小的选项用0填充到长度为8字节。
- IPv6超大有效载荷:IPv6超大有效载荷选项指定了一种有效载荷大于65535字节的IPv6数据报,称为超大报文。
- 隧道封装限制:
- 隧道是指将一个协议封装在另一个协议中,IP数据报可能被封装在另一个IP数据报的有效载荷部分。
- 隧道可用于形成虚拟的覆盖网络。
- 封装限制行动类似于IPv4的TTL和IPv6的跳数限制字段,只不过采用隧道封装层次代替转发跳步。
- 路由警告:指出数据报包含需要路由器处理的信息。
- 快速启动: 快速启动,仅用于专用网络。
- CALIPSO: 支持通用体系结构式标签IPv6安全选项,提供一种为数据报做标记的方法,包括一个安全级别标识符和一些额外的信息。
- 家乡地址:移动IP可能改变自己的网络接入点,同时不会断开自己的高层网络连接。
- 路由头部: IPv6路由头部为发送方提供了一种IPv6数据报控制机制,以控制数据报通过网络的路径。
- IPv6路由头部涵盖了来自IPv4的宽松源路由和记录路由选项。
- IPv6路由头部在转发过程中不会处理,直至目的IP地址字段中包含的地址所在的点。
- 分片头部:
- 分片头部用于IPv6源节点向目的地发送一个大于路径MTU的数据报。
- IPv6中,仅数据报的发送者可以执行分片操作。
- IPv6分片标识符字段是32位,IPV4分片标识符是16位,更大的字段提供网络中容纳更多分片的能力。
IP转发
- IP转发对于一个主机来说,比较简单,如果目的地址是直接相连的主机或共享网络,IP数据报直接发送到目的地,不需要或不使用路由器。
- 否则主机将数据报发送到一台路由器,该路由器将数据报交付到目的地。
- 主机与路由器处理IP数据报的区别在于: 主机不转发那些不是它生成的数据报,但是路由器会转发不是自己生成的数据报。
- IP层包括一些内存信息:称为路由表或转发表。
- 每次转发一个数据报就会从路由表中查找信息。
- ICMP消息可能发送回源节点,以表明发生了一个错误。
- 转发表:
- IP转发表通常需要几个关键信息:
- 目的地:32位字段(IPv6为128位),用于与一个掩码操作结果相匹配。
- 掩码: 32位字段(IPv6为128位),用作数据报目的IP地址按位与操作的掩码,其中的目的IP地址是要再转发表中查找的地址。
- 下一跳: 它是下一个IP实体(路由器或主机)的32位IPv4地址或128位IPv6地址,数据报将转发到该地址。
- 下一跳实体通常在一个网络中由执行转发查找的系统所共共享,这意味着他们共享同一网络前缀。
- 接口: 包含一个由IP层使用的标识符,以确定将数据报发送到下一跳的网络接口。
- IP转发逐跳进行,路由器和主机不包含到任何目的地的完整转发路径,IP转发只提供下一跳实体的IP地址。
- 由一个或多个路由协议确保路由表正确,多种路由协议能做好这项工作: 包括RIP、OSPF、BGP和IS-IS。
- IP转发表通常需要几个关键信息:
- 当一台主机或路由器中的IP层需要向下一跳的路由器或主机发送一个数据报时,它首先检查数据报中的目的IP地址(D).
- 在转发表中使用该值D来执行最长前缀匹配算法。
移动IP
- 移动IP基于一台主机拥有一个家乡网络,但可以不时地访问其他网络的想法。
- 针对IPv4的移动IP协议(MIPv4);
- 针对IPv6的移动IP协议(MIPv6).
- MIPv6的复杂性主要涉及信令消息,以及如何保证它们的安全。
- 移动IP自身实际上是一种特殊的协议。
- 基本模型: 双向隧道:
- 一台可能移动的主机称为移动节点(MN),与它通信的主机称为通信节点(CN).
- MN被赋予一个由家乡网络的网络前缀获得的IP地址,家乡地址(HoA);
- 漫游到一个可访问的网络时,它被赋予了另一个地址,称为转交地址(CoA)。
- 在基本模型中,当一个CN与MN通信时,该流量需要通过MN的家乡代理(HA)来路由。
- HA是一种特殊类型的路由器,被部署在网络基础设施中。
- MN的HoA和CoA之间的关联称为MN绑定。
- 当MN(或移动网络的路由器)连接到网络中的一个新位置时,它接收自己的CoA,并向自己的HA发送一个绑定更新消息,这个HA使用一个绑定确认来响应。
- MN和CA之间的流量通过MN的HA来路由,并使用一种双向的IPv6分组隧道,称为双向隧道。
- 一台可能移动的主机称为移动节点(MN),与它通信的主机称为通信节点(CN).
- 路由优化:
- 为了改善MIPv6中出现的低效路由,可使用一种称为路由优化(RO)的方法。
- RO操作分为两个部分:
- 涉及注册绑定的建立和维护,MN必须向每个CN证明自己的真实身份,通过一个返回路由程序(RRP)来完成。
- 涉及所有绑定建立后的数据交换方法。
- RRP使用的移动消息是IPv6移动扩展头部的子类型:
- 家乡测试初始化(HoTI);
- 家乡测试(HoT);
- 转交测试初始化(Coti);
- 转交测试(CoT).
- 这些消息向CN验证一个特定MN的家乡地址(HoTI和HoT消息)和转交地址(CoTI和CoT消息)可达性。
- RRP使用的移动消息是IPv6移动扩展头部的子类型:
IP数据报的主机处理
- 确定一个单播数据报是否匹配一台主机的IP地址并被处理,它取决于接收系统的主机模式,以及它是否为最相关的多宿主主机。
- 强主机模式:只有当目的IP地址字段中包含的IP地址与数据报到达的接口配置的IP地址匹配时,才同意将数据报交付本地协议栈。
- 主机模式也适用于发送行为: 当接口胚子的地址与发送数据报的源IP地址字段匹配时,这台采用强主机模式的主机才可从这个特定的接口发送数据报。
- 弱主机模式:一个数据报携带的目的地址与它到达的任何接口的任何本地地址匹配,无论它到达那个网络接口,他都会被接收的协议栈处理。
- 强主机模式:只有当目的IP地址字段中包含的IP地址与数据报到达的接口配置的IP地址匹配时,才同意将数据报交付本地协议栈。
- 地址选择:
- 当一台主机发送一个IP数据报时,它必须将自己的IP地址写入数据报的源IP地址字段,在他已知多个地址的情况下,数据报的目的地址确定一台特定的目的主机。
- 数据报的源IP地址和目的IP地址字段中使用的IP地址,是通过一组称为源地址选择程序和目的地址选择程序获得的。
- 地址选择失败可能导致非对称路邮局、不必要的过滤或丢弃分组。
- 默认地址选择通过一个策略表来控制,它存在于每台主机中。
- 它是一个最长匹配前缀查找表,类似于IP路由使用的转发表。
- 源地址选择算法:
- 源地址选择算法定义了一个源地址的候选集合CS(D), 它基于一个特定的目的地址D。
- 目的地址选择算法:
- 指定了一种类似于源地址选择的方式。
- 与IP相关的攻击:
- 主要基于选项操作,或利用专用代码中的错误(分片重组)。
- 当前Internet中的路由器会忽略或剥离IP选项,并在基本分组的处理中修复错误。
- 如果没有身份认证或加密,IP欺骗攻击是有可能发生的。
- 一些早期的攻击涉及对源IP地址的伪造。
- IPv6和移动IP相对较新,攻击者可以对IPv6分组进行处理,产生攻击。
- 如果仅简单地过滤所有包含IPv6扩展头部和选项的分组,浙江会严重限制其使用,特别是,禁止头部将影响移动IPv6的正常运行。
- IPv4和IPv6头部不能直接兼容,并且只共享了4位的版本字段。
- IP转发描述了IP数据报通过单一和多跳网络的传输方式。
- 除了特殊情况,IP转发在逐跳的基础上进行。
- 数据报的目的IP地址经过每跳时都不改变,但是链路层封装和链路层目的地址在每跳时会改变。
- 主机和路由器器使用转发表和最长前缀匹配算法,以确定匹配得最好的转发条目,以及沿着一条转发路径的下一跳。
- 移动IP在移动节点的家乡地址和转交地址之间建立安全绑定。
- 这些绑定可用于与移动节点通信,即使它不在家乡内部。
- 主机模式涉及主机如何选择通信使用的地址,目前已经有一些地址选择算法(针对源地址和目的地址),这些算法倾向于选择范围有限、永久性的地址。
TCP-IP详解笔记3的更多相关文章
- TCP/IP详解 笔记十四
TCP/IP协议(二) 连接的建立与终止 tcpdump -S输出TCP报文的格式 格式: 源>目的:标志 (标志就是tcp头部).标识首字符意义如下: 例如:telnet 某服务的输出(包括 ...
- TCP/IP详解 笔记一
概述: Tcp-ip让网络上的计算机进行通信,而不管计算机和操作系统是否一样. 分层结构: Tcp/ip协议族是多层协议的组合,而tcp和ip只是其中的两个协议而已. 一个通信举例: 注意图的右上方: ...
- TCP/IP详解 笔记十三
TCP协议(一) 概述 特点 1, 面向连接可靠的字节流服务 2, 只有两方通信,不能用于广播或多播 3, 应用数据被TCP分隔为最合适发送的数据段,传给IP协议栈 4, 发送端并启动定时器, ...
- TCP/IP详解 笔记十一
域名服务系统(DNS) DNS:名字到IP转换:电子邮件选路信息:分布式数据库 解析器:是通过gethostbyname(3)和gethostbyaddr(3)来实现的 最常用的名字服务器是BIND ...
- TCP/IP详解 笔记九
广播和多播 多播和广播只能用于UDP包,TCP明确在两个进程间建立连接. 多播:帧只传送给属于多播组的多个接口 主机对帧的过滤过程: 通常网卡只接收那些目的地址为本物理接口地址或广播地址的帧:设置为混 ...
- TCP/IP详解 笔记八
UDP协议 UDP是传输层协议,提供无连接不可靠的数据传输,其优点失效率高,确定确定是无序不可靠. 报文格式 UDP头部 TCP和UDP的端口号是独立的 UDP长度是指UDP数据报的总长度 UDP的校 ...
- TCP/IP 详解笔记
最早的 TCP 协议文档是 RFC793. TCP 提供一种面向连接的.可靠的字节流服务. 面向连接容易理解,那么什么是字节流服务呢? 答:两个应用程序通过 TCP 连接交换 8 bit 字节构成的字 ...
- TCP/IP详解 笔记十二
简单文件传送协议 TFTP 1) 初衷是为了引导无盘系统 2) 使用UDP 3) 代码都能适合只读存储器 无盘主机通过RARP获得ip地址后进行一个TF ...
- TCP/IP详解 笔记十
IGMP Internet组管理协议 IGMP的作用:让一个物理网络上的所有系统知道主机所在的多播组: 让路由器知道多播数据报应该向哪个端口转发. IGMP有固定长度,没有可选数据,在ip头部的协议值 ...
- TCP/IP详解学习笔记
TCP/IP详解学习笔记(1)-基本概念 TCP/IP详解学习笔记(2)-数据链路层 TCP/IP详解学习笔记(3)-IP协议,ARP协议,RARP协议 TCP/IP详解学习笔记(4)-ICMP协议, ...
随机推荐
- 将arguments转换成数组的方法
将函数里的arguments,转换成一个真正的数组的方法,arguments是个类数组,除了有实参所组成的类似数组以外,还有自己的属性,如callee,arguments.callee就是当前正在执行 ...
- Redis详解(三)------ redis的五大数据类型详细用法
我们说 Redis 相对于 Memcache 等其他的缓存产品,有一个比较明显的优势就是 Redis 不仅仅支持简单的key-value类型的数据,同时还提供list,set,zset,hash等数据 ...
- Socket之listen() receive()
socket.listen([backlog]) 相比listen方法,它俩就好理解多了,一个是Client用于连接Server的方法,一个是Server用于接收Client的连接申请的方法. 但事 ...
- Python之find命令中的位置的算法
find("s",a,b) #s表示的是一个子序列,a表示的是检索的起始位置,b表示的是检索的终止位置,ab可有可无 test = "abcdefgh" ...
- 国内可访问的稳定docker镜像
可参考:https://yeasy.gitbooks.io/docker_practice/content/install/mirror.html 但在debian 9上进行相应配置后,在pull镜像 ...
- Shell命令-文件压缩解压缩之tar、unzip
文件及内容处理 - tar.unip 1.tar:打包压缩命令 tar命令的功能说明 tar 命令常用语用于备份文件,tar 是用来建立,还原备份文件的工具程序,它可以加入,解开备份文件内的文件 ta ...
- Python学习之路——函数的参数分类
今日内容 '''实参:调用函数,在括号内传入的实际值,值可以为常量.变量.表达式或三者的组合*****形参:定义函数,在括号内声明的变量名,用来接受外界传来的值''''''注:形参随着函数的调用 ...
- Android学习第九天
为什么需要内容提供者 a) 如何创建数据库 b) 文件权限 c) Chmod linux修改权限 内容提供者原理 a) 内容提供者把数据进行封 ...
- 如何打印consul的错误信息
在配置文件中添加 management: endpoints: web: exposure: include: "*" endpoint: shutdown: enabled: t ...
- 配置ssh免密登录服务器
当前服务器环境为ubantu 14.04 一.本地 ①生成id_rsa id_rsa.pub ssh-keygen -t rsa -C "xxxxx@xxxxx.com" ss ...