# 시작 문자열 (Start String)

시작 문자열(Start String)은 비트코인 P2P 프로토콜에서 모든 메시지의 시작을 알리는 4바이트로, 연속적인 데이터 스트림 안에서 다음 메시지를 찾을 수 있게 합니다. 네트워크 매직(network magic) 또는 매직 바이트라고도 합니다.

## 메시지의 시작 표시

노드끼리 주고받는 데이터는 끊김 없는 바이트의 흐름으로 도착합니다. 편지 더미를 분류할 때 봉투마다 찍힌 우표를 보고 편지 한 통의 시작과 출신 지역을 알아보듯, 노드는 약속된 4바이트를 찾아 개별 메시지의 경계를 표시하고, 그 메시지가 어느 네트워크에서 왔는지도 확인합니다.

## P2P 메시지 헤더의 구조

비트코인 P2P 메시지는 24바이트 헤더와 그 뒤의 본문(페이로드)으로 이루어지며, 시작 문자열은 헤더의 맨 앞에 옵니다.

| 필드 | 크기 | 내용 |
|---|---|---|
| 시작 문자열(start string) | 4바이트 | 네트워크를 나타내는 매직 값 |
| 명령 이름(command name) | 12바이트 | version, inv, tx, block 같은 메시지 유형(ASCII, 남는 자리는 0으로 채움) |
| 페이로드 크기(payload size) | 4바이트 | 본문의 바이트 수(리틀 엔디언 정수) |
| 체크섬(checksum) | 4바이트 | 본문을 SHA-256으로 두 번 해시한 값의 처음 4바이트 |

## 네트워크별 값

네트워크마다 서로 다른 값을 쓰므로, 다른 네트워크에서 온 메시지를 구분하는 데도 쓰입니다. 아래 값은 전송되는 바이트 순서대로 적은 것입니다.

- **메인넷:** 0xF9BEB4D9
- **테스트넷(testnet3):** 0x0B110907
- **시그넷(기본 signet):** 0x0A03CF40
- **리그테스트(regtest):** 0xFABFB5DA

Bitcoin Core는 이 값을 일반 데이터에 잘 나타나지 않도록 골랐다고 설명합니다. 잘 쓰이지 않는 상위 ASCII 바이트로 이루어져 UTF-8 문자로도 유효하지 않고, 어떤 정렬로 읽어도 큰 32비트 정수가 되도록 했습니다. 같은 값은 노드가 디스크에 저장하는 블록 파일(blk*.dat)에서도 각 블록 앞에 붙어 블록의 시작을 표시합니다.

예를 들어 테스트넷 노드가 메인넷 노드에 접속하면 시작 문자열이 맞지 않으므로 메시지가 처리되지 않습니다.

## 왜 중요할까요?

- **메시지 동기화:** 노드가 새 메시지의 시작을 빠르게 식별하도록 도와 네트워크와 동기화된 상태를 유지합니다.
- **네트워크 구분:** 메인넷, 테스트넷 등 서로 다른 네트워크의 메시지가 섞이지 않도록 합니다.
- **효율적인 처리:** 노드가 관련 없는 데이터를 건너뛰고 다음 유효한 메시지의 시작 위치를 직접 찾을 수 있습니다.

다만 메시지 내용의 무결성은 시작 문자열이 아니라 메시지 헤더의 체크섬으로 따로 검사합니다. 또한 시작 문자열은 항상 같은 값이므로, 암호화되지 않은 연결에서는 네트워크 관찰자가 비트코인 트래픽을 식별하는 단서가 될 수 있습니다.

---
출처: https://achivx.kr/glossary/start-string-%EC%8B%9C%EC%9E%91-%EB%AC%B8%EC%9E%90%EC%97%B4/ · ACHIVX 용어 사전 · 수정일 2026-10-20
