Wireshark로 윈도우 변화 관찰하기
혼잡 윈도우는 TCP 내부 변수라 직접 볼 수 없습니다. 그러나 Wireshark의 TCP 스트림 그래프를 쓰면 윈도우 크기와 처리량이 시간에 따라 어떻게 변하는지 간접적으로 확인할 수 있습니다. 큰 파일을 다운로드하면서 그래프를 열면 톱니파 패턴이 실제로 보이는 경우도 있습니다.
캡처 준비
대용량 파일 다운로드 중에 캡처하면 데이터가 풍부합니다. 리눅스 ISO 이미지 같은 수백 메가바이트 파일을 HTTP(비암호화 또는 HTTPS 무관)로 받으면서 Wireshark를 돌립니다.
# 파일: 터미널
# 파일 다운로드 (예시, ubuntu.com에서 공식 ISO 미러)
curl -O http://releases.ubuntu.com/22.04/ubuntu-22.04.3-desktop-amd64.iso
위 명령을 실행하는 동안 Wireshark에서 같은 인터페이스를 캡처합니다. 다운로드가 충분히 진행되면(수십 메가 이상) 캡처를 멈춰도 됩니다.
TCP 스트림 그래프 열기
캡처가 끝나면 다운로드 관련 패킷 하나를 클릭합니다. 메뉴에서 Statistics 를 선택합니다. TCP Stream Graphs 아래에 여러 그래프 옵션이 있습니다.
Time Sequence (tcptrace style) 그래프를 선택합니다. 가로축이 시간, 세로축이 순서 번호입니다. 데이터가 순조롭게 흐를 때는 선이 위로 고르게 올라갑니다. 재전송이 일어나면 갑자기 아래로 내려오는 선이 나타납니다.
Window Scaling 그래프
같은 메뉴에서 Window Scaling 그래프를 선택합니다. 가로축이 시간, 세로축이 수신 윈도우 크기입니다. 이 그래프에서 수신 측 버퍼가 얼마나 남았는지, 송신 측이 얼마나 빠르게 보낼 수 있는지 확인됩니다.
수신 윈도우가 갑자기 줄어드는 구간이 보이면 수신 측 애플리케이션이 데이터를 읽는 속도가 느려진 것입니다. 반대로 수신 윈도우가 0으로 떨어지면 송신 측이 완전히 멈춥니다. 이것을 Zero Window 상태라 합니다.
Throughput 그래프
Statistics 메뉴의 IO Graphs를 사용하면 단위 시간당 처리량 변화를 볼 수 있습니다.
# 파일: Wireshark IO Graphs 설정
- Y축: Bytes/s
- 필터: tcp.stream == 0 (첫 번째 TCP 스트림)
- Interval: 0.1s
이 그래프를 보면 다운로드가 시작되면서 처리량이 빠르게 올라가는 슬로 스타트 구간, 이후 고르게 유지되는 혼잡 회피 구간이 보입니다. 손실이 있을 경우 처리량이 급락하는 순간도 확인됩니다.
직접 해보는 것의 가치
이 실습에서 정확한 cwnd 값을 보는 것은 불가능합니다. 하지만 처리량이 올라가다 꺾이고 다시 올라가는 패턴을 직접 눈으로 보면, 앞 절에서 말로만 들은 혼잡 제어의 메커니즘이 추상이 아닌 실재로 다가옵니다. 면접에서 "TCP 혼잡 제어를 설명해보세요"라는 질문에 "Wireshark로 처리량 그래프를 본 적 있는데요"라고 시작할 수 있는 차이입니다.
PART 05가 끝났습니다. 포트와 소켓으로 시작해, TCP의 연결과 신뢰성, UDP의 설계 철학, 그리고 혼잡 제어의 원리까지 전송계층 전체를 살펴봤습니다. 다음 PART에서는 이 전송계층 위에서 동작하는 응용계층으로 올라갑니다.