16-WAAS配置
本章节下载: 16-WAAS配置 (345.74 KB)
目 录
WAAS(Wide Area Application Services,广域网应用服务)是能够对广域网链路流量提供优化的一种广域网技术。WAAS设备可以通过配置优化动作,改善广域网链路高延迟、低带宽的缺点。相互通信的WAAS设备在TCP连接三次握手过程中,通过TCP选项协商两端优化动作。WAAS优化动作包括:TFO(Transport Flow Optimization,传输层流优化)、DRE(Data Redundancy Elimination,数据冗余消除)和LZ(Lempel-Ziv compression,LZ压缩)。
TFO是指传输层流优化技术。在不改变TCP流量的源、目的IP地址和端口号的情况下,在广域网链路两端对TCP连接进行透明代理,并对广域网链路两端的TCP流量进行优化。TFO优化方式包括:
传统TCP慢启动时,拥塞窗口初始值为1个TCP分段,每经过一个传输轮次,拥塞窗口就加倍,最后拥塞窗口达到一个合适的值。在广域网环境下,传输时延较大,导致拥塞窗口达到一个合适的值需要经过较长的时间。慢启动优化通过扩大初始拥塞窗口大小的方式来缩短慢启动过程。
传统TCP的接收缓冲区最大为64K,即TCP在发送完64K的报文后,需接收到对端的确认报文后才能继续发送数据,即使广域网链路带宽还有空闲,也无法再发送数据。TFO可以把TCP接收缓冲区最大增加到16384K,提高TCP的传输性能。
TCP的拥塞控制算法主要依赖于拥塞窗口,窗口的大小代表在未收到确认报文的情况下能够发送出去的最大数据报文段。拥塞窗口的大小取决于网络的拥塞程度,并且动态地在变化。窗口越大,数据发送的速度越快,则越有可能出现网络拥塞;相反窗口越小,数据发送的速度越慢,则导致数据发送效率低下。TFO拥塞控制算法优化就是要在发送速度与网络拥塞状况这两者之间权衡,选取最好的拥塞窗口大小,使得网络吞吐量最大化且不产生拥塞。
传统TCP在数据的传输过程中采用累计确认机制,发送方需等待一个来回时间根据接收方的确认报文确认丢失的数据,并且可能重传一些已经被接收方正确接收的数据。在多个不连续分段丢失的情况下,这种机制降低了TCP传输的总吞吐量。
SACK(Selective Acknowledgment,选择性确认)允许接收方通知发送方所有正确接收的数据,因此发送方只需要重传丢失的数据。例如,在多个不连续分段丢失的情况下,接收方对未正确接收的不连续数据分别确认,使发送方只重传丢失的数据,实现数据包的选择性重传。
DRE是指消除冗余数据技术。在相互通信的WAAS设备上保存重复数据块与字典索引对应的数据字典。数据发送前首先查找字典,如果查找到该数据块的字典表项,则认为之前发送过该数据块,称为重复数据块。发送端将重复数据块替换为字典索引在广域网链路上传输。接收端通过识别字典索引,将其还原成重复数据块,以减少广域网链路传输的数据量,提高数据传输速度。用字典索引替换重复数据块的过程称为DRE压缩。用重复数据块替换字典索引的过程称为DRE解压缩。
(1) 数据缓存:将TCP连接上接收的数据块发送给DRE模块前,需要TCP透明代理缓存输入的TCP数据流,以提供给DRE一个较大的数据块。
(2) 数据分块和替换:DRE压缩前将待发送数据划分为互不重叠的数据块,针对数据块来检测是否为重复数据块。
· 如果为重复数据块,用字典索引替换该数据块,并根据该数据块生成MD5摘要,把字典索引和MD5摘要信息发送至接收端;
· 如果不是重复数据块,为该数据块生成对应的字典索引,将该字典索引和数据块添加到本地数据字典中,并根据该数据块生成MD5摘要,把数据块、对应的字典索引和摘要信息发送至接收端。
WAAS采用滑动块检测技术对数据进行分块和检测,滑动块检测技术的优点包括:
· 计算速度快、效率高。
· 对原始数据进行基于固定长度窗口的逐字节滑动比较,可以有效地检测出重复数据块,从而获得良好的重复数据缩减率。
(1) 数据还原:WAAS设备检测接收到的数据,根据接收数据获得对应的原始数据。
¡ 如果接收到的数据为字典索引,则根据字典索引进行数据字典查询以获取相对应的重复数据块。
¡ 如果接收到的数据为字典索引和重复数据块,则根据收到的数据创建新的字典表项,并添加到本地数据字典中。
(2) 数据校验:所有数据都还原后,计算解压数据的MD5摘要,并且和报文中携带的摘要信息进行对比。如果相同,则代表解压缩成功;如果不同,则代表解压缩失败,等待对端重新发送数据。
如果检测到接收到的数据是字典索引,并且在数据字典中查询失败,则认为解压缩失败,需要对端重传该报文原始数据和字典索引。
LZ压缩是一种数据无损压缩技术。主要是通过自建字典方法来进行压缩替换,其压缩字典存在于压缩结果中。与DRE压缩相比,LZ压缩的压缩率比较低,但其不需要在压缩和解压双方同步保存数据字典,因此内存开销比较小。
与WAAS相关的协议规范有:
· RFC 1323:TCP Extensions for High Performance
· RFC 3390:Increasing TCP's Initial Window
· RFC 2581:TCP Congestion Control
· RFC 2018:TCP Selective Acknowledgment Options
· RFC 3042:Enhancing TCP's Loss Recovery Using Limited Transmit
· RFC 2582:The NewReno Modification to TCP's Fast Recovery Algorithm
使用WAAS特性时必须关闭快转负载分担功能,否则会造成WAAS业务不通,快速负载分担的详细介绍请参见“三层技术-IP业务配置指导”中的“快速转发”。
WAAS配置任务如下:
(1) 配置WAAS类
(2) 配置WAAS策略
(3) 配置接口应用WAAS策略
(4) (可选)配置WAAS工作在非对称组网模式
(5) (可选)配置TFO参数
(6) (可选)配置WAAS黑名单
(7) (可选)配置DRE优化参数
(8) (可选)还原WAAS的预定义配置
(9) (可选)删除WAAS所有配置
(1) 进入系统视图。
system-view
(2) 创建一个WAAS类,并进入WAAS类视图。
waas class class-name
缺省情况下,只存在预定义类。
(3) 创建匹配流分类的规则。
match [ match-id ] tcp { any | destination | source } [ ip-address ipv4-address [ mask-length | mask ] | ipv6-address ipv6-address [ prefix-length ] ] [ port port-list ]
通过创建WAAS策略,然后在此WAAS策略视图下引用指定的类,为不同的类配置不同的动作,可以实现对匹配动作的报文进行优化处理。
WAAS类可以配置的动作包括:
· 优化动作:对匹配指定WAAS类的TCP流量进行优化处理,包括TFO、DRE、LZ三种方式。其中TFO为必选方式,DRE和LZ为可选方式。
· 直接旁路动作:对匹配指定WAAS类的TCP流量不进行优化处理。
· 配置优化动作命令受对应优化控制功能的影响,如果用户配置了优化动作命令,而对应的优化控制功能处于关闭状态,则不能对匹配的报文流量进行相应的优化处理。
· 建议用户通过修改预定义策略的方式完成策略配置。
(1) 进入系统视图。
system-view
(2) 创建WAAS策略,并进入WAAS策略视图。
waas policy policy-name
缺省情况下,只存在预定义策略waas_default。
(3) 配置WAAS策略引用的类,并进入WAAS策略类动作视图。
class class-name [ insert-before exiting_class ]
缺省情况下,WAAS策略未引用任何类。
(4) 配置WAAS类的动作。请选择其中一项进行配置。
¡ 配置WAAS类优化动作。
optimize tfo [ dre | lz ] *
¡ 配置WAAS类直接旁路动作。
passthrough
缺省情况下,WAAS类未配置任何动作。
(5) 退回系统视图。
quit
(6) 配置WAAS消除数据冗余功能。
waas tfo optimize dre
缺省情况下,WAAS消除数据冗余功能处于开启状态。
(7) 配置WAAS数据压缩功能。
waas tfo optimize lz
缺省情况下,WAAS数据压缩功能处于开启状态。
在同一台设备上连接广域网的接口上应用WAAS策略,连接局域网的接口上不应用WAAS策略。对从广域网侧发送或接收的报文流量会与广域网接口所引用的策略进行匹配。但如果指定流量经过同一台设备的入接口和出接口都连接广域网,则不对报文进行优化。
一个WAAS策略可以应用于一台设备的多个接口,但一个接口只能应用一个策略。
(1) 进入系统视图。
system-view
(2) 进入接口视图。
interface interface-type interface-number
(3) 应用WAAS策略。
waas apply policy [ policy-name ]
缺省情况下,接口上未应用任何WAAS策略。
若报文的收发均通过设备的同一个接口,则称为对称组网,否则为非对称组网。在非对称组网环境中需要配置WAAS工作在非对称组网模式。
(1) 进入系统视图。
system-view
(2) 配置WAAS工作在非对称组网模式。
waas asymmetric
缺省情况下,WAAS工作在对称组网模式。
拥塞窗口的大小取决于网络的拥塞程度和发送速度,并且动态的在变化。设置合理的慢启动初始拥塞窗口,当拥塞发生后,能够较快的恢复到网络最大传输能力。
配置TFO的保活功能后,系统启动保活定时器。当定时器超时后,如果通信双方仍没有数据传输,则向对端设备发送保活报文,使连接不断开。
接收缓冲区的大小决定了可以接收到的报文大小,用户可以通过设置缓冲区的大小来影响线路的吞吐量。
不同的网络性能需要使用不同的拥塞算法,设置合理的拥塞算法,能够较快的恢复到网络最大传输能力。
配置TFO的最大并发连接数,当超过最大连接数后,后续新建连接的流量不再进行WAAS优化处理。
(1) 进入系统视图。
system-view
(2) 配置超时重传时慢启动的初始拥塞窗口大小。
waas tfo base-congestion-window segments
缺省情况下,初始拥塞窗口为2。
(3) 配置TFO的保活功能。
waas tfo keepalive
缺省情况下,TFO的保活功能处于开启状态。
(4) 配置TFO的接收缓冲区大小。
waas tfo receive-buffer buffer-size
缺省情况下,TFO的接收缓冲区为64KB。
(5) 配置WAAS在WAN侧链路所使用的TCP拥塞控制算法。
waas tfo congestion-method { bic | reno }
缺省情况下,WAAS在WAN侧链路所使用的TCP拥塞控制算法为BIC算法。
(6) 配置TFO的最大并发连接数。
waas tfo connect-limit limit
缺省情况下,TFO的最大并发连接数是10000。
DRE优化参数包括以下内容:
· WAAS匹配偏移步进级别:配置的WAAS匹配偏移步进级别越高,步进的步长就越大,匹配精度也就越低。请根据链路的传输速率配置WAAS匹配偏移步进级别,建议在高速链路上配置高级别偏移步进,提高WAAS匹配的效率;在低速链路上配置低级别偏移步进,确保WAAS匹配的精度。
· WAAS数据字典表项的老化时间:配置WAAS数据字典表项的老化时间后,设备会循环遍历所有的WAAS数据字典表项,超过老化时间的表项将会被删除。WAAS数据字典表项数量到达最大后,不再新建表项。
设备遍历一次WAAS数据字典表项的时间与当前设备上表项数量有关,请以设备的实际情况为准。
(1) 进入系统视图。
system-view
(2) 配置WAAS匹配偏移步进级别。
waas dre offset-step { general | fast | fastest | normal }
缺省情况下,WAAS匹配偏移步进为normal级别。
WAAS匹配偏移步进级别由高到低分别为:fastest、fast、general、normal。
(3) 配置WAAS数据字典表项的老化时间。
waas dre cache aging minutes
缺省情况下,WAAS数据字典表项不老化,表项达到最大数量后,后续创建的新表项会覆盖最早创建的表项。
当本端设备配置了WAAS策略并应用于接口时,如果本端设备不能通过此接口与对端设备建立TCP连接,那么系统自动将请求的服务器接口的IP地址和端口号加入黑名单,对匹配黑名单的流量不做任何优化。
在建立TCP连接的三次握手过程中,本端发送携带特定TCP选项的请求报文后,如果发生下列情况,则认为连接建立失败:
· 在指定时间内未作出有效应答。
· 对端设备关闭了TCP连接。
WAAS黑名单是系统实时自动生成的,黑名单表项有一定的生存时间,当黑名单超时后将被系统自动删除。
(1) 进入系统视图。
system-view
(2) 开启黑名单自动发现功能。
waas tfo auto-discovery blacklist enable
缺省情况下,自动发现黑名单功能处于关闭状态。
(3) (可选)配置黑名单表项的老化时间。
waas tfo auto-discovery blacklist hold-time minutes
缺省情况下,黑名单表项的老化时间为5分钟。
还原WAAS预定义配置是把WAAS预定义策略和预定义类的配置还原到WAAS进程第一次启动时的配置,不修改用户自定义的配置。
配置本功能时,需保证所有接口未应用任何WAAS策略,否则恢复失败。
(1) 进入系统视图。
system-view
(2) 还原WAAS的预定义配置。
waas config restore-default
删除WAAS所有配置是指删除WAAS特性的所有配置数据和运行数据,并使WAAS进程退出。
(1) 进入系统视图。
system-view
(2) 删除WAAS所有配置。
waas config remove-all
在完成上述配置后,在任意视图下执行display命令可以显示配置后WAAS的运行情况,通过查看显示信息验证配置的效果。
在用户视图下执行reset命令可以清除WAAS的信息。
表1-1 WAAS显示和维护
操作 |
命令 |
显示WAAS类的信息 |
display waas class [ class-name ] |
显示WAAS策略的信息 |
display waas policy [ policy-name ] |
显示WAAS会话信息 |
display waas session { ipv4 | ipv6 } [ client-ip client-ip ] [ client-port client-port ] [ server-ip server-ip ] [ server-port server-port ] [ peer-id peer-id ] [ verbose ] [ slot slot-number ] |
显示DRE的统计信息 |
display waas statistics dre [ peer peer-id ] [ slot slot-number ] |
显示WAAS全局状态 |
display waas status |
显示WAAS自动发现的黑名单信息 |
display waas tfo auto-discovery blacklist { ipv4 | ipv6 } [ slot slot-number ] |
清除DRE的数据字典 |
reset waas cache dre [ peer peer-id ] |
清除DRE统计信息 |
reset waas statistics dre [ peer peer-id ] |
清除所有的黑名单表项 |
reset waas tfo auto-discovery blacklist |
· 在Device A和Device B两台设备上应用预定义策略waas_default,默认引用所有的预定义类。
· Host请求从Server下载数据,通过显示统计信息来检测优化效果。第一次请求下载数据,两端WAAS设备需要创建数据字典表项,发送字典索引和原始数据,压缩效率较低。第二次请求下载同样的数据,由于数据字典已经建立,用字典索引代替重复数据,压缩效率较高。
图1-1 预定义WAAS策略配置组网图
(1) 配置各接口的IP地址
按照图1-1配置各接口IP地址和掩码,具体配置过程略。
(2) 在广域网和各局域网内配置合适的路由协议,保证全网路由可达(具体配置过程略)
(3) 在设备上关闭快速转发负载分担功能。
# 在Device A上关闭快速转发负载分担功能。
<DeviceA> system-view
[DeviceA] undo ip fast-forwarding load-sharing
# 在Device B上关闭快速转发负载分担功能。
<DeviceB> system-view
[DeviceB] undo ip fast-forwarding load-sharing
(4) 在接口上应用预定义WAAS策略
# 在Device A的GigabitEthernet1/0/1接口上应用预定义策略。
[DeviceA] interface gigabitethernet 1/0/1
[DeviceA-GigabitEthernet1/0/1] waas apply policy
[DeviceA-GigabitEthernet1/0/1] quit
[DeviceA] quit
# 在Device B的GigabitEthernet1/0/1接口上应用预定义策略。
[DeviceB] interface gigabitethernet 1/0/1
[DeviceB-GigabitEthernet1/0/1] waas apply policy
(5) 客户端Host通过HTTP协议从Server下载一个约14MB的测试文件。
(6) 清除Device A 的DRE统计信息
<DeviceA> reset waas statistic dre
(7) 客户端重新请求下载同一测试文件。
# 第一次下载后,显示Device A的DRE统计信息。
<DeviceA> display waas statistic dre
Peer-ID: cc3e-5fd8-5158
Peer version: 1.0
Cache in storage: 12710912 bytes
Index number: 49652
Age: 00 weeks, 00 days, 00 hours, 00 minutes, 35 seconds
Total connections: 1
Active connections: 0
Encode Statistics
Dre msgs: 2
Bytes in: 286 bytes
Bytes out: 318 bytes
Bypass bytes: 0 bytes
Bytes Matched: 0 bytes
Space saving: -11%
Average latency: 0 usec
Decode Statistics
Dre msgs: 57050
Bytes in: 14038391 bytes
Bytes out: 14079375 bytes
Bypass bytes: 0 bytes
Space saved: 0%
Average latency: 0 usec
# 清除统计信息后,重新下载,显示Device A的DRE统计信息。
<DeviceA> display waas statistic dre
Peer-ID: cc3e-5fd8-5158
Peer version: 1.0
Cache in storage: 12851200 bytes
Index number: 50200
Age: 00 weeks, 00 days, 00 hours, 2 minutes, 56 seconds
Total connections: 1
Active connections: 0
Encode Statistics
Dre msgs: 2
Bytes in: 286 bytes
Bytes out: 60 bytes
Bypass bytes: 0 bytes
Bytes Matched: 256 bytes
Space saved: 79%
Average latency: 0 usec
Decode Statistics
Dre msgs: 62791
Bytes in: 2618457 bytes
Bytes out: 13972208 bytes
Bypass bytes: 0 bytes
Space saved: 81%
Average latency: 0 usec
通过比较可以看出:数据字典建立后,第二次下载解压缩接收字节数明显降低,节省空间81%,第二次下载速度明显加快。
· 在Device A和Device B两台设备上应用用户自定义策略。
· Host请求从Server下载数据,通过显示统计信息来检测优化效果。第一次请求下载数据,两端WAAS设备需要创建数据字典表项,发送字典索引和原始数据,压缩效率较低。第二次请求下载同样的数据,由于数据字典已经建立,用字典索引代替重复数据,压缩效率较高。
图1-2 用户自定义WAAS策略配置组网图
(1) 配置各接口的IP地址
按照图1-2配置各接口IP地址和掩码,具体配置过程略。
(2) 在广域网和各局域网内配置合适的路由协议,保证全网路由可达(具体配置过程略)
(3) 在设备上关闭快速转发负载分担功能。
# 在Device A上关闭快速转发负载分担功能。
<DeviceA> system-view
[DeviceA] undo ip fast-forwarding load-sharing
# 在Device B上关闭快速转发负载分担功能。
<DeviceB> system-view
[DeviceB] undo ip fast-forwarding load-sharing
(4) 创建WAAS类
# 在Device A上创建WAAS类c1,在该WAAS类视图下创建匹配流分类的规则为匹配所有TCP流量。
[DeviceA] waas class c1
[DeviceA-waasclass-c1] match 1 tcp any
[DeviceA-waasclass-c1] quit
# 在Device B上创建WAAS类c1,在该WAAS类视图下创建匹配流分类的规则为匹配所有TCP流量。
[DeviceB] waas class c1
[DeviceB-waasclass-c1] match tcp any
[DeviceB-waasclass-c1] quit
(5) 创建WAAS策略
# 在Device A上创建策略p1,配置其引用WAAS类c1,匹配c1报文的优化方式为TFO、DRE和LZ。
[DeviceA] waas policy p1
[DeviceA-waaspolicy-p1] class c1
[DeviceA-waaspolicy-p1-c1] optimize tfo dre lz
[DeviceA-waaspolicy-p1-c1] quit
[DeviceA-waaspolicy-p1] quit
# 在Device B上创建策略p1,配置其引用WAAS类c1,匹配c1报文的优化方式为TFO、DRE和LZ。
[DeviceB] waas policy p1
[DeviceB-waaspolicy-p1] class c1
[DeviceB-waaspolicy-p1-c1] optimize tfo dre lz
[DeviceB-waaspolicy-p1-c1] quit
[DeviceB-waaspolicy-p1] quit
(6) 在接口上应用策略。
# 在Device A的GigabitEthernet1/0/1接口上应用WAAS策略p1。
[DeviceA] interface gigabitethernet 1/0/1
[DeviceA-GigabitEthernet1/0/1] waas apply policy p1
[DeviceA-GigabitEthernet1/0/1] quit
[DeviceA] quit
# 在Device B的GigabitEthernet1/0/1接口上应用WAAS策略p1。
[DeviceB] interface gigabitethernet 1/0/1
[DeviceB-GigabitEthernet1/0/1] waas apply policy p1
[DeviceB-GigabitEthernet1/0/1] quit
[DeviceB] quit
(7) 客户端Host通过HTTP协议从Server下载一个约14MB的测试文件。
(8) 清除DRE统计信息
<DeviceA> reset waas statistic dre
(9) 客户端重新请求下载同一测试文件
# 第一次下载后,显示Device A的DRE统计信息。
<DeviceA> display waas statistic dre
Peer-ID: cc3e-5fd8-5158
Peer version: 1.0
Cache in storage: 12718592 bytes
Index number: 49682
Age: 00 weeks, 00 days, 00 hours, 00 minutes, 35 seconds
Total connections: 1
Active connections: 0
Encode Statistics
Dre msgs: 2
Bytes in: 286 bytes
Bytes out: 318 bytes
Bypass bytes: 0 bytes
Bytes Matched: 0 bytes
Space saved: -11%
Average latency: 0 usec
Decode Statistics
Dre msgs: 56959
Bytes in: 13999244 bytes
Bytes out: 14055291 bytes
Bypass bytes: 0 bytes
Space saved: 0%
Average latency: 0 usec
# 清除统计信息后,重新下载,显示Device A的DRE统计信息。
<DeviceA> display waas statistic dre
Peer-ID: cc3e-5fd8-5158
Peer version: 1.0
Cache in storage: 12857856 bytes
Index number: 50226
Age: 00 weeks, 00 days, 00 hours, 2 minutes, 02 seconds
Total connections: 1
Active connections: 0
Encode Statistics
Dre msgs: 2
Bytes in: 286 bytes
Bytes out: 60 bytes
Bypass bytes: 0 bytes
Bytes Matched: 256 bytes
Space saved: 79%
Average latency: 0 usec
Decode Statistics
Dre msgs: 62687
Bytes in: 2592183 bytes
Bytes out: 13972208 bytes
Bypass bytes: 0 bytes
Space saved: 81%
Average latency: 0 usec
通过比较可以看出:数据字典建立后,第二次下载解压缩接收字节数明显降低,节省空间81%,第二次下载速度明显加快。
· 在Device A和Device B两台设备上分别配置UDP报文压缩和解压缩功能。
· Host将报文发送给上游设备Device A,Device A对UDP报文进行压缩后进行转发,报文到达下游设备Device B,Device B对UDP报文进行解压缩后转发给Server进行分析处理。
图1-3 UDP报文压缩解压缩功能组网图
(1) 配置各接口的IP地址
按照图1-3配置各接口IP地址和掩码,配置Server地址172.16.105.48,具体配置过程略。
(2) 在广域网和各局域网内配置合适的路由协议,保证全网路由可达(具体配置过程略)
(3) 在设备上关闭快速转发负载分担功能。
# 在Device A上关闭快速转发负载分担功能。
<DeviceA> system-view
[DeviceA] undo ip fast-forwarding load-sharing
# 在Device B上关闭快速转发负载分担功能。
<DeviceB> system-view
[DeviceB] undo ip fast-forwarding load-sharing
(4) 配置UDP报文压缩解压缩功能。
# 在Device A上开启UDP报文压缩功能。
<DeviceA> system-view
[DeviceA] waas udp compress
# 在Device A上配置对目的地址为172.16.105.48和端口号为5000的报文进行压缩。
[DeviceA] waas udp ip 172.16.105.48 port 5000
# 在Device B上开启UDP报文解压缩功能。
<DeviceB> system-view
[DeviceB] waas udp decompress
# 在Device B上配置对目的地址为172.16.105.48和端口号为5000的报文进行解压缩。
[DeviceB] waas udp ip 172.16.105.48 port 5000
# 第一次产生UDP报文后,显示Device A的UDP报文统计信息。
[DeviceA] display waas statistic udp compress
Bytes in : 30106991182
Bytes out : 375556018
Saved bandwidth ratio : 98.75%
Compressed packet ratio : 100.00%
通过统计信息可以看出:UDP报文压缩后,带宽明显降低,节省带宽达98.75%。
不同款型规格的资料略有差异, 详细信息请向具体销售和400咨询。H3C保留在没有任何通知或提示的情况下对资料内容进行修改的权利!