Deflate 알고리즘은 LZ77과 Huffman Coding으로 압축됩니다.
LZ77 알고리즘은 이전 버퍼 데이터에 의존해서 압축하는 구조입니다. 어떤 경우에는 앞 버퍼를 비우고 압축을 해야할 필요가 있습니다. 바로 앞 데이터와 뒤 데이터간 의존성을 없애는 목적입니다. Block은 의존성이 있는 연속된 데이터 구간을 의미합니다. 하나의 압축 결과물은 한개 이상의 Block으로 구성됩니다. 크게 하나의 압축 파일은 헤더부, Block군, 종료부로 나눌 수 있습니다. 만약 Block 용어가 zlib에서 등장한다면 “독립되고 연속 데이터 구간을 생성하는구나.” 라고 생각하면 됩니다. Block마다 window size나 압축 레벨을 다르게 구현해 줄 수 있습니다. 만약 인위적으로 윈도우 사이즈나 압축 레벨을 변경하면 새로운 Block이 생성됩니다.
Flush라는 용어는 Huffman Coding 알고리즘과 관련된 용어입니다. Huffman Coding 알고리즘은 비트 단위 압축 알고리즘입니다. 문제는 컴퓨터의 기록 단위는 바이트 단위라는 겁니다. 따라서 기록하는 시점에 바이트 바운더리가 자동적으로 채워지게 됩니다. Flush라는 용어는 강제로 빈 비트를 채워서라도 바이트 단위 바운더리 단위로 기록하게 됩니다. 결국 Flush를 적게 할수록 압축율을 올라갑니다.
Block과 Flush는 zlib에서 flush 모드라고 부릅니다.