이석복 님의 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를 주로 사용함
흐름) 동작 방식
더보기
- 수신자의 버퍼 상태 전송
- 수신자: 자신의 버퍼에 남은 공간 크기를 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 |