커뮤니티·지원
목차
< 용어사전으로 돌아가기
TCP(Transmission Control Protocol)

TCP(Transmission Control Protocol)는 애플리케이션 사이에서 안전하게 데이터를 통신하는 규약이에요.

데이터를 다양한 경로로 주고받으면 더 빠르게 통신할 수 있는데요. 고속도로가 막힐 때 일반 도로로 돌아가는 것과 비슷하죠. 하지만 데이터 통신 경로가 다양해지면 속도가 향상되는 대신 안정성이 떨어져요. 경로가 다양해지면 데이터 일부가 유실되거나 늦게 전달될 수 있기 때문이에요.

그래서 통신 속도를 높이면서도 안정성, 신뢰성을 보장할 수 있는 TCP가 탄생했어요. TCP는 처음 군사 통신 목적이 있었지만 이제는 보통 IP(Internet Protocol)와 엮어서 TCP/IP로 표현하기도 해요. TCP의 역사와 자세한 스펙이 궁금하다면 RFC 9293를 살펴보세요.

네트워크에서 데이터를 통째로 통신하는 경우는 거의 없어요. 예를 들어 이미지를 전송할 때 여러 조각으로 나누어 각 조각을 따로 전달한 뒤 합칠 수 있죠. TCP 통신도 마찬가지인데요. TCP 통신 과정은 다음과 같이 요약할 수 있어요.

  1. 데이터 스트림에서 받은 데이터를 일정 단위로 분할해요.
  2. 분할된 데이터 단위에 TCP 헤더를 붙여서 TCP 세그먼트를 생성해요.
  3. TCP 세그먼트를 IP 데이터그램으로 변환해요. IP 데이터그램은 인터넷 통신에 사용되는 데이터 패킷입니다.
  4. IP 데이터그램을 수신 애플리케이션에 보내요.

TCP 세그먼트

TCP 세그먼트는 헤더와 데이터 필드가 나뉘어 있어요. 주요 헤더를 자세히 살펴볼게요.

  • Source Port: 데이터를 발송하는 애플리케이션의 포트 번호입니다.
  • Destination Port: 데이터를 수신하는 애플리케이션의 포트 번호입니다.
  • Sequence Number(SYN): TCP 통신 과정에서 데이터를 일정 단위로 분할하는데요. 분할된 데이터의 순서입니다.
  • Acknowledgment Number(ACK): 데이터를 수신하는 애플리케이션 입장에서, 다음으로 받고 싶은 TCP 세그먼트의 Sequence Number입니다.

통신 과정에서 분할된 데이터가 순서대로 전달되지 않거나 각자 다른 경로로 통신될 수 있는데요. 위와 같은 TCP 헤더가 있어서 수신 애플리케이션에서 데이터를 안전하고 정확하게 원상복구할 수 있어요.

TCP 핸드셰이크

TCP 통신을 하려면 네트워크 연결 설정이 먼저 필요해요. 데이터를 발송하는 애플리케이션, 수신하는 애플리케이션 모두 준비가 됐다는 것을 보장하기 위해서 필요해요. 데이터를 정확하게 전달하기 위해 세션을 만드는 중요한 과정입니다. TCP 연결을 생성할 때는 3-Way 핸드셰이크를 이용해요.

  1. SYN: 클라이언트가 서버에게 SYN(synchronize) 플래그가 설정된 메시지를 보냅니다. 이때 SYN은 클라이언트의 임의 시퀀스 번호 A를 포함합니다.
  2. SYN-ACK: 서버는 클라이언트의 SYN에 응답하여 SYN-ACK 메시지를 보냅니다. 서버는 자신만의 새로운 시퀀스 번호 B를 포함한 SYN을 전송하고, 클라이언트의 시퀀스 번호 A에 1을 더한 ACK(acknowledgment)를 함께 보냅니다(A+1).
  3. ACK: 클라이언트는 서버로부터 받은 SYN에 대해 ACK 메시지를 전송합니다. 이때 ACK는 서버의 시퀀스 번호 B에 1을 더한 값(B+1)을 포함합니다.

1-2번 과정은 클라이언트와 서버 간의 연결을 확인하고, 2-3번 과정은 반대로 서버가 클라이언트의 연결 요청을 승인하는 과정입니다. Handshake로 안정적인 연결이 확보되면 안전한 데이터 통신을 시작할 수 있어요.

핸드셰이크 과정에서 클라이언트와 서버는 시퀀스 번호를 설정하고, 윈도우 크기를 협상해 데이터 흐름을 제어하기 때문에 신뢰성 있는 데이터 전송이 가능해요. 또, 패킷 손실이 발생해도 재전송 메커니즘을 통해 데이터를 정확하게 전달할 수 있어요.

클라이언트와 서버 사이에 데이터 통신이 완료되면 4-Way 핸드셰이크로 연결이 해제돼요. 클라이언트와 서버는 FIN 및 ACK 메시지를 교환하여 세션을 안전하게 종료합니다.

TCP 핸드셰이크

  • 더 궁금한 내용이 있나요?
  • 코드 샘플을 참고하세요
  • 기술지원이 필요한가요?
    실시간 문의|이메일 보내기