TCP(Transmission Control Protocol)는 인터넷을 통한 신뢰성 있는 데이터 전송을 가능하게 하는 핵심 프로토콜입니다.
그러나 이론적인 개념만으로는 TCP의 동작 방식을 충분히 이해하기 어렵습니다.
따라서, 실제 환경에서 TCP 연결을 설정하고 데이터를 전송하며, 패킷을 분석하는 실습 과정이 필요합니다.
본 실습에서는 TCP 연결 설정 과정(3-way 핸드셰이크), 데이터 전송, 연결 종료(4-way 핸드셰이크) 및 패킷 분석을 단계별로 진행하며,
이를 통해 네트워크 통신의 기본 원리를 체험하고 실무적인 이해를 높이는 것을 목표로 합니다.
📌 1. 실습 환경 설정
실습을 진행하기 위해 필요한 환경을 구성하는 단계입니다.
네트워크 환경을 직접 설정하고, 서버와 클라이언트를 구현한 후, 패킷 분석 도구를 활용하여 통신 흐름을 시각적으로 확인할 수 있습니다.
✅ 1.1 필요한 도구 및 소프트웨어
- Python의
socket
라이브러리: 간단한 TCP 서버 및 클라이언트 구현 - Wireshark: 네트워크 패킷 캡처 및 분석
- Linux/Windows 기반의 터미널 또는 명령 프롬프트
🚀 2. TCP 연결 실습
TCP 연결 실습은 다음과 같은 단계를 거쳐 진행됩니다.
🏁 2.1 서버 및 클라이언트 구성
🔹 서버 코드 구현 (Python 기반)
TCP 서버는 클라이언트의 연결 요청을 수락하고, 데이터를 수신 및 응답하는 역할을 합니다.
아래 코드에서는 서버가 특정 포트에서 클라이언트의 요청을 기다린 후, 데이터를 수신하고 응답을 반환합니다.
import socket
# TCP 서버 소켓 생성
server_socket = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
server_socket.bind(('0.0.0.0', 12345)) # 모든 인터페이스에서 12345 포트로 대기
server_socket.listen(1) # 최대 1개의 연결 대기
print("서버가 클라이언트 연결을 기다리는 중...")
conn, addr = server_socket.accept() # 클라이언트 연결 수락
print(f"클라이언트 연결됨: {addr}")
# 데이터 수신 및 응답
data = conn.recv(1024).decode()
print(f"클라이언트로부터 받은 데이터: {data}")
conn.send("Hello Client!".encode()) # 클라이언트에 응답 전송
conn.close() # 연결 종료
🔹 클라이언트 코드 구현 (Python 기반)
클라이언트는 서버에 TCP 연결 요청을 보내고 데이터를 주고받는 역할을 합니다.
아래 코드는 서버에 연결한 후 메시지를 전송하고, 서버의 응답을 출력하는 과정을 포함하고 있습니다.
import socket
# TCP 클라이언트 소켓 생성
client_socket = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
client_socket.connect(('127.0.0.1', 12345)) # 서버 IP 및 포트 지정
# 서버에 데이터 전송
message = "Hello Server!"
client_socket.send(message.encode())
# 서버 응답 수신 및 출력
response = client_socket.recv(1024).decode()
print(f"서버 응답: {response}")
client_socket.close() # 연결 종료
📡 2.2 3-Way 핸드셰이크 과정 분석
TCP 연결이 설정되는 과정에서 3-way 핸드셰이크가 수행됩니다.
1️⃣ SYN (Synchronization) – 클라이언트 → 서버
- 클라이언트가 서버에 연결 요청(SYN 패킷 전송)
2️⃣ SYN-ACK (Synchronization + Acknowledgment) – 서버 → 클라이언트
- 서버가 클라이언트의 요청을 수락하고 응답(SYN + ACK 패킷 전송)
3️⃣ ACK (Acknowledgment) – 클라이언트 → 서버
- 클라이언트가 서버의 응답을 확인하고 최종적으로 연결이 설정됨
Wireshark에서 tcp.flags.syn == 1
필터를 사용하여 SYN 패킷을 확인할 수 있습니다.
🔄 2.3 데이터 전송 및 수신
TCP 연결이 설정된 후 클라이언트는 서버로 데이터를 전송하며,
서버는 이를 수신한 후 응답을 반환합니다.
이 과정에서 TCP는 데이터의 무결성을 보장하기 위해 확인 응답(ACK)을 함께 전송합니다.
Wireshark에서 tcp.flags.ack == 1
필터를 사용하여 데이터 전송 과정을 확인할 수 있습니다.
🛑 2.4 연결 종료(4-way 핸드셰이크)
TCP 연결 종료는 4-way 핸드셰이크 과정을 통해 이루어집니다.
1️⃣ FIN (Finish) – 클라이언트 → 서버
- 클라이언트가 서버에게 연결 종료 요청 전송
2️⃣ ACK (Acknowledgment) – 서버 → 클라이언트
- 서버가 클라이언트의 요청을 확인하고 응답
3️⃣ FIN (Finish) – 서버 → 클라이언트
- 서버가 최종적으로 연결 종료 요청을 클라이언트에게 전송
4️⃣ ACK (Acknowledgment) – 클라이언트 → 서버
- 클라이언트가 이를 확인하고 연결이 완전히 종료됨
Wireshark에서 tcp.flags.fin == 1
필터를 사용하여 FIN 패킷을 감지할 수 있습니다.
🔎 3. 패킷 분석 및 결과 확인
Wireshark를 활용하면 실시간으로 TCP 패킷을 캡처하고 분석할 수 있습니다.
다음은 TCP 연결 실습 후 Wireshark에서 패킷을 분석하는 방법입니다.
✅ 패킷 필터링 명령어
- TCP 패킷만 확인
tcp
- 특정 포트(예: 12345번 포트)에서의 트래픽 확인
tcp.port == 12345
- SYN 패킷만 필터링
tcp.flags.syn == 1
- 연결 종료 과정(FIN 패킷) 필터링
tcp.flags.fin == 1
🎯 4. 실습의 중요성
TCP 실습을 통해 얻을 수 있는 핵심적인 이점은 다음과 같습니다.
✅ 네트워크 프로토콜의 실무 이해
- 실제 TCP 연결 과정을 직접 구현하고 패킷을 분석함으로써 이론적인 개념을 현실적으로 적용할 수 있음.
✅ 네트워크 문제 해결 능력 향상
- 패킷 분석을 통해 연결 문제를 진단하고, 전송 지연, 패킷 손실 등의 원인을 파악할 수 있음.
✅ 보안 위협 감지 및 예방
- 네트워크 패킷을 감시하여 비정상적인 트래픽 패턴을 식별하고, 보안 공격(예: SYN Flooding, 세션 하이재킹 등)에 대한 이해를 높일 수 있음.
🔎 5. 결론
TCP 실습을 진행하면서 서버와 클라이언트 간의 연결 설정, 데이터 전송, 패킷 분석 등을 직접 경험해보는 것은 네트워크 전문가가 되는 데 필수적인 과정입니다.
Wireshark와 같은 패킷 분석 도구를 활용하면 네트워크의 흐름을 더욱 정밀하게 이해하고, 문제 해결 능력을 향상시킬 수 있습니다. 🚀
'네트워크 > TCP' 카테고리의 다른 글
최신 TCP 기술: Multipath TCP (MPTCP) – 다중 경로를 활용한 고성능 네트워크 기술 (0) | 2025.03.10 |
---|---|
최신 TCP 기술: TCP Fast Open (TFO) (0) | 2025.03.10 |
TCP 실습: 패킷 분석 도구 활용과 네트워크 트래픽 이해 (0) | 2025.03.10 |
보안 및 TCP: TCP 보안 강화 기법 (0) | 2025.03.10 |
보안 및 TCP: TCP의 보안 취약점과 대응 방안 (0) | 2025.03.10 |