Network

[컴퓨터 네트워킹 하향식 접근] 3-2. 트랜스포트 계층: TCP

noahkim_ 2025. 3. 28. 18:57

이석복 님의 KOCW 강의 "컴퓨터 네트워크"를 정리한 글입니다.

* James F. Kurose님과 Keith W. Ross 님의
"컴퓨터 네트워킹 하향식 접근" 책을 교제로 한 강의입니다. (책의 내용은 포함되지 않았습니다)

 

 

1. TCP

  • 신뢰성있는 데이터 전송을 보장하는 전송 계층 프로토콜

 

특징

특징 설명
Point to Point
단일 송신자와 단일 수신자 간의 통신 (1:1 연결)
Connected-Oriented
통신을 시작하기 전에 송신자와 수신자 간에 연결을 설정해야 하는 프로토콜
Reliable In-order Byte
데이터가 순서대로, 신뢰성 있게 전송되어야 한다는 보장
Pipelined (Sender & Receiver Buffer)
송신자는 버퍼를 사용하여 데이터를 연속적으로 보냄
수신자는 버퍼를 사용하여 이를 처리함 (패킷 순서 재졍렬 및 누락된 패킷 대기용으로 사용)
Full Duplex 양방향 통신, 송신과 수신이 동시에 이루어짐
Congestion Control
네트워크 혼잡을 감지하고 이를 완화하기 위한 전송 속도 조절 기능
Flow Control
수신자의 처리 능력에 맞춰 송신자가 전송 속도를 조절함 (수신자 과부하 방지)

 

 

TCP 세그먼트 헤더

+------------------------------------------------------------+
|      Source Port (16 bits)      |  Destination Port (16 bits) |
+------------------------------------------------------------+
|               Sequence Number (32 bits)                    |
+------------------------------------------------------------+
|               Acknowledgment Number (32 bits)              |
+------------------------------------------------------------+
| Data Offset | Reserved | Control Flags (9 bits) | Window Size (16 bits) |
+------------------------------------------------------------+
|    Checksum (16 bits)    |    Urgent Pointer (16 bits)     |
+------------------------------------------------------------+
|               Options (Variable length)                     |
+------------------------------------------------------------+
|                   Data (Variable length)                   |
+------------------------------------------------------------+
필드 비트 설명
Source Port 16비트 송신 측 포트 번호
Destination Port 16비트 수신 측 포트 번호
Sequence Number 32비트 송신 측 데이터의 시퀀스 번호 (순차적인 식별 제공)
Acknowledgment Number 32비트 수신 측에서 마지막으로 받은 바이트의 다음 바이트 번호 (받고 싶은 바이트 번호)
Data Offset 4비트
TCP 헤더의 크기
최소 5 (20바이트)
Reserved 3비트 예약된 필드 (현재는 사용되지 않음)
Flags 9비트 제어 플래그 (각각 1비트)
URG, ACK, PSH, RST
- SYN: 3 way handshake (요청 시작) 및 sequence number 알리기
- FIN: 4 way handshake (요청 종료)
Receive Window 16비트
윈도우 크기 (수신 측에서 받을 수 있는 데이터 양)
흐름 제어에 사용됨
Checksum 16비트 데이터의 오류를 체크하기 위한 체크섬 값
Urgent Pointer 16비트 URG 플래그가 설정된 경우, 긴급 데이터의 끝을 표시하는 포인터.
Options 가변
(0~40바이트)
선택적 필드 (다양한 옵션을 포함할 수 있음)
ex) 타임스탬프, 최대 세그먼트 크기(MSS) 등
Padding 가변
(0~3바이트)
헤더 길이가 32비트 배수가 되도록 채워지는 패딩 영역
Data 가변 실제 데이터
최대 크기는 MSS에 의해 결정됨 (536 ~ 1460 byte)

 

2. 연결 지향형

  • 통신을 시작하기 전에 송신자와 수신자 간에 연결을 설정해야 하는 프로토콜

 

연결 설정 (3-Way Handshake)

  • 클라이언트와 서버가 연결을 설정하고 초기 sequence number를 맞추는 과정

 

과정
1️⃣ 클라이언트 → 서버: SYN(seq=x) 전송 (연결 요청)
2️⃣ 서버 → 클라이언트: SYN(seq=y), ACK(x+1) 응답 (요청 수락 및 서버 SEQ 설정)
3️⃣ 클라이언트 → 서버: ACK(y+1) 응답 (연결 확정)

 

연결 종료 (4-Way Handshake)

  • TCP 연결을 안전하게 종료하는 과정

 

과정
1️⃣ 클라이언트 → 서버: FIN(seq=x) 전송 (더 이상 보낼 데이터 없음)
2️⃣ 서버 → 클라이언트: ACK(x+1) 응답 (확인)
3️⃣ 서버 → 클라이언트: FIN(seq=y) 전송 (서버도 종료 준비 완료)
4️⃣ 클라이언트 → 서버: ACK(y+1) 응답 (서버 종료 확인)

 

TIME_WAIT Timeout
  • 클라이언트에서 서버의 FIN에 대해 ACK로 응답한 후, 바로 연결 종료하지 않고 일정 시간동안 TIME_WAIT 상태를 유지하는 타이머
  • 즉시 종료하지 않는 이유
    • 서버가 보낸 FIN을 받은 후, 서버가 ACK를 제대로 받았는지 확인하기 위함
      • 서버가 클라이언트의 ACK를 유실할 경우, 서버가 FIN을 다시 보낼 수 있음
      • 클라이언트가 종료되어 있으면 서버의 FIN을 받을 수 없고, 서버는 연결 종료를 제대로 인식하지 못함
    • 지연된 FIN 재전송 방지
      • 클라이언트가 바로 종료하면 늦게 도착한 FIN이 새로운 연결에서 혼동을 일으킬 수 있음

 

2. 흐름 제어

  • Selective Repeat를 주로 사용함

 

동작 방식

  1. 수신자의 버퍼 상태 전송
    • 수신자는 자신의 버퍼에 남은 공간 크기를 Receive Window 필드에 담아 송신자에게 전달함
    • 송신자는 이 값을 참고하여 데이터 양을 조절하여 전송한다
  2. 버퍼가 가득 찬 경우
    1. 수신자 버퍼가 가득 차면, Receive Window = 0 인 세그먼트를 송신자에게 전송하여 더이상 데이터를 보내지 말것을 알림
    2. 송신자는 새로운 데이터 전송을 멈춤
  3. 송신자의 확인 작업 (Window Probing)
    1. 송신자는 수신자의 버퍼가 비워졌는지 확인하기 위해 주기적으로 의미 없는 작은 데이터를 전송
    2. 수신자가 ACK와 함께 업데이트된 Receive Window값을 응답하면, 송신자는 다시 데이터 전송을 시작함

 

권고사항

Round-Trip Time Estimation and Timeout (RFC 793, 6298, 2988)
항목 설명
문제
세그먼트 유실 또는 ACK 지연 발생 시 송신자는 재전송을 판단해야 함
타임아웃 역할
일정 시간 내 ACK 미수신 → 타임아웃 → 세그먼트 재전송
타임아웃이 너무 짧을 경우
ACK가 늦게 도착한 것인데도 불필요하게 재전송 발생
타임아웃이 너무 길 경우
실제 유실 상황에서 재전송까지 지연, 성능 저하
RTT의 특성
네트워크 상황(혼잡, 큐잉 지연 등)에 따라 계속 변화
해결 방법
RTT를 동적으로 측정하고, 이를 기반으로 타임아웃 시간 계산
EstimatedRTT=(1−α)⋅EstimatedRTT+α⋅SampleRTT
DevRTT=(1−β)⋅DevRTT+β⋅|SampleRTT−EstimatedRTT|

TimeoutInterval=EstimatedRTT+4⋅DevRTT

 

Delayed ACK (RFC 1122)
  • 데이터를 받을 때마다 바로 ACK를 보내지 않고, 잠깐 기다렸다가 ACK를 보내는 방식
  • 불필요한 ACK 패킷 수를 줄이기 위해 도입됨
  • 장점
    • ACK만 단독으로 보내는 것보단 응답 데이터와 함께 보내는 것이 더 효율적
    • 한 번에 두 개 이상의 세그먼트를 받을 때, 한번의 ACK로 처리할 수 있음

 

Fast Retransmit ACK (RFC 5681)
  • 세그먼트 손실을 빠르게 감지하고 재전송하는 기술 (ACK 기반)
    • 중복 ACK를 활용하여 패킷 손실을 감지
    • 3개의 중복된 ACK를 받으면 손실된 패킷을 즉시 재전송함

 

  1. 세그먼트 전송 및 ACK 수신
    • 송신자가 연속적인 세그먼트를 전송
    • 수신자는 정상적으로 받을 경우 그에 맞는 ack를 송신함
    • 만약 하나의 세그먼트가 손실되었을 경우, 수신자는 이전 ack를 계속해서 보냄
    • 예를 들어, seq1~100을 보냈고 seq10이 손실되었다면 수신자는 ack10을 계속 보냄
  2. 중복 ack
    • 송신자에게 중복 ack가 3회가 수신되면, 송신자는 해당 세그먼트가 유실되었다 판단하고 타임아웃되기 전에 재전송함
    • 타이머가 만료되기 전에 재전송하여 전송 지연을 최소화함
  3. 수신 버퍼와 중복 ack
    • 수신 버퍼는 큐로 이루어져 있으며, 수신된 세그먼트를 보관
    • 일부 세그먼트가 유실될경우, 수신 버퍼는 해당 세그먼트를 pop 할수 없음
    • 이로인해 수신자는 유실된 세그먼트를 받기 전까지 중복 ACK를 계속 전송함

 

3. 혼잡 제어

동작 순서

  1. Slow Start
    • 네트워크가 허용할 수 있는 전송량을 빠르게 찾아가는 단계
    • 초기에는 병목이 일어나는 대역폭이 어느 정도인지 알 수 없음
    • 작은 cwnd값에서 시작하여 점진적으로 exponential하게 증가시키기 
  2. Additive increase
    • slow start에서 threshold에 도달하면 증가 속도를 조절
    • linear하게 증가시키면서 cwnd를 조절
  3. Multiplicative decrease
    • 어느 순간 패킷 손실을 확인하면, 네트워크가 과부하 상태라고 판단
    • cwnd를 절반으로 줄이기
    • 동시에 threshold값도 절반으로 줄임
    • 다시 slow start로 돌아가 반복

 

MSS

  • Maximum Segment Size
  • TCP 세그먼트에서 payload 부분의 최대 크기
  • 혼잡 윈도우 (CongWin) 크기에 따라 MSS 단위로 증가 / 감소
  • 500byte

 

전송 속도 공식

  • rate = CongWin/RTT (Bytes/Sec)
  • congWin는 네트워크에 따라 동적으로 결정됨

 

버전

특징 TCP Tahoe TCP Reno
패킷 손실 감지 방법 Timeout만 사용 3개의 중복 ACK로 손실 감지
MSS 지수적 증가 후 선형적 증가 지수적 증가 후 선형적 증가
Multiplicative Decrease Timeout 시 CongWin 절반으로 줄임 3 중복 ACK 시 CongWin 절반으로 줄임, Timeout 시 25% 감소
SSThresh 패킷 손실 시 CongWin / 2로 설정 패킷 손실 시 CongWin / 2로 설정
성능 향상 중복 ACK에 대한 반응 없음 중복 ACK 발생 시 빠른 재전송 및 CongWin 절반 감소
재전송 Timeout 후 재전송 3 중복 ACK 후 빠른 재전송

 

Timeout 심각성
  • 네트워크가 매우 불안정하거나 혼잡한 상태에서 발생함
  • 단순히 패킷 유실을 의미하는 것이 아니라 네트워크 상태를 의미함

 

TCP Fairness

  • TCP는 네트워크에서 대역폭을 기기당 균등하게 할당하는 특성을 가짐.
    • 여러 개의 TCP 연결이 존재할 때, 각 연결이 동일한 대역폭을 사용하도록 조정됨.
    • 새로운 기기가 추가되면, TCP의 혼잡 제어 메커니즘을 통해 기존 대역폭이 재분배됨.
    • 결국, 모든 TCP 기기의 대역폭이 균등해지는 방향으로 조정됨.

 

 

 

 

 

출처