맨위로가기

DEFLATE

"오늘의AI위키"는 AI 기술로 일관성 있고 체계적인 최신 지식을 제공하는 혁신 플랫폼입니다.
"오늘의AI위키"의 AI를 통해 더욱 풍부하고 폭넓은 지식 경험을 누리세요.

1. 개요

DEFLATE는 데이터를 압축하는 알고리즘으로, LZ77 알고리즘과 허프만 부호화를 결합하여 사용한다. 압축률에 비해 압축/해제 속도가 빠르지만, 최근의 압축 알고리즘에 비해 압축률이 다소 낮다. DEFLATE는 다양한 파일 형식(ZIP, GZIP, PNG 등)과 웹 서버 통신, 여러 프로그래밍 언어에서 활용되며, zlib 라이브러리가 대표적인 구현체이다. DEFLATE64는 Deflate의 변형으로, 더 큰 사전 크기와 거리 코드를 사용하여 압축률을 향상시켰다. 하드웨어 구현체로는 Comtech AHA, Indra Networks, Cavium, Intel, IBM 등이 있다.

2. 역사

DEFLATE는 인터넷에서 널리 사용되는 무손실 압축 형식으로, 압축은 비교적 빠르며 신장(원래대로 되돌리는 것/전개)은 매우 빠르게 이루어진다. LZW 등 다른 압축 알고리즘에 비해 계산량이 많다.

LZ77에는 여러 회사, 법인, 개인이 특허를 보유하고 있었다.[1] zlib 구현에서는 이러한 특허를 회피하도록 주의 깊게 설계되었으며, 관련된 알고리즘은 모두 회피한 것으로 알려져 있다.[1] 개발 초기에는 특허 문제가 있었지만, 현재는 대부분 특허권, 라이선스 등이 소멸하여 퍼블릭 도메인이 되었다.[1]

DEFLATE는 일본인이 고안한 LHA와 거의 같은 알고리즘을 사용한다.[1]

2. 1. 개발 배경

DEFLATE는 인터넷에서 널리 사용되는 무손실 압축 형식이다. 압축 속도는 비교적 빠르며, 압축 해제(신장) 속도는 매우 빠르다. 다만, LZW 등의 알고리즘과 비교하면 계산량이 많은 편이다.

DEFLATE 개발 당시 LZ77 알고리즘에는 여러 회사, 법인, 개인이 특허를 보유하고 있었다.[1] zlib 구현에서는 이러한 특허를 회피하기 위해 주의 깊게 설계되었다.[1] 특허 회피가 완전히 보장된 것은 아니며 논란도 있었지만, 결과적으로 특허 관련 알고리즘은 모두 회피한 것으로 여겨진다.[1] 또한, 개발 초기에는 문제가 되었던 특허도 현재는 대부분 소멸하여 퍼블릭 도메인이 되었다.[1]

DEFLATE는 일본인이 고안한 LHA와 거의 같은 알고리즘을 사용한다.[1]

2. 2. 초기 개발 및 특허 문제

DEFLATE는 인터넷에서 널리 사용되는 무손실 압축 형식이다. 압축 속도는 비교적 빠르며, 압축 해제(신장) 속도는 매우 빠르다. 다만, LZW 등에 비하면 계산량이 더 많다.

LZ77 알고리즘에는 여러 회사, 법인, 인물이 특허를 보유하고 있었다. zlib 구현에서는 이러한 특허를 회피하기 위해 신중하게 설계되었다. 완전히 보장되지는 않았고 논의도 있었지만, 관련된 알고리즘은 모두 회피한 것으로 알려져 있다. 개발 초기에는 문제가 되었던 특허도 현재는 대부분 특허권, 라이선스 등이 소멸하여 퍼블릭 도메인이 되었다.

DEFLATE는 일본인이 고안한 LHA와 거의 같은 알고리즘을 사용한다.

2. 3. Deflate의 확산과 표준화

인터넷에서 널리 사용되는 압축 형식으로, 압축은 비교적 빠르며, 압축 해제(원래대로 되돌리는 것)는 매우 빠르다. LZW 등과 비교하면 계산량이 많다.[1] LZ77에는 여러 회사, 법인, 인물이 특허를 가지고 있었는데, zlib 구현에서는 특허를 회피하도록 주의 깊게 구현되었다.[1] 보장되지는 않았고 논의도 있었지만, 특허와 관련된 알고리즘은 모두 회피할 수 있었다고 여겨진다.[1] 또한 개발 초기 문제가 되었던 특허도 현재는 대부분 특허권, 라이선스 등이 소멸하여 퍼블릭 도메인이 되었다.[1]

Deflate 알고리즘은 일본인이 고안한 LHA와 거의 같은 알고리즘을 사용한다.[1]

Deflate 알고리즘이 사용되는 소프트웨어는 다음과 같다.

소프트웨어
zlib[1]
ZIP[1]
GZIP[1]
7z[1]
PNG[1]



또한, 대부분의 프로그래밍 언어에서 Deflate 알고리즘을 사용할 수 있다.

프로그래밍 언어
Java - Deflater 클래스에서 nowrap을 활성화하여 원시 deflate를 처리할 수 있으며, 별도로 zlib 형식 또는 gzip 형식의 헤더 및 푸터가 붙은 것도 처리할 수 있다.[1]
Perl[1]
PHP[1]
Python[1]
Ruby[1]
C#, VB.NET 등의 .NET Framework 2.0 이후 지원 언어 - DeflateStream 클래스를 통해 원시 deflate 또는 GZipStream 클래스를 통해 gzip 형식을 사용할 수 있다.[1]



Apache HTTP Server와 같은 웹 서버에서도 zlib 형식의 Deflate를 사용하여 압축 통신을 구현하고 있다.[1]

3. 기술

DEFLATE는 LZ77 알고리즘을 사용하여 데이터를 압축한 후, 중복되는 내용에 대한 포인터(일치하는 내용의 위치와 길이)를 허프만 부호화를 사용하여 한 번 더 압축하는 기술이다.

DEFLATE 알고리즘은 압축률에 비해 압축 및 해제 속도가 빠른 편이지만, 최근에 개발된 압축 알고리즘에 비해서는 압축률이 다소 낮은 경향을 보인다. DEFLATE는 데이터를 "문자 그 자체" 또는 "일치 길이, 일치 위치" 쌍으로 부호화한다. 여기서 "문자 그 자체"와 "일치 길이"는 하나의 허프만 부호로, "일치 위치"는 다른 허프만 부호로 부호화된다. DEFLATE의 허프만 부호화는 블록마다 부호를 다시 생성하는 '''동적 허프만 부호화'''(dynamic Huffman coding영어) 방식이다. 이는 일본에서 흔히 동적 허프만 부호화라고 불리는 Adaptive Huffman coding|적응형 허프만 부호화영어와는 다르므로 주의해야 한다.

3. 1. LZ77 알고리즘

DEFLATE는 LZ77 알고리즘을 기반으로 데이터를 압축한다. 압축 과정에서 중복되는 문자열이 발견되면, 이를 직접 저장하는 대신 이전 위치를 가리키는 포인터(일치하는 내용의 위치와 길이)로 대체한다.

이전 텍스트에서 중복된 하위 문자열을 검색하는 것은 DEFLATE 알고리즘에서 계산 비용이 가장 많이 드는 부분이며, 압축 수준 설정이 영향을 미치는 연산이다. DEFLATE는 LZ77(실제로는 변종인 LZSS)로 데이터를 "문자 그 자체" 또는 "일치 길이, 일치 위치" 쌍으로 부호화한다.

3. 1. 1. 슬라이딩 윈도우

압축된 블록 내에서 중복되는 바이트 나열(반복 문자열)이 발견되면, 해당 문자열의 이전 위치를 가리키는 역 참조가 삽입된다. 이전 문자열에 대한 인코딩된 일치는 8비트 길이(3–258 바이트)와 중복 시작 부분까지의 15비트 거리(1–32,768 바이트)로 구성된다. 상대적인 역참조는 디코딩된 압축되지 않은 데이터의 마지막 32 KiB 내에 거리가 나타나는 한(이것을 '슬라이딩 윈도우'라고 함) 블록 수를 넘어서 수행될 수 있다.[1]

거리가 길이보다 짧으면 중복이 자체적으로 겹쳐서 반복을 나타낸다. 예를 들어, 10개의 동일한 바이트 연속은 한 바이트로 인코딩된 다음, 이전 바이트부터 시작하는 길이 9의 중복으로 인코딩될 수 있다.[1]

3. 1. 2. 거리 및 길이 코딩

DEFLATE에서 압축된 블록 내에서 중복된 문자열이 발견되면, 해당 문자열의 이전 위치를 가리키는 역 참조가 삽입된다. 이전 문자열에 대한 인코딩된 일치는 8비트 길이(3–258 바이트)와 중복 시작 부분까지의 15비트 거리(1–32,768 바이트)로 구성된다. 상대적인 역참조는 디코딩된 압축되지 않은 데이터의 마지막 32 KiB 내에 거리가 나타나는 한(이것을 '슬라이딩 윈도우'라고 함) 블록 수를 넘어서 수행될 수 있다.

거리가 길이보다 짧으면 중복이 자체적으로 겹쳐서 반복을 나타낸다. 예를 들어, 10개의 동일한 바이트의 연속은 한 바이트로 인코딩된 다음, 이전 바이트부터 시작하는 길이 9의 중복으로 인코딩될 수 있다.

3. 2. 허프만 부호화

DEFLATE는 허프만 부호화를 사용하여 압축을 수행한다. 허프만 부호화는 자주 사용되는 기호는 더 짧은 표현으로, 덜 자주 사용되는 기호는 더 긴 표현으로 대체하는 방식이다. 각 기호의 길이는 해당 기호가 나타날 확률의 로그에 반비례하며, 겹치지 않는 접두사 트리 형태로 생성된다. 따라서 기호가 나타날 확률이 높을수록 비트 표현은 짧아진다.

허프만 부호화는 블록마다 부호를 (재)구축하는 방식으로, '''동적 허프만 부호'''(dynamic Huffman coding영어)라고 부른다. 일본에서 일반적으로 동적 허프만 부호라고 불리는 Adaptive Huffman coding|적응형 허프만 부호영어와는 다르므로 주의해야 한다.

3. 2. 1. 정적 허프만 부호화

DEFLATE의 두 번째 압축 단계에서는 허프만 부호화를 사용하여 자주 사용되는 기호는 더 짧게, 덜 자주 사용되는 기호는 더 길게 표현한다. 이 방법은 각 기호의 길이를 해당 기호가 나타날 확률의 로그에 반비례하도록 겹치지 않는 접두사 트리 형태로 생성한다. 따라서 기호가 나타날 확률이 높을수록 비트 표현은 짧아진다.

288개의 기호를 위한 트리가 생성되는데, 각 기호는 다음과 같다.

  • 0–255: 리터럴 바이트/기호 0–255를 나타낸다.
  • 256: 블록의 끝을 의미한다. 마지막 블록이면 압축 해제를 중지하고, 그렇지 않으면 다음 블록의 압축 해제를 시작한다.
  • 257–285: 추가 비트와 결합하여 3–258 바이트의 일치 길이를 나타낸다.
  • 286, 287: 사용되지 않지만, 트리에는 포함되어 있다.


일치 길이 코드 뒤에는 항상 거리 코드가 온다. 거리 코드를 읽은 후 추가 비트를 읽어 최종 거리를 생성한다. 거리 트리는 32개의 기호를 위한 공간을 포함한다.

기호 범위거리추가 비트
0–31–40
4–55–81
6–79–162
8–917–323
26–278,193–16,38412
28–2916,385–32,76813
30–31사용되지 않음-



일치 거리 기호 2–29의 경우, 추가 비트 수는 \left\lfloor\frac{n}{2}\right\rfloor-1로 계산할 수 있다.

길이/리터럴 트리(288개 기호)와 거리 트리(32개 기호)는 각 기호에 대한 코드의 비트 길이를 제공하는 정규 허프만 코드로 인코딩된다. 비트 길이는 런 길이 인코딩을 통해 최대한 압축된다. "정적 트리" 옵션은 표준 고정 허프만 트리를 제공하여 트리 표현을 포함하지 않도록 한다. 압축기는 정적 트리를 사용했을 때와 동적 트리를 생성했을 때의 압축 크기를 비교하여 더 작은 것을 선택할 수 있다.

3. 2. 2. 동적 허프만 부호화

DEFLATE에서 허프만 부호화는 블록마다 부호를 다시 생성하는 방식, 즉 '''동적 허프만 부호화'''(dynamic Huffman coding영어)를 사용한다. 이는 자주 사용되는 기호는 더 짧게, 덜 사용되는 기호는 더 길게 표현하여 압축 효율을 높이는 방식이다.

DEFLATE는 LZ77(정확히는 그 변형인 LZSS)을 통해 "문자 자체" 또는 "일치 길이, 일치 위치" 쌍으로 데이터를 부호화한다. 여기서 "문자 자체"와 "일치 길이"는 하나의 허프만 부호로, "일치 위치"는 다른 허프만 부호로 압축된다.

이때 사용되는 허프만 부호는 다음과 같이 구성된다.

  • 길이/리터럴 트리 (288개 기호):
  • 0–255: 리터럴 바이트/기호 0–255
  • 256: 블록 끝 (마지막 블록이면 처리 중지, 아니면 다음 블록 처리)
  • 257–285: 3–258 바이트의 일치 길이 (추가 비트와 결합)
  • 286, 287: 미사용, 예약됨
  • 거리 트리 (32개 기호):
  • 0–3: 거리 1–4
  • 4–5: 거리 5–8 (1 추가 비트)
  • 6–7: 거리 9–16 (2 추가 비트)
  • 26–27: 거리 8,193–16,384 (12 추가 비트)
  • 28–29: 거리 16,385–32,768 (13 추가 비트)
  • 30–31: 미사용, 예약됨


일본에서는 보통 동적 허프만 부호화라고 하면 en를 가리키는 경우가 많으므로 혼동에 주의해야 한다.

3. 3. 스트림 형식

DEFLATE 스트림은 일련의 블록으로 구성되며, 각 블록 앞에는 3-비트 헤더가 붙는다.

구분설명
첫 번째 비트스트림 내 마지막 블록 마커
`1`: 이 블록이 스트림의 마지막 블록이다.
`0`: 이 블록 다음에 처리할 블록이 더 있다.
두 번째 및 세 번째 비트이 블록 유형에 사용된 인코딩 방법
`00`: 저장된(저장 또는 원시) 섹션, 길이는 0에서 65,535바이트 사이이다.
`01`: RFC에 정의된 사전 합의된 허프만 트리를 사용하는 정적 허프만 압축 블록이다.
`10`: 허프만 테이블이 함께 제공되는 동적 허프만 압축 블록이다.
`11`: 예약됨—사용하지 않는다.



''저장된'' 블록 옵션은 최소한의 오버헤드를 추가하며 압축할 수 없는 데이터에 사용된다. 대부분의 압축 가능한 데이터는 ''동적 허프만'' 인코딩(방법 `10`)을 사용하여 인코딩되며, 각 데이터 블록에 맞게 사용자 정의된 최적화된 허프만 트리를 생성한다. 정적 허프만 옵션은 짧은 메시지에 사용된다.

압축은 두 단계로 수행된다.


  • 중복 문자열을 포인터로 일치시키고 대체한다.
  • 사용 빈도에 따라 기호를 새로운 가중치 기호로 대체한다.


압축된 블록 내에서 중복된 바이트(반복 문자열)가 발견되면, 이전 문자열을 가리키는 역 참조가 삽입된다. 상대적인 역참조는 디코딩된 압축되지 않은 데이터의 마지막 32 KiB 내에 거리가 나타나는 한 블록 수를 넘어서 수행될 수 있다.

두 번째 압축 단계는 허프만 코딩을 사용하며, 자주 사용되는 기호를 더 짧은 표현으로, 덜 자주 사용되는 기호를 더 긴 표현으로 대체한다.

288개의 기호를 위한 공간을 포함하는 트리가 생성된다.

  • 0–255: 리터럴 바이트/기호 0–255를 나타낸다.
  • 256: 블록의 끝 – 마지막 블록인 경우 처리를 중지하고, 그렇지 않으면 다음 블록 처리를 시작한다.
  • 257–285: 추가 비트와 결합하여 3–258 바이트의 일치 길이를 나타낸다.
  • 286, 287: 사용되지 않음, 예약됨, 잘못되었지만 여전히 트리의 일부이다.


일치 길이 코드는 항상 거리 코드가 뒤따르며, 거리 트리는 32개의 기호를 위한 공간을 포함한다.

기호설명
0–3거리 1–4
4–5거리 5–8, 1 추가 비트
6–7거리 9–16, 2 추가 비트
8–9거리 17–32, 3 추가 비트
......
26–27거리 8,193–16,384, 12 추가 비트
28–29거리 16,385–32,768, 13 추가 비트
30–31사용되지 않음, 예약됨, 잘못되었지만 여전히 트리의 일부이다.



두 코드(288개의 기호 길이/리터럴 트리와 32개의 기호 거리 트리)는 자체적으로 정규 허프만 코드로 인코딩된다. "정적 트리" 옵션은 표준 고정 허프만 트리를 제공한다.

deflate는 LZ77로 데이터를 "문자 그 자체" 또는 (일치 길이, 일치 위치) 쌍으로 부호화한다. 그 결과 중 "문자 그 자체" 및 "일치 길이"를 합쳐 하나의 허프만 부호로 부호화하고, "일치 위치"를 다른 허프만 부호로 부호화한다. deflate의 허프만 부호화는 블록마다 부호를 (재)구축하는 방식으로, '''동적''' 허프만 부호 (dynamic Huffman coding|동적 허프만 부호영어)라고 부른다.

4. 구현

DEFLATE 알고리즘은 다양한 소프트웨어에서 구현되어 사용되고 있다. 대표적인 구현체로는 zlib이 있으며, 이는 오픈 소스 라이선스로 배포되어 많은 애플리케이션에서 표준 참조 구현으로 활용된다.

압축 효율을 높이기 위한 다양한 DEFLATE 인코더들이 개발되었으며, 이들은 기존 DEFLATE 디코더와 호환되는 비트스트림을 생성한다. 이러한 인코더들은 일반적으로 더 작은 크기의 압축 파일을 생성하는 데 중점을 둔다.

다음은 DEFLATE의 주요 구현체들이다.

구현체설명
PKZIP필 카츠가 개발한 최초의 DEFLATE 구현체이다.[11]
zlib오픈 소스 라이선스로 널리 사용되는 표준 참조 구현이다. 더 높은 성능을 가진 버전은 zlib 포크에서 확인할 수 있다.
7-Zip이고르 파블로프가 C++로 작성했으며, CPU 사용량을 늘려 zlib보다 높은 압축률을 제공한다. DEFLATE64 저장 형식 옵션도 지원한다.[11]
Crypto++C++로 작성된 공개 도메인 구현체로, 보안 취약점을 줄이는 데 중점을 둔다.
PuTTY 'sshzlib.c'사이먼 타담이 작성한 MIT 라이선스 기반의 독립형 구현체로, 전체 디코딩 기능은 있지만 정적 트리 생성만 지원한다.[11]
libflate벨 연구소의 Plan 9 운영체제의 일부로, deflate 압축을 구현한다.[11]
Hyperbac자체 독점 압축 라이브러리(C++ 및 어셈블리)를 사용하며, DEFLATE64 저장 형식을 지원한다.
Zopfli구글이 개발한 아파치 라이선스 기반의 C 구현체로, CPU 사용량을 늘려 높은 압축률을 달성한다. ZopfliPNG는 PNG 파일에 특화된 변형이다.
igzip인텔이 MIT 라이선스로 공개한 x86 어셈블리 언어 기반 인코더로, zlib -1보다 3배 빠른 속도를 제공하며 유전체 데이터 압축에 유용하다.[12]
libdeflate빠르고 전체 버퍼 DEFLATE 기반 압축 및 압축 해제를 위한 라이브러리로, 특히 x86 프로세서에 최적화되어 있다.[13]



AdvanceCOMP는 7-Zip, libdeflate, Zopfli 등 압축률이 높은 DEFLATE 구현체를 활용하여 gzip, PNG, MNG, ZIP 파일의 재압축을 지원하며, zlib의 최대 설정보다 더 작은 파일 크기를 얻을 수 있도록 한다.[14]

4. 1. zlib

zlib 범용 압축 라이브러리는 DEFLATE 알고리즘의 대표적인 구현이다.[11] 오픈 소스이며, 허가된 라이선스로 인해 많은 앱에서 채택된 표준 참조 구현으로 사용되고 있다. 압축은 비교적 빠르며, 신장(원래대로 되돌리는 것/전개)은 매우 빠르다. 다만, LZW 등과 비교하면 계산량이 많다.

zlib의 구현에서는 특허를 회피하도록 주의 깊게 구현되었다. 보장되지는 않았고 논의도 있었지만, 특허와 관련된 알고리즘은 모두 회피할 수 있었다고 생각된다. 또한, 개발 초기에는 문제가 되었던 특허도 현재는 대부분 특허권, 라이선스 등이 소멸하여 퍼블릭 도메인이 되었다.

7-Zip에서는 DEFLATE와 같은 포맷을 사용하면서 압축률을 더 높이는 알고리즘을 사용하고 있으며, 켄 실버맨(Ken Silverman)의 KZIP과 PNGOUT에서도 더 효율적인 알고리즘을 구현하고 있다.

4. 1. 1. zlib 포크

zlib는 오픈 소스이며 라이선스가 허가되어 있어 많은 앱에서 채택된 표준 참조 구현이다. 더 높은 성능을 가진 zlib의 포크는 다음과 같다.

  • igzip: 인텔이 MIT 라이선스로 출시한 인코더로, x86 어셈블리 언어로 작성되었다. zlib -1보다 3배 빠르며, 유전체 데이터를 압축하는 데 유용하다.[12]
  • libdeflate: 빠르고 전체 버퍼 DEFLATE 기반 압축 및 압축 해제를 위한 라이브러리이다. Libdeflate는 특히 x86 프로세서에서 매우 최적화되어 있다.[13]
  • Zopfli: 구글이 개발한 아파치 라이선스 하의 C 구현이다. CPU 사용량을 희생하여 더 높은 압축률을 달성한다. ZopfliPNG는 PNG 파일에 사용하기 위한 Zopfli의 변형이다.


AdvanceCOMP는 7-Zip, libdeflate 및 Zopfli에서 DEFLATE의 더 높은 압축률 버전을 사용하여 gzip, PNG, MNG 및 ZIP 파일의 재압축을 가능하게 하여 zlib가 최대 설정에서 달성할 수 있는 파일 크기보다 더 작은 파일 크기를 얻을 수 있게 한다.[14]

4. 2. 7-Zip

7-Zip은 이고르 파블로프가 C++로 작성했으며, 자유롭게 라이선스가 부여된다. 이 버전은 CPU 사용량을 늘려 zlib보다 더 높은 압축률을 달성하며, DEFLATE64 저장 형식 사용 옵션이 있다.[11] AdvanceCOMP는 7-Zip의 DEFLATE 압축률이 높은 버전을 사용하여 gzip, PNG, MNG 및 ZIP 파일을 다시 압축하여 zlib가 최대 설정에서 달성할 수 있는 파일 크기보다 더 작은 파일 크기를 얻을 수 있게 해준다.[14]

4. 3. Crypto++

Crypto++는 C++로 작성된 공개 도메인 구현을 포함하며, 잠재적인 보안 취약점을 줄이는 것을 목표로 한다. 저자 웨이 다이는 "이 코드는 zlib보다 덜 영리하지만, 더 이해하기 쉽고 유지 관리하기 쉽기를 바랍니다"라고 말했다.[11]

4. 4. PuTTY

사이먼 타담이 작성한 PuTTY의 'sshzlib.c'는 MIT 라이선스 하의 독립형 구현으로, 전체 디코딩 기능을 갖지만 정적 트리 생성만 지원한다.[11]

4. 5. 기타 구현체


  • PKZIP: 필 카츠가 PKZip의 일부로 개발한 최초의 구현체이다.[11]
  • zlib: 오픈 소스 라이선스로 많은 앱에서 채택된 표준 참조 구현체이다. 더 높은 성능을 가진 버전은 Zlib 포크에서 확인할 수 있다.
  • Crypto++: C++로 작성된 공개 도메인 구현체를 포함하며, 잠재적인 보안 취약점을 줄이는 것을 목표로 한다. 저자 웨이 다이는 "이 코드는 zlib보다 덜 영리하지만, 더 이해하기 쉽고 유지 관리하기 쉽기를 바랍니다"라고 말했다.
  • 7-Zip: 이고르 파블로프가 C++로 작성했으며, 자유 라이선스가 부여된다. CPU 사용량을 늘려 zlib보다 더 높은 압축률을 달성한다. DEFLATE64 저장 형식 사용 옵션이 있다.
  • PuTTY 'sshzlib.c': 사이먼 타담이 작성한 MIT 라이선스 하의 독립형 구현으로, 전체 디코딩 기능을 갖지만 정적 트리 생성만 지원한다.
  • libflate:[11] 벨 연구소의 Plan 9의 일부로, deflate 압축을 구현한다.
  • Hyperbac: DEFLATE64 저장 형식 구현 옵션을 사용하여 자체 독점 압축 라이브러리(C++ 및 어셈블리)를 사용한다.
  • Zopfli: 구글이 개발한 아파치 라이선스 하의 C 구현체이다. CPU 사용량을 늘려 더 높은 압축률을 달성한다. ZopfliPNG는 PNG 파일에 사용하기 위한 Zopfli의 변형이다.
  • igzip: 인텔이 MIT 라이선스로 출시한, x86 어셈블리 언어로 작성된 인코더이다. zlib -1보다 3배 빠르다. 유전체 데이터를 압축하는 데 유용하다.[12]
  • libdeflate:[13] 빠르고 전체 버퍼 DEFLATE 기반 압축 및 압축 해제를 위한 라이브러리이다. Libdeflate는 특히 x86 프로세서에서 매우 최적화되어 있다.


AdvanceCOMP는 7-Zip, libdeflate 및 Zopfli에서 DEFLATE의 더 높은 압축률 버전을 사용하여 gzip, PNG, MNG 및 ZIP 파일의 재압축을 가능하게 하여 zlib가 최대 설정에서 달성할 수 있는 파일 크기보다 더 작은 파일 크기를 얻을 수 있다.[14]

5. Deflate64/Enhanced Deflate

Deflate64는 PKWARE에서 지정한 Deflate의 독점 변형이다. 기본적으로 동일한 알고리즘이지만 다음과 같은 변경 사항이 있다.


  • 사전 크기가 32KB에서 64KB로 증가했다.
  • 거리 코드가 16비트로 확장되어 64KB 범위를 처리할 수 있다.
  • 길이 코드가 16비트로 확장되어 3~65,538바이트 길이를 정의할 수 있다.[6]


이로 인해 Deflate64는 Deflate보다 압축 시간이 더 길고 잠재적으로 압축률이 약간 더 높다.[7] 7-Zip과 같은 여러 자유 및/또는 오픈 소스 프로젝트가 Deflate64를 지원하는 반면, zlib와 같은 다른 프로젝트는 절차의 독점적 특성[9]과 Deflate에 비해 성능이 매우 미미하게 향상되었기 때문에 지원하지 않는다.[10]

6. 하드웨어 구현

DEFLATE 알고리즘을 하드웨어로 구현한 사례는 다음과 같다.


  • Comtech AHA: Comtech AHA는 Deflate 압축을 지원하는 PCI-X 카드(PCI-ID: `193f:0001`)를 생산했다. 이 카드는 최대 375MB의 속도로 데이터를 압축할 수 있으며, 리눅스 커널 드라이버, "ahagzip" 유틸리티, 아파치 HTTP 서버의 하드웨어 압축 지원("mod_deflate_aha")을 포함한다.[15] 이 하드웨어는 자일링스 Virtex FPGA와 4개의 맞춤형 AHA3601 ASIC을 기반으로 한다.[15] 2008년에는 새로운 AHA3610 인코더 칩을 사용한 PCIe 카드(PCI-ID: 193f:0363/193f:0364)도 생산되었다.[15]
  • Indra Networks: Indra Networks는 최대 450MB의 처리 속도를 제공하는 StorCompress 300 및 MX3 PCI (PCI-ID: 17b4:0011) 또는 PCI-X 카드 제품군을 생산했다.
  • 기타:
  • Comtech의 Nitrox 및 Octeon 프로세서는 ZLIB 및 GZIP과 호환되는 하드웨어 Deflate 및 Inflate 엔진을 포함한다.[15]
  • HDL-Deflate는 GPL FPGA 구현체이다.
  • CAST Inc의 ZipAccel-C는 Deflate, Zlib, Gzip 압축을 지원하는 실리콘 IP 코어이다.
  • 인텔 제온 E5-2600 및 E5-2400 프로세서 시리즈용 인텔 통신 칩셋 89xx 시리즈는 하드웨어 압축 및 압축 해제를 지원한다.[15]
  • IBM z15 CPU는 하드웨어 Deflate 압축 및 압축 해제를 위한 Nest Accelerator Unit(NXU) 하드웨어 가속을 통합한다.[16][17]
  • POWER9 아키텍처부터 IBM은 Nest 가속기(NX) 코어에 Deflate 압축 및 압축 해제를 위한 하드웨어 지원을 추가했다.[18][19]

6. 1. Comtech AHA

Comtech AHA는 최대 3.0Gbit/s (375MB/s)의 속도로 들어오는 데이터를 Deflate를 사용하여 압축할 수 있는 PCI-X 카드 (PCI-ID: `193f:0001`)를 생산했다.[15] 이 카드에는 AHA361-PCIX 용 리눅스 커널 드라이버, "ahagzip" 유틸리티, 아파치의 하드웨어 압축을 지원하는 "mod_deflate_aha"가 포함되어 있다.[15] 이 하드웨어는 자일링스 Virtex FPGA와 4개의 맞춤형 AHA3601 ASIC을 기반으로 한다.[15]

AHA361/AHA362 보드는 정적 허프만 블록만 처리하도록 제한되어, 동적 허프만 블록을 지원하려면 소프트웨어 수정이 필요하다.[15] 즉, 카드는 전체 Deflate 사양을 지원하지 못하고 자체 출력(동적 허프만 유형 2 블록이 없는 스트림)만 안정적으로 디코딩할 수 있다.[15]

2008년에 Comtech는 새로운 하드웨어 AHA3610 인코더 칩을 사용한 두 개의 PCIe 카드(PCI-ID: 193f:0363/193f:0364)를 생산하기 시작했다.[15] 새로운 칩은 지속적인 2.5Gbit/s를 처리하도록 설계되었다.[15] AHA363-PCIe 보드는 두 개의 칩을 사용하여 두 채널(압축 및 압축 해제 각 2개)에서 최대 5.0Gbit/s (625MB/s)의 속도로 Deflate를 처리할 수 있다.[15] AHA364-PCIe는 로드 밸런서용으로 설계된 인코딩 전용 버전으로, 여러 레지스터 세트를 사용하여 32개의 독립적인 ''가상'' 압축 채널을 제공한다.[15]

마이크로소프트 윈도우, OpenSolaris 커널 장치 드라이버와 함께 수정된 zlib 시스템 라이브러리가 제공되어, 동적 연결된 애플리케이션이 내부 수정 없이 하드웨어 지원을 자동으로 사용할 수 있다.[15] AHA367-PCIe 보드(PCI-ID: 193f:0367)는 AHA363-PCIe와 유사하지만, 4개의 AHA3610 칩을 사용하여 10Gbit/s (1250MB/s)의 지속적인 압축 속도를 제공한다.[15] AHA362-PCIX와 달리 AHA363-PCIe 및 AHA367-PCIe 보드의 압축 해제 엔진은 전체 Deflate를 준수한다.[15]

6. 2. Indra Networks

[http://www.indranetworks.com/ Indra Networks]의 [http://www.indranetworks.com/SC300.html StorCompress 300] 및 [http://www.indranetworks.com/SCMX3.html MX3]는 PCI (PCI-ID: 17b4:0011) 또는 PCI-X 카드 제품군으로, 최대 3.6Gbit/s(450MB/s)의 처리 속도를 제공한다. 이 카드의 한 버전은 SAN 또는 백업 용도가 아닌 웹 서비스용으로 특별히 설계된 ''WebEnhance''라는 별도 브랜드로 제공된다. PCIe 개정판인 [http://www.indranetworks.com/SCMX4E.html MX4E]도 생산된다.

6. 3. 기타 하드웨어 구현체


  • Comtech의 Nitrox 및 Octeon 프로세서는 ZLIB 및 GZIP과 호환되는 고속 하드웨어 Deflate 및 Inflate 엔진을 포함하며, 일부 장치는 여러 개의 동시 데이터 스트림을 처리할 수 있다.[15]
  • HDL-Deflate는 GPL FPGA 구현체이다.
  • CAST Inc의 ZipAccel-C는 Deflate, Zlib, Gzip 압축을 지원하는 실리콘 IP 코어이다. ZipAccel-C는 ASIC 또는 FPGA로 구현할 수 있으며 동적 및 정적 허프만 테이블을 모두 지원하며 100Gbps를 초과하는 처리량을 제공할 수 있다. 이 회사는 인텔 FPGA 및 자일링스 FPGA용 압축/압축 해제 가속기 보드 참조 설계를 제공한다.
  • 인텔 제온 E5-2600 및 E5-2400 프로세서 시리즈(Sandy Bridge-EP/EN)용 인텔 통신 칩셋 89xx 시리즈(Cave Creek)는 QuickAssist 기술을 사용하여 하드웨어 압축 및 압축 해제를 지원한다. 칩셋에 따라 5Gbit/s, 10Gbit/s 또는 20Gbit/s의 압축 및 압축 해제 속도를 사용할 수 있다.[15]
  • IBM z15 CPU는 RFC1951에 지정된 대로 하드웨어 Deflate 압축 및 압축 해제를 위해 z14 시스템에서 사용되는 zEDC Express I/O 확장 카드의 Nest Accelerator Unit(NXU) 하드웨어 가속의 개선된 버전을 통합한다.[16][17]
  • POWER9 아키텍처부터 IBM은 이전에 암호화 중심적인 Nest 가속기(NX) 코어에 Deflate(RFC 1951에 지정됨)를 압축하고 압축 해제하기 위한 하드웨어 지원을 추가했다. 이 지원은 IBM AIX 7.2 기술 레벨 4 확장 팩 또는 AIX 7.2 기술 레벨 5 서비스 팩 2를 사용하여 zlibNX 라이브러리를 통해 실행되는 프로그램에서 사용할 수 있다.[18][19]

7. 디코더/압축 해제

인플레이트는 압축 해제를 위해 Deflate 비트스트림을 가져와 원본 전체 크기 데이터 또는 파일을 정확하게 생성하는 디코딩 프로세스이다.[1]

구체적인 구현체에 대한 내용은 하위 섹션을 참고하라.

7. 1. 어셈블리 언어 구현체


  • 어셈블리 언어
  • [https://github.com/pfusik/zlib6502 6502 inflate]: 6502 어셈블리 언어로 Piotr Fusik가 작성하였다.
  • [http://sourceforge.net/projects/samflate/ SAMflate]: Z80 어셈블리 언어로 Andrew Collier가 작성했으며, SAM Coupé에 대한 선택적 메모리 페이징 지원이 있다. BSD/GPL/LGPL/DFSG 라이선스에 따라 사용할 수 있다.
  • [https://web.archive.org/web/20160304053236/https://bitbucket.org/grauw/gunzip gunzip]: MSX용으로 Z80 어셈블리 언어로 Laurens Holst가 작성했으며, BSD 라이선스에 따라 사용 가능하다.
  • [https://github.com/keirf/Amiga-Stuff inflate.asm]: Keir Fraser가 작성하고 퍼블릭 도메인에 공개된 M68000 기계어로 된 빠르고 효율적인 구현이다.

7. 2. C/C++ 구현체


  • C/C++
  • [https://web.archive.org/web/20070927122958/http://www.mikekohn.net/file_formats/kunzip.php kunzip]: Michael Kohn이 작성했으며 "KZIP"와 관련이 없다. GNU LGPL 라이선스에 따라 C 소스 코드가 함께 제공된다. GIMP 설치 프로그램에서 사용된다.
  • puff.c (zlib): zlib 배포판의 /contrib/puff 디렉토리에 포함된 작고, 부담 없고, 단일 파일 참조 구현이다.
  • [http://www.ibsensoftware.com/download.html tinf]: Jørgen Ibsen이 ANSI C로 작성했으며 zlib 라이선스가 함께 제공된다. 약 2k의 코드를 추가한다.
  • [http://code.google.com/p/miniz/source/browse/trunk/tinfl.c tinfl.c] ([http://code.google.com/p/miniz/ miniz]): 단일 C 함수에 완전히 포함된 퍼블릭 도메인 Inflate 구현이다.
  • `PCDEZIP`: Bob Flanders와 Michael Holmes가 작성했으며, PC Magazine 1994-01-11에 게재되었다.

7. 3. 기타 언어 구현체

프로그래밍 언어이름개발자라이선스설명
어셈블리 언어[https://github.com/pfusik/zlib6502 6502 inflate]Piotr Fusik6502 어셈블리 언어로 작성됨.
어셈블리 언어[http://sourceforge.net/projects/samflate/ SAMflate]Andrew CollierBSD/GPL/LGPL/DFSGZ80 어셈블리 언어로 작성되었으며, SAM Coupé에 대한 선택적 메모리 페이징 지원이 있음.
어셈블리 언어[https://web.archive.org/web/20160304053236/https://bitbucket.org/grauw/gunzip gunzip]Laurens HolstBSDMSX용으로 Z80 어셈블리 언어로 작성됨.
어셈블리 언어[https://github.com/keirf/Amiga-Stuff inflate.asm]Keir Fraser퍼블릭 도메인M68000 기계어로 된 빠르고 효율적인 구현.
C/C++[https://web.archive.org/web/20070927122958/http://www.mikekohn.net/file_formats/kunzip.php kunzip]Michael KohnGNU LGPLC 소스 코드가 함께 제공되며, GIMP 설치 프로그램에서 사용됨. ("KZIP"와 관련 없음)
C/C++puff.c (zlib)zlib 배포판의 /contrib/puff 디렉토리에 포함된 작고, 부담 없고, 단일 파일 참조 구현.
C/C++[http://www.ibsensoftware.com/download.html tinf]Jørgen Ibsenzlib 라이선스ANSI C로 작성되었으며 약 2k의 코드를 추가함.
C/C++[http://code.google.com/p/miniz/source/browse/trunk/tinfl.c tinfl.c] ([http://code.google.com/p/miniz/ miniz])퍼블릭 도메인단일 C 함수에 완전히 포함된 Inflate 구현.
PCDEZIPBob Flanders와 Michael HolmesPC Magazine 1994-01-11에 게재됨.
Common Lisp[http://opensource.franz.com/deflate/ inflate.cl]John FoderaroGNU LGPL독립형 디코더.
Seed7[http://seed7.sourceforge.net/libraries/inflate.htm inflate.s7i]/[http://seed7.sourceforge.net/libraries/gzip.htm gzip.s7i]Thomas MertesGNU LGPLDeflate 및 gzip 압축 해제의 순수 구현.
Python[http://www.paul.sladen.org/projects/pyflate/ pyflate]Paul SladenBSD/GPL/LGPL/DFSG순수 Python 독립형 Deflate (gzip) 및 bzip2 디코더. 연구/프로토타입 제작을 위해 작성됨.
Lua[http://lua-users.org/wiki/ModuleCompressDeflateLua deflatelua]David ManuraDeflate 및 gzip/zlib 압축 해제의 순수 구현.
Javascript[https://github.com/chrisdickinson/inflate inflate]Chris DickinsonInflate의 순수 구현.
Javascript[https://github.com/nodeca/pako pako]zlib의 JavaScript 속도 최적화 포트. Inflate만 포함된 별도의 빌드가 포함됨.


7. 4. 하드웨어 디코더


  • BitSim이 제공하는 ''BADGE'' (Bitsim Accelerated Display Graphics Engine) 컨트롤러의 일부인 Inflate 하드웨어 구현으로, 임베디드 시스템용이다.
  • HDL-Deflate는 GPL FPGA 구현이다.
  • ZipAccel-D는 CAST Inc에서 제공하는 실리콘 IP 코어다. Deflate, Zlib, Gzip 파일의 압축 해제를 지원하며, ASIC 또는 FPGA에서 구현할 수 있다. 이 회사는 인텔 FPGA (ZipAccel-RD-INT) 및 자일링스 FPGA (ZipAccel-RD-XIL)용 압축/압축 해제 가속기 보드 참조 설계를 제공한다.
  • IBM z15 CPU는 z14 시스템에서 사용된 zEDC Express I/O 확장 카드의 Nest Accelerator Unit (NXU) 하드웨어 가속의 개선된 버전을 통합하여, RFC1951에 의해 지정된 하드웨어 Deflate 압축 및 압축 해제를 지원한다.[16][17]
  • POWER9 아키텍처부터 IBM은 POWER7+에서 도입된 이전 암호화 중심 Nest accelerator (NX) 코어에 Deflate 압축 및 압축 해제 (RFC 1951에 의해 지정)에 대한 하드웨어 지원을 추가했다. 이 지원은 AIX 7.2 Technology Level 4 Expansion Pack 또는 AIX 7.2 Technology Level 5 Service Pack 2에서 zlibNX 라이브러리를 통해 실행되는 프로그램에서 사용할 수 있다.[18][19]

8. 활용 사례

DEFLATE는 다양한 소프트웨어 및 기술 분야에서 활용된다.

파일 압축에는 ZIP, GZIP, 7z와 같은 압축 형식과 zlib과 같은 소프트웨어에서 사용되며, PNG 이미지 형식에도 쓰인다.[1]

Apache HTTP Server와 같은 웹 서버에서는 zlib 형식의 DEFLATE를 사용하여 압축 통신을 구현하기도 한다.[1]

8. 1. 파일 압축

DEFLATE는 ZIP, GZIP, 7z, PNG 등 다양한 압축 형식 및 zlib등의 소프트웨어에서 사용된다.[1]

대부분의 프로그래밍 언어에서 사용 가능한데, 그 예시는 다음과 같다.

  • Java: Deflater 클래스에서 nowrap을 활성화하여 원시 deflate를 처리할 수 있으며, 별도로 zlib 형식 또는 gzip 형식의 헤더 및 푸터가 붙은 것도 처리할 수 있다.[1]
  • Perl[1]
  • PHP[1]
  • Python[1]
  • Ruby[1]
  • C#, VB.NET 등의 .NET Framework 2.0 이후 지원 언어: DeflateStream 클래스를 통해 원시 deflate 또는 GZipStream 클래스를 통해 gzip 형식을 사용할 수 있다.[1]


Apache HTTP Server와 같은 웹 서버에서도 zlib 형식의 Deflate를 사용하여 압축 통신을 구현하고 있다.[1]

8. 2. 네트워크 통신

Apache HTTP Server와 같은 웹 서버에서 zlib 형식의 Deflate를 사용하여 압축 통신을 구현하고 있다.

8. 3. 이미지 형식

PNG 이미지 형식은 Deflate 알고리즘을 사용한다.[1]

8. 4. 프로그래밍 언어 지원

C로 작성된 앱은 일반적으로 zlib 라이브러리(zlib 라이선스)를 사용한다. 볼랜드 파스칼(및 호환 가능한 언어)로 작성된 앱은 paszlib을 사용할 수 있다. C++로 작성된 앱은 7-Zip의 향상된 Deflate 라이브러리를 활용할 수 있다. Java와 .NET Framework는 자체 라이브러리에서 Deflate를 즉시 지원한다(각각 `java.util.zip` 및 [https://docs.microsoft.com/en-us/dotnet/api/system.io.compression.deflatestream System.IO.Compression]). Ada로 작성된 앱은 [http://unzip-ada.sourceforge.net/ Zip-Ada](순수) 또는 [http://zlib-ada.sourceforge.net/ ZLib-Ada]를 사용할 수 있다.

다음은 Deflate 알고리즘을 지원하는 프로그래밍 언어 예시이다.

  • Java - Deflater 클래스에서 nowrap을 활성화하여 원시 deflate를 처리할 수 있으며, 별도로 zlib 형식 또는 gzip 형식의 헤더 및 푸터가 붙은 것도 처리할 수 있다.
  • Perl
  • PHP
  • Python
  • Ruby
  • C#, VB.NET 등의 .NET Framework 2.0 이후 지원 언어 - DeflateStream 클래스를 통해 원시 deflate 또는 GZipStream 클래스를 통해 gzip 형식을 사용할 수 있다.


Apache HTTP Server와 같은 웹 서버에서도 zlib 형식의 Deflate를 사용하여 압축 통신을 구현하고 있다.

9. zlib와 gzip

zlib ()와 gzip () 등은 deflate와 함께 자주 사용되는 헤더와 푸터이다. zlib는 헤더가 2바이트 이상, 푸터가 4바이트인 반면, gzip는 헤더가 10바이트 이상, 푸터가 8바이트이다. gzip가 정보가 더 많으며, 어떤 파일 시스템에서 압축되었는지도 기록되어 있다. 푸터에는 zlib가 Adler-32를 사용하고, gzip는 CRC-32를 사용한다.[1]

참조

[1] 웹사이트 flate package - compress/flate - Go Packages https://pkg.go.dev/c[...] Google 2023-09-05
[2] 웹사이트 PDF 32000-1:2008: Document management — Portable document format — Part 1: PDF 1.7 https://opensource.a[...] Adobe 2023-09-05
[3] 간행물 DEFLATE Compressed Data Format Specification version 1.3 IETF 1996-05
[4] 특허 String Searcher, and Compressor Using Same
[5] 서적 Data Compression: The Complete Reference https://books.google[...] Springer
[6] 웹사이트 Binary Essence – Deflate64 http://www.binaryess[...] 2011-05-22
[7] 웹사이트 Binary Essence – "Calgary Corpus" compression comparisons http://www.binaryess[...] 2011-05-22
[8] 웹사이트 -m (Set compression Method) switch https://sevenzip.osd[...] 2023-01-21
[9] 웹사이트 History of Lossless Data Compression Algorithms http://ieeeghn.org/w[...]
[10] 웹사이트 zlib FAQ https://www.zlib.net[...]
[11] 웹사이트 Plan 9 from Bell Labs's /n/sources/plan9/sys/src/libflate http://plan9.bell-la[...] Lucent Technologies
[12] 웹사이트 High Performance DEFLATE Compression with Optimizations for Genomic Data Sets https://software.int[...] 2019-10-01
[13] 웹사이트 libdeflate https://github.com/e[...]
[14] 웹사이트 amadvance/advancecomp https://github.com/a[...] 2023-02-21
[15] 웹사이트 Intel® Xeon® Processor E5-2600 and E5-2400 Series with Intel® Communications Chipset 89xx Series https://www-ssl.inte[...] 2016-05-18
[16] 웹사이트 Introducing the IBM z15 - The enterprise platform for mission-critical hybrid multicloud https://www.ibm.com/[...] 2019-09-12
[17] 서적 IBM z15 (8562) Technical Guide, Page 97 https://books.google[...] IBM Redbooks 2021-04-28
[18] 웹사이트 Data compression by using the zlibNX library - IBM Documentation https://www.ibm.com/[...] 2021-11-01
[19] 웹사이트 Exploitation of In-Core Acceleration of POWER Processors for AIX https://community.ib[...] 2021-11-01



본 사이트는 AI가 위키백과와 뉴스 기사,정부 간행물,학술 논문등을 바탕으로 정보를 가공하여 제공하는 백과사전형 서비스입니다.
모든 문서는 AI에 의해 자동 생성되며, CC BY-SA 4.0 라이선스에 따라 이용할 수 있습니다.
하지만, 위키백과나 뉴스 기사 자체에 오류, 부정확한 정보, 또는 가짜 뉴스가 포함될 수 있으며, AI는 이러한 내용을 완벽하게 걸러내지 못할 수 있습니다.
따라서 제공되는 정보에 일부 오류나 편향이 있을 수 있으므로, 중요한 정보는 반드시 다른 출처를 통해 교차 검증하시기 바랍니다.

문의하기 : help@durumis.com