1. TCP란 무엇인가?
TCP(Transmission Control Protocol)는 신뢰성을 보장하는 연결형 프로토콜이다.
데이터 전송 전 연결을 설정하고, 데이터의 손실이나 순서 오류를 방지하며, 전송된 데이터를 정확히 수신자가 받을 수 있도록 보장한다.
TCP의 주요 특징
연결 지향적이다. (데이터 전송 전 연결을 설정한다.)
신뢰성을 보장한다. (패킷 손실, 중복, 순서 오류를 복구한다.)
흐름 제어(Flow Control)와 혼잡 제어(Congestion Control)를 제공한다.
데이터 스트림을 패킷 단위로 나누어 전송하고, 수신자는 이를 조립하여 원래 데이터를 복원한다.
3-Way Handshake
3-Way Handshake는 TCP 연결을 설정하기 위해 송신자와 수신자가 세 번의 신호를 교환하는 과정이다.

과정
1. SYN (Synchronize)
- 클라이언트가 서버에 연결 요청을 보냅니다.
-클라이언트는 SYN 플래그가 설정된 패킷을 서버로 전송하며, 이 패킷에는 초기 시퀀스 번호(Initial Sequence Number, ISN)가 포함됩니다.
예: SYN=1, Seq=x
- 목적: 서버에게 "연결을 시작하겠다"는 신호를 보냄.
2. SYN-ACK
- 서버가 클라이언트의 요청을 수락합니다.
- 서버는 클라이언트가 보낸 시퀀스 번호에 대한 ACK(승인)와 자신의 시퀀스 번호를 포함한 SYN 플래그가 설정된 패킷을 클라이언트로 전송합니다.
- 예:
SYN=1, ACK=1, Seq=y, Ack=x+1
- 목적: 클라이언트의 요청을 확인하고 서버도 연결 준비가 되었음을 알림.
3. ACK
- 클라이언트는 서버의 응답을 확인합니다.
- 클라이언트는 ACK 플래그가 설정된 패킷을 서버로 전송하며, 서버의 시퀀스 번호에 대한 확인 응답을 포함합니다.
- 예:
ACK=1, Seq=x+1, Ack=y+1
- 목적: 서버의 응답을 확인하고 연결 설정을 완료함.
결과
송신자와 수신자는 서로 연결이 설정되었음을 확인하며 데이터 전송을 시작한다.
예시 비유
전화 통화 예시:
1. 클라이언트가 서버에 전화를 겁니다. (SYN)
2. 서버가 전화를 받고 "여보세요?"라고 답합니다. (SYN-ACK)
3. 클라이언트가 "잘 들려요, 시작합시다!"라고 응답합니다. (ACK)
4-Way Handshake
3-way handshake 를 통해 안전하게 세션을 생성하고, 데이터를 주고 받은 뒤 연결을 해제 하고자 할 때, 4-way Handshake 과정이 이루어 지게 된다

과정
1. FIN (Finish)
클라이언트는 연결을 종료하고자 서버에 FIN 플래그를 보내고 FIN_WAIT 상태에 들어간다.
2. ACK
서버는 클라이언트로 부터 FIN 플래그를 받은 뒤 ACK 패킷을 보낸 후 데이터를 모두 보낼 때 까지 잠시 TIME_OUT 이 된다. 이 때 서버는 ClOSE_WAIT 상태이다.
3. FIN
서버가 연결을 종료할 준비가 되면, 연결을 해제할 준비가 되었다는 FIN 플래그를 클라이언트에 전송하고, 서버는 LAST_ACK 상태가 된다.
4. ACK
클라이언트는 서버에 ACK를 보내 응답하고 클라이언트의 상태는 FIN_WAIT 에서 TIME-WAIT 으로 변경된다. 클라이언트의 ACK 응답을 받은 서버는 연결을 해제한다.
이 때, 클라이언트는 ACK 를 보낸 이후 일정 시간동안 기다리게 되는데, 아직 서버에서 받지 못한 데이터가 연결이 해제되어 유실되는 경우를 대비해 잉여 패킷을 기다리는 TIME_WAIT 상태를 일정 시간 유지하게 된다.
결과
양측은 연결을 안전하게 종료한다.
TCP 빠른 재전송 (Fast Retransmission)
TCP 빠른 재전송은 데이터 손실이 의심되는 경우, 타이머를 기다리지 않고 즉시 데이터를 재전송하는 메커니즘이다.
작동 원리
수신자가 예상되지 않은 데이터 패킷을 받으면 중복 ACK를 송신자에게 보낸다.
송신자가 동일한 중복 ACK를 세 번 받으면, 해당 데이터가 손실되었음을 추정하고 즉시 재전송한다.

예를들어 1, 2, 3, 4, 5... 번의 데이터가 순서대로 와야하는데 2, 3 다음 5번이 온 것이다.
이런 상황이 발생했을 때 수신측에서는 순서대로 잘 도착한 마지막 패킷의 다음 순번을 ACK 패킷에 실어서 보낸다. 그리고 이런 중복 ACK를 3개 받으면 재전송이 이루어진다.
송신 측은 자신이 설정한 타임아웃 시간이 지나지 않았어도 바로 해당 패킷을 재전송할 수 있기 때문에 보다 빠른 전송률을 유지할 수 있다.
참고로, 송신측에서 설정한 타임아웃 까지 ACK를 받지 못하면 혼잡(Congestion)이 발싱한 것으로 판단하여 혼잡 회피를 한다.
장점
데이터 전송 지연을 줄인다.
효율적인 손실 복구를 통해 네트워크 성능을 향상시킨다.
Congestion Control (혼잡 제어)
-
네트워크 혼잡으로 인한 성능 저하를 방지하기 위해 송신 속도를 조절하는 메커니즘
-
송신측의 데이터는 지역망이나 인터넷으로 연결된 대형 네트워크를 통해 전달된다. 만약 한 라우터에 데이터가 몰릴 경우, 자신에게 온 데이터를 모두 처리할 수 없게 된다. 이런 경우 호스트들은 또 다시 재전송을 하게되고 결국 혼잡만 가중시켜 오버플로우나 데이터 손신을 발생시키게 된다. 따라서 이러한 네트워크의 혼잡을 피하기 우해 송신측에서 보내는 데이터의 전송속도를 강제로 줄이게 되는데, 이러한 작업을 혼잡제어라고 한다.
-
또한 네트워크 내에 패킷의 수가 과도하게 증가하는 현상을 혼잡이라 하며, 혼잡 현상을 방지하거나 제거하는 기능을 혼잡제어라고 한다.
-
흐름제어가 송신측과 수신측 사이의 전송속도를 다루는데 반해, 혼잡제어는 호스트와 라우터를포함한 보다 넓은 관점에서 전송 문제를 다루게 된다.
주요 알고리즘
1. AIMD(Additive Increase / Multiplicative Decrease)

- 처음에 패킷을 하나씩 보내고 이것이 문제없이 도착하면 window 크기(단위 시간 내에 보내는 패킷의 수)를 1씩 증가시켜가며 전송하는 방법
- 패킷 전송에 실패하거나 일정 시간을 넘으면 패킷의 보내는 속도를 절반으로 줄인다.
- 공평한 방식으로, 여러 호스트가 한 네트워크를 공유하고 있으면 나중에 진입하는 쪽이 처음에는 불리하지만, 시간이 흐르면 평형상태로 수렴하게 되는 특징이 있다.
- 문제점은 초기에 네트워크의 높은 대역폭을 사용하지 못하여 오랜 시간이 걸리게 되고, 네트워크가 혼잡해지는 상황을 미리 감지하지 못한다. 즉, 네트워크가 혼잡해지고 나서야 대역폭을 줄이는 방식이다.
2. Slow Start (느린 시작)
- 초기에는 송신 윈도 크기를 작게 시작하고, ACK를 받을 때마다 크기를 지수적으로 증가시킨다.
- AIMD 방식이 네트워크의 수용량 주변에서는 효율적으로 작동하지만, 처음에 전송 속도를 올리는데 시간이 오래 걸리는 단점이 존재했다.
- Slow Start 방식은 AIMD와 마찬가지로 패킷을 하나씩 보내면서 시작하고, 패킷이 문제없이 도착하면 각각의 ACK 패킷마다 window size를 1씩 늘려준다. 즉, 한 주기가 지나면 window size가 2배로 된다.
- 전송속도는 AIMD에 반해 지수 함수 꼴로 증가한다. 대신에 혼잡 현상이 발생하면 window size를 1로 떨어뜨리게 된다.
- 처음에는 네트워크의 수용량을 예상할 수 있는 정보가 없지만, 한번 혼잡 현상이 발생하고 나면 네트워크의 수용량을 어느 정도 예상할 수 있다.
- 그러므로 혼잡 현상이 발생하였던 window size의 절반까지는 이전처럼 지수 함수 꼴로 창 크기를 증가시키고 그 이후부터는 완만하게 1씩 증가시킨다.
3. Fast Retransmit (빠른 재전송)
- 빠른 재전송은 TCP의 혼잡 조절에 추가된 정책이다.
패킷을 받는 쪽에서 먼저 도착해야할 패킷이 도착하지 않고 다음 패킷이 도착한 경우에도 ACK 패킷을 보내게 된다.
- 단, 순서대로 잘 도착한 마지막 패킷의 다음 패킷의 순번을 ACK 패킷에 실어서 보내게 되므로, 중간에 하나가 손실되게 되면 송신 측에서는 순번이 중복된 ACK 패킷을 받게 된다. 이것을 감지하는 순간 문제가 되는 순번의 패킷을 재전송 해줄 수 있다.
- 중복된 순번의 패킷을 3개 받으면 재전송을 하게 된다. 약간 혼잡한 상황이 일어난 것이므로 혼잡을 감지하고 window size를 줄이게 된다.
4. Fast Recovery (빠른 회복)
- 중복 ACK를 기반으로 데이터 손실을 빠르게 복구하고, 혼잡 윈도 크기를 줄이면서 회복한다.
- 혼잡한 상태가 되면 window size를 1로 줄이지 않고 반으로 줄이고 선형증가시키는 방법이다. 이 정책까지 적용하면 혼잡 상황을 한번 겪고 나서부터는 순수한 AIMD 방식으로 동작하게 된다.
Flow Control (흐름 제어)
- 수신측이 송신측보다 데이터 처리 속도가 빠르면 문제없지만, 송신측의 속도가 빠를 경우 문제가 생긴다.
- 수신측에서 제한된 저장 용량을 초과한 이후에 도착하는 데이터는 손실 될 수 있으며, 만약 손실 된다면 불필요하게 응답과 데이터 전송이 송/수신 측 간에 빈번이 발생한다.
- 이러한 위험을 줄이기 위해 송신 측의 데이터 전송량을 수신측에 따라 조절해야한다.
해결 방법
- 수신자는 윈도 크기(Window Size) 정보를 통해 자신이 처리 가능한 데이터 크기를 송신자에게 알린다.
- 송신자는 수신자가 처리할 수 있는 만큼만 데이터를 보낸다.
장점
- 데이터 손실을 방지한다.
- 송신자와 수신자 간의 데이터 처리 균형을 유지한다.