💡 핵심 인사이트
비트 스터핑(Bit Stuffing)은 문자 기반 프레이밍의 무거움을 극복하고, 어떤 종류의 데이터(동영상, 음악)든 완벽하게 프레임을 자를 수 있게 만든 현대 통신(HDLC 등)의 지배적인 표준 프레이밍 기법입니다.
시작과 끝을 오직 **01111110 (1이 6개)**이라는 깃발(Flag)로 표시하며, 본문 속에 가짜 깃발이 생기는 것을 막기 위해 '1이 5개 연속되면 무조건 강제로 0을 끼워 넣는' 마법을 부립니다.


Ⅰ. 특수 플래그(Flag)와 비트의 한계

문자 삽입(DLE) 방식은 8비트(1바이트) 단위로 뭉텅뭉텅 글자를 쑤셔 넣어야 해서 비효율적이었습니다. 그래서 개발자들은 아예 바이트 단위를 버리고 순수한 비트 단위(Bit-oriented)로 프레임을 자르기로 했습니다.

  • 프레임의 깃발 (Flag): 01111110 (가운데 1이 정확히 연속으로 6개 있음)
  • 프레임의 맨 앞과 맨 뒤에 무조건 이 깃발을 꽂습니다. 수신기는 쏟아지는 비트 스트림을 보다가 1이 연속으로 6개(01111110) 나오는 순간, 무조건 거기를 프레임의 경계선(시작 또는 끝)으로 인식합니다.

Ⅱ. 본문 속 가짜 깃발을 막아라 (비트 스터핑 알고리즘)

문제는 우리가 보내는 동영상 데이터(본문) 안에 우연히 01111110 패턴이 들어있을 수 있다는 점입니다. 수신기가 그걸 진짜 끝나는 깃발로 착각하면 데이터가 잘려 나갑니다. 이를 막는 완벽한 트릭이 비트 스터핑입니다.

송신기의 조작 (Stuffing)

  • 송신기는 데이터를 보낼 때 눈에 불을 켜고 비트를 감시합니다.
  • 만약 본문 데이터 중에 1이 연속으로 5개(11111)가 나오는 순간! 뒤에 1이 또 나올지 모르는 위험한 상황이므로, 무조건 그 5개의 1 뒤에 강제로 가짜 비트 0을 하나 쑤셔 넣습니다(Stuffing).
  • 원본 본문: 01111110 (가짜 깃발 패턴 출현)
  • 송신 후: 011111 + 0(강제삽입) + 10011111010 (가짜 깃발이 부서짐!)
  • 이렇게 하면 본문 전체를 통틀어 '1이 6개 연속되는 구간'은 절대, 네버 존재할 수 없게 됩니다. 오직 진짜 양끝의 깃발(Flag)만이 1을 6개 가질 수 있습니다.

수신기의 해독 (Destuffing)

  • 수신기는 들어오는 데이터를 편안하게 읽습니다.
  • 그러다 1이 연속으로 5개(11111) 들어오는 것을 발견하면 바짝 긴장합니다. "송신기가 또 0을 끼워 넣었나?"
  • 만약 그다음 6번째 비트가 0이면? "아, 송신기가 스터핑한 0이구나!" 하고 그 0을 핀셋으로 쏙 뽑아서 쓰레기통에 버려버리고(Destuffing) 원본 데이터를 복원합니다.
  • 만약 그다음 6번째 비트가 1이면? "앗! 1이 6개네! 이건 진짜 프레임이 끝났다는 깃발(01111110)이다!"라고 판단하고 프레임을 칼같이 자릅니다.

Ⅲ. 비트 스터핑의 위력

  • 8비트를 통째로 끼워 넣던 문자 방식보다 오버헤드(쓸데없이 늘어나는 데이터 크기)가 극단적으로 적습니다.
  • 어떤 언어의 문자셋을 쓰든, 어떤 이진 파일을 보내든 전혀 상관없이 비트 레벨에서 기계적으로 처리되므로 현대 모든 동기식 시리얼 통신의 뼈대가 되었습니다.

📢 섹션 요약 비유: 비트 스터핑은 지하철의 **'빨간 모자 규칙'**입니다. 역장님(시작/끝)만 유일하게 '빨간 모자'를 쓸 수 있습니다. 만약 일반 승객(데이터) 중에 빨간 모자를 쓴 사람이 개찰구를 지나가려 하면, 역무원이 강제로 **'파란 스티커(비트 0)'**를 모자에 붙여버립니다(Stuffing). 반대쪽 역에서는 파란 스티커가 붙은 모자를 보면 "아, 저건 일반 승객이구나" 하고 스티커를 떼서 내보내 줍니다. 오직 스티커 없는 진짜 빨간 모자만 기차의 시작과 끝을 알립니다.