📚 네트워크 · 패킷 분석 › 03. Wireshark 패킷 분석 — 133편
이전 글: 132. Duplicate ACK · 다음 글: 134. Follow TCP Stream
TCP Stream은 Wireshark가 하나의 TCP 연결에 속한 패킷을 묶어 번호를 붙인 것입니다. 이 번호(tcp.stream)는 패킷 헤더에 없는, Wireshark가 캡처 파일을 읽으며 계산한 값입니다. 연결 단위 통계는 110. Conversations에서 다뤘고, 이 글은 스트림 번호를 필터·추출의 기준으로 쓰는 방법에 집중합니다.
| 필드 | 의미 | 쓰임 |
|---|---|---|
tcp.stream | 0부터 시작하는 연결 인덱스 | 한 연결만 골라 보기 |
tcp.completeness | 연결에서 관찰된 단계를 비트로 합친 값 (최근 버전) | 완결된 연결인지 판단 |
tcp.time_relative | 스트림 첫 패킷 이후 경과 시간 | 연결 안 시간 흐름 |
tcp.time_delta | 같은 스트림 이전 패킷과의 간격 | 응답 지연, 대기 구간 |
tcp.analysis.reused_ports | 이전 연결과 같은 포트로 새 SYN | 포트 재사용 표시 |
tcp.time_relative·tcp.time_delta는 TCP 설정의 "Calculate conversation timestamps"가 켜져 있어야 채워집니다.
TCP 패킷 도착
↓ 키 생성: (IP A, 포트 A, IP B, 포트 B) ※ 방향 무관
이미 추적 중인 연결인가?
├─ 아니오 → 새 번호 부여 (0, 1, 2 …)
└─ 예 → 그 연결이 종료된 뒤 새 SYN인가?
├─ 예 → 새 번호 + [TCP Port numbers reused]
└─ 아니오 → 기존 번호 유지
↓
관찰한 단계(SYN, SYN-ACK, ACK, DATA, FIN, RST)를 비트로 누적 → tcp.completeness
udp.stream이 있습니다(120. UDP Header 분석).tcp.completeness 비트 값
| 비트 값 | 관찰된 단계 |
|---|---|
| 1 | SYN |
| 2 | SYN-ACK |
| 4 | ACK |
| 8 | DATA (페이로드 있음) |
| 16 | FIN |
| 32 | RST |
대표 합계와 읽는 법
| 합계 | 구성 | 해석 |
|---|---|---|
| 31 | 1+2+4+8+16 | Handshake → 데이터 → FIN, 완결된 정상 연결 |
| 47 | 1+2+4+8+32 | 데이터 후 RST 종료 (정상일 수도, 강제 종료일 수도) |
| 1 | SYN만 | 응답 없음 (차단·호스트 없음) |
| 33 | SYN + RST | 닫힌 포트의 거부 |
| 7 | SYN, SYN-ACK, ACK만 | 연결만 맺고 데이터 없음 |
| 35 | SYN, SYN-ACK, RST | 연결 완료 직전 끊음 (SYN 스캔에서 흔한 형태) |
값의 표시 방식(숫자, 문자열 설명)은 버전에 따라 다를 수 있습니다.
스트림 번호 활용 필터
| 필터 | 용도 |
|---|---|
tcp.stream eq 5 | 5번 연결만 |
tcp.stream in {3 7 9} | 여러 연결 동시에 |
tcp.completeness == 1 | 응답 없는 SYN 연결 |
tcp.analysis.reused_ports | 짧은 시간 같은 포트 재사용 |
실습 예시 — 본인 소유 실습망 캡처 파일에서 스트림 목록을 만듭니다. 명령과 출력은 예시(값은 환경마다 다름)입니다.
# 스트림별 첫 SYN: 누가 누구의 어느 포트로 연결을 시작했나
tshark -r /tmp/lab.pcapng -Y 'tcp.flags.syn == 1 && tcp.flags.ack == 0' -T fields -E header=y \
-e tcp.stream -e frame.time -e ip.src -e tcp.srcport -e ip.dst -e tcp.dstport
# 스트림별 완결성 (-2: 두 번 읽어 최종값 반영)
tshark -2 -r /tmp/lab.pcapng -Y tcp -T fields -e tcp.stream -e tcp.completeness \
| sort -u -n | awk '{print $2}' | sort | uniq -c | sort -rn
# 연결 단위 요약 표
tshark -r /tmp/lab.pcapng -q -z conv,tcp
완결성 분포의 형식 예시입니다.
118 31
24 47
9 1
3 35
| 확인 포인트 | 읽는 법 |
|---|---|
| 대부분 31 | 정상적으로 열리고 닫힌 연결이 주류 |
| 1이 9개 | 응답 없는 SYN. 목적지·포트를 추가 확인 |
| 35가 3개 | 연결 직전 RST. 스캔 흔적인지 목적지 분포 확인 |
📷 [실습 화면 삽입 위치] Packet Details의 Transmission Control Protocol에서
[Stream index]와[Conversation completeness]항목이 보이는 화면
📷 [실습 화면 삽입 위치] Packet List에서 우클릭 → Conversation Filter → TCP로
tcp.stream eq N필터가 적용된 화면
| 관찰 | 가능한 해석 | 확인할 것 |
|---|---|---|
| 짧은 시간 스트림 번호가 수백~수천 개 증가 | 스캔, 자동화된 반복 접속, 브루트포스 | 목적지 포트 분포, completeness 분포 |
| completeness 1·33·35 위주 | 연결이 성립하지 않는 탐색 (143. SYN Scan Packet 분석) | 한 출발지에서 여러 포트인가 |
| 한 스트림의 duration이 수 시간, 데이터는 소량 | 장기 유지형 원격 제어 채널 가능성 | tcp.time_delta 간격의 규칙성 |
reused_ports 다발 | 같은 출발지 포트를 고정해 쓰는 도구, 또는 NAT 환경 | 출발지 포트 분포 |
| 흔적 위치 | 대응 관계 |
|---|---|
| 방화벽 세션 로그 | 스트림 1개 ≒ 세션 1건 (세션 ID·종료 사유와 대조) |
| IDS Alert | Alert의 4-튜플·시각으로 스트림 번호를 찾아 전후 패킷 확인 (297. IDS Alert와 Packet 연계) |
| Zeek 등 연결 로그 | 연결 상태 요약 필드와 completeness를 비교 |
관제자가 확인할 질문
오탐 주의: 캡처 시작 전에 열린 연결은 SYN 없이 시작하므로 completeness가 낮게 나옵니다. 또 로드밸런서·NAT 뒤에서는 서로 다른 사용자가 같은 IP로 보여 스트림 수가 부풀려 보일 수 있습니다. 캡처 시간 범위와 네트워크 구조를 먼저 확인합니다.
tcp.stream은 Wireshark가 4-튜플 기준으로 붙인 연결 번호이며, 파일 안에서만 유효합니다.[TCP Port numbers reused] 표시가 붙습니다.tcp.completeness의 비트 합(31, 47, 1, 33, 35 등)으로 연결이 어디까지 진행되었는지 빠르게 분류할 수 있습니다.tcp.stream eq N, tcp.stream in {…} 필터로 Alert와 관련된 연결만 추려 분석합니다.