📚 네트워크 · 패킷 분석 › 03. Wireshark 패킷 분석 — 131편
이전 글: 130. ACK Number 분석 · 다음 글: 132. Duplicate ACK
재전송이 일어나는 두 경로(타임아웃, 빠른 재전송)와 관련 필드 목록은 46. 시퀀스 번호·ACK·윈도우 — TCP가 데이터를 빠짐없이 전달하는 방법에서 정리했습니다. 이 글은 Wireshark가 재전송을 어떻게 분류해 표시하는지, 그 표시를 보고 무엇을 판단할 수 있는지에 집중합니다.
Wireshark의 재전송 표시는 패킷 헤더에 들어 있는 값이 아니라 캡처된 패킷 순서를 보고 계산한 판단입니다.
| 필드 | Info 표시 | Wireshark의 판단 기준(요약) |
|---|---|---|
tcp.analysis.retransmission | [TCP Retransmission] | 이미 본 seq 범위를 다시 보냄 (SYN·FIN 포함) |
tcp.analysis.fast_retransmission | [TCP Fast Retransmission] | 반대 방향 Dup ACK 직후의 재전송 |
tcp.analysis.spurious_retransmission | [TCP Spurious Retransmission] | 수신 측이 이미 ACK한 데이터를 다시 보냄 |
tcp.analysis.out_of_order | [TCP Out-Of-Order] | 재전송처럼 보이지만 짧은 시간 안에 순서만 바뀐 것으로 추정 |
재전송 패킷에는 다음 계산 필드가 붙습니다.
| 계산 필드 | 의미 |
|---|---|
tcp.analysis.rto | 원래 세그먼트로부터 재전송까지 걸린 시간(초) |
tcp.analysis.rto_frame | 원래 세그먼트의 프레임 번호 |
세그먼트 N 도착 (tcp.len > 0 또는 SYN/FIN)
↓
seq < 이 방향에서 기대한 다음 seq ?
│ 아니오 → 정상 세그먼트
↓ 예
이미 ACK된 데이터인가? ── 예 → Spurious Retransmission
↓ 아니오
반대 방향 Dup ACK 직후인가? ── 예 → Fast Retransmission
↓ 아니오
직전 세그먼트와 시간 차가 매우 짧은가? ── 예 → Out-Of-Order 추정
↓ 아니오
Retransmission (rto, rto_frame 기록)
무엇이 재전송되었는가에 따른 의미
| 재전송 대상 | 필터 예 | 뜻하는 것 |
|---|---|---|
| SYN | tcp.analysis.retransmission && tcp.flags.syn == 1 && tcp.flags.ack == 0 | 상대가 응답하지 않음 (필터링·호스트 다운·경로 문제) |
| SYN/ACK | tcp.analysis.retransmission && tcp.flags.syn == 1 && tcp.flags.ack == 1 | 서버는 응답했지만 클라이언트 ACK가 오지 않음 |
| 데이터 | tcp.analysis.retransmission && tcp.len > 0 | 전송 중 손실 또는 ACK 손실 |
| FIN | tcp.analysis.retransmission && tcp.flags.fin == 1 | 종료 확인이 오지 않음 |
RTO 간격 패턴
| 패턴 | 읽는 법 |
|---|---|
rto가 1, 2, 4… 처럼 늘어남 | 응답 없는 상대에 대한 지수 백오프 |
| 같은 SYN이 정해진 횟수 후 멈춤 | OS 기본 재시도 횟수 도달 (Linux는 net.ipv4.tcp_syn_retries, 기본값은 OS·버전마다 다름) |
| Dup ACK 직후 수 ms 내 재전송 | Fast Retransmission, 손실 1건에 대한 빠른 회복 |
실습 예시 — 본인 소유 VM에서 방화벽이 조용히 버리는(DROP) 포트와 정상 포트에 접속을 시도해 SYN 재전송을 비교합니다. 명령과 출력은 예시(값은 환경마다 다름)입니다.
sudo tcpdump -i ens33 -nn -w /tmp/retrans.pcapng host 192.168.10.10 &
curl -s --max-time 10 http://192.168.10.10:8081/ # 서버에서 DROP 처리된 포트 가정
curl -s http://192.168.10.10/ -o /dev/null # 정상 포트
sudo pkill -INT tcpdump
# 재전송 패킷과 원본 프레임, 간격
tshark -r /tmp/retrans.pcapng -Y 'tcp.analysis.retransmission' -T fields -E header=y \
-e frame.number -e tcp.stream -e ip.dst -e tcp.dstport -e tcp.flags.str \
-e tcp.analysis.rto_frame -e tcp.analysis.rto
# 스트림별 재전송 수 집계
tshark -r /tmp/retrans.pcapng -Y 'tcp.analysis.retransmission' -T fields -e tcp.stream \
| sort -n | uniq -c | sort -rn | head
# 전체 Expert Info 요약
tshark -r /tmp/retrans.pcapng -q -z expert,warn
(서버 DROP 설정 예: Rocky firewalld 기본 zone은 허용되지 않은 포트에 거부 응답을 보내므로 rich rule로 drop 지정, Ubuntu ufw deny는 기본적으로 응답 없이 버림. 실습 후 원복합니다.)
형식 예시입니다.
frame.number tcp.stream ip.dst tcp.dstport tcp.flags.str rto_frame rto
2 0 192.168.10.10 8081 ··········S· 1 1.012
3 0 192.168.10.10 8081 ··········S· 1 3.041
4 0 192.168.10.10 8081 ··········S· 1 7.105
| 확인 포인트 | 읽는 법 |
|---|---|
rto_frame이 모두 1 | 같은 SYN(프레임 1)을 반복 |
rto 1 → 3 → 7초 | 간격이 두 배씩 늘어나는 백오프 |
| 응답(SYN/ACK·RST) 없음 | 조용한 차단 또는 호스트 없음 |
📷 [실습 화면 삽입 위치]
tcp.analysis.retransmission필터 결과와 SYN 재전송 패킷의[SEQ/ACK analysis]에서 The RTO for this segment was, RTO based on delta from frame 항목을 펼친 화면
📷 [실습 화면 삽입 위치] Statistics → I/O Graphs에
tcp.analysis.retransmission그래프를 추가해 재전송이 몰린 시간대를 표시한 화면
| 관찰 | 가능한 해석 | 확인할 것 |
|---|---|---|
| 한 출발지의 SYN 재전송이 여러 목적지·포트로 분산 | 존재하지 않는 호스트·포트를 향한 탐색, 또는 오래된 설정 | 목적지 분포, 성공 연결 비율 (146. 비정상 TCP Traffic 분석) |
| 외부 한 IP로 SYN 재전송이 주기적으로 반복 | 차단된 C2 주소로의 반복 접속 시도 가능성 | 간격의 규칙성, 해당 호스트 프로세스 |
| 서버의 SYN/ACK 재전송 대량 | 응답을 받지 않는 출발지(위조 가능)의 SYN 폭주 | SYN 대비 완료 Handshake 비율 |
| 특정 페이로드 이후에만 데이터 재전송·연결 단절 | 인라인 IPS의 세션 차단 흔적 | IPS 이벤트 시각과 대조 |
| 흔적 위치 | 확인할 수 있는 것 |
|---|---|
| 패킷 캡처 | 재전송 종류, 원본 프레임, 간격 |
| 방화벽 로그 | DROP 정책에 걸린 반복 시도(같은 출발지·목적지 반복 기록) |
| 호스트 | 재전송 카운터(nstat, netstat -s) |
| NetFlow | 응답 바이트가 0인 짧은 흐름 반복 |
관제자가 확인할 질문
오탐 주의: 무선 구간, 과부하된 링크, 장거리 경로에서는 데이터 재전송이 일상적입니다. 또 수신 측 캡처에서는 원본이 이미 누락되어 lost_segment와 재전송이 함께 보일 수 있으므로, 재전송 수치만으로 공격이나 장애를 단정하지 않고 캡처 지점과 비율(전체 세그먼트 대비)을 함께 보고합니다.
tcp.analysis.rto_frame으로 원본을, tcp.analysis.rto로 간격을 확인하면 백오프 패턴이 보입니다.