TCP 3-Way Handshake를 Packet으로 직접 분석하기
TCP 3-Way Handshake를 Packet으로 직접 분석하기#
1장 TCP 연결은 어디에서 시작될까#
1.1 Connection Timeout이라는 한 줄만으로는 원인을 알 수 없다#
주차관제 현장에서 결제단말이 중앙 Server에 연결되지 않는다고 가정해보겠습니다.
Application Log에는 다음과 같이 기록되어 있습니다.
2026-09-24 10:31:04
Connection Timeout
Server: 192.168.100.20:8000이 정보만으로는 원인을 판단하기 어렵습니다.
가능한 원인은 매우 다양합니다.
장비 Application 문제
잘못된 Server IP
잘못된 TCP Port
VLAN 문제
Default Gateway 오류
Routing 문제
Firewall 차단
Server Down
Server에서 Service 미실행
Return Path 문제이때 Packet Capture를 보면 중요한 질문에 답할 수 있습니다.
SYN은 실제로 나갔는가?
Server까지 도착했는가?
SYN/ACK가 돌아왔는가?
Client가 ACK를 보냈는가?
누군가 RST를 보냈는가?TCP 연결 장애는 바로 이 세 개의 Packet에서 시작해 범위를 좁힐 수 있습니다.
1.2 정상적인 TCP 연결은 세 단계로 시작한다#
TCP Client가 Server에 연결할 때 일반적인 흐름은 다음과 같습니다.
Client Server
│ │
│ SYN │
├─────────────────────────────→│
│ │
│ SYN, ACK │
│←─────────────────────────────┤
│ │
│ ACK │
├─────────────────────────────→│
│ │
│ ESTABLISHED │이를 TCP 3-Way Handshake라고 합니다.
세 Packet은 단순한 인사말이 아닙니다.
양쪽 TCP Stack이:
Connection을 시작하고
각 방향의 Sequence Number를 동기화하고
TCP Option을 교환하고
상대방과 양방향 통신이 가능한지 확인하는과정입니다.
2장 첫 번째 Packet — SYN#
2.1 Client가 Connection을 시작한다#
다음 환경을 가정해보겠습니다.
RFID Reader
10.0.0.5
Server
192.168.1.100
Server TCP Port
8000Client가 Connection을 시작하면 첫 번째 TCP Segment에 SYN Flag가 설정됩니다.
10.0.0.5:50123
↓
192.168.1.100:8000
SYN여기에서:
10.0.0.5
→ Source IP
50123
→ Source Port
192.168.1.100
→ Destination IP
8000
→ Destination Port입니다.
2.2 Source Port와 Destination Port의 의미#
Server는 일반적으로 특정 Port에서 Client의 연결을 기다립니다.
예:
Server
TCP 8000
LISTENClient는 보통 임시 Source Port를 사용합니다.
예:
50123따라서 하나의 연결을 보면:
10.0.0.5:50123
↕
192.168.1.100:8000처럼 표현할 수 있습니다.
현장에서 Packet을 분석할 때는 IP만 보지 말고 Port까지 함께 확인하는 습관이 중요합니다.
2.3 SYN에는 Initial Sequence Number가 들어간다#
TCP는 Byte Stream의 위치를 관리하기 위해 Sequence Number를 사용합니다.
Connection을 시작할 때 Client는 자신의 Initial Sequence Number, 즉 ISN을 선택합니다.
설명을 단순화하기 위해 다음 값을 사용해보겠습니다.
Client ISN
1000그러면 첫 번째 SYN은:
SYN
Seq = 1000처럼 볼 수 있습니다.
실제 운영체제의 ISN은 이런 작은 숫자를 순서대로 단순 증가시키는 방식으로 이해하면 안 됩니다.
Packet 분석 도구 역시 사람이 보기 쉽게 Relative Sequence Number를 표시하는 경우가 많습니다.
3장 두 번째 Packet — SYN/ACK#
3.1 Server가 Client의 SYN을 받는다#
Server의 TCP Port 8000에서 정상적으로 Service가 대기 중이고 연결을 받아들일 수 있다면 Server가 응답합니다.
Client Server
SYN
Seq=1000
─────────────────────────────→
SYN,ACK
←─────────────────────────────Server도 자신의 Initial Sequence Number를 선택합니다.
예:
Server ISN
30003.2 ACK 번호는 왜 Client ISN + 1일까#
Server의 Packet을 단순화하면 다음과 같습니다.
SYN = 1
ACK = 1
Seq = 3000
Ack = 1001Client가 보낸 SYN의 Sequence Number가 1000이었기 때문에 Server는:
ACK = 1001을 보냅니다.
TCP에서는 SYN 자체도 Sequence Number 공간에서 하나를 소비합니다.
따라서:
Client SYN
Seq 1000
Server
Ack 1001이 되는 것입니다.
4장 세 번째 Packet — ACK#
4.1 Client가 Server의 SYN을 확인한다#
Client는 Server가 보낸:
SYN
Seq = 3000을 확인합니다.
그리고 다음과 같이 ACK를 보냅니다.
ACK = 3001전체 흐름을 다시 보면:
Client Server
SYN
Seq=1000
───────────────────────────────────→
SYN, ACK
Seq=3000 Ack=1001
←───────────────────────────────────
ACK
Ack=3001
───────────────────────────────────→이 과정을 통해 양쪽이 서로의 Sequence Number 공간을 확인합니다.
4.2 언제 ESTABLISHED가 되는가#
TCP 내부 상태는 두 Endpoint에서 완전히 같은 순간에 바뀌는 것은 아닙니다.
일반적으로 Server는 마지막 ACK를 정상적으로 수신한 뒤 ESTABLISHED 상태로 들어가고, Client는 SYN/ACK을 확인하고 마지막 ACK를 보내면서 연결이 성립한 상태로 전환합니다.
사용자가 실제로 보는 수준에서는 다음처럼 이해해도 충분합니다.
SYN
↓
SYN/ACK
↓
ACK
↓
TCP Connection Established이제 Application Data를 주고받을 수 있습니다.
5장 실제 Packet Capture를 읽어보자#
5.1 tcpdump에서 정상 Handshake#
다음은 이해를 위해 단순화한 예입니다.
10:00:00.000000
10.0.0.5.50123 > 192.168.1.100.8000
Flags [S]
seq 1000
win 64240
length 0
10:00:00.010000
192.168.1.100.8000 > 10.0.0.5.50123
Flags [S.]
seq 3000
ack 1001
win 28960
length 0
10:00:00.020000
10.0.0.5.50123 > 192.168.1.100.8000
Flags [.]
ack 3001
win 64240
length 0tcpdump에서 Flag 표기를 읽으면:
[S]
→ SYN
[S.]
→ SYN + ACK
[.]
→ ACK로 이해할 수 있습니다.
5.2 세 줄만 보고도 확인할 수 있는 정보#
첫 번째 Packet:
10.0.0.5.50123
→
192.168.1.100.8000
SYNClient가 Server의 TCP 8000 Port로 연결을 시도했습니다.
두 번째 Packet:
192.168.1.100.8000
→
10.0.0.5.50123
SYN + ACKServer가 SYN을 받았고 응답했습니다.
세 번째 Packet:
10.0.0.5.50123
→
192.168.1.100.8000
ACKClient 역시 Server의 응답을 받았습니다.
따라서 적어도 Packet Capture 위치에서 보면:
양방향 IP 통신
+
TCP 8000 연결
+
3-Way Handshake가 성립했다고 볼 수 있습니다.
6장 Wireshark에서 Handshake를 찾는 방법#
6.1 특정 TCP Port만 보고 싶을 때#
Wireshark Display Filter에서:
tcp.port == 8000처럼 사용할 수 있습니다.
해당 Port와 관련된 TCP Traffic을 확인할 수 있습니다.
6.2 SYN Packet만 확인하고 싶을 때#
예를 들어 초기 SYN을 찾을 때는 상황에 맞는 TCP Flag Filter를 사용할 수 있습니다.
개념적으로 확인해야 하는 것은:
SYN = 1
ACK = 0인 Packet입니다.
Wireshark UI에서는 TCP Header를 펼쳐 다음 Field를 직접 확인할 수도 있습니다.
Source Port
Destination Port
Sequence Number
Acknowledgment Number
Flags
Window
TCP Options6.3 Relative Sequence Number에 주의한다#
Wireshark는 기본 설정에서 Sequence Number를 사람이 읽기 쉽게 상대적인 값으로 보여줄 수 있습니다.
실제 Wire상 Sequence Number가:
2841938721이더라도 화면에서는:
Seq = 0처럼 보일 수 있습니다.
이후 데이터는:
Seq = 1
Seq = 501
Seq = 1001등으로 표시될 수 있습니다.
따라서:
왜 실제 Sequence Number가 항상 0이나 1부터 시작하지?
라고 오해하지 않아야 합니다.
실제 값과 Relative Sequence Number를 구분해야 합니다.
7장 SYN Packet에서는 TCP Option도 확인한다#
7.1 MSS#
MSS는 Maximum Segment Size입니다.
상대방에게:
나는 하나의 TCP Segment에서 이 정도 크기의 TCP Payload까지 받을 수 있다.
는 정보를 알려줍니다.
예:
MSS = 1460Ethernet MTU 1500 환경에서 IPv4와 기본 TCP Header를 사용하는 전형적인 상황에서 자주 볼 수 있는 값입니다.
하지만 IPv6, TCP Option, Tunnel, 다른 MTU 환경에서는 조건이 달라질 수 있습니다.
7.2 Window Scale#
TCP Header의 기본 Window Field만으로 표현할 수 있는 범위를 확장하기 위한 Option입니다.
고속·고지연 Network에서는 큰 Receive Window가 필요할 수 있기 때문에 Window Scaling이 중요해질 수 있습니다.
Handshake 시 협상되는 Option이므로 연결된 뒤 갑자기 새로 활성화하는 방식으로 이해하면 안 됩니다.
7.3 SACK Permitted#
Selective Acknowledgment를 사용할 수 있다는 사실을 상대방에게 알립니다.
SACK Permitted가 Handshake 과정에서 교환되었다면 이후 Packet Loss가 발생했을 때 Receiver가 자신이 받은 특정 데이터 범위를 더 구체적으로 알려주는 데 사용할 수 있습니다.
7.4 Timestamp#
TCP Timestamp Option을 사용하는 환경도 있습니다.
Packet Capture에서는:
TSval
TSecr같은 Field를 볼 수 있습니다.
RTT 측정 등 여러 TCP 기능에 활용될 수 있습니다.
모든 TCP Connection이 동일한 Option을 사용하는 것은 아닙니다.
8장 Handshake를 볼 때 가장 먼저 확인해야 하는 것#
Packet을 열자마자 Sequence Number부터 볼 필요는 없습니다.
현장에서는 더 단순한 순서가 효과적입니다.
8.1 IP가 맞는가#
Source IP
Destination IP를 확인합니다.
잘못된 Server IP로 연결하고 있는 경우 의외로 많습니다.
8.2 Port가 맞는가#
Source Port
Destination Port를 봅니다.
특히 Server Port가 중요합니다.
예:
설정
Server Port 8000
실제 Service
TCP 8080이라면 Network가 정상이어도 연결되지 않습니다.
8.3 SYN이 실제로 나가는가#
Application Log에는:
Connecting...이라고 나오는데 Packet Capture에는 SYN이 전혀 없을 수도 있습니다.
이 경우 Network 밖보다 먼저:
Application 설정
Local Firewall
Routing Table
Socket 생성 오류등 Client 내부를 확인해야 합니다.
9장 실패 패턴 1 — SYN만 반복된다#
9.1 Packet Capture#
다음과 같이 보인다고 하겠습니다.
10:00:00 SYN
10:00:01 SYN
10:00:03 SYN
10:00:07 SYN
...SYN은 반복되지만 SYN/ACK이 없습니다.
9.2 무엇을 의미할까#
현재 Capture 위치에서는:
Client가 SYN을 전송하고 있다.
그러나 SYN/ACK은 관찰되지 않는다.라는 사실까지만 확실히 말할 수 있습니다.
가능한 원인은 다양합니다.
Server Down
Server IP 오류
Routing 문제
Firewall Drop
VLAN 문제
Return Route 문제
Server까지 SYN이 도착하지 않음
Server 응답이 중간에서 손실됨따라서:
SYN만 보인다
=
Firewall 문제라고 단정하면 안 됩니다.
10장 Capture 위치를 바꾸면 장애 지점을 좁힐 수 있다#
10.1 Client에서 SYN은 보인다#
첫 번째 확인:
Client Capture
SYN
O
SYN/ACK
X이것만으로는 Server가 SYN을 받았는지 알 수 없습니다.
10.2 Server에서도 Capture한다#
Server에서:
SYN
X라면:
Client
↓
Network
↓
Server사이에서 문제가 발생했습니다.
확인 영역은:
VLAN
Routing
Firewall
ACL
VPN
WAN등으로 좁혀집니다.
10.3 Server에서는 SYN이 보인다#
Server Capture:
SYN
O인데 Server가 SYN/ACK을 보내지 않는다면:
Service 상태
Listening Port
Server Firewall
TCP Stack
Server Resource등을 확인할 수 있습니다.
이렇게 양쪽 Capture를 비교하는 것이 매우 강력한 진단 방법입니다.
11장 실패 패턴 2 — Server가 RST를 보낸다#
다음과 같은 Packet 흐름을 생각해보겠습니다.
Client Server
SYN
─────────────────────────────→
RST
←─────────────────────────────이 경우 SYN이 Server까지 도달했다는 중요한 정보를 얻을 수 있습니다.
11.1 대표적인 원인#
예를 들어 해당 Port에 아무 Service도 Listen하고 있지 않을 수 있습니다.
Server IP
정상
TCP Port
8000
Service
없음이때 운영체제가 연결을 거부할 수 있습니다.
Application에서는 흔히:
Connection Refused와 같은 오류로 나타납니다.
11.2 Timeout과 Refused는 큰 차이가 있다#
다음 두 상황을 구분해야 합니다.
SYN
↓
아무 응답 없음
↓
Timeout과:
SYN
↓
RST
↓
Connection Refused입니다.
두 번째 경우는 목적지 Host까지 Packet이 도착했다는 중요한 단서를 제공합니다.
따라서 Server Process와 Listening Port를 우선 확인할 수 있습니다.
12장 실패 패턴 3 — SYN/ACK이 중간까지만 온다#
조금 더 복잡한 경우입니다.
Server Capture에서는:
Client SYN
O
Server SYN/ACK
O입니다.
하지만 Client Capture에서는:
SYN
O
SYN/ACK
X입니다.
이 경우 Server가 응답을 만들었다는 사실은 확인됐습니다.
문제 범위는 Return Path 쪽으로 좁혀집니다.
Server
↓
Router
↓
Firewall
↓
WAN
↓
Client확인 대상은:
Return Route
Firewall
ACL
NAT 상태
VPN
중간 Network등입니다.
13장 실패 패턴 4 — SYN/ACK은 Client까지 왔는데 마지막 ACK가 없다#
Client Capture에서:
SYN
O
SYN/ACK
O
마지막 ACK
X라면 Client가 SYN/ACK까지 받았다는 의미입니다.
이제 다음을 확인합니다.
Client TCP Stack
Local Firewall
Client Application 상태
Capture 누락 가능성
Client Resource단순히 Return Route 문제라고 할 수는 없습니다.
SYN/ACK이 Client에 도착했다면 Return Path가 적어도 그 Packet에 대해서는 동작한 것입니다.
14장 실패 패턴 5 — 3-Way Handshake는 성공했는데 Application이 실패한다#
가장 중요한 현장 패턴 중 하나입니다.
SYN
↓
SYN/ACK
↓
ACK
↓
ESTABLISHED까지 정상입니다.
그런데 관제 프로그램에서는:
Login Failed
Authentication Timeout
Invalid Protocol
No Response등이 나타납니다.
이 경우 TCP 연결 자체보다 Application Layer를 확인해야 합니다.
14.1 확인해야 할 항목#
Application Protocol
TLS Handshake
Authentication
API Path
Protocol Version
Device ID
Application Timeout
Server Log등입니다.
즉:
TCP Connection 성공
≠
Application 정상입니다.
15장 TLS를 사용하는 경우 Handshake가 두 번처럼 보일 수 있다#
HTTPS 같은 서비스를 사용하는 경우:
TCP 3-Way Handshake
↓
TLS Handshake
↓
HTTP순서로 진행됩니다.
따라서:
TCP Handshake 성공
하지만 HTTPS 연결 실패라면 TCP보다 TLS 단계에서 문제가 발생했을 수도 있습니다.
예:
Certificate 오류
TLS Version 불일치
Cipher Suite 문제
SNI 문제
Application 인증 실패등입니다.
Network 담당자와 Application 담당자가 서로:
Network는 정상입니다.
그런데 연결이 안 됩니다.
라고 말하는 상황이 여기에서 자주 발생합니다.
TCP와 TLS, Application을 구분해야 합니다.
16장 NAT가 있는 환경에서는 무엇을 확인해야 할까#
16.1 Source 정보가 바뀔 수 있다#
Client 내부에서는:
192.168.10.20:50123으로 보낸 Connection이 NAT 장비 밖에서는:
203.0.113.10:43001처럼 보일 수 있습니다.
따라서 내부와 외부 Capture를 비교할 때는 IP와 Port가 동일하지 않을 수 있습니다.
16.2 NAT 환경의 Handshake#
개념적으로:
Client
192.168.10.20:50123
↓
NAT
↓
203.0.113.10:43001
↓
ServerServer는 내부 Client 주소가 아니라 NAT 이후의 Source Address를 보게 될 수 있습니다.
장애 분석에서는:
NAT Rule
Session Table
Source Translation
Return Traffic까지 확인할 수 있습니다.
17장 Firewall은 Drop과 Reject가 다를 수 있다#
17.1 Drop#
Firewall이 Packet을 조용히 버리는 정책이라면 Client에서는 다음처럼 보일 수 있습니다.
SYN
↓
응답 없음
↓
SYN Retransmission
↓
Timeout17.2 Reject#
환경과 정책에 따라 즉시 거부 응답을 돌려줄 수도 있습니다.
이 경우 Client가 Timeout까지 오래 기다리지 않고 빠르게 실패를 인식할 수 있습니다.
따라서 Packet Capture에서:
아무 응답이 없는가?
RST가 오는가?
ICMP 오류가 오는가?를 구분하는 것이 중요합니다.
18장 주차관제 현장 사례 — 결제단말이 Server에 접속하지 못한다#
다음 구조를 가정하겠습니다.
Payment Terminal
10.20.10.30
│
│
Switch
│
│
Firewall
│
│
Parking Server
10.100.10.20:8000Application Log:
Connection Timeout
10.100.10.20:8000입니다.
18.1 첫 번째 Capture#
Terminal에서 Capture합니다.
10.20.10.30 → 10.100.10.20
SYN
10.20.10.30 → 10.100.10.20
SYN Retransmission
10.20.10.30 → 10.100.10.20
SYN RetransmissionSYN/ACK은 없습니다.
18.2 Server에서도 확인한다#
Server Capture에는 SYN 자체가 없습니다.
그러면:
Terminal
↓
Switch
↓
Gateway
↓
Firewall
↓
Server중간 어딘가에서 SYN이 전달되지 않는 것입니다.
18.3 중간 장비의 기록을 비교한다#
Firewall Log에서:
Source 10.20.10.30
Destination 10.100.10.20
TCP Port 8000
Action DROP이 확인됐다고 가정해보겠습니다.
이제 원인은:
Server TCP 문제가 아니라:
Firewall Policy로 좁혀집니다.
이것이 Packet Capture의 가장 큰 장점입니다.
연결되지 않는다는 결과를 보고 추측하는 대신 Packet이 어디까지 갔는지 확인할 수 있습니다.
19장 반대로 Server까지 SYN이 도착한다면#
Server Capture:
10.20.10.30.50123
→
10.100.10.20.8000
SYN이 정상적으로 보인다고 가정합니다.
하지만 Server에서 SYN/ACK이 없습니다.
이 경우 다음을 확인합니다.
TCP 8000 Service가 실행 중인가?
정확한 Interface에서 Listen하는가?
Server Firewall이 차단하는가?
Service의 Connection Queue에 문제가 있는가?
Server Resource가 고갈됐는가?netstat, ss 같은 운영체제 도구를 이용해 Listening 상태를 확인할 수 있습니다.
Linux에서는 예를 들어:
ss -lnt를 사용할 수 있습니다.
특정 Port는:
ss -lnt | grep ':8000'처럼 확인할 수 있습니다.
20장 Packet Capture 위치가 중요한 이유#
20.1 한 지점에서 본 Packet이 전체 Network를 대표하지 않는다#
Client에서:
SYN 전송이 보였다고 Server까지 도착했다는 뜻은 아닙니다.
Server에서:
SYN/ACK 전송이 보였다고 Client까지 도착했다는 뜻도 아닙니다.
그래서 복잡한 장애에서는 여러 지점을 비교합니다.
Client
↓
Access Switch
↓
Firewall
↓
Router
↓
Server20.2 장애 구간을 이분법적으로 좁힐 수 있다#
예를 들어:
Client Capture
SYN O
Firewall 내부 Capture
SYN O
Server Capture
SYN X이면:
Firewall 이후
~
Server 이전구간을 집중적으로 볼 수 있습니다.
Packet Capture는 단순히 Packet 내용을 읽는 도구가 아니라 장애 위치를 좁히는 도구이기도 합니다.
21장 Port Mirroring을 이용한 Capture#
직접 Client나 Server에서 Capture할 수 없는 산업 장비도 많습니다.
예:
Gate Controller
RFID Reader
Embedded Controller
IP Camera이런 장비에서는 Switch의 Port Mirroring 기능을 사용할 수 있습니다.
개념적으로:
Controller
│
│
Switch Port 10
│
├──────── 정상 Traffic
│
└──────── 복사
↓
Monitor Port
↓
Capture PC제조사에 따라:
Port Mirroring
SPAN
Mirror Port등의 이름을 사용할 수 있습니다.
22장 Port Mirroring에도 한계가 있다#
Mirror Port에 너무 많은 Traffic을 복사하면 Monitor Port의 처리 능력을 초과할 수 있습니다.
예:
여러 1Gbps Port Traffic
↓
하나의 1Gbps Monitor Port라면 모든 Packet을 완벽하게 Capture하지 못할 수도 있습니다.
따라서:
Capture에서 Packet이 안 보인다
=
실제로 Packet이 없었다라고 무조건 단정하면 안 됩니다.
Capture 구조와 Packet Loss 가능성도 확인해야 합니다.
23장 TCP State도 함께 이해하면 분석이 쉬워진다#
Handshake 과정에서 대표적으로 다음 상태를 볼 수 있습니다.
Client 측:
CLOSED
↓
SYN-SENT
↓
ESTABLISHEDServer 측:
LISTEN
↓
SYN-RECEIVED
↓
ESTABLISHED이를 Packet과 연결하면:
Client SYN
→ SYN-SENT
Server SYN 수신
→ SYN-RECEIVED
마지막 ACK 완료
→ ESTABLISHED처럼 이해할 수 있습니다.
24장 Server가 LISTEN 상태인지 확인한다#
TCP 연결을 받으려면 Server Application이 해당 Port에서 기다리고 있어야 합니다.
예:
TCP 8000
LISTEN이어야 합니다.
Application이 실행되어 있어도 다른 Port를 Listen하고 있을 수 있습니다.
예상
8000
실제
8080이 경우 Network는 정상이어도 연결되지 않습니다.
그래서 현장에서는:
Server Process가 실행 중인가?와:
정확한 TCP Port를 LISTEN하고 있는가?를 따로 확인해야 합니다.
25장 Handshake 시간도 중요한 정보다#
정상적인 LAN에서는 일반적으로 Handshake가 매우 빠르게 완료됩니다.
Packet Capture에서:
SYN 10:00:00.000
SYN/ACK 10:00:00.002
ACK 10:00:00.003처럼 나타날 수 있습니다.
하지만 원격 WAN이나 VPN, 이동통신망 등에서는 RTT가 더 클 수 있습니다.
중요한 것은 절대적인 숫자 하나보다:
평소에는 얼마나 걸렸는가?
장애 시간에는 얼마나 증가했는가?를 비교하는 것입니다.
26장 SYN Retransmission을 어떻게 볼까#
Client가 SYN을 보냈는데 응답이 없다면 SYN을 다시 보낼 수 있습니다.
SYN
↓
응답 없음
↓
SYN Retransmission
↓
응답 없음
↓
SYN RetransmissionWireshark에서는 상황에 따라 이러한 Packet을 Retransmission으로 분석해서 표시할 수 있습니다.
반복되는 SYN은 다음 사실을 알려줍니다.
Client TCP Stack이
연결 시도를 계속하고 있다.하지만 왜 응답이 없는지는 추가 분석이 필요합니다.
27장 Sequence Number가 이상해 보여도 바로 공격이라고 판단하지 않는다#
Packet Capture를 처음 보는 경우 Sequence Number가 크게 바뀌거나 예상과 달라 보이면:
Session Hijacking인가?
라고 생각할 수 있습니다.
하지만 먼저 확인해야 할 것이 많습니다.
Wireshark Relative Sequence Number
Capture 시작 위치
새로운 Connection인지
TCP Offloading
Retransmission
Out-of-Order Packet
Capture Loss등입니다.
TCP Sequence Number만 보고 공격 여부를 판단해서는 안 됩니다.
보안 사고를 의심하려면 Network 구조, Endpoint Log, 인증 기록, Firewall Log 등의 추가 증거가 필요합니다.
28장 3-Way Handshake 성공 여부로 장애 범위를 나누자#
| 관찰 결과 | 의미 | 다음 확인 |
|---|---|---|
| SYN 없음 | Client가 실제 TCP 연결을 시작하지 않았을 가능성 | Application·Routing·Local Firewall |
| SYN 반복, 응답 없음 | Client는 요청 중이나 응답을 못 받음 | VLAN·Routing·Firewall·Server |
| SYN 후 RST | 목적지까지 도달했을 가능성이 높음 | Server Port·Service·Firewall |
| SYN/ACK이 Server에서만 보임 | Return Path에서 손실 가능 | Routing·NAT·Firewall |
| SYN/ACK이 Client까지 도착, ACK 없음 | Client 측 처리 확인 | Client TCP Stack·Firewall·Capture |
| SYN→SYN/ACK→ACK 정상 | TCP 연결 성립 | TLS·Application Protocol |
| Handshake 직후 RST | 연결 후 즉시 종료됨 | Application·Protocol·Security Policy |
29장 시험망에서 직접 Handshake를 만들어보자#
29.1 Server 준비#
격리된 테스트 환경의 Linux Server에서:
nc -l 8000처럼 간단한 TCP Listener를 만들 수 있습니다.
시스템에 설치된 nc 구현에 따라 Option 문법이 다를 수 있습니다.
29.2 Client 연결#
Client에서는:
nc 192.168.1.100 8000처럼 연결합니다.
29.3 동시에 Packet Capture#
tcpdump -n -i eth0 'tcp port 8000'을 실행합니다.
파일로 저장하려면:
tcpdump -n -i eth0 'tcp port 8000' -w handshake.pcap처럼 사용할 수 있습니다.
29.4 관찰해야 할 것#
첫 번째 실습에서는 다음만 정확하게 찾으면 됩니다.
SYN
SYN/ACK
ACK그다음:
Source IP
Destination IP
Source Port
Destination Port
Sequence Number
ACK Number을 확인합니다.
마지막으로:
MSS
Window Scale
SACK Permitted같은 Option을 확인합니다.
30장 장애 실습은 안전한 시험망에서 한다#
Handshake 장애를 이해한다고 운영 Network의 Firewall Rule을 임의로 변경해서는 안 됩니다.
실습 환경에서:
Client VM
↓
Test Firewall
↓
Server VM구성을 만든 뒤 Rule을 변경하여:
정상 Handshake
SYN Drop
Server Port Closed상태를 비교하는 것이 좋습니다.
실제 결제망이나 운영 중인 제어 Network에서 고의로 장애를 발생시키는 실습은 피해야 합니다.
31장 Packet Capture의 보안도 중요하다#
TCP Payload에는 상황에 따라 다음 정보가 들어갈 수 있습니다.
차량번호
Device ID
사용자 정보
인증 Token
결제 관련 데이터
관리 명령TLS를 사용하지 않는 Protocol이라면 Packet Capture 파일에 Application Data가 그대로 남을 수도 있습니다.
따라서 Capture는:
필요한 Interface만
필요한 Host만
필요한 Port만
필요한 시간만수집하는 것이 좋습니다.
31.1 Capture Filter로 범위를 줄인다#
예:
tcpdump -n -i eth0 'host 192.168.1.100 and tcp port 8000'처럼 대상 Traffic을 줄일 수 있습니다.
Capture 파일은 일반 로그보다 훨씬 많은 Network 정보를 포함할 수 있으므로 접근 권한과 보관 정책도 필요합니다.
32장 현장에서는 Packet과 Log의 시간을 맞춘다#
Application Log:
10:31:04.120 Connection TimeoutFirewall Log:
10:31:00.100 TCP SYN DROPPacket Capture:
10:31:00.098 SYN
10:31:01.100 SYN Retransmission
10:31:03.105 SYN Retransmission처럼 시간을 맞추면 하나의 사건으로 연결할 수 있습니다.
그래서 장비마다 시간이 크게 다르면 장애 분석이 어려워집니다.
가능하다면 운영 장비의 시간 동기화 정책도 관리해야 합니다.
33장 Handshake 장애 진단의 기본 흐름#
연결이 되지 않는다면 다음 순서로 확인할 수 있습니다.
Application이 Connection을 시작했는가?
↓
SYN이 나가는가?
↓
SYN이 Server에 도착하는가?
↓
Server가 SYN/ACK을 보내는가?
↓
SYN/ACK이 Client에 도착하는가?
↓
Client가 ACK을 보내는가?
↓
Connection Established
↓
Application Data가 흐르는가?그리고 그 아래에는 항상 기존 Network 계층이 있습니다.
Physical Link
↓
VLAN
↓
IP
↓
ARP / NDP
↓
Gateway
↓
Routing
↓
Firewall
↓
TCP
↓
ApplicationTCP Packet 분석만 잘한다고 아래 계층을 무시할 수 있는 것은 아닙니다.
34장 현장에서 자주 하는 잘못된 판단#
34.1 SYN이 나가면 Client는 정상이다?#
완전히 그렇지는 않습니다.
TCP 연결 시도는 하고 있다는 뜻이지만 잘못된 Destination IP나 Port로 SYN을 보낼 수도 있습니다.
34.2 SYN/ACK이 없으면 Server가 죽은 것이다?#
아닙니다.
중간 Firewall, Routing, VLAN, Return Path 등 다양한 원인이 있을 수 있습니다.
34.3 RST가 오면 Network가 끊긴 것이다?#
오히려 RST가 왔다는 것은 Network를 통해 어떤 응답이 돌아왔다는 중요한 단서입니다.
Service Port나 Application 상태를 확인해야 할 수 있습니다.
34.4 Handshake가 성공하면 Service가 정상이다?#
아닙니다.
TCP 위의:
TLS
Authentication
API
Application Protocol등은 별도로 실패할 수 있습니다.
34.5 Packet Capture 하나만 보면 모든 것을 알 수 있다?#
아닙니다.
Capture 위치에 따라 볼 수 있는 Packet이 다릅니다.
필요하면 Client·Server·Firewall 등 여러 지점의 자료를 비교해야 합니다.
35장 핵심 개념 한눈에 정리하기#
| 개념 | 의미 |
|---|---|
| SYN | 새로운 TCP 연결 시작 |
| SYN/ACK | SYN 수신 확인과 Server 측 SYN |
| ACK | 상대 Sequence 공간 확인 |
| ISN | Connection 시작 시 사용하는 Initial Sequence Number |
| 3-Way Handshake | TCP Connection 확립 과정 |
| ESTABLISHED | TCP Connection이 성립된 상태 |
| LISTEN | Server가 Connection을 기다리는 상태 |
| SYN-SENT | Client가 SYN을 보내고 응답을 기다리는 상태 |
| SYN-RECEIVED | SYN을 받고 SYN/ACK 이후 ACK를 기다리는 상태 |
| RST | TCP Connection의 즉시 Reset |
| MSS | 수신 가능한 TCP Payload 크기 관련 Option |
| Window Scale | Receive Window 표현 범위 확장 |
| SACK Permitted | Selective ACK 사용 가능 여부 협상 |
36장 자기 점검#
36.1 Client에서 SYN만 반복되고 SYN/ACK이 없다면 무엇을 알 수 있는가#
Client가 TCP 연결을 시도하고 있지만 Capture 지점에서는 응답이 관찰되지 않는다는 사실을 알 수 있습니다.
Server, Routing, Firewall, VLAN, Return Path 등을 추가로 확인해야 합니다.
36.2 SYN/ACK의 ACK Number가 Client ISN + 1인 이유는 무엇인가#
SYN이 TCP Sequence Number 공간에서 하나를 소비하기 때문입니다.
36.3 3-Way Handshake가 성공하면 Application도 정상인가#
아닙니다.
TCP Connection만 정상적으로 만들어졌다는 의미입니다. TLS, 인증, Application Protocol 등은 이후 별도로 실패할 수 있습니다.
36.4 SYN 다음에 바로 RST가 돌아온다면 무엇을 확인해야 하는가#
목적지 Server까지 Packet이 도달했을 가능성이 있으므로 해당 TCP Port에서 Service가 Listen 중인지, Server Firewall이나 Application이 연결을 거부하고 있는지 확인합니다.
36.5 Packet Capture 위치가 중요한 이유는 무엇인가#
어떤 Packet이 한 지점에서 관찰되었다고 해서 다음 지점까지 도착했다는 뜻은 아니기 때문입니다. 여러 지점의 Capture를 비교하면 장애가 발생한 구간을 좁힐 수 있습니다.
37장 이 글을 마치며#
TCP 3-Way Handshake는 세 개의 Packet만 보면 매우 단순해 보입니다.
SYN
↓
SYN/ACK
↓
ACK하지만 실제 장애 분석에서는 이 세 Packet만으로도 많은 정보를 얻을 수 있습니다.
먼저:
Client가 SYN을 만들었는가?를 확인합니다.
그다음:
Server까지 SYN이 도착했는가?를 확인합니다.
Server가:
SYN/ACK을 만들었는가?를 보고:
Client까지 SYN/ACK이 돌아왔는가?를 확인합니다.
마지막으로:
Client가 ACK을 보냈는가?를 확인합니다.
이 과정을 연결하면:
Application
↓
SYN 생성
↓
VLAN
↓
Routing
↓
Firewall
↓
Server
↓
SYN/ACK
↓
Return Path
↓
Client
↓
ACK
↓
ESTABLISHED라는 전체 경로가 보입니다.
따라서 Connection Timeout이라는 한 줄을 봤을 때 바로:
Server 문제다.
Network 문제다.
Firewall 문제다.라고 결론을 내리는 것이 아니라 Handshake가 정확히 어느 단계에서 멈췄는가를 먼저 확인하는 것이 중요합니다.
특히 네 가지를 기억하면 됩니다.
SYN은 Client가 실제 연결을 시작했는지 보여줍니다.
SYN/ACK은 Server가 SYN을 받고 응답할 수 있었는지를 보여주는 중요한 단서입니다.
마지막 ACK까지 확인되면 TCP Connection이 성립됐는지 판단할 수 있습니다.
3-Way Handshake가 성공했다고 Application까지 정상이라는 뜻은 아닙니다.
TCP Packet 분석의 핵심은 Flag를 외우는 것이 아니라 Packet이 어디까지 갔고, 어느 지점에서 다음 응답이 사라졌는지를 추적하는 것입니다.