Step 35. TCP 심화 — 악수의 기술
Level 0 — 컴퓨터 조작과 구조의 이해 | 난이도 ★★★☆☆ | 예상 소요 시간 3시간
전제: Step 34(포트와 서비스) 완료. 윈도우 파워쉘과 종이·펜을 씁니다. 이 챕터의 최고의 실습 도구는 종이와 펜입니다.
- 준비물: 윈도우 PC, 파워쉘, 종이와 펜.
- 주의: 오늘 실습은 조회와 종이 위의 그리기뿐이라 100% 안전합니다.
전화를 걸 때를 생각해 보세요. 수화기를 들자마자 용건부터 말하는 사람은 없습니다. "여보세요?" — "네, 여보세요." — "아, 안녕하세요." 이 짧은 인사가 지나야 대화가 시작됩니다. 그리고 끝날 때도 "그럼 끊을게요" — "네, 들어가세요" 하고 끊지, 대뜸 끊지 않습니다.
인터넷의 주력 배달부인 TCP(Transmission Control Protocol)는 이 예절을 정확히 따라 하도록 설계되었습니다. 데이터를 보내기 전에 반드시 "연결"을 맺고, 끝낼 때도 정해진 작별 인사를 합니다. 오늘은 그 인사말들의 정확한 순서를 배웁니다.
지루한 암기처럼 보이겠지만, 이 세 장의 인사말이 보안 세계에서는 엄청난 일을 합니다. 포트 스캔이 이 인사로 이루어지고, 디도스 공격이 이 인사를 악용하고, 방화벽은 이 인사말을 읽어 판단합니다. 조용히, 하지만 아주 멀리 가는 챕터입니다.
1. 학습 목표
이 챕터를 끝내면 다음을 할 수 있습니다:
- TCP가 "연결 지향"이라는 말의 뜻을 설명한다
- 3-way handshake(SYN → SYN-ACK → ACK)를 백지에 그린다
- 주요 플래그(SYN, ACK, FIN, RST)의 역할을 말한다
- 연결 상태 표(Established, TimeWait, SynSent…)를 읽고 무슨 일인지 해석한다
- 포트 스캔이 이 악수를 어떻게 이용하는지 설명한다
2. 배경 지식 — 오늘의 도구와 개념
오늘의 도구 한눈에 보기
| 구분 | 내용 |
|---|---|
| 언어·환경 | 파워쉘 5.1 (조회만) + 종이와 펜 |
| 오늘의 명령어 | netstat -an | findstr ESTABLISHED(살아 있는 연결), Get-NetTCPConnection | Group-Object State(상태별 분포), Test-NetConnection(악수의 성패 확인) |
| 필요한 개념 | 연결 지향, 3-way handshake, 플래그(SYN/ACK/FIN/RST), 시퀀스 번호, 연결 종료 4회 악수 |
2-1. 연결 지향 — "선을 깔고 말하기"
통신 방식은 크게 둘로 나뉩니다. 연결 지향(connection-oriented) 방식인 TCP는 대화 전에 선을 깔고(연결을 맺고), 대화 중에는 잘 도착했는지 계속 확인하며, 끝나면 선을 걷습니다. 반대편에는 그런 절차 없이 그냥 던지는 비연결형 방식(UDP)이 있습니다.
연결 지향의 대가는 신뢰성입니다. TCP는 편지가 빠지면 다시 보내고, 순서가 뒤섞이면 바로잡습니다. 웹, SSH, 메일처럼 "한 글자도 빠지면 안 되는" 통신은 전부 TCP를 택했습니다.
2-2. 3-way handshake — 세 번의 인사
연결을 맺는 정확한 순서입니다. 클라이언트(부르는 쪽)와 서버(받는 쪽)의 그림으로 봅시다.
클라이언트 서버
|------ SYN -------->| "연결하고 싶습니다" (처음 인사)
|<---- SYN-ACK ------| "좋습니다, 저도 준비됐어요" (화답 + 확인)
|------ ACK -------->| "확인했습니다. 시작하죠" (마무리 인사)
| |
|=== 이제 데이터 ====>| 진짜 대화 시작
왜 두 번이 아니라 세 번일까요? 서로가 "내 말이 상대에게 닿았고, 상대의 말도 나에게 닿는다"를 확인하려면 최소 세 번이 필요합니다. SYN-ACK가 하나로 합쳐져 있지만, 역할로 보면 서버의 ACK("들었다")와 서버의 SYN("나도 시작하자")이 함께 담긴 것입니다.
2-3. 플래그 — 편지에 붙는 표시등
TCP 편지(세그먼트(segment))에는 목적을 알리는 작은 깃발, 플래그(flag)가 붙습니다. 네 개만 외우면 됩니다.
| 플래그 | 의미 | 전화 비유 |
|---|---|---|
| SYN | 연결 시작 요청 | "여보세요" (걸기) |
| ACK | 잘 받았다는 확인 | "네, 듣고 있습니다" |
| FIN | 정상적인 종료 요청 | "그럼 이만 끊을게요" |
| RST | 강제 리셋 | 전화를 벌컥 끊음 |
ACK는 특별한 행사가 아닙니다. 연결이 맺어진 뒤의 데이터 편지들은 거의 전부 "나 네 편지 받았어"라는 확인 표시로 ACK를 달고 다닙니다. handshake 이후의 TCP 통신은 "데이터 + 확인"의 연속입니다.
2-4. 종료는 네 번의 인사
끝낼 때는 FIN을 주고받으며 네 번의 인사로 마무리합니다.
클라이언트 서버
|------ FIN -------->| "이제 끊을게요"
|<------ ACK --------| "알겠어요"
|<------ FIN --------| "저도 이제 다 했어요, 끊죠"
|------ ACK -------->| "네, 수고하셨습니다"
시작(3번)보다 종료(4번)가 한 번 많은 이유: 시작에서는 서버의 "들었다"와 "나도 시작"이 한 편지(SYN-ACK)에 합쳐지지만, 종료는 합쳐지지 않습니다. 한쪽이 먼저 끊자고 해도 다른 쪽은 아직 보낼 데이터가 남았을 수 있어서, ACK를 먼저 보내고 FIN은 나중에 보냅니다. 작별은 각자 자기 할 말을 다 끝내야 할 수 있습니다.
2-5. 시퀀스 번호 — 편지의 일련번호
모든 TCP 편지에는 시퀀스 번호(sequence number, 일련번호)가 매겨져 있습니다. 받는 쪽은 이 번호로 순서를 맞추고, "3번 다음에 5번이 왔네? 4번 다시 주세요"라고 말할 수 있습니다. 이 번호 체계가 순서 보장과 재전송의 기반입니다.
보안 이야기 하나: 초기 TCP의 시작 번호는 예측 가능했습니다. 그래서 "다음 번호를 맞히는 공격자"가 남의 연결에 끼어드는 일(TCP 세션 하이재킹)이 가능했습니다. 현대 운영체제는 시작 번호를 무작위로 뽑아 이를 막습니다. "무작위성"이 보안 재료가 되는 대표 사례입니다.
2-6. 방화벽은 악수를 읽는다
오늘 배운 인사말이 방어 장비에게도 언어라는 이야기를 잠깐 하겠습니다. 현대의 방화벽은 편지 한 장만 보고 판단하지 않습니다. "이 편지가 어느 대화의 일부인가"를 기억합니다 — 이를 상태 추적(stateful inspection)이라고 합니다.
밖에서 갑자기 날아온 ACK는 "시작도 없이 확인만 오는 이상한 편지"라 버리고, 안에서 SYN으로 시작된 대화의 ACK는 통과시킵니다. 즉 방화벽은 오늘 여러분이 그린 그림을 그대로 알고 있고, 그 그림에서 벗어난 편지를 의심합니다. 규칙을 아는 자와, 그 규칙의 예외를 노리는 자의 대결이 이 한 장의 인사말에서 벌어집니다.
3. 따라 하기
3-1. 악수를 그리기
종이에 두 개의 기둥(클라이언트, 서버)을 세우고, 화살표 세 개로 handshake를 그려 보세요. 각 화살표에 SYN, SYN-ACK, ACK를 적습니다.
책을 보지 않고 그릴 수 있을 때까지 세 번 반복하세요. 머리로 아는 것과 손이 그리는 것은 다릅니다. 그림이 손에서 나오면 이해한 것입니다.
3-2. 지금 이 순간의 연결 상태 분포 보기
오늘 배운 인사말들은 지금 이 순간에도 여러분 컴퓨터에서 오가고 있습니다. 그 흔적을 상태별로 세어 봅시다.
Get-NetTCPConnection | Group-Object State | Sort-Object Count -Descending
Name Count
---- -----
Established 76
Bound 70
TimeWait 60
Listen 56
CloseWait 6
SynSent 1
(2026-09-09 실측. 숫자는 순간순간 바뀝니다.)
출력 읽는 법 — 각 상태가 바로 오늘 배운 인사말의 한 장면입니다:
Listen56 — Step 34의 "손님 기다리는 문" 56개.Established76 — 세 번의 악수를 통과한 "통화 중" 연결 76개.TimeWait60 — 작별 인사(FIN 4회)를 끝낸 뒤 잠시 자리를 지키는 연결. 뒤늦게 도착하는 편지를 처리하기 위한 여운 시간입니다. 방금 막 작별한 연결들이 60개나 됩니다.CloseWait6 — 상대가 FIN을 보냈는데("끊을게요") 내 쪽 프로그램이 아직 마무리 인사를 안 한 상태.SynSent1 — SYN을 보내고 상대의 SYN-ACK를 지금 이 순간 기다리는 중인 연결이 포착됐습니다. 악수 도중의 한 컷입니다.
여러분이 명령을 치는 그 순간에도 이 표의 숫자는 살아 움직입니다. 몇 번 반복해 치면서 숫자가 오르내리는 것을 보세요 — 눈에 안 보이던 악수와 작별이 숫자로 보이기 시작합니다.
3-3. 살아 있는 연결 보기
netstat -an | findstr ESTABLISHED
TCP 127.0.0.1:3452 127.0.0.1:64743 ESTABLISHED
TCP 127.0.0.1:3452 127.0.0.1:64744 ESTABLISHED
TCP 127.0.0.1:10086 127.0.0.1:64728 ESTABLISHED
(2026-09-09 실측. 여러분의 목록에는 브라우저가 연 443(HTTPS) 연결이 많이 보일 것입니다.)
출력 읽는 법: 왼쪽이 내 주소+포트, 오른쪽이 상대의 주소+포트입니다. 실측 줄들은 내 컴퓨터 안의 프로그램들끼리의 대화(127.0.0.1끼리)입니다. 브라우저로 웹사이트를 연 상태에서 치면 …:443과 ESTABLISHED인 줄들이 보입니다 — 전부 세 번의 인사를 무사히 마친 연결들입니다.
이 목록에 오른다는 것은 곧 "SYN → SYN-ACK → ACK가 성공했다"는 뜻입니다. 결과만 보고도 그 뒤의 악수를 재구성할 수 있습니다.
3-4. 악수의 성패를 결과로 추적하기
지난 챕터의 Test-NetConnection을 오늘의 눈으로 다시 봅시다.
Test-NetConnection 172.30.1.254 -Port 80
TcpTestSucceeded : True
(2026-09-09 실측, 출력 발췌.)
True 한 줄의 뒤에서 벌어진 일: 내 컴퓨터가 SYN을 보냈고 → 게이트웨이가 SYN-ACK로 화답했고 → 내 컴퓨터가 ACK로 마무리했다. 세 마디가 무사히 오갔기에 True입니다.
닫힌 문(127.0.0.1:65000, 2026-09-09 실측)은 False였습니다. 그 뒤에서 벌어진 일: SYN을 보냈지만 → "그런 호수 없습니다"라는 RST가 돌아왔다. 같은 "응답"이라도 SYN-ACK(환영)와 RST(거절)는 정반대입니다.
3-5. 스캔의 원리 — 대답의 세 종류
이제 이 악수가 스캔 도구(nmap 같은)의 재료가 되는 원리를 정리합니다. 스캐너가 포트에 SYN을 보냈을 때:
| 돌아온 대답 | 뜻 | 스캐너의 판정 |
|---|---|---|
| SYN-ACK | "좋습니다" — 서비스가 기다리는 중 | 열림(open) |
| RST | "그런 호수 없습니다" — 벌컥 끊음 | 닫힘(closed) |
| (침묵) | 방화벽이 편지를 조용히 버림 | 걸러짐(filtered) |
읽는 법: 스캔 도구는 마법이 아닙니다. TCP의 예절 규칙을 이용해 "문을 두드리고 대답을 분류하는" 기계일 뿐입니다. 그리고 3-4절에서 여러분은 이 분류를 손으로 두 번 모두 해 본 것입니다.
예측해 보기: 공격자가 SYN만 보내고 마지막 ACK를 절대 안 보낸다면 서버는 어떤 상태가 될까요? (정답: 서버는 SYN-ACK를 보내고 상대의 마지막 ACK를 하염없이 기다리는 "반쯤 열린" 연결을 떠안게 됩니다. 이런 반쪽 연결이 수만 개 쌓이면 서버의 기억 공간이 마비됩니다 — SYN 플러드 공격의 씨앗입니다. 지금은 "인사를 억지로 끊으면 상대가 곤란해진다"는 직관만 가져가세요.)
3-6. 비유로 압축하기
오늘 배운 것을 전화 비유 한 문단으로 압축해 소리 내어 말해 보세요.
"TCP는 전화와 같다. 걸 때 여보세요(SYN), 받아서 네 여보세요(SYN-ACK), 아 네(ACK)로 시작한다. 통화 중에는 네네(ACK) 하며 잘 듣고 있다고 확인하고, 순서가 꼬이지 않게 번호를 매긴다(시퀀스 번호). 끝날 때는 끊을게요(FIN), 네(ACK), 저도요(FIN), 네(ACK)로 정중하게 끝낸다. 상대가 없는 번호면 벌컥 끊김(RST)이 온다."
이 문단이 술술 나오면 이 챕터의 핵심은 끝난 것입니다.
4. 미션과 연습문제
미션 — 내 컴퓨터의 악수 관찰 일지
- 브라우저로 웹사이트 두 곳을 차례로 방문하세요
- 방문 직후
netstat -an | findstr ESTABLISHED를 실행해 443번 연결 줄을 찾으세요 Get-NetTCPConnection | Group-Object State로 상태 분포를 기록하세요- 2~3분 뒤 같은 명령을 다시 실행해, 늘어난 것과 줄어든 것(특히 TimeWait의 변화)을 비교해 적으세요
- 관찰 결과를
tcp-diary.txt에 정리하고, 마지막 줄에 "오늘 내 컴퓨터에서 SYN을 보내고 답을 기다리는 중(SynSent)인 연결은 __개였다"를 채우세요
연습문제
문제 1. 책을 덮고 3-way handshake를 백지에 그리세요. 화살표 방향과 플래그 이름이 모두 맞아야 합니다.
문제 2. 포트 스캐너가 SYN을 보냈을 때 돌아올 수 있는 대답 세 가지와, 각각에 대한 스캐너의 판정을 적으세요.
문제 3. 연결 종료는 왜 시작(3번)보다 한 번 많은 4번일까요? SYN-ACK는 합쳐지는데 종료의 ACK와 FIN은 왜 안 합쳐지는지로 설명하세요.
문제 4. "웹사이트에 접속이 안 됩니다"라는 신고를 받았습니다. 악수의 어느 마디에서 멈췄는지에 따라 원인 후보가 어떻게 달라지는지, 세 갈래로 나누어 말하세요.
5. 모범 답안과 완료 기준
미션 모범 답안
실측 컴퓨터의 관찰 일지 예 (2026-09-09):
[방문 직후 ESTABLISHED]
127.0.0.1:3452 ↔ 127.0.0.1:64743 ESTABLISHED
(브라우저를 열었다면) 내주소:5xxxx ↔ 외부서버:443 ESTABLISHED
[상태 분포 — 1차]
Established 76 / Bound 70 / TimeWait 60 / Listen 56 / CloseWait 6 / SynSent 1
[2분 뒤 — 2차]
TimeWait가 줄고 Established가 늘거나 그 반대 — 탐색할수록 새 연결이 생기고,
끝난 연결은 TimeWait를 거쳐 사라진다
[마지막 줄 예]
"오늘 내 컴퓨터에서 SYN을 보내고 답을 기다리는 중(SynSent)인 연결은 1개였다"
검증하는 법: ① 443번 ESTABLISHED 줄을 찾았는가(브라우저 방문 직후여야 잘 보입니다 — 잠시 후면 작별 인사를 하고 사라집니다). ② 두 시점의 상태 분포가 기록됐는가. ③ "TimeWait는 종료를 마친 연결의 여운"이라는 해석이 붙어 있는가. 숫자 자체는 매번 다릅니다 — 숫자가 아니라 상태 이름을 해석할 수 있으면 완료입니다.
연습문제 해답
문제 1 해답. 클라이언트 → 서버로 SYN, 서버 → 클라이언트로 SYN-ACK, 클라이언트 → 서버로 ACK. 흔한 오류: 두 번째 화살표의 방향(서버가 답합니다), SYN-ACK를 "ACK-SYN"으로 적는 것(답이 먼저 나오는 이상한 순서는 없습니다), 세 번째를 생략하는 것(세 번째 ACK까지 와야 연결이 완성됩니다).
문제 2 해답. ① SYN-ACK → 열림(open) — 서비스가 예절대로 화답. ② RST → 닫힘(closed) — "그런 호수 없다"는 거절. ③ 침묵 → 걸러짐(filtered) — 방화벽이 편지를 조용히 버린 것으로 의심.
문제 3 해답. 시작에서는 서버의 "들었다(ACK)"와 "나도 시작하자(SYN)"가 같은 순간에 결정되니 한 편지(SYN-ACK)로 합쳐집니다. 그러나 종료에서는 "들었다(ACK)"는 즉시 할 수 있어도 "나도 끝낼게(FIN)"는 아직 보낼 데이터를 다 보낸 뒤에야 가능합니다. 그 시간차 때문에 종료는 두 편지로 나뉘고, 양쪽이 각각 마무리하니 총 네 번이 됩니다.
문제 4 해답. ① SYN이 안 나감 → 내 쪽 문제(연결·주소·게이트웨이 층). ② SYN은 갔는데 아무 대답이 없음 → 중간 경로 또는 상대 측 문제(방화벽의 침묵 포함). ③ RST가 돌아옴 → 상대 서버까지는 닿았으나 그 포트의 서비스가 꺼져 있음. 같은 "안 됨"이 세 가지 다른 병이고, 처방도 셋이 다릅니다.
완료 기준 체크리스트
- [ ] 3-way handshake를 백지에 그릴 수 있다
- [ ] 종료 절차(FIN 네 번)를 그릴 수 있다
- [ ] SYN, ACK, FIN, RST의 역할을 말할 수 있다
- [ ] 상태 표에서 Established, TimeWait, SynSent의 의미를 해석할 수 있다
- [ ] 포트 스캔이 handshake의 대답을 분류하는 원리임을 설명할 수 있다
- [ ] 시퀀스 번호의 역할(순서와 재전송)을 한 문장으로 말할 수 있다
- [ ] 미션:
tcp-diary.txt관찰 일지를 완성했다
6. 흔한 실수와 해결
벽 1. "SYN, SYN-ACK, ACK 순서가 자꾸 헷갈려요."
증상: 두 번째가 뭐였는지, 서버가 뭘 보내는지 섞입니다.
원인: 글자로 외우려 해서입니다.
해결: 전화 비유로 가세요. "여보세요(걸기) → 네 여보세요(받기) → 아 네(확인)". 비유는 안 잊힙니다. 그림 세 번 그리기도 효과적입니다.
벽 2. "상태 표에 모르는 단어가 너무 많아요."
증상: Bound, CloseWait, TimeWait 같은 상태 이름에 막힙니다.
원인: 상태는 전부 오늘 배운 인사말의 한 장면일 뿐입니다.
해결: 세 개만 확실히 읽으세요 — Listen(기다리는 문), Established(통화 중), TimeWait(작별 후 여운). 나머지는 "악수 또는 작별의 중간 장면"으로 분류하면 됩니다. 3-2절 실측에서 SynSent 1개가 포착됐듯, 중간 상태는 순간이라 개수가 적은 게 정상입니다.
벽 3. "ACK만 오는 패킷은 대체 뭔가요?"
증상: 설명을 읽다가 "ACK 플래그만 켜진 패킷"이라는 표현에 막힙니다.
원인: 연결이 맺어진 뒤의 데이터 편지들은 거의 전부 ACK를 달고 다닙니다 — "나 네 편지 받았어"라는 확인 표시를 항상 겸하기 때문입니다.
해결: handshake 이후의 TCP 통신은 "데이터 + 확인"의 연속이라고 이해하면 됩니다. ACK는 특별한 행사가 아니라 일상의 인사입니다.
벽 4. "Test-NetConnection에서 빨간 경고가 떠서 실패한 줄 알았어요."
증상: 닫힌 포트에서 경고: TCP connect to (… ) failed 같은 경고 줄이 뜹니다 (2026-09-09 실측).
원인: 오류가 아니라 결과 보고입니다. "연결해 봤는데 안 됐다"는 것이 이 명령의 정상 출력의 일부입니다.
해결: 경고 줄이 아니라 결과표를 읽으세요. TcpTestSucceeded : False가 "닫힘"의 뜻이고, 그 뒤에서 SYN에 대해 RST(또는 침묵)가 돌아온 것입니다.
벽 5. "RST가 어떤 상황에서 오는 건지 정리가 안 돼요."
증상: RST의 등장 상황이 여러 곳이라 헷갈립니다.
원인: RST는 "비정상 상황의 만능 리셋"이라 등장 무대가 여럿입니다.
해결: 세 가지만 기억하세요. ① 없는 호수에 연결 요청이 왔을 때 ② 이미 끊긴 연결로 편지가 왔을 때 ③ 뭔가 말이 안 맞을 때 강제로 끊을 때. 공통점은 "이 대화는 성립 불가"라는 선언입니다.
7. 정리
오늘의 개념
| 개념 | 한 줄 설명 |
|---|---|
| TCP | 연결 지향 배달부 — 선을 깔고, 확인하며, 정중히 끝낸다 |
| 3-way handshake | SYN → SYN-ACK → ACK, 연결의 세 번 인사 |
| 플래그 | SYN(시작) / ACK(확인) / FIN(정상 종료) / RST(강제 리셋) |
| 종료 4회 악수 | FIN→ACK→FIN→ACK — 작별은 각자 마무리 |
| 시퀀스 번호 | 편지의 일련번호 — 순서 보장과 재전송의 기반 |
| TimeWait | 작별을 마친 연결의 여운 시간 |
| 상태 추적 방화벽 | 대화의 맥락을 기억하고 예절 밖의 편지를 의심하는 장비 |
오늘의 명령어
| 명령 | 하는 일 |
|---|---|
netstat -an | findstr ESTABLISHED |
악수를 통과한 연결 보기 |
Get-NetTCPConnection | Group-Object State |
연결 상태별 분포 보기 |
Test-NetConnection 주소 -Port 번호 |
악수의 성패 확인 (내 장비 한정) |
명령어보다 중요한 감각
3-way handshake를 아는 사람과 모르는 사람은 같은 장애를 다르게 봅니다. "연결이 안 돼요"에, 모르는 사람은 "인터넷 고장"으로 끝내지만, 아는 사람은 악수의 어느 마디에서 멈췄는지를 묻습니다. 대답 없음, RST, 완성 안 된 악수 — 같은 "안 됨"이 세 가지 다른 병입니다. 문제의 위치를 묻는 능력이 실력입니다.
오늘 챕터에는 명령어가 적고 그림이 많았습니다. 이런 챕터가 가장 오래 갑니다. 명령어는 잊어도 그림은 남고, 그 그림이 낯선 상황에서 길을 찾게 해 줍니다. 정상적인 예절을 아는 사람만이 이상한 예절을 알아봅니다 — 스캔의 반쪽 악수도, 플러드의 밀려드는 SYN도, 전부 오늘의 밝은 그림 위에서 보이는 변형입니다. 세 번의 인사와 네 번의 작별, 이제 여러분의 것입니다.
전부 체크되면 Step 35 완료입니다. 사이드바의 체크박스를 눌러 진도를 저장하세요.