반응형

TCP 통신 이해하기

인터넷을 통해 데이터를 주고받는 네트워크의 핵심 프로토콜 중 하나가 바로 **TCP(Transmission Control Protocol)**입니다. 안정적이고 신뢰성 있는 데이터 전송을 제공하는 TCP는 다양한 상태와 복잡한 동작 방식을 갖고 있습니다. 특히, 연결을 설정하는 과정인 3-Way Handshake와 연결 상태의 변화를 보여주는 TCP 상태 전이도는 TCP를 이해하는 데 필수적입니다. 이 글에서는 개념부터 예시까지 차근차근 알아보겠습니다.


1. TCP 통신이란?

TCP는 네트워크에서 데이터를 신뢰성 있게 전송하기 위해 사용하는 프로토콜입니다.
주요 특징은 다음과 같습니다:

1.1. 특징

  • 연결 지향적: 데이터를 주고받기 전에 연결을 설정합니다.
  • 데이터 전송 보장: 패킷이 손실되면 재전송하고, 순서대로 데이터를 재조립합니다.
  • 흐름 제어: 송신자가 수신자의 처리 속도에 맞춰 데이터를 전송합니다.

💡 비유로 이해하기

TCP 통신은 택배 서비스와 비슷합니다:

  • 송신자(발신지)와 수신자(목적지)는 주소를 통해 연결됩니다.
  • 데이터(소포)는 순서대로 잘 포장되어 전송됩니다.
  • 소포가 도착하지 않으면 발신지에서 다시 보냅니다.

1.2. TCP 플래그

TCP 플래그는 TCP 헤더의 특정 비트 필드로, 송신자가 수신자에게 현재 상태 또는 의도를 알리기 위해 사용됩니다.
TCP 플래그는 연결 설정, 데이터 전송, 연결 종료 등의 다양한 역할을 수행합니다.

💡 주요 TCP 플래그 종류와 역할

플래그 이름역할설명

플래그 이름 역할 설명
SYN 연결 요청 연결을 시작할 때 사용합니다.
ACK 응답 확인 이전에 받은 데이터나 요청을 확인합니다.
FIN 연결 종료 요청 연결을 종료하려는 의도를 나타냅니다.
RST 연결 강제 종료 비정상 상황에서 연결을 즉시 종료합니다.
PSH 데이터 밀어넣기 데이터를 즉시 처리하도록 수신자에게 알립니다.
URG 긴급 데이터 표시 특정 데이터를 긴급히 처리하도록 우선순위를 부여합니다.

 


2. 3-Way Handshake란?

TCP에서 송신자와 수신자가 데이터를 전송하기 전에 연결을 설정하는 과정입니다.
3-Way Handshake는 다음 3단계로 이루어집니다:

2.1. 과정 설명

  1. SYN(Synchronize):
    송신자가 연결을 요청합니다. (SYN 플래그 설정)
  2. SYN-ACK(Synchronize + Acknowledge):
    수신자가 요청을 받고 응답하며 연결을 준비합니다. (SYN 플래그 + ACK 플래그 설정)
  3. ACK(Acknowledge):
    송신자가 수신자의 응답을 확인하고 데이터 전송을 시작합니다. (ACK 플래그 설정)

💡 비유로 이해하기

  • 송신자: "나 연결해도 될까?" (SYN)
  • 수신자: "그래, 연결 준비 됐어. 너도 준비됐니?" (SYN-ACK)
  • 송신자: "좋아, 연결 시작하자!" (ACK)

2.2. 시퀀스 다이어그램

송신자                수신자
   SYN   -------->     
             <--------  SYN + ACK
   ACK    -------->
 

3. TCP 상태 전이도란?

TCP 상태 전이도(TCP State Transition Diagram)는 TCP 연결의 상태 변화를 나타내는 다이어그램입니다. TCP 연결은 데이터 전송의 신뢰성과 안정성을 보장하기 위해 여러 상태를 거칩니다.

3.1. 주요 상태

  1. CLOSED: 연결이 닫혀 있는 상태입니다. 기본 상태입니다.
  2. LISTEN: 서버가 클라이언트의 연결 요청(SYN)을 기다리는 상태입니다.
  3. SYN_SENT: 클라이언트가 연결 요청(SYN)을 보내고 응답을 기다리는 상태입니다.
  4. SYN_RECEIVED: 서버가 클라이언트의 연결 요청을 받고 응답(SYN-ACK)을 보낸 상태입니다.
  5. ESTABLISHED: 연결이 완료되어 데이터를 주고받을 수 있는 상태입니다.
  6. FIN_WAIT_1 / FIN_WAIT_2: 연결 종료를 요청하거나 종료 대기 중인 상태입니다.
  7. CLOSE_WAIT: 수신자가 연결 종료 요청을 받은 상태입니다.
  8. LAST_ACK: 종료 요청에 대한 마지막 확인(ACK)을 보낸 상태입니다.
  9. TIME_WAIT: 모든 종료 절차가 끝난 후 잠시 대기하는 상태입니다.

4. TCP 데이터 송수신 과정 및 예시

TCP 데이터 송수신 과정은 3-Way Handshake를 통해 연결을 설정하고, 데이터를 교환한 뒤 4-Way Handshake로 연결을 종료하는 단계로 이루어집니다.

4.1 연결 설정: 3-Way Handshake

  1. SYN (Synchronize):
    클라이언트가 서버에 연결 요청을 보냅니다.
    • 플래그: SYN
  2. SYN + ACK (Acknowledge):
    서버가 연결 요청을 받고 확인 응답을 보냅니다.
    • 플래그: SYN, ACK
  3. ACK:
    클라이언트가 서버의 확인 메시지를 수신하고 연결을 확립합니다.
    • 플래그: ACK

예제 시나리오: "전화 연결" 비유

  • 클라이언트: "연결해도 될까요?" (SYN)
  • 서버: "좋아요, 준비됐어요. 당신도 괜찮나요?" (SYN + ACK)
  • 클라이언트: "네, 시작해요!" (ACK)

4.2 데이터 전송

  1. 데이터 송신:
    송신자는 데이터와 함께 ACK 또는 PSH 플래그를 설정합니다.
    • 플래그: PSH, ACK
  2. 데이터 수신 확인:
    수신자는 데이터를 받았음을 송신자에게 알립니다.
    • 플래그: ACK

예제 시나리오: "택배 전송" 비유

  • 송신자: 데이터를 담은 소포를 택배로 보냅니다. (PSH)
  • 수신자: 소포를 잘 받았다고 알립니다. (ACK)

4.3 연결 종료: 4-Way Handshake

  1. FIN:
    송신자가 연결 종료 요청을 보냅니다.
    • 플래그: FIN
  2. ACK:
    수신자가 연결 종료 요청을 수락했다는 응답을 보냅니다.
    • 플래그: ACK
  3. FIN:
    수신자가 자체적으로 연결을 종료하려는 요청을 보냅니다.
    • 플래그: FIN
  4. ACK:
    송신자가 수신자의 종료 요청을 확인하고 모든 연결을 닫습니다.
    • 플래그: ACK

예제 시나리오: "전화 끊기" 비유

  • 송신자: "통화 끝내도 될까요?" (FIN)
  • 수신자: "알겠어요." (ACK)
  • 수신자: "이제 저도 끊을게요." (FIN)
  • 송신자: "확인했어요, 안녕히 계세요!" (ACK)

6. TCP의 중요성

TCP는 다음과 같은 환경에서 필수적입니다:

  • 웹 브라우징: 신뢰성 있는 데이터 전송을 보장해야 합니다.
  • 파일 다운로드: 손실 없이 파일을 완벽히 받아야 합니다.
  • 이메일: 데이터가 누락되거나 중복되면 안 됩니다.

6.1 TCP 실무 예시

SYN 플러딩 공격 (SYN 플래그 남용)

  • 상황: 악의적인 사용자가 대량의 SYN 요청을 보내 서버를 과부하 상태로 만듭니다.
  • 대응 방법: 방화벽이나 SYN Cookies 같은 보안 메커니즘 활용.

대용량 파일 업로드

  • 송신자: 파일 데이터를 여러 패킷으로 나누어 PSH 플래그를 사용해 빠르게 전송.
  • 수신자: 각 패킷마다 ACK 플래그로 수신 확인.

6.2 TCP 활용 시 주의점

  1. 연결 안정성:
    • TCP는 연결 지향적이므로 데이터가 신뢰성 있게 전송되지만, 상태 유지 비용이 큽니다.
  2. 비정상 연결 종료 (RST 플래그):
    • 연결 중 오류가 발생하면 RST 플래그로 즉시 종료할 수 있으나, 비정상적인 종료는 데이터 손실을 초래할 수 있습니다.
  3. TIME_WAIT 상태 처리:
    • 연결 종료 후 TIME_WAIT 상태에서 일정 시간 대기하며 재전송 요청을 방지합니다.

 


마무리

TCP는 신뢰성 있는 데이터 전송을 위해 설계된 중요한 프로토콜입니다. 3-Way Handshake를 통해 연결을 설정하고, 상태 전이도를 통해 다양한 상태를 관리하며 안정적인 통신을 보장합니다. 이를 이해하면 네트워크 동작 원리를 더 깊이 이해할 수 있습니다.

반응형

'개발 부트캠프 > 네트워크' 카테고리의 다른 글

[Nginx] Load Balancing 설정  (0) 2025.02.17
[HTTP] Stateful vs Stateless  (1) 2024.12.04
[IP] 고정 IP  (0) 2024.12.03
[IP] 바인드 주소(Bind Addresss)  (0) 2024.11.27

+ Recent posts