Transmission Control Protocol (TCP)
1. 개념
- 연결 지향형(Connection-Oriented) Transport Protocol
- 통신을 시작하기 전에 가상의 연결(Virtual Connection) 을 생성
- 흐름 제어(Flow Control), 오류 검출 및 복구(Error Detection & Recovery) 기능 제공
2. TCP의 데이터 전송 특징
- 스트림 지향(Stream-Oriented)
- 연속된 바이트 스트림 으로 데이터를 처리
- 버퍼 (Buffer)
- 송신자(Sending)와 수신자(Receiving) 간 처리 속도 차이를 고려해 버퍼(Buffer) 사용
- 원형 큐(Circular Queue) 형태로 관리
- 보낸 데이터는 수신자의 응답(ACK) 을 받을 때까지 Sending Buffer에 유지
- 에러가 발생하면 재전송(Retransmission) 가능
3. TCP 서비스 특징
- Full-Duplex 서비스
- 양쪽 프로세스가 동시에 송신과 수신 가능
- Piggybacking: 송신할 데이터에 수신 확인(ACK) 정보도 같이 실어 보냄 → 효율성 증가
- Connection-Oriented 서비스
- 연결 설정 과정이 필요 (Three-way Handshake)
- 양쪽 모두 데이터 전송이 끝나고 버퍼가 비워지면 연결 해제
- Reliable 서비스
- 수신 확인(ACK) 메커니즘을 통해 데이터가 정상적으로 도착했는지 확인
- 데이터 손실, 순서 오류 발생 시 재전송
Byte Number
- TCP에서 전송되는 데이터의 각 바이트에 대한 고유 번호
Sequence Number (순서 번호)
- 세그먼트에 포함된 첫 번째 바이트의 번호
TCP Segment
- TCP는 데이터를 일정 크기의 세그먼트(Segment) 로 나눠서 전송
- 각 세그먼트는 데이터 + 제어 정보(헤더) 로 구성
TCP Segment Header 주요 필드

- Sequence Number: 이 세그먼트에서 처음 전송하는 Byte Number
- Acknowledgment Number: 수신자가 다음에 기대하는 바이트 번호 (애러 검출 및 복구에 사용)
- Window Size: 수신자가 한 번에 받을 수 있는 데이터 크기 (흐름 제어에 사용)
- Control Bits: 세그먼트의 제어 목적 (ACK, SYN, FIN 등)
Control Bits 종류 (대표)
- ACK : Acknowledgment Number가 유효함을 표시
- SYN : 연결 설정 요청
- FIN : 연결 종료 요청
Connection Establishment : 3 - Way Handshake
- TCP 연결을 설정하는 과정으로, 송신자와 수신자가 서로 통신할 준비가 되었는지 확인하는 절차
[1] SYN 패킷 (연결 요청)
Source Port: 12345 | Destination Port: 80 | Sequence Number: 1000 | ACK Number: 0 | Flags: SYN = 1, ACK = 0
[2] SYN + ACK 패킷 (연결 승인)
Source Port: 80 | Destination Port: 12345 | Sequence Number: 5000 | ACK Number: 1001 | Flags: SYN = 1, ACK = 1
[3] ACK 패킷 (연결 확립)
Source Port: 12345 | Destination Port: 80 | Sequence Number: 1001 | ACK Number: 5001 | Flags: ACK = 1
SYN Flooding Attack
- 정의: 공격자가 서버에 다수의 SYN 패킷을 보내서, 서버의 연결 요청 처리 리소스를 고갈시키는 공격
- 공격 방식:
- IP 주소 위조: 각 SYN 패킷이 다른 클라이언트에서 온 것처럼 보이도록 출발지 IP 주소를 위조.
- 서버 리소스 소모: 서버는 연결을 기다리며 자원을 점점 소모하게 되고, 결국 정상적인 요청을 처리하지 못하게 됨.
Connection Termination: 4-Way Handshake (Half-Close)
- Half-Close 상태:
- 클라이언트가 FIN 패킷을 전송 → 연결 종료 요청
- 서버가 ACK로 응답 : 클라이언트 → 서버 방향의 데이터 전송 종료
- 서버 → 클라이언트 방향의 데이터 전송은 계속 가능
→ 서버는 데이터를 계속 보낼 수 있으며, 클라이언트는 이를 ACK로 응답
- 최종 종료:
- 서버가 더 이상 데이터를 보내지 않으면 FIN 패킷을 전송
- 클라이언트가 이를 받아 ACK 패킷을 보내면서 연결 종료
TCP - Flow Control
- 수신 버퍼의 크기에 따라 데이터를 얼마나 보낼 수 있는지 조절하는 방식
- rwnd (Receive Window) 크기에 맞춰 송신 버퍼에서 데이터를 전송
- 클라이언트와 서버는 이 정보를 주고받으며 데이터 흐름을 제어
TCP - Normal Operation (ACK Delaying Timer)
- 목표:
- 데이터 전송 속도를 높이기 위해 수신 버퍼의 사이즈를 자주 업데이트하는 것이 중요
- 이를 통해 데이터를 얼마나 많이 보낼 수 있는지 파악 가능
- 문제점:
- Server로부터 많이 오는 ACK 패킷으로 인해 성능에 부하가 걸림.
- ACK 패킷을 자주 받는 것이 서버 측에 부하를 주기 때문에 이를 최적화할 필요가 있음
- ACK Delaying Timer:
- ACK Delaying Timer를 사용하면 ACK 패킷을 보내는 주기를 조절하여 부하를 줄일 수 있음
- 타이머가 짧으면 rwnd 사이즈가 더 빨리 업데이트되어 데이터 전송 속도가 증가함
- 그러나 타이머를 짧게 설정하면 서버 부하가 증가하므로 Trade-off 관계가 발생
- 현대적 관점:
- 컴퓨터의 프로세싱 성능이 향상되어 타이머를 짧게 설정하는 것이 유리해짐
- 부하가 증가하더라도 빠른 데이터 전송을 위해 타이머를 짧게 설정하는 것이 일반적
Lost Segment
- RTO (Retransmission Time Out):
- 송신자는 데이터(segment)를 보내고 타이머(RTO)를 시작
- 서버로부터 ACK를 RTO 시간 내에 받지 못하면 해당 데이터를 송신 버퍼에서 꺼내 재전송
- 동작 예시:
- 송신자가 Seq: 701–800 데이터 전송 후 타이머 시작.
- RTO 시간 안에 ACK: 701을 받지 못해 타임아웃 발생.
- 결과적으로 Seq: 701–800 구간을 Resent(재전송) 한다.
Fast Retransmission
- 빠른 오류 복구 메커니즘:
- 송신자가 같은 ACK 패킷을 3번 연속 수신하면, 해당 데이터(segment)가 손실된 것으로 간주하고 즉시 재전송
- 컴퓨터 프로세싱 속도가 빨라짐에 따라 적합한 기법.
Tahoe TCP - Congestion Control
- Slow Start 단계:
- cwnd(혼잡 윈도우)가 지수적으로 증가.
- cwnd란, 송신측이 ACK를 받기 전에 보낼 수 있는 패킷의 최대 개수.
- 네트워크가 혼잡하지 않으면 계속 빠르게 성장.
- cwnd(혼잡 윈도우)가 지수적으로 증가.
- Time-Out 발생 시:
- ssthresh를 현재 cwnd의 절반으로 설정.
- cwnd를 1로 초기화하고 다시 Slow Start로 돌아간다.
- Congestion Avoidance 단계:
- cwnd가 ssthresh 도달 시, 선형 증가(한 번에 1씩 증가)로 전환.
- 3중 중복 ACK 수신 시:
- ssthresh는 현재 cwnd의 절반으로 설정, cwnd를 1로 리셋.
- 이후 다시 Slow Start 단계부터 시작.
- 참고로, Reno TCP는 3중 중복 ACK 수신 시:
- Fast Recovery 단계 진입.
- cwnd를 1로 초기화하지 않고, 성능 저하를 방지하면서 빠르게 복구.
'풀스택서비스네트워킹' 카테고리의 다른 글
[풀스택서비스네트워킹] - 2주차 : OSI Architecture L4 (1) (0) | 2025.03.17 |
---|---|
[풀스택서비스네트워킹] - 1주차 : OSI Architecture L2~L3 (0) | 2025.03.10 |
[풀스택서비스네트워킹] - 1주차 : OSI Architecture (0) | 2025.03.05 |