Wireshark로 TCP 흐름 잡기
3-way handshake, 데이터 전송, 4-way 종료. 이 모든 것을 텍스트로만 읽으면 추상적입니다. Wireshark로 직접 패킷을 잡아보면 순서 번호와 확인 번호가 어떻게 바뀌는지 눈으로 볼 수 있습니다. 이 실습을 한 번이라도 해보면 TCP의 동작을 몸으로 기억하게 됩니다.
캡처 준비
Wireshark를 시작하고 인터페이스를 선택합니다. 실습에는 HTTP(80번 포트)를 쓰는 사이트가 편합니다. HTTPS는 데이터가 암호화되어 내용을 볼 수 없지만, TCP 핸드셰이크 자체는 암호화와 관계없이 볼 수 있습니다.
캡처를 시작하기 전에 필터를 설정하면 깔끔합니다.
# 파일: Wireshark 캡처 필터 입력창
tcp port 80
이렇게 하면 80번 포트를 오가는 TCP 패킷만 잡힙니다. 다른 트래픽이 섞이지 않아 읽기 편합니다. 캡처 시작 후 브라우저에서 HTTP 사이트에 접속하고, 페이지가 뜨면 캡처를 멈춥니다.
3-way handshake 확인
잡힌 패킷 목록에서 처음 세 줄을 봅니다. Info 열에 이런 내용이 보일 것입니다.
# 파일: Wireshark 패킷 목록
No. Time Source Destination Protocol Info
1 0.000 192.168.1.5 93.184.216.34 TCP 54321 → 80 [SYN] Seq=0
2 0.045 93.184.216.34 192.168.1.5 TCP 80 → 54321 [SYN, ACK] Seq=0 Ack=1
3 0.045 192.168.1.5 93.184.216.34 TCP 54321 → 80 [ACK] Seq=1 Ack=1
SYN, SYN/ACK, ACK 세 개가 차례로 보입니다. Seq=0은 실제 ISN이 아니라 Wireshark가 보기 편하게 0으로 정규화한 것입니다. 1번 패킷을 클릭해 TCP 헤더를 펼치면 진짜 ISN을 확인할 수 있습니다.
Seq와 Ack 번호의 변화 추적
데이터가 오가는 패킷을 살펴보면 Seq와 Ack가 어떻게 바뀌는지 보입니다.
# 파일: Wireshark 패킷 목록 (데이터 전송 구간)
4 0.046 192.168.1.5 93.184.216.34 TCP [GET 요청] Seq=1 Len=200
5 0.091 93.184.216.34 192.168.1.5 TCP [HTTP 응답] Seq=1 Ack=201 Len=1460
6 0.091 93.184.216.34 192.168.1.5 TCP [HTTP 응답 계속] Seq=1461 Ack=201 Len=1460
7 0.091 192.168.1.5 93.184.216.34 TCP [ACK] Seq=201 Ack=2921
4번에서 클라이언트가 200바이트 요청을 보냈습니다. 5번에서 서버가 응답을 시작하면서 Ack=201로 "200바이트 받았다"고 확인합니다. 6번에서 다음 1460바이트를 이어 보냅니다. 7번에서 클라이언트가 2920바이트까지 받았다고 확인합니다.
TCP Stream 기능 활용
패킷 하나를 오른쪽 클릭하면 "Follow TCP Stream" 메뉴가 있습니다. 이것을 선택하면 이 연결에서 오간 모든 데이터를 한 화면에 모아줍니다. HTTP 사이트라면 요청 헤더와 응답 HTML이 텍스트로 보입니다. 이 기능을 사용하면 패킷 단위가 아니라 연결 단위로 전체 흐름을 한눈에 파악할 수 있습니다.
FIN 찾기
연결 종료 부분도 찾아봅니다. 목록 후반부에 [FIN, ACK]와 [ACK]가 번갈아 보이는 구간이 있습니다.
# 파일: Wireshark 패킷 목록 (연결 종료 구간)
... 93.184.216.34 192.168.1.5 TCP [FIN, ACK] Seq=5000 Ack=201
... 192.168.1.5 93.184.216.34 TCP [ACK] Seq=201 Ack=5001
... 192.168.1.5 93.184.216.34 TCP [FIN, ACK] Seq=201 Ack=5001
... 93.184.216.34 192.168.1.5 TCP [ACK] Seq=5001 Ack=202
FIN과 ACK가 각 방향으로 오가는 4-way 종료 과정을 직접 볼 수 있습니다.
이론으로만 알던 TCP가 실제 패킷으로 동작하는 것을 눈으로 확인했습니다. 다음 장에서는 TCP와 전혀 다른 방식으로 설계된 UDP를 살펴봅니다.