Network

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

noahkim_ 2025. 3. 28. 18:57

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

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

 

 

0. TCP

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

 

세그먼트 헤더

+------------------------------------------------------------+
|      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 헤더 길이
word 단위
 5 이상
Reserved 3 예약된 필드 ❌ 현재는 사용되지 않음
Flags 9 제어 플래그 각각 1비트
Receive Window 16 윈도우 크기
 수신 측에서 받을 수 있는 데이터 양
 흐름 제어에 사용됨
Checksum 16 데이터 체크섬 값 데이터 오류 체크용
Urgent Pointer 16 긴급 데이터의 끝을 표시하는 포인터.  URG 플래그가 설정된 경우 사용됨
Options (0~40) 선택적 필드
 다양한 옵션을 포함할 수 있음
ex) 타임스탬프, MSS 등
Padding (0~3) 패딩 영역 헤더 길이가 32비트 배수가 되도록 함
Data 가변 실제 데이터 최대 크기는 MSS에 의해 결정됨
- 536 ~ 1460 byte

 

표) 제어 플래그

더보기
플래그 의미 특징 / 예
SYN
데이터 순서 추적을 위한 번호
TCP 연결을 시작할 때 사용
- 서로 초기 ISN을 교환
- 3-way handshake의 1, 2단계에서 등장
URG 데이터 중 일부가 우선적으로 처리되어야 함을 알림
예: 중단 요청
ACK 상대방으로부터 데이터를 수신했음을 확인하는 신호  
PSH
데이터를 즉시 상위 애플리케이션에 전달하도록 지시
버퍼에 대기하지 않도록 함
예: 터미널 입력 시 바로 전송.
RST
현재 연결을 강제로 끊음. 
예: 잘못된 패킷 수신, 포트 닫힘, 비정상 상태
FIN
TCP 연결을 종료할 때 사용
내 전송 방향을 닫는다는 의미로 사용
- 양방향 종료를 위해 두번 필요
- 4-way handshake에서 등장

 

MSS

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

 

1. 연결 지향형 (Connected-Oriented)

연결 설정: 3-Way Handshake

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

 

과정

더보기
단계 내용 송신 주체 플래그
시퀀스 번호 / 승인 번호
1 연결 요청 클라이언트 → 서버 SYN SEQ = x
2 요청 수락 + 서버 시퀀스 설정 서버 → 클라이언트 SYN + ACK
SEQ = y, ACK = x + 1
3 연결 확정 클라이언트 → 서버 ACK
ACK = y + 1

 

연결 종료: 4-Way Handshake

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

 

과정

더보기
단계 내용 송신 주체 플래그
시퀀스 번호 / 승인 번호
1 더 이상 보낼 데이터 없음 클라이언트 → 서버 FIN SEQ = x
2 클라이언트 FIN 확인 서버 → 클라이언트 ACK ACK = x + 1
3 서버도 종료 준비 완료 서버 → 클라이언트 FIN SEQ = y
4 서버 FIN 확인 클라이언트 → 서버 ACK ACK = y + 1

 

TIME_WAIT

  • 마지막 ACK를 보낸 쪽이 일정 시간 동안 연결을 완전히 닫지 않고 유지하는 상태
  • 일반적으로 MSL * 2 정도 열어둠 (Maximum Segment Lifetime. 보통 수십초)

 

즉시 종료하지 않는 이유
구분 설명 TIME_WAIT 유지 이유
ACK 유실 대비 서버가 보낸 FIN에 대해 클라이언트가 ACK를 보냈지만, 서버가 이를 받지 못한 경우 서버는 FIN을 재전송함 재전송된 FIN을 받고 ACK를 다시 보낼 수 있음
지연 패킷 혼동 방지 네트워크 상에 이전 연결에서 보낸 FIN이 지연되어 남아 있을 수 있음
지연된 FIN이 모두 소멸해, 새 연결에서 잘못 처리되는 것을 방지

 

2. 흐름 제어

Selective Repeat

  • 윈도우 단위로 여러 세그먼트 전송 가능

 

동작 방식

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

 

권고사항

Round-Trip Time Estimation and Timeout (RFC 793, 6298, 2988)
  • 세그먼트 유실 또는 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로 돌아가 반복

 

전송 속도 공식

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

 

TCP Fairness

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

 

버전

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

 

출처