📚 네트워크 · 패킷 분석 › 03. Wireshark 패킷 분석 — 133편
이전 글: 132. Duplicate ACK · 다음 글: 134. Follow TCP Stream

1. 개념

TCP Stream은 Wireshark가 하나의 TCP 연결에 속한 패킷을 묶어 번호를 붙인 것입니다. 이 번호(tcp.stream)는 패킷 헤더에 없는, Wireshark가 캡처 파일을 읽으며 계산한 값입니다. 연결 단위 통계는 110. Conversations에서 다뤘고, 이 글은 스트림 번호를 필터·추출의 기준으로 쓰는 방법에 집중합니다.

필드의미쓰임
tcp.stream0부터 시작하는 연결 인덱스한 연결만 골라 보기
tcp.completeness연결에서 관찰된 단계를 비트로 합친 값 (최근 버전)완결된 연결인지 판단
tcp.time_relative스트림 첫 패킷 이후 경과 시간연결 안 시간 흐름
tcp.time_delta같은 스트림 이전 패킷과의 간격응답 지연, 대기 구간
tcp.analysis.reused_ports이전 연결과 같은 포트로 새 SYN포트 재사용 표시

tcp.time_relative·tcp.time_delta는 TCP 설정의 "Calculate conversation timestamps"가 켜져 있어야 채워집니다.


2. 동작 원리

TCP 패킷 도착
   ↓ 키 생성: (IP A, 포트 A, IP B, 포트 B)  ※ 방향 무관
이미 추적 중인 연결인가?
   ├─ 아니오 → 새 번호 부여 (0, 1, 2 …)
   └─ 예 → 그 연결이 종료된 뒤 새 SYN인가?
            ├─ 예 → 새 번호 + [TCP Port numbers reused]
            └─ 아니오 → 기존 번호 유지
   ↓
관찰한 단계(SYN, SYN-ACK, ACK, DATA, FIN, RST)를 비트로 누적 → tcp.completeness
  • 번호는 그 캡처 파일 안에서만 의미가 있습니다. 파일을 필터링해 저장하거나 나누면 번호가 다시 매겨질 수 있으므로, 보고서에는 번호와 함께 4-튜플(IP·포트)과 시각을 적습니다.
  • UDP에도 같은 개념의 udp.stream이 있습니다(120. UDP Header 분석).

3. 주요 특징

tcp.completeness 비트 값

비트 값관찰된 단계
1SYN
2SYN-ACK
4ACK
8DATA (페이로드 있음)
16FIN
32RST

대표 합계와 읽는 법

합계구성해석
311+2+4+8+16Handshake → 데이터 → FIN, 완결된 정상 연결
471+2+4+8+32데이터 후 RST 종료 (정상일 수도, 강제 종료일 수도)
1SYN만응답 없음 (차단·호스트 없음)
33SYN + RST닫힌 포트의 거부
7SYN, SYN-ACK, ACK만연결만 맺고 데이터 없음
35SYN, SYN-ACK, RST연결 완료 직전 끊음 (SYN 스캔에서 흔한 형태)

값의 표시 방식(숫자, 문자열 설명)은 버전에 따라 다를 수 있습니다.

스트림 번호 활용 필터

필터용도
tcp.stream eq 55번 연결만
tcp.stream in {3 7 9}여러 연결 동시에
tcp.completeness == 1응답 없는 SYN 연결
tcp.analysis.reused_ports짧은 시간 같은 포트 재사용

4. 예시

실습 예시 — 본인 소유 실습망 캡처 파일에서 스트림 목록을 만듭니다. 명령과 출력은 예시(값은 환경마다 다름)입니다.

# 스트림별 첫 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 필터가 적용된 화면


5. 보안 관점

관찰가능한 해석확인할 것
짧은 시간 스트림 번호가 수백~수천 개 증가스캔, 자동화된 반복 접속, 브루트포스목적지 포트 분포, completeness 분포
completeness 1·33·35 위주연결이 성립하지 않는 탐색 (143. SYN Scan Packet 분석)한 출발지에서 여러 포트인가
한 스트림의 duration이 수 시간, 데이터는 소량장기 유지형 원격 제어 채널 가능성tcp.time_delta 간격의 규칙성
reused_ports 다발같은 출발지 포트를 고정해 쓰는 도구, 또는 NAT 환경출발지 포트 분포

6. SOC 관점

흔적 위치대응 관계
방화벽 세션 로그스트림 1개 ≒ 세션 1건 (세션 ID·종료 사유와 대조)
IDS AlertAlert의 4-튜플·시각으로 스트림 번호를 찾아 전후 패킷 확인 (297. IDS Alert와 Packet 연계)
Zeek 등 연결 로그연결 상태 요약 필드와 completeness를 비교

관제자가 확인할 질문

  • 이 Alert에 해당하는 스트림은 몇 번이고, 연결은 완결되었는가?
  • 같은 출발지에서 비슷한 스트림이 몇 개 있는가?
  • 스트림의 시작·종료 시각이 장비 로그의 세션 시각과 맞는가?

오탐 주의: 캡처 시작 전에 열린 연결은 SYN 없이 시작하므로 completeness가 낮게 나옵니다. 또 로드밸런서·NAT 뒤에서는 서로 다른 사용자가 같은 IP로 보여 스트림 수가 부풀려 보일 수 있습니다. 캡처 시간 범위와 네트워크 구조를 먼저 확인합니다.


7. 핵심 정리

  • tcp.stream은 Wireshark가 4-튜플 기준으로 붙인 연결 번호이며, 파일 안에서만 유효합니다.
  • 종료 후 같은 포트로 새 SYN이 오면 새 번호와 [TCP Port numbers reused] 표시가 붙습니다.
  • tcp.completeness의 비트 합(31, 47, 1, 33, 35 등)으로 연결이 어디까지 진행되었는지 빠르게 분류할 수 있습니다.
  • tcp.stream eq N, tcp.stream in {…} 필터로 Alert와 관련된 연결만 추려 분석합니다.
  • 보고서에는 스트림 번호와 함께 4-튜플·시각을 적어야 다른 로그와 대조할 수 있습니다.
profile
코드에 숨겨진 위협을 읽고 AI로 보안의 미래를 설계합니다. 프론트엔드 개발 경험을 자산 삼아 더 견고하고 지능적인 보안 운영 시스템을 구축해 나가는 과정을 기록합니다

0개의 댓글