具体实施方式
综述
描述了数据压缩。在一个示例性实现中,由服务器执行一压缩模块,以压缩用于从服务器流到客户机的数据。该压缩模块采用一包括先前流到客户机的数据的历史缓冲区。当被执行时,该压缩模块将要流传送的数据中的序列与历史缓冲区中的一个或多个序列进行比较,以找出匹配序列。为在历史缓冲区中定位序列,采用一具有多个条目的查找表。每一条目可使用多个索引中的特定一个来发现。每一条目涉及对应的索引是否位于历史缓冲区中,并且如果是,则还引用对应索引在历史缓冲区中的一个或多个位置。因此,压缩模块可使用要流传送的数据中的一初始序列,作为查找表中的索引以找出条目。以这一方式,压缩模块可快速地定位具有初始序列的历史缓冲区中的每一位置,而无需为要流传送的数据中的每一序列单独比较历史缓冲区中的每一序列。
如果匹配索引的对应条目引用了多个位置,则压缩模块通过将每一位置上具有匹配索引的序列与包括初始序列的数据中的序列进行比较,来导出匹配序列。数据中的该匹配序列然后可用描述历史缓冲区中匹配序列的位置和长度的表示来表示。然后可形成包括该表示的已压缩数据。已压缩数据然后流到客户机。客户机通过使用同样包括先前从服务器流到客户机的数据的历史缓冲区来解压已压缩数据。客户机通过执行解压模块,使用由该表示指示的长度和位置找出客户机历史缓冲区中的匹配序列,以重建该数据。以这一方式,提供了一种无损数据压缩技术,使得可在没有丢失数据的情况下压缩和解压数据。例如,可使用该数据压缩技术压缩和解压视频数据,而不会丢失数据部分,由此保留了视频数据的分辨率。
示例性环境
图1是示出其中数据通过网络106从服务器102流到客户机104的环境100的示例性实现的说明。客户机104可用各种方法来配置。例如,客户机104可被配置为能够通过网络通信的设备,如所示的台式机、移动站、娱乐设施、机顶盒、无线电话等等。客户机104也可涉及操作客户机104的个人和/或实体。换言之,客户机104可描述包括用户和/或机器的逻辑客户机。尽管示出了一个客户机104,然而多个客户机可通信上耦合至网络106。网络106被示出为因特网,并也可包括各种其它网络,如内联网、有线或无线电话网络等等。
服务器102被配置成通过网络106将数据流到客户机104。服务器102可提供各种流数据,以供客户机104呈现。在一个实现中,服务器102可提供流到客户机104的音乐会的网播。当由客户机104呈现时,用户可观看并倾听网播。在另一实现中,客户机104可接收包括从服务器102流出的歌曲的数据,以供客户机104输出。
在另外一个实现中,服务器102也可提供用于远程应用程序执行的终端服务。例如,服务器102可包括多个应用程序108(1)、……、108(n)、……、108(N),其中,“n”可以是从2到“N”的任何整数。应用程序108(1)-108(N)中的每一个在服务器102上执行。服务器102通过网络106将屏幕信息流到客户机104,该屏幕信息是通过执行应用程序108(1)-108(N)来提供的。例如,屏幕信息可包括由操作***提供的桌面和显示涉及文字处理程序的执行的信息的窗口的显示,以及由操作***和/或文字处理程序提供的音频信息。
从服务器102流出的屏幕信息由客户机104呈现,以供用户观看。用户可与客户机104交互,以使用客户机104的输入设备,如鼠标108和/或键盘110来提供输入。输入可对应于呈现的屏幕信息,如通过使用键盘110提供的用于文字处理程序的文本输入。输入通过网络106从客户机104传递到服务器102。当由服务器102接收时,输入可在执行多个应用程序108(1)-108(N)时使用。例如,文字处理程序可接收用于包括在文档中的文本输入,并将屏幕信息流到客户机104以说明该文档具有包括的文本。通过执行服务器102上的应用程序108(1)-108(N)并将屏幕信息流到客户机104,客户机104可访问客户机104自身上以其它方式可能不可用的功能。
例如,客户机104可被配置成“瘦”客户机,如具有有限的处理和/或存储器资源。然而,服务器102可以是特征丰富的,如通过具有比客户机104更多的处理和/或存储器资源量。因此,服务器102可执行客户机104无法执行和/或由客户机104以较慢的方式执行的应用程序。服务器102通过向客户机104发送屏幕信息来向客户机104提供一个或多个应用程序108(1)-108(N)的执行结果,并通过网络106从客户机104接收输入。以这一方式,由服务器102提供的功能,如处理资源、存储器资源和多个应用程序108(1)-108(N)可被提供给否则将会无法访问该功能的客户机104。
为提供服务器102和客户机104之间通过网络的通信,服务器102和客户机104分别实现远程桌面协议(RDP)112、114。RDP 112、114被设计成如上所述地通过网络连接向应用程序108(1)-108(N)提供远程显示和输入能力。例如,RDP可用于允许携带从服务器102到客户机104的设备通信和呈现数据的单独的虚拟信道,以及从客户机104传递到服务器102的经加密的输入。
RDP 112、114可也通过在服务器102和客户机104上分别包括压缩和解压模块116、118来提供带宽的减少。压缩模块116可由服务器102通过实现RDP 112来执行,以在数据通过网络106流传送之前压缩它。类似地,解压模块可由客户机104通过实现RDP 114来执行,以解压通过网络106从服务器102流出的已压缩数据。
当被执行时,压缩和解压模块116、118分别压缩和解压通过网络106流传送的数据。如上所述,流数据的压缩和解压会导致一个独特的问题,与一次压缩和解压整个数据集,即块压缩相反。例如,数据可“实时”地流传送,使得流传送数据时所遇到的延迟会降低数据的有用性。压缩和解压模块116、118解决了流数据的这一独特的问题,并由此提供了已压缩数据通过网络106的流传送,如参考图3到5更详细描述的。
通过使用终端服务(TS),客户机104可访问安装在服务器102上的一个或多个应用程序108(1)-108(N)、执行服务器102上的应用程序、以及在客户机104上显示应用程序用户界面(UI)。由于应用程序108(1)-108(N)在服务器102上执行,TS允许客户机104利用企业基础结构资源,而与客户机104是否具有执行本地在客户机104本身上的资源的硬件和软件无关。
尽管在由服务器102执行多个应用程序108(1)-108(N)的终端服务环境中描述了客户机104,然而客户机104也可执行多个应用程序120(1)、……、120(m)、……、120(M)中的一个或多个。例如,应用程序120(1)-120(M)之一可提供一接口,它结合RDP 114使用,以呈现供用户观看的数据,并从用户接收输入,如从鼠标108和/或键盘110接收输入。另外,尽管压缩和解压模块116、118被示出为相应的RDP 112、114的一部分,然而压缩和解压模块116、118可被配置成独立的软件组件,它们被执行来分别压缩和解压流数据。
另外,尽管以下讨论的部分描述了终端服务环境中压缩的使用,然而此处所描述的压缩和解压技术也可用于各种其它环境。例如,压缩和解压技术可用于压缩远程访问环境中使用的数据。远程访问描述了从遥远的距离访问计算机或网络的能力。例如,企业的远程办公室可能期望接入企业网络,并使用远程访问来获取诸如通过电话网络、因特网等对其上包含的文件和应用程序的访问权限。服务器102可被配置成具有关联的软件的远程访问服务器,该软件被设立以处理远程地寻求接入网络的客户机。在一个实现中,远程访问服务器包括用于安全性的防火墙服务器,以及用于将远程访问请求转发到网络的其它部分的路由器。远程访问服务器也可用作虚拟专用网络(VPN)的一部分。
图2是更详细地示出图1的服务器102和客户机104的示例性实现200的说明。服务器102包括处理器202和存储器204。RDP 112及其相应的压缩模块116被示出为在处理器202上执行,并可储存在存储器204中。类似地,客户机104包括处理器206和存储器208。RDP 114及其相应的解压模块118被示出为在处理器206上执行,并可储存在存储器208中。
要从服务器102流到客户机104的数据可从各种来源提供,如执行一个或多个应用程序108(1)-108(N)、从诸如视频摄像机、麦克风的输入设备210接收,等等。压缩模块116在服务器102的处理器202上执行,以压缩流到客户机104的数据。数据可以分组的形式从服务器102流到客户机104。
例如,压缩模块116可接收具有给定长度的未压缩序列的数据,并试图将该序列向下压缩成一较小的(现在已压缩)的长度,如具有更少的字节、比特等等。压缩模块116可通过用一种表示来替换序列而在每一分组的基础上压缩数据,该表示在储存时使用比被替换的序列更少的存储器资源,如更少的字节。
如果压缩模块116能够压缩序列,则将已压缩的数据发送到RDP连接的端点,即客户机104的RDP 114。解压模块118由客户机104执行,以解压已压缩数据来重建该数据。在压缩模块116无法压缩数据的情况下,数据可以未压缩形式,即文字序列(literal sequence)流到客户机104。压缩模块116然后可由服务器102执行,以试图压缩后一序列。
用于压缩数据的基本操作涉及要压缩的数据中的序列与已在过去流传送的序列之间的模式匹配。为实现这一目的,压缩模块116维护一包含先前流到客户机104的数据的历史缓冲区212。当被执行时,压缩模块116将要流传送的数据中的序列与包括在已流到客户机104的数据中的一个或多个序列进行匹配。要流传送的数据中匹配历史缓冲区中的序列的序列然后可通过使用引用历史缓冲区212中的匹配序列的一个或多个表示来表示。该表示可以小于即使用更少的存储器资源用于储存要压缩的实际序列,即匹配序列的存储器资源。这有效地减少了包括在流数据中的数据量。
为说明使用历史缓冲区212的模式匹配的一个基本实例,假定历史缓冲区212包含以下序列:
12745639451491
压缩模块116在服务器102的处理器202上执行,并接收以下序列:
45974563945146
当被执行时,压缩模块116找出历史缓冲区中匹配要压缩的数据中的序列的最长序列,即匹配序列。在本情形中,出现在历史缓冲区中的匹配序列在下面用粗体显示。匹配序列是10字节长,并从离历史缓冲区212的起始处三个字节之处开始(从左边开始,并从零算起)。
45974563945146
由此,当被执行时,压缩模块116可通过将要流传送的数据表示如下来产生已压缩数据:
459(从离缓冲区的起始处三个字节之处开始的长度为10字节的匹配)6通过引用历史缓冲区中的匹配序列,服务器102不需要重新发送已流到客户机104的序列。由此,压缩模块116通过找出要流传送的数据中的重复模式,并用当通过网络106发送时使用更少存储器资源和带宽的表示来替换重复模式,即匹配序列,来压缩要流传送的数据。
为解压已压缩数据,客户机104包括解压模块118和历史缓冲区214。与服务器102的历史缓冲区212一样,客户机104的历史缓冲区214储存先前流传送的数据。因此,当由客户机104执行时,解压模块118可通过使用历史缓冲区214来解压流到客户机104的已压缩数据。继续前一实例,假定客户机104接收已压缩数据,示出如下:
459(从离缓冲区的起始处三个字节之处开始的长度为10字节的匹配)6基于包括在已压缩数据中的表示,当被执行时,解压模块118可从历史缓冲区214中检索已压缩序列,它在下面用粗体显示:
45974563945146
由此,解压模块118可通过使用历史缓冲区214来解压已压缩的串。
服务器102也可包括查找表216,以找出历史缓冲区212中的匹配序列。例如,查找表216可包括多个条目,其每一个可由多个索引的对应的一个发现。每一条目描述历史缓冲区212中具有对应索引的每一位置。由此,当由服务器102执行时,压缩模块116可使用查找表216来快速定位历史缓冲区212中的特定序列。对查找表216和历史缓冲区212的进一步讨论可参考图3-4找到。
服务器102也可使用编码技术来进一步压缩流传送的数据,如哈夫曼编码、算术编码、前缀编码和马尔可夫编码。例如,要流传送的数据可包括不匹配历史缓冲区中的序列的序列。这些序列可被称为“文字”序列。通过使用哈夫曼编码,数据中部分或所有文字序列可被压缩以进一步压缩数据。例如,哈夫曼编码可用一出现频率表开始,该表关系到要被进一步压缩的每一文字序列的出现频率。出现频率表可从数据本身和/或代表性数据中生成。例如,文字序列的出现频率可通过处理先前流传送的分组来获取,然后用于处理每一后续分组。
例如,可向每一文字序列分配一唯一地表示该特定文字序列的可变长度串,如唯一的前缀。该可变长度串然后被排列成树以分别编码和解码每一文字序列和表示。为编码文字序列,在树中定位要编码的文字序列。树中用于定位包括该文字序列的叶的分支用于编码该文字序列,即,提供该文字序列的表示。例如,树中用于哈夫曼编码的每一分支可由一输出字母表的码元来标记,如比特0和1,使得编码是从树的根到要编码的文字序列的路径上的分支标记的枚举。解码每一表示是通过基于可变长度串中每一连续值从其起点开始通过分支向下遍历到树的叶,直到到达包括文字序列的树叶为止来执行的。
尽管描述了文字序列的哈夫曼编码,然而可使用哈夫曼编码来进一步压缩各种数据。例如,哈夫曼表218可对文字222序列和后指针(backpointer)224两者进行编码。如上所述,文字序列包括未在历史缓冲区212中找到的序列。因此,通过使用哈夫曼表218,文字222序列可被压缩。哈夫曼表218也可用于压缩后指针224。后指针224描述了历史缓冲区212中的特定序列的位置。例如,如上所述,数据中匹配历史缓冲区212中的序列的序列,即匹配序列,可被描述为“从离缓冲区的起始处Y字节之处开始的长度为X字节的匹配”。后指针224描述了历史缓冲区212中的匹配序列的位置,即Y字节。哈夫曼表220可用于压缩匹配序列的长度226,即X字节。
为解压从服务器102流到客户机104的已压缩数据,由客户机104使用分别对应于服务器102的哈夫曼表218、220的哈夫曼表228、230来执行解压模块。例如,哈夫曼表228可用于解压文字232序列和后指针,而哈夫曼表230可用于解压匹配序列的长度226。对哈夫曼表的进一步讨论可参考图7找到。
服务器102和客户机104也可包括相应的最近使用(LRU)表236、238。LRU表236、238的每一个可用于基于后指针是否为“最近使用”后指针之一来进一步编码后指针。例如,LRU表236可用于对最后四个后指针的每一个分别提供LRU表示。LRU表示用作在LRU表236中定位特定后指针的索引。以这一方式,重复的后指针可被进一步压缩。对LRU表的进一步讨论可参考图7找到。
尽管描述了从服务器102流到客户机104的数据的压缩,然而客户机104也可压缩数据并将其流回服务器102。另外,尽管以下讨论描述了与从服务器102流到客户机104的分组有关的数据的压缩,然而可使用各种数据集合来压缩数据,如子分组字节序列、多分组等等。此外,尽管以下讨论描述了字节序列,然而也可构想数据中的其它序列,如比特。
示例性过程
图3是描述示例性过程300的流程图,其中,配置流数据用于压缩。在块302,向历史缓冲区212添加数据。例如,历史缓冲区212可包括多个分组304(1)、304(2),它们通过网络106从图2的服务器102流到和/或将要流到客户机104。在另一实现中,分组304(1)、304(2)可对应于先前通过执行压缩模块116处理的数据。
服务器102接收要流传送的分组304(3)。当由服务器102执行时,压缩模块116将分组304(3)添加到历史缓冲区212,使得历史缓冲区包括流传送的分组304(1)、304(2)和将要流传送的分组304(3)。
在块306,当由服务器102执行时,压缩模块116更新查找表216以引用添加的数据,即分组304(3)。查找表216被配置成包括多个索引308(k),其中,“k”可以是从“1”到“K”的任何索引。每一索引308(k)用于发现查找表216中多个条目的相应的一个。每一条目涉及多个索引308(k)的对应的一个是否位于历史缓冲区212中,并且如果是,引用对应的索引308(k)在历史缓冲区212中的一个或多个位置。例如,多个条目之一可引用历史缓冲区中具有索引308(k)的对应的一个的多个位置。多个位置的每一个被示出为通过使用多个散列链310(k)的对应的一个来描述。
例如,索引308(k)被示出为具有“45”的序列。查找表216中索引308(k)的对应条目,即散列链310(k)描述了历史缓冲区212中索引308(k)“45”的每一位置。例如,分组304(1)在图3中被示出为具有以下序列:
01234567
分组304(2)在图3中被示出为具有以下序列:
89453130
要流到图2的客户机104的分组304(3)在图3中被示出为具有以下序列:
45670824
分组304(1)-304(3)可以在历史缓冲区中顺序地排列,使得观察到以下序列:
012345678945313045670824
散列链310(k)描述了历史缓冲区212中索引308(k)“45”的每一位置。每一位置可用各种方法来描述。例如,当从历史缓冲区212的起始开始,以数字零开始计数时,位置可被描述为第一类型序列的位置。散列链310(k)描述了历史缓冲区212中离序列的起始处16字节之处的索引308(k)“45”的第一位置,如在图3中由从散列链310(k)中的“16”到分组304(3)的起始的虚线示出的。类似地,散列链310(k)描述了历史缓冲区212中离序列的起始处10字节的索引308(k)“45”的第二位置,由图3中从散列链310(k)中的“10”到分组304(2)的第三字节的虚线示出。此外,散列链310(k)包括历史缓冲区中4字节处的索引308(k)“45”的第三且最终的位置。由此,查找表216包括索引310(k),如“45”,它具有引用描述索引308(k)在历史缓冲区212中的每一位置,如4、10、16的散列链310(k)。通过更新查找表216,当被执行时,压缩模块116可压缩数据以用更有效的方式来流传送,如下文参考图4更详细描述的。
尽管在图3中示出每一索引308(k)具有多个散列链310(k)中对应的一个,然而可能会有索引308(k)没有对应的散列链的情况。例如,在某些情形下,历史缓冲区212可能不包括索引。因此,查找表216中对应于该索引的条目可能不包括散列链。换言之,该索引的散列链的值为零,即,历史缓冲区212中没有包括该对应索引的位置。另外,尽管多个散列链310(k)的每一个被示出为包括在查找表216中,一个或多个散列链310(k)可用各种方式来提供。例如,查找表216中的每一条目可包括指向一对应散列链的指针,该对应散列链被配置为与查找表216分离的数组。
图4是描述了一个示例性过程400的流程图,其中,被配置成包括对要流传送的分组304(3)的引用的图3的查找表216用于压缩分组304(3)。在块402,当被执行时,压缩模块116开始将所添加的数据,即分组304(3)的当前指针404指向图3的块302处的历史缓冲区212。
在块406,由服务器102执行压缩模块116,以找出查找表216中匹配当前指针404处的初始序列的索引。例如,压缩模块116可使用当前指针404处由两个字节,如“45”组成的初始序列,以找出多个索引308(k)中匹配该初始序列的那一个。在本示例中,查找表216的索引308(k)“45”匹配历史缓冲区212中当前指针404处的初始序列“45”。索引308(k)具有查找表216中引用描述历史缓冲区212中索引“45”308(k)的每一位置的散列链310(k)的对应的条目。因此,该对应条目描述了历史缓冲区212中初始序列的每一位置。
如果匹配索引308(k)的对应条目引用多个位置,则将历史缓冲区中具有索引308(k)“45”的每一位置的序列与数据中具有当前指针404处的初始序列的序列进行比较。例如,当前指针404处,即历史缓冲区212中的位置“16”处的初始序列“45”,以及历史缓冲区212中位置“10”的序列具有长度为“2”,即,每一位置上字节序列中仅前两个字节相互匹配。如上所述,本示例中,散列链310(k)中的位置通过从历史缓冲区212的起始开始,从零开始计数来描述。当前指针404处的初始序列和历史缓冲区212的位置“4”处的序列具有长度为“4”。换言之,位置“4”处的字节序列中的四个字节与位置“16”处的序列中的四个字节相匹配。以这一方式,从计算的长度导出匹配序列“4567”。为找出最优匹配序列,可将散列链310(k)中的每一位置与要压缩的数据的序列,即分组304(3)进行比较,直到计算了最大长度和/或达到阈值,如参考图7更详细描述的。为优化比较,可首先比较序列中的下一字节,如历史缓冲区212中初始序列之后的字节或索引,因为从比较中已知,前两个字节匹配。基于序列中“下一”字节的比较的另外的讨论可以参考图8找到。
在块408,用形成压缩数据所使用的表示来表示匹配序列。例如,分组304(3)中的匹配序列“4567”可用描述匹配序列的长度以及匹配序列在历史缓冲区212中的位置的表示来表示。该表示可被格式化为元组,即具有指定的顺序的集合,它被格式化为{后指针,长度}。后指针可将匹配序列的相对位置描述为历史缓冲区中的偏移。例如,后指针可将相对位置描述为历史缓冲区中匹配序列的绝对位置和当前指针404的绝对位置之间的偏移。在本示例中,匹配序列的绝对位置是在历史缓冲区212的位置4处,而当前指针404的绝对位置是“16”。因此,匹配序列的相对位置是离当前指针40412字节之处。长度描述了匹配序列的长度,如“4”。由此,分组304(3)可通过用表示“{12,4}”表示匹配序列“4567”来压缩,以形成已压缩数据,如分组410。在另一实现中,匹配序列的位置可根据匹配序列在历史缓冲区中的绝对位置,如位置4来提供。
由此,查找表216可提供历史缓冲区212中的每一索引308(k)的每一位置。因此,当执行压缩模块116时,可在历史缓冲区212中找到初始序列的每一位置,而无需“步查(walk)”历史缓冲区212中的每一个别比特或字节来找出匹配序列。由此,压缩模块116可有效地压缩要流传送的数据。
图5是描述一个示例性实现的过程500的流程图,其中,图4的已压缩数据由客户机104通过执行解压模块128来解压。在块502,客户机104接收已压缩数据,如分组410,它从图4的服务器120流到客户机104。
在块504,当被执行时,解压模块218找出客户机104的历史缓冲区214中的匹配序列。客户机104的历史缓冲区214与服务器102的历史缓冲区212一样可包括从服务器102流到客户机104的数据。由此,客户机104的历史缓冲区214在形成已压缩数据,如分组410之前匹配服务器102的历史缓冲区212。因此,当被执行时,解压模块118可根据描述服务器历史缓冲区212中的匹配序列的长度和位置的描述来找出客户机104的历史缓冲区214中的匹配序列。继续上述示例,在位置“12”处找到匹配序列“4567”,它是上述的相对位置。
在块506,当被执行时,解压模块118用匹配序列替换该表示,以重建数据。例如,表示“{12,4}”用匹配字节序列“4567”来替换,以形成包括序列“45670824”的分组508,该序列与在图4的块408处压缩的分组304(3)的序列相匹配。例如,已压缩数据可通过形成包括替换匹配序列的表示的一组新数据,来从要流传送的数据中形成。由此,如本示例中所示的,客户机104可解压已压缩数据,而不使用查找表216。因此,即使当客户机104与服务器102相比减少了硬件和/或软件资源,所流传送的已压缩数据也可由客户机104解压。
在分别参考图3-4所描述的示例性过程300、400中,配置查找表216,使得多个索引308(k)的每一个包括两个字节。因此,可向查找表216提供描述主机缓冲区212中的每一两字节序列的65,536个对应条目。这使初始序列可直接在查找表216中使用。换言之,不转换初始序列以用于查找表216来发现对应条目。尽管描述了具有两个字节的索引308(k),然而可使用各种不同的索引长度,如三字节序列、四字节序列等等。
图6是示例性实现600的说明,其中,在历史缓冲区212中使用了滑动窗来包括要流传送的数据。在参考图3所讨论的实现中,向历史缓冲区212添加分组304(3)。然后更新查找表216以引用分组304(3)。然而,历史缓冲区212可能具有有限量的存储。因此,采用了滑动窗来包括历史缓冲区212中新添加的数据。
例如,历史缓冲区212可包括序列602,作为图3的块302处添加分组304(3)的结果。本示例中历史缓冲区212可储存最大24字节。因此,为添加具有八个字节的序列604,执行压缩模块116以从历史缓冲区212的起始处移除具有八个字节的序列606,并将剩余的序列移动到历史缓冲区212的起始处。然后在历史缓冲区212的末端添加新序列604。通过移动和添加序列,历史缓冲区212然后就具有包括新添加序列604的24字节序列608。
为更新查找表216以反映该序列608,查找表216中散列链310(k)的每一位置可具有一减去的数字,它对应于历史缓冲区212中其每一字节被移位的字节数。例如,在本示例中,每一字节被移位了8字节,以为新序列604留出空间。因此,由多个散列链310(1)-310(k)描述的每一位置具有从位置中减去的“8”,以反映对应索引308(k)在历史缓冲区212中的新位置。为从每一散列链310(k)中移除不再包括在历史缓冲区212的位置,从散列链310(k)中移除其值小于零的任何位置。
图7是描述一个示例性实现中的过程700的流程图,其中,流数据的压缩被进一步优化。在上述参考图3-4讨论的过程300、400中,查找表216被配置成描述历史缓冲区212中对应索引308(k)的每一位置,以有效地在历史缓冲区212中定位初始序列。在历史缓冲区212中找出匹配序列还可被进一步优化,以进一步提高数据压缩的效率。
例如,在块702,使用查找表并采用阈值找出匹配序列。可采用各种阈值。例如,可在历史缓冲区的预定数量的位置上执行找出匹配序列的比较,以限制所执行的比较次数。通过限制历史缓冲区中与要流传送的数据比较的位置的数量,可限制位置的大小(如,字节数)。例如,如上所述,历史缓冲区212中的匹配序列的位置可被描述为匹配序列的始端或末端与当前指针的始端或末端之间的相对位置,它可通过后指针来描述。因此,通过限制所执行的比较的次数,匹配序列将位于“更靠近”当前指针的概率就越大。由此,由于这一“靠近”,位置可具有较小的值,如使用更少的字节。在另一实现中,可采用阈值,使得具有超过预定阈值的值的位置不被考虑在内,这可再一次有助于限制位置的值的大小。由此,可采用各种阈值,如要搜索的位置的数量、描述该位置的值的大小、描述每一定位的序列的长度的值的大小等等。
在判决块704,确定描述匹配序列的位置的后指针是否包括在最近使用(LRU)表内。LRU表可用于储存最近使用的后指针。如果匹配序列的后指针包括在LRU表中,则可使用对应于LRU表中该后指针的LRU表示来对该匹配序列的后指针进行编码。例如,LRU表的深度可以为4,使得最后四个最近使用的后指针被储存在LRU表中。LRU中每一后指针具有映射到LRU表的对应的LRU表示。因此,如果后指针包括在LRU表中,则在块706,可用来自LRU表的LRU表示对后指针进行编码。以这一方式,压缩模块可着眼于流数据中遇到的其它模式,以进一步压缩数据。例如,从服务器流到客户机的图形数据可包括在历史缓冲区中的相似偏移处重复的匹配序列。因此,匹配序列可使用包括匹配序列的长度和位置的表示来压缩,通过使用LRU表示其位置得以进一步压缩。
如果后指针不包括在LRU表中,则在块708,可使用图2的哈夫曼表228来编码后指针。哈夫曼编码可用一出现频率表来开始,该表涉及要被进一步压缩的每一后指针的出现频率。向每一后指针分配一唯一地表示该后指针的可变长度串。例如,每一可变长度串可具有一唯一的前缀。该串然后可被排列成树,以分别编码和解码每一后指针和表示。为编码后指针,在树中定位该后指针。树中用于定位包括后指针的叶的分支用于编码该字节序列,即,提供该后指针的表示。例如,树中用于哈夫曼编码的每一分支可由一输出字母表的符号来标记,如比特0和比特1,使得编码是对从树根到要编码的后指针的路径上的分支标记的枚举。解码每一表示通过基于串中的每一连续值,从起源通过分支向下跟踪树到树叶,直到达到包括该后指针的树叶位置来执行。
在块710,也使用哈夫曼表来编码匹配序列的长度。例如,图2的哈夫曼表230可用于编码历史缓冲区中的匹配序列的长度,以进一步压缩数据。可如对后指针所描述的那样对长度进行编码。
在块712,匹配序列由被配置成元组的表示来表示,它包括描述历史缓冲区中匹配序列的位置以及匹配序列的长度的后指针。在块714,采用一代价函数来确定该表示是否比匹配序列更有效,如当储存时使用更少的存储器资源和/或当流传送时使用更少的带宽。例如,在某些情形中,匹配序列可能比描述历史缓冲区中的匹配序列的位置和长度的表示使用更少的字节。因此,可采用代价函数来确定是表示还是匹配序列,即数据中的文字序列更有效。可采用各种代价函数。例如,代价函数可使用后指针的大小和匹配序列的长度的乘积。
在判别块716,如果表示更有效,则在块718,通过用该表示来表示匹配序列来形成已压缩数据。在块720,更新当前指针,并处理下一初始序列。例如,当前指针可按匹配序列的长度递增,并且对数据中的下一序列重复该过程。一旦当前指针递增通过了用于流传送的数据,将已压缩的数据流到客户机。
在判别块716,如果表示并非更有效,则在块722,如先前所描述的使用哈夫曼表来表示匹配序列。在块720,按匹配序列中的字节数递增当前指针,并且对下一序列继续该过程。
如上所述,哈夫曼表可进一步压缩要流传送的数据。这些哈夫曼表已分别被描述成对后指针、长度和文字序列编码。在另一实现中,可组合哈夫曼表。例如,如图2所示,哈夫曼表228可用于编码文字232字节序列和后指针234。为在已压缩流中区别后指针和文字序列,可分别向后指针和文字序列提供唯一的前缀,如,每一后指针用比特“0”开始,每一文字序列用比特“1”开始。在另一实现中,可使用同一的索引代码,通过将文字序列和后指针组合成单个字母表,使得后指针和文字序列具有不同的各自的字符,来对这两者进行编码。
诸如上述哈夫曼表等编码表可用各种方式来提供。例如,在一个实现中,预配置编码表以供压缩和解压模块使用,使得不需要对要流传送的数据的每一分组计算编码表。这可用于提高加密过程的速度。在另一实现中,以预定的间隔动态地计算编码表。例如,可在每一次接收预定数量的分组时重新计算编码表,以更新编码表。
图8是一个示例性实现800的说明,其中,对序列的压缩进行优化以进一步优化数据压缩。如上所述,服务器102包括历史缓冲区212和查找表216。服务器102执行压缩模块116来压缩分组304(3)。从历史缓冲区212的起始处到其前两个字节相同的最右边的序列的起始的偏移可被表示为i1=HASH[HASH_SUM(s)]。在所示的示例中,当从历史缓冲区212的起始处从零开始计数时,“s”等于“45”,i1=10。从历史缓冲区212的起始处到下一最右边序列的下一偏移可被表示为i2=NEXT[i1]。在图8所示的示例中,在散列链802(k)中,i2=NEXT[10]=4。类似地,从历史缓冲区212的起始处的每一连续的偏移可在散列链802(k)中表示,如i3=NEXT[i2]。在所示的示例中,i3=0,因为在历史缓冲区212中没有包括“45”的其它序列。
当被执行时,压缩模块116然后可启动一过程以压缩从历史缓冲区212中的位置16的“45”开始的分组304(3)。压缩模块116首先可定位历史缓冲区212中具有来自散列链802(k)的位置i1=HASH[HASH_SUM(′4′,′5′)]=10的初始序列“45”的序列。该位置被储存,并且NEXT[16]被设为10,HASH[HASH_SUM(′4′,′5′)被设为16。通过首先比较相应序列中的下一顺序字节,在当前位置(16)和位置i1(10)相互比较序列。在本情形中,将分组304(3)中的第三字节与分组304(2)中的第五字节进行比较以找出匹配。在所示的示例中,下一顺序字节(即,相应的序列中的第三字节)是不同的,因为HISTORY[10+3]=′3′,而HISTORY[16+3]=′6′。因此,预期匹配序列的长度保持在2,而预期匹配序列的位置保持在10。
压缩模块116然后可在历史缓冲区212中从定位查找表216的位置i2=NEXT[i1]=4处的下一序列。由于i2不等于0,有至少两个字节的匹配。相应的字节“45”之后的下一顺序字节被如上所述地比较,得到4字节的匹配。因此,预期匹配序列的长度被设为4,而预期匹配序列的位置被设为4。压缩模块116然后可在历史缓冲区212中从定位散列链802(k)的位置i3=NEXT[i2]=0处的另一序列。由于i3等于0,它是散列链802(k)的末端,并且不比较任何其它位置。应当注意,在一个实现中,压缩模块116不特别地核查散列链802(k)的末端。相反,位置“i0”(图8所示的示例中为16)处的序列被设为等于i0。因此,当到达散列链802(k)的末端(iN=NEXT[i{N-1}]=0)时,核查它,并且压缩模块116前进到i{N+1}=NEXT[iN]=i0。
通过比较预期匹配序列长度之后的“下一”顺序字节,可提高比较的速度。例如,在上述示例中,将HISTORY[i0+匹配长度]与HISTORY[i0+匹配长度]进行比较,当历史缓冲区212中没有其它序列用于比较时,然后执行每一相应位置上的全序列的比较。换言之,在历史缓冲区212中的相应位置上的相应序列中,将每一字节相互比较。如果全序列比较成功,则导出匹配序列。以这一方式,可获得历史缓冲区212中的序列比较的可测量的加速。
图9是一个示例性实现的***900的说明,其中,响应于从***接收的反馈动态地调整压缩。由于各种各样的因素,服务器102和客户机104之间通过网络的通信可以变化。例如,客户机104可具有有限的软件和/或硬件资源,使得客户机104花费比服务器102压缩数据更长的时间来解压数据。在另一示例中,服务器102可向多个客户机提供数据,并因此客户机可能比服务器102为每一客户机压缩数据更快地解压数据。通过调整先前描述的一个或多个压缩参数,可优化服务器102和客户机104之间的通信,使得可考虑服务器102和104的硬件和/或软件资源,以及通信上耦合它们的网络106的资源。例如,如果服务器102正在“等候”向客户机104发送已压缩数据,则服务器102可执行附加的压缩计算以进一步压缩数据。
为调整RDP 112的压缩模块116的参数,获取反馈。可使用各种因素作为反馈来调整压缩参数,如通用网络特征。例如,来自网络层的指示由于慢链路而存在网络反压力(backpressure)的信息可由压缩模块116使用来指示有额外的时间来进一步压缩数据。因此,压缩模块116可被动态地调整来花费更多的时间压缩数据,以当存在反压力时减小最终输出的大小。
在另一示例中,RDP 112可使用历史缓冲区904(1)、……、904(h)、……、904(H)的固定池(pool)902。希望发送数据的较高层通过向池902请求(分配)缓冲区(如,缓冲区904(h))、用数据填充缓冲区904(h)(包括压缩数据)、然后将已压缩的数据发送到客户机104来操作。当发送了缓冲区的内容时,缓冲区904(h)仅被返回到池902,即“释放”。这一技术允许RDP 112,尤其是压缩模块116能够基于花费了多久将缓冲区“释放”回缓冲区池,来获取关于是有慢连接还是快连接(如,带宽量)、慢客户机还是快客户机(如,客户机解压数据所花费的时间量)等的反馈,即反压力信息。
在又一示例中,如果池902的缓冲区904(1)-904(H)没有一个可用,则可通过调整各种压缩阈值以在压缩上花费更多的时间,来调节压缩模块116以“更努力地工作”。一旦网络条件改善,也可调整压缩模块116以执行更少的压缩操作,使得数据更快速地被发送出去。例如,如果网络106具有相当大量的可用带宽,则可减少所执行的压缩操作的数量,因为不需要压缩来降低传递数据所花费的时间。以这一方式,可采用一种动态技术,使得基于波动的网络条件在运行时改变压缩参数。在另一实现中,使用网络速度的初始度量来调整参数,这些参数然后贯穿整个会话而使用。
如上所述,用于调整压缩模块116的因素也可考虑服务器102的硬件和/或软件资源。例如,可考虑服务器102的负载(如,服务器102正提供多少活动会话、图2的处理器上的负载等等),并动态调整压缩强度以通过在压缩上使用更少的CPU来补偿。可被调整的压缩参数的一个示例是搜索窗大小。例如,搜索窗大小可从64K调整到512K。更大的窗可提供更多相关压缩,但是实现较慢。因此,如果认为网络慢时,“切换”到大窗是有利的。
用于调整压缩模块116的因素的另一示例是散列链中被遍历来查找匹配的链接数量可被调整。例如,步查更长的链链接可提高找到更长匹配的概率,但是可消耗额外的硬件和/或软件资源来执行匹配。
用于调整压缩模块116的因素的又一示例是指定用于终止搜索的所找到的最长匹配的阈值。如上所述,该阈值可用于限制找出匹配所执行的搜索的量。这一阈值越大,找到更长匹配的概率越大,并由此可以进一步压缩数据。然而,当执行这一搜索时,也可使用更大量的处理资源。尽管讨论了各种因素和参数,各种其它因素和参数也可如此处所描述地使用。
尽管以对结构特征和/或方法动作专用的语言描述了本发明,然而可以理解,所附权利要求书中定义的本发明不必要局限于所描述的具体特征或动作。相反,揭示了具体特征和动作作为实现本发明的示例性形式。