CS/Computer Network

[컴퓨터네트워크/Computer Network] 전송계층 - TCP(Transmission Control Protocol)란?

binaryroot 2026. 6. 3. 16:15
728x90

이번 글에서는 TCP에 대해서 정리해보고자 한다.

 

TCP(Transmission Control Protocol)란?

인터넷에서 데이터를 전송할 때 사용하는 대표적인 전송 계층 프로토콜은 TCP와 UDP이다.

TCP(Transmission Control Protocol)는 신뢰성 있는 데이터 전송을 제공하기 위해 설계된 연결 지향(Connection-Oriented) 프로토콜이다. 단순히 데이터를 보내는 것이 아니라, 데이터가 손실 없이 순서대로 도착했는지 확인하며 전송한다.

웹 브라우징(HTTP/HTTPS), 이메일(SMTP), 파일 전송(FTP) 등 대부분의 인터넷 서비스는 TCP를 기반으로 동작한다.

 

TCP의 특징

TCP는 다음과 같은 특징을 가진다.

1. 연결 지향(Connection-Oriented)

데이터를 전송하기 전에 송신자와 수신자가 연결을 설정한다.

TCP는 통신을 시작하기 전 3-Way Handshake 과정을 통해 서로 통신 가능한 상태인지 확인한다.

2. 신뢰성(Reliability)

패킷이 손실되거나 순서가 바뀌더라도 이를 복구할 수 있다.

이를 위해 다음과 같은 기능을 제공한다.

  • Sequence Number
  • ACK(Acknowledgement)
  • Retransmission

3. 순서 보장(In-order Delivery)

수신자는 Sequence Number를 이용하여 데이터의 순서를 확인한다.

패킷이 도착 순서가 뒤바뀌더라도 올바른 순서로 재조립할 수 있다.

4. 흐름 제어(Flow Control)

수신자의 처리 속도를 고려하여 송신 속도를 조절한다.

수신자는 TCP 헤더의 Receive Window(rwnd) 필드를 통해 현재 수신 가능한 버퍼 크기를 송신자에게 알려준다.

5. 혼잡 제어(Congestion Control)

네트워크가 혼잡한 경우 전송 속도를 줄여 전체 네트워크 성능 저하를 방지한다.

TCP는 네트워크 상태를 추정하며 스스로 전송량을 조절한다.

 

TCP 세그먼트 구조

TCP는 데이터를 세그먼트(Segment) 단위로 전송한다.

주요 필드는 다음과 같다.

Source Port 송신 포트 번호
Destination Port 수신 포트 번호
Sequence Number 데이터의 순서를 나타냄
Acknowledgement Number 다음에 받을 데이터 번호
Window Size 수신 가능한 버퍼 크기
Checksum 오류 검출
SYN, ACK, FIN 연결 관리

 

특히 Sequence NumberACK는 TCP 신뢰성의 핵심 요소이다.

 

Sequence Number와 ACK

TCP는 바이트 단위로 데이터를 관리한다.

예를 들어 Sequence Number가 100이라면 현재 세그먼트의 첫 번째 바이트 번호가 100임을 의미한다.

수신자는 데이터를 정상적으로 받으면 ACK를 전송한다.

예시:

  • 송신: Seq = 100, 길이 = 20 byte
  • 수신 완료
  • 응답: ACK = 120

이는 120번 바이트부터 보내달라는 의미이다.

TCP는 누적 ACK(Cumulative ACK)를 사용하여 여러 데이터를 한 번에 확인할 수 있다.

 

재전송(Retransmission)

패킷이 손실될 경우 TCP는 재전송을 수행한다.

Timeout 기반 재전송

일정 시간 내 ACK가 도착하지 않으면 손실로 판단한다.

이때 동일한 세그먼트를 다시 전송한다.

Fast Retransmit

동일한 ACK가 3번 연속 도착하면 패킷 손실로 판단한다.

Timeout을 기다리지 않고 즉시 재전송한다.

이를 Triple Duplicate ACK라고 부른다.

 

RTT와 Timeout 계산

TCP는 RTT(Round Trip Time)를 이용해 적절한 Timeout 값을 계산한다.

RTT는 데이터 전송 후 ACK를 받을 때까지 걸린 시간이다.

TCP는 단순 평균이 아닌 EWMA(Exponential Weighted Moving Average)를 사용한다.

EstimatedRTT = (1 − α) × EstimatedRTT + α × SampleRTT

일반적으로 α = 0.125를 사용한다.

Timeout 값은 다음과 같이 계산된다.

TimeoutInterval = EstimatedRTT + 4 × DevRTT

이를 통해 네트워크 상황 변화에 유연하게 대응할 수 있다.

 

흐름 제어(Flow Control)

송신자가 너무 빠르게 데이터를 보내면 수신자의 버퍼가 가득 찰 수 있다.

이를 방지하기 위해 TCP는 Receive Window(rwnd)를 사용한다.

수신자는 현재 남은 버퍼 크기를 송신자에게 알린다.

송신자는 rwnd를 초과하지 않는 범위에서만 데이터를 전송한다.

즉, 수신자의 처리 능력에 맞춰 전송 속도를 조절하는 기능이다.

 

3-Way Handshake

TCP 연결은 다음 과정을 통해 생성된다.

3way handshaking

1단계

Client → Server

SYN

 

2단계

Server → Client

SYN + ACK

 

3단계

Client → Server

ACK

이 과정을 통해 양측은

  • 통신 가능 여부 확인
  • 초기 Sequence Number 교환
  • 연결 상태 동기화

를 수행한다.

 

연결 종료 (4-Way Handshake)

연결 종료는 일반적으로 4단계로 이루어진다.

4way handshake

  1. Client → FIN
  2. Server → ACK
  3. Server → FIN
  4. Client → ACK

종료 후 일정 시간 동안 TIME_WAIT 상태를 유지하여 지연된 패킷으로 인한 문제를 방지한다.

728x90

TCP 혼잡 제어

혼잡 제어는 TCP의 핵심 기능 중 하나이다.

혼잡이 발생하면 패킷 손실과 지연이 증가한다.

TCP는 Congestion Window(cwnd)를 사용하여 전송량을 조절한다.

전송 가능 데이터 양은 다음과 같이 결정된다.

전송 가능 데이터 < cwnd

 

Slow Start

연결 직후에는 네트워크 상태를 알 수 없다.

따라서 작은 크기로 시작한다.

 

초기값: cwnd = 1 MSS

ACK를 받을 때마다 cwnd를 증가시킨다.

결과적으로 RTT마다 전송량이 2배씩 증가한다.

이를 Slow Start라고 한다.

 

Congestion Avoidance

Slow Start가 계속되면 혼잡이 발생할 수 있다.

특정 임계값(ssthresh)에 도달하면 증가 방식을 변경한다.

  • Slow Start: 지수 증가
  • Congestion Avoidance: 선형 증가

이를 통해 네트워크를 안정적으로 활용할 수 있다.

 

TCP와 UDP 비교

  TCP UDP
연결 방식 연결 지향 비연결
신뢰성 보장 보장하지 않음
순서 보장 가능 불가능
흐름 제어 지원 미지원
혼잡 제어 지원 미지원
속도 상대적으로 느림 빠름

 

TCP는 단순히 데이터를 전송하는 프로토콜이 아니다.

Sequence Number, ACK, 재전송, 흐름 제어, 혼잡 제어 등의 메커니즘을 통해 인터넷 환경에서 신뢰성 있는 통신을 제공한다.

오늘날 웹 서비스, 이메일, 파일 전송 등 대부분의 인터넷 서비스가 TCP를 사용하는 이유도 이러한 신뢰성 때문이다.

728x90