이석복 님의 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이 새로운 연결에서 혼동을 일으킬 수 있음
- 서버가 보낸 FIN을 받은 후, 서버가 ACK를 제대로 받았는지 확인하기 위함
2. 흐름 제어
- Selective Repeat를 주로 사용함
동작 방식
- 수신자의 버퍼 상태 전송
- 수신자는 자신의 버퍼에 남은 공간 크기를 Receive Window 필드에 담아 송신자에게 전달함
- 송신자는 이 값을 참고하여 데이터 양을 조절하여 전송한다
- 버퍼가 가득 찬 경우
- 수신자 버퍼가 가득 차면, Receive Window = 0 인 세그먼트를 송신자에게 전송하여 더이상 데이터를 보내지 말것을 알림
- 송신자는 새로운 데이터 전송을 멈춤
- 송신자의 확인 작업 (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를 받으면 손실된 패킷을 즉시 재전송함
- 세그먼트 전송 및 ACK 수신
- 송신자가 연속적인 세그먼트를 전송
- 수신자는 정상적으로 받을 경우 그에 맞는 ack를 송신함
- 만약 하나의 세그먼트가 손실되었을 경우, 수신자는 이전 ack를 계속해서 보냄
- 예를 들어, seq1~100을 보냈고 seq10이 손실되었다면 수신자는 ack10을 계속 보냄
- 중복 ack
- 송신자에게 중복 ack가 3회가 수신되면, 송신자는 해당 세그먼트가 유실되었다 판단하고 타임아웃되기 전에 재전송함
- 타이머가 만료되기 전에 재전송하여 전송 지연을 최소화함
- 수신 버퍼와 중복 ack
- 수신 버퍼는 큐로 이루어져 있으며, 수신된 세그먼트를 보관
- 일부 세그먼트가 유실될경우, 수신 버퍼는 해당 세그먼트를 pop 할수 없음
- 이로인해 수신자는 유실된 세그먼트를 받기 전까지 중복 ACK를 계속 전송함
3. 혼잡 제어
동작 순서
- Slow Start
- 네트워크가 허용할 수 있는 전송량을 빠르게 찾아가는 단계
- 초기에는 병목이 일어나는 대역폭이 어느 정도인지 알 수 없음
- 작은 cwnd값에서 시작하여 점진적으로 exponential하게 증가시키기
- Additive increase
- slow start에서 threshold에 도달하면 증가 속도를 조절
- linear하게 증가시키면서 cwnd를 조절
- 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 기기의 대역폭이 균등해지는 방향으로 조정됨.
출처
'Network' 카테고리의 다른 글
[러닝 HTTP/2] 2. HTTP/2 맛보기 (0) | 2025.03.29 |
---|---|
[컴퓨터 네트워킹 하향식 접근] 3-3. 트랜스포트 계층: UDP (1) | 2025.03.28 |
[러닝 HTTP/2] 1. HTTP의 진화 (0) | 2025.03.28 |
[컴퓨터 네트워킹 하향식 접근] 3-1. 트랜스포트 계층: 개요 (0) | 2025.03.27 |
[컴퓨터 네트워킹 하향식 접근] 2. 애플리케이션 계층 (1) | 2025.03.27 |