1. 개요 및 목적
TCP Session Tracker는 우리가 인터넷을 사용하면서 네트워크에서 발생하는 TCP 세션을 추적해 각 세션의 상태,송수신 데이터,연결상태 등을 기록하고 분석하는 도구이다.
전체적인 구성은 크게 아래 3단계에 걸쳐 TCP Session Tracker를 만들어 볼 것이다.
- 1단계: pc에서 오고가는 트래픽 모니터링 및 트래킹
- 2단계: (모드1) 3-Way Handshake 및 데이터 스트림 나열
- 3단계: (모드2) TCP 데이터 스트림 재조합
2. 단계별 구현 및 출력 결과 분석
2.1 pc에서 오고가는 트래픽 모니터링 및 트래킹
- 우선 세션 목록을 명확히 하기 위해 내 사설 ip를 찾아 출력하고, 이 ip를 기준으로 연결된 세션들을 캡쳐해 출력하려고 했다.
- TCP에서는 handshaking을 마치게 되면 이를 ‘establish’또는 ‘세션이 맺어졌다’라고 한다. 이렇게 맺어진 세션들은 활성화되었다가, 4-way handshaking을 통해서 끊어지기도 한다.
- 만약 새로운 세션이 맺어진다면 세션 리스트에 추가하고 번호를 매기며, Active 상태로 설정해준다.
- 그리고 FIN또는 RST플래그가 활성화되면, 이를 감지해 끊어진 세션으로 간주해 closed 상태로 바꿔준다.
세션들의 나열 형식은 “번호)src ip : src port -> dest ip: dest port (활성화 여부)”로 설정했다. 이때 엔터키를 눌러 캡처를 종료하도록 했다.

2.2 3-Way Handshake 및 데이터 스트림 나열
- 앞서 출력된 세션 번호 중 하나를 선택하고, 두 가지 모드 중 하나를 선택한다.
그 중 모드 1(3-Way Handshake 및 데이터 스트림 나열)을 선택한다.

- 이때 해당 세션의 3-way handshake가 먼저 출력되고,데이터 스트림들이 출력된다.
- 데이터 스트림은 C(client)->S(server)로 방향을 명시하여 페이로드 크기와 함께 출력하도록 했다.
- 또한 중복된 패킷들은 제거하고, 페이로드 크기가 0인 패킷들도 제거해 출력하니 훨씬 깔끔해 졌다.

2.3 3단계.TCP 데이터 스트림 재조합
-
http 테스트 사이트(http://www.testingmcafeesites.com/)를 사용했다. 그리고 세션 목록을 출력해주었다.

-
이번엔 세션 번호를 입력한 후 모드 2(TCP 데이터 스트림 재조합)를 선택한다.

-
모드2는 해당 세션에 대해 패킷을 순서대로 재조립하고, raw 데이터를 출력하여 실제 전송된 데이터 내용을 보여준다. 이때 사람이 읽을 수 있는 텍스트로 디코딩해줬다.
-
HTTP 응답 데이터
(데이터의 타입=html, 데이터의 크기=522byte 등 기타 보안 및 캐싱 관련 정보)

-
HTML 본문
(html, head, <body 태그로 구성된 웹 페이지의 HTML 내용)

-
HTTP 요청 데이터
(HTTP 메소드 GET으로 /testcat_al.html 요청)

3. 주요 소스코드 분석
3.1 사설 IP 주소 확인 (get_private_ip)
- 자신의 사설 IP 주소를 반환하여 패킷 필터링 및 세션 추적에 사용한다.
- UDP 소켓을 이용해 공용 DNS 서버(8.8.8.8)와 연결하여 송신 IP를 추론한다.

3.2 TCP 세션 상태 업데이트 (update_session_state)
- 캡처된 패킷의 TCP 플래그(SYN, FIN, RST)를 확인하여 세션 상태를 결정한다.
- 그리고 그 결과로 "Active" 또는 "Closed" 상태를 반환한다.

3.3 패킷 처리 (process_packet)
- 실시간으로 캡처된 패킷을 분석하여 TCP 세션 데이터 저장소(sessions)에 추가한다.
- 송수신 IP와 포트를 기반으로 세션을 식별한다.

3.4 3-way handshake 및 데이터 스트림 정보 출력(display_session_details)
- 선택된 세션의 3-Way Handshake 상태와 데이터 스트림 정보를 출력한다.


3.5 TCP 데이터 스트림 재조합 (reassemble_tcp_stream)
- 선택된 세션의 TCP 데이터 스트림을 SEQ 번호 기준으로 재조합하여 출력한다.
- UTF-8로 디코딩된 텍스트를 출력하거나 디코딩 실패 시 원시 데이터를 출력한다.


4. 회고
- 사실 처음에 ip를 사용자의 ip로 한정해 출력해보기 전에는 너무 난잡한 출력에 헤매기만 했었다.
- 그리고 handshake도 제대로 출력하기까지 굉장히 오랜 시간이 걸렸다.
- 비교적 마지막 모드2의 구현에 있어서는 금방 해냈던 것 같아 다행이었다.
- 이제 이 소스코드를 사용해 사용자의 ip를 기준으로 맺어지는 세션들을 모두 트래킹하여 목록으로 출력할 수 있게 되었다.
- 그리고 더 자세히 알고 싶은 세션의 번호를 입력하고, 두 가지 모드 중 하나를 선택하여 원하는 데이터 스트림 형태를 볼 수 있도록 하는데 성공했다.