← 문제 라이브러리
Network 입문 NETWORK-003 · 17분

tcpdump로 HTTP 흐름 읽기: 한가할 때만 나는 connection reset by peer

주문 서비스(order-svc)는 사내 L4 로드밸런서 뒤에 있는 재고 API(inventory.internal:80)를 HTTP keep-alive 연결 풀로 호출합니다.

검수된 문제무료
시나리오

주문 서비스(order-svc)는 사내 L4 로드밸런서 뒤에 있는 재고 API(inventory.internal:80)를 HTTP keep-alive 연결 풀로 호출합니다. 요청이 몰리는 낮에는 아무 문제가 없는데, 트래픽이 한산한 새벽과 점심 직후에만 'connection reset by peer' 오류가 몇 건씩 납니다. 재시도하면 바로 성공합니다. 재고 API 팀은 "우리 서버 로그에는 그 요청이 아예 없다"고 하고, 주문 팀은 "재고 API가 가끔 연결을 끊는다"며 타임아웃을 늘리자고 합니다. 주문 서비스 파드에서 패킷을 잡아 봤습니다.

단서
sudo tcpdump -i eth0 -nn 'host 10.20.4.15 and port 80' (한 연결만 추림)
12:30:01.102 IP 10.0.3.21.51544 > 10.20.4.15.80: Flags [P.], seq 1:212, ack 1, length 211: HTTP: GET /v1/stock?sku=A-1001 HTTP/1.1
12:30:01.104 IP 10.20.4.15.80 > 10.0.3.21.51544: Flags [.], ack 212, length 0
12:30:01.118 IP 10.20.4.15.80 > 10.0.3.21.51544: Flags [P.], seq 1:305, ack 212, length 304: HTTP: HTTP/1.1 200 OK
12:30:01.118 IP 10.0.3.21.51544 > 10.20.4.15.80: Flags [.], ack 305, length 0
   … 이 연결로 오간 패킷 없음 …
12:36:12.540 IP 10.0.3.21.51544 > 10.20.4.15.80: Flags [P.], seq 212:423, ack 305, length 211: HTTP: GET /v1/stock?sku=B-2002 HTTP/1.1
12:36:12.541 IP 10.20.4.15.80 > 10.0.3.21.51544: Flags [R], seq 305, win 0, length 0
order-svc 오류 로그
12:36:12.542 ERROR call inventory failed: GET http://inventory.internal/v1/stock?sku=B-2002: read: connection reset by peer
12:36:12.561 INFO  retry 1/2 succeeded (new connection)
설정
# order-svc HTTP 클라이언트 연결 풀
maxIdleConnections: 50
idleTimeout: 10m
tcpKeepAlive: off

# 사내 L4 로드밸런서 (인프라팀 문서)
TCP idle timeout: 350초 (변경 불가) — 시간이 지나면 연결 정보를 조용히 지우고, 그 뒤 들어오는 패킷에는 RST로 응답

과제 reset이 나는 원인을 패킷으로 설명하고, 당장의 조치와 설정 수정(검증 포함), 재발 방지책을 적어 보세요.

먼저 볼 것
  • tcpdump에서 한 연결(같은 포트 쌍)의 흐름만 따라 읽기
  • RST를 누가 보냈는지, 요청이 서버까지 갔는지 판단하기
  • 연결 풀의 idle timeout과 중간 장비의 idle timeout 비교
점검 체크리스트
  1. tcpdump -nn 으로 실패한 요청의 포트 쌍(10.0.3.21.51544)을 골라 그 연결만 시간순으로 읽기
  2. 실패 직전 그 연결이 얼마나 쉬었는지 타임스탬프로 계산
  3. 클라이언트 풀의 idleTimeout·TCP keepalive 설정과 로드밸런서·NAT·방화벽의 idle timeout 표 비교
  4. 재시도 대상이 멱등 요청(GET)인지 확인