핵심 인사이트 (3줄 요약)
- 본질: TCP 헤더의 정중앙에 위치한 6개의 제어 플래그(Control Flags)는, 현재 날아가고 있는 이 쇳덩어리(패킷)가 "이제 막 인사하는 놈인지, 대답하는 놈인지, 헤어지자는 놈인지, 빡쳐서 밥상을 엎는 놈인지" 통신의 성격과 상태를 단 1비트의 전구 스위치로 명확히 규정하는 핵심 상태 지시자다.
- 3-Way Handshake의 주인공 (SYN, ACK): 통신을 처음 시작할 때 "우리 통신하자!"라고 손을 내미는 SYN(동기화) 불이 켜지고, 상대방은 "오케이, 네 말 잘 들었어!"라고 대답하는 ACK(확인 응답) 불을 켜서 화답하며 절대적인 신뢰 터널을 파 내려간다.
- 이별과 강제 종료 (FIN, RST): 통신을 끝낼 때 "나 이제 보낼 데이터 다 보냈어. 그만 끊자"라고 정중하게 이별을 고하는 FIN(종료) 불이 켜지며, 해킹 공격이 들어오거나 서버가 미쳐버렸을 때 "야 다 닥치고 당장 통신 끊어!!"라며 비정상적으로 멱살을 잡고 선을 뽑아버리는 무자비한 RST(리셋) 불이 켜진다.
Ⅰ. 개요 및 필요성 (Context & Necessity)
-
개념: TCP 세그먼트 헤더에 포함된 6비트 길이의 플래그 필드로, 각 비트가 1(On) 또는 0(Off)의 값을 가지며 해당 패킷의 논리적 목적과 처리 방식을 수신 측 운영체제에 지시한다.
-
필요성: 수백만 개의 TCP 패킷이 쏟아져 들어올 때, 운영체제는 이 패킷들을 어떻게 요리해야 할지 0.01초 만에 판단해야 한다. 만약 제어 플래그가 없다면? 운영체제는 패킷의 내용물을 다 까보고 앞뒤 문맥을 파악한 뒤에야 "아~ 이거 접속을 끊자는 패킷이구나!" 하고 뒷북을 칠 것이다. "야, 복잡하게 내용물 까보게 하지 말고, 겉봉투에 '연결요청', '수신확인', '긴급종료' 같은 체크박스 6개를 만들어서 딱 빨간펜으로 V표시를 쳐서 보내!" 이것이 플래그 비트의 탄생이다.
-
💡 비유: 제어 플래그는 군대 무전 통신의 **"무전 수신호(음어)"**와 같습니다.
- SYN: "본부 응답하라, 여기는 독수리! (통신 개시 요청)"
- ACK: "독수리, 본부 잘 들린다. 송신 바람! (수신 양호)"
- FIN: "독수리, 보고 끝. 이상! (통신 정상 종료)"
- RST: "야 적군이다! 무전기 당장 부숴!! (비정상 강제 종료)"
📢 섹션 요약 비유: TCP의 6개 전등 스위치(플래그)는 자동차의 **"방향지시등과 브레이크등"**입니다. 뒤따라오는 차(수신자)는 앞차의 깜빡이(SYN)와 빨간불(FIN)만 보고도 앞차가 우회전을 할지 멈출지 그 의도를 100% 정확하게 예측하고 대응할 수 있습니다.
Ⅱ. 6대 플래그의 실무적 역할과 조합 (Deep Dive)
와이어샤크(Wireshark) 패킷 분석의 기본이자 방화벽 룰 세팅의 알파와 오메가다.
1. 연결의 시작: SYN (Synchronize, 동기화)
- 역할: "내 초기 시퀀스 번호(ISN)는 100번이야! 나랑 통신 시작하자!"
- 특징: 오직 통신을 처음 뚫을 때, 첫 번째 패킷과 두 번째 패킷에만 딱 2번 불이 켜지고 평생 꺼져 있다.
- 방화벽 실무: 방화벽에서 "외부에서 들어오는
SYN패킷을 다 버려(Drop)!"라고 세팅하면, 안에서 밖으로 나가는 건 되지만 밖에서 안으로 치고 들어오는 접속은 원천 차단된다. (Stateful 방화벽의 기본 원리다).
2. 신뢰의 증명: ACK (Acknowledgment, 확인 응답)
- 역할: "네가 보낸 100번 패킷 무사히 잘 받았다! (다음에 101번 보내!)"
- 특징: 통신 맨 처음의 SYN 패킷 딱 1개를 제외하고, 인터넷을 날아다니는 모든 99.999%의 TCP 패킷에는 무조건 이 ACK 불이 켜져 있다. (내가 데이터를 보내는 중에도, 예전에 받은 데이터를 잘 받았다는 영수증을 끊임없이 동봉해서 보내기 때문).
3. 밀어내기: PSH (Push, 푸시)
- 역할: "버퍼 꽉 찰 때까지 기다리지 말고, 지금 당장 애플리케이션 화면에 이 데이터 띄워줘!"
- 특징: 키보드로 채팅을 치거나 텔넷(Telnet) 명령어를 칠 때, 한 글자 칠 때마다 즉각 반응해야 하므로 PSH 불이 켜져서 날아간다.
4. 아름다운 이별: FIN (Finish, 종료)
- 역할: "나 이제 더 이상 너한테 보낼 데이터 없어. 세션 우아하게 끊자."
- 특징: 양쪽이 서로서로 "나도 끝!", "나도 끝!"이라며 4번의 핑퐁(4-Way Handshake)을 거쳐 램(RAM)에 잡아뒀던 세션 메모리를 예쁘게 청소하고 헤어진다.
5. 밥상 엎기: RST (Reset, 초기화)
- 역할: "야, 너 누군데 나한테 데이터 보내? 난 너랑 연결 맺은 적 없어! 닥치고 연결 끊어!"
- 특징: 비정상적인 종료다. 해커가 열리지도 않은 포트를 스캔하려 들 때 서버가 "포트 닫혔어!"라며 튕겨낼 때 쏘거나, 서버 프로세스가 뻑이 나서 미쳐버렸을 때 기존 클라이언트들을 다 내쫓기 위해 냅다 쏜다.
6. 응급실: URG (Urgent, 긴급)
- 역할: "이 패킷 안에 폭탄 해체 암호(긴급 데이터)가 들어있으니까 순서 무시하고 제일 먼저 처리해!"
- 특징: 이 불이 켜져 있으면, 나중에 배울
Urgent Pointer(긴급 포인터)가 가리키는 지점의 데이터를 OS가 0순위로 뽑아간다. (현대 인터넷에서는 거의 안 쓴다).
┌─────────────────────────────────────────────────────────────┐
│ TCP 플래그의 실전 조합 (와이어샤크 뷰) │
├─────────────────────────────────────────────────────────────┤
│ │
│ 1) [SYN] : 클라이언트가 서버 찌를 때 (최초 1회) │
│ 2) [SYN, ACK] : 서버가 "어 그래 통신하자!"라고 대답할 때 │
│ 3) [ACK] : 클라이언트가 "오케이 나도 준비 끝!" 할 때 │
│ 4) [PSH, ACK] : 실제 카톡 메시지(데이터)가 쓩 날아갈 때 │
│ 5) [FIN, ACK] : 다 쓰고 나서 "이제 끊자~" 라고 손 흔들 때 │
│ 6) [RST] : 해커가 포트 스캔하다가 서버한테 싸대기 맞을 때 │
│ │
│ ▶ "이 전등 6개의 켜짐/꺼짐 조합만으로 인터넷의 모든 행동이 설명된다!" │
└─────────────────────────────────────────────────────────────┘
📢 섹션 요약 비유: 6개의 제어 플래그는 카카오톡 대화방의 **"시스템 메시지"**입니다. [님이 입장하셨습니다(SYN)], [메시지 읽음 표시(ACK)], [상대방이 나갔습니다(FIN)], [강제 퇴장당하셨습니다(RST)]라는 명확한 꼬리표 덕분에 우리는 대화방의 상태를 직관적으로 꿰뚫어 볼 수 있습니다.