Network

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

noahkim_ 2025. 3. 28. 18:57

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

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

 

 

1. TCP

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

 

특징

특징 설명
Point to Point
단일 송신자와 단일 수신자 간의 통신
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 헤더 길이
- 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 연결을 시작할 때 사용
데이터 순서 추적
- 3-way handshake의 1, 2단계에서 등장
- 서로 초기 ISN을 교환
URG 긴급 포인터 필드가 유효함을 나타냄
데이터 중 일부가 우선적으로 처리되어야 함을 알림. 
- 예: 중단 요청
ACK
승인 번호 필드가 유효함을 나타냄. 
상대방으로부터 데이터를 수신했음을 확인하는 신호
PSH
데이터를 즉시 상위 애플리케이션에 전달하도록 지시.
버퍼에 대기하지 않도록 함
- 예: 터미널 입력 시 바로 전송.
RST
현재 연결을 강제로 끊음. 
즉시 세션을 종료할 때 사용.
- 예: 잘못된 패킷 수신, 포트 닫힘, 비정상 상태
FIN
TCP 연결을 종료할 때 사용
4-way handshake에서 등장
- 내 전송 방향을 닫는다는 의미로 사용
- 양방향 종료를 위해 두번 필요

 

2. 연결 지향형

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

 

연결 설정 (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 미수신 → 타임아웃 → 세그먼트 재전송
타임아웃이 너무 짧을 경우
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 기기의 대역폭이 균등해지는 방향으로 조정됨.

 

 

 

 

 

출처