TCP는 전송 제어 프로토콜로 인터넷에서 데이터를 신뢰성 있게 송수신 하기 위한 프로토콜로 TCP 연결의 주요 과정은 연결 설정, 데이터 송수신, 연결 종료로 나눌 수 있습니다
우선 용어에 대해서 간단히 말씀 드리면 액티브 오픈 호스트
는 연결 설정을 시작하는 호스트이고, 주로 클라이언트의 역할을 말한다고 합니다. 그리고 패시브 오픈 호스트
는 연결 요청을 수신하고 수락하는 호스트로 주로 서버 역할을 한다고 합니다.
SYN (Synchronize) 단계
액티브 오픈 호스트가 연결을 시작하고 싶을 때, 먼저 SYN 패킷을 보내는 것으로 연결 요청을 합니다. SYN 패킷은 연결 설정을 위한 초키 시퀀스 번호와 기타 정보를 포함하고 있다고 합니다.
SYN-ACK (Synchronize-Acknowledge) 단계
패시브 오픈 호스트가 이 요청을 수신하면, 연결을 수락할 준비가 되었음을 알리기 위해 SYN-ACK 패킷을 반환합니다. 이 패킷은 수신자가 보낸 SYN에 대한 응답으로 수신자의 SYN과 ACK를 포함합니다
ACK (Acknowledge)
액티브 오픈 호스트가 SYN-ACK 패킷을 수신하면 마지막으로 ACK 패킷을 보내 연결을 확인합니다. 이 패킷은 상대방의 SYN-ACK 패킷을 확인 응답하며, 이제 양쪽 호스트가 서로의 존재를 인식하고 연결이 설정 됩니다.
FIN (Finish)
액티브 클로즈 호스트가 연결 종료를 시작하고, 이 호스트는 더 이상 데이터를 송신하지 않겠다는 신호를 보내기 위해 FIN 패킷을 전송합니다. 이 패킷은 연결 종료를 요청하는 신호로, 송신자는 이 패킷을 통해 자신의 데이터 전송을 종료하겠다는 의사를 표현합니다
ACK (Acknowledge)
패시브 클로즈 호스트는 FIN 패킷을 수신한 후 이를 확인하기 위해 ACK 패킷을 반환합니다. ACK 패킷은 FIN 패킷에 대한 응답으로 수신자는 송신 호스트의 종료 요청을 수락했음을 나타냅니다 이때 패시브 클로즈 호스트는 자신의 데이터 전송을 계속할 수 있다고 합니다
FIN (Finish)
패시브 클로즈 호스트가 자신의 데이터 전송을 완료하고 연결 종료를 원할 때 FIN 패킷을 송신합니다.
ACK (Acknowledge)
액티브 클로즈 호스트가 패시브 클로즈 호스트가 보낸 FIN 패킷을 수신한 후, 이를 확인하기 위해 ACK 패킷을 반환합니다.
이런 과정을 통해 데이터 손실 방지
, 완전한 종료
, 시간 지연 방지
, 상태 일관성 유지
를 할 수 있다고 합니다.
TCP는 연결형 프로토콜이자 스테이트풀
프로토콜이라고 합니다. 이는 TCP가 연결 상태를 유지하고, 관리하며 다양한 상태를 통해 안정적이고 신뢰성 있는 통신을 제공한한다는 것을 의미합니다.
TCP 연결의 주요 상태 중 대표적인 것으로는
1. CLOSED: 연결이 완전히 종료된 상태로 모든 자원이 해제되고, 상태가 초기화되는 상태입니다.
LISTEN, SYN-SENT, SYN-RECEIVED: 연결 수립 도중 사용되는 상태
LISTEN은 서버가 클라이언트의 연결 요청을 기다리는 상태, SYN-SENT는 클라이언트가 연결 요청을 보내고, 서버의 응답을 기다리는 상태로 클라이언트가 이 상태에서 SYN 패킷을 보내고, SYN-ACK 패킷을 기다립니다. SYN-RECEIVED는 서버가 클라이언트의 연결 요청을 수신하고, 응답을 보낸 후에 있는 상태입니다.
ESTABLISHED: 클라이언트와 서버 간에 연결이 설정된 상태로, 데이터 송수신이 가능한 상태로, 양쪽 호스트가 데이터를 교환할 수 있습니다.
FIN-WAIT-1, FIN-WAIT-2, CLOSE-WAIT, CLOSING, LAST-ACK, TIME-WAIT: 연결 해제시 사용되는 상태
이중에서 TIME-WAIT
상태는 액티브 클로즈 호스트가 FIN 패킷을 보내고 마지막으로 ACK 패킷을 수신한 후에 들어가는 상태로 주된 역할로는
1. 마지막 ACK 세그먼트의 유실 대비: 만약 ACK 패킷이 유실되면, 상대방 호스트는 FIN 패킷을 재전송할 수 있으며, TIME-WAIT 상태를 통해 이 재전송을 수신하고 정상적으로 종료할 수 있습니다
2. 패킷 혼선 방지: 네트워크에서 이전 연결의 패킷이 지연되어 새로운 연결에 영향을 미치는 것을 막기 위해 TIME-WAIT 상태에서 일정 시간 동안 기다리며 이 시간을 통해 이전 연결의 패킷이 네트워크에서 소멸되도록 합니다.
TCP는 데이터가 정확히 전달되도록 보장하기 위해 재전송 기반의 오류 제어를 사용합니다. 이 기법은 잘못된 데이터 전송을 수정하기 위해 데이터 패킷을 재전송하는 방식입니다. 주요 특징으로는 두 가지가 있습니다.
ARQ (Automatic Repeat reQuest): 자동 재전송 요구 방식으로, 송신자가 패킷 전송 후 확인 응답을 기다리고, 응답이 오지 않거나 오류가 발생한 경우 패킷을 재전송하는 방식입니다.
타임아웃: 송신자는 데이터 패킷을 보낸 후, 일정 시간 동안 확인 응답을 기다리고 일정 시간 초과하면 패킷이 손실된 것으로 간주하고, 해당 패킷을 재전송합니다
잘못된 데이터 전송을 인지하는 오류 인지 방법에 대해서 말씀드리겠습니다.
수신 호스트가 동일한 데이터 패킷을 여러 번 수신했거나, 패킷이 손실되어 후속 패킷이 도착하지 않은 경우, 송신 호스트는 중복된 ACK 세그먼트를 수신할 수 있습니다.
빠른 재전송 (Fast Retransmit): 중복된 ACK 세그먼트를 일정 횟수(일반적으로 세 번) 수신하면, 송신자는 타이머가 만료되기 전에 손실된 패킷을 즉시 재전송하는 방식또한 있습니다. 이 방식은 타이머가 만료되기 전에 오류를 빠르게 감지하고 수정할 수 있게 합니다.
재전송 기법은 데이터 패킷을 효율적으로 관리하기 위한 방법으로, 다음과 같은 방식이 있습니다
단순 재전송: 송신자는 하나의 패킷을 보내고, 그에 대한 ACK를 받을 때까지 기다립니다. ACK를 수신하면 다음 패킷을 전송합니다. 이 방법은 구현이 간단하지만, 데이터 전송 속도가 느릴 수 있습니다.
이렇게 네트워크 이용 효율이 낮아지는 문제가 생기고 이러한 문제를 해결하기 위해 파이프라이닝을 사용합니다. 파이프라이닝
은 네트워크 전송에서 여러 데이터 패킷을 연속적으로 송신할 수 있도록 하는 기법입니다.
파이프라이닝의 작동 방식
연속적인 패킷 전송: 파이프라이닝에서는 송신자가 하나의 패킷에 대한 ACK를 기다리지 않고, 여러 개의 패킷을 연속적으로 전송합니다.
윈도우 기반의 관리: TCP에서 파이프라이닝을 지원하는 주요 방법은 슬라이딩 윈도우(sliding window) 기법입니다. 송신자는 윈도우 크기 내에서 여러 패킷을 전송할 수 있으며, 수신자는 이러한 패킷들을 수신하고, 순서대로 ACK를 보내면서 패킷을 처리합니다.
이런 파이프라이닝과 결합한 재전송 기법에 Selective Repeat ARQ
와 Go-Back-N ARQ
입니다.
윈도우 크기: 송신자는 한 번에 전송할 수 있는 패킷의 범위를 정의하며, 이 범위 내에서 패킷을 보내고 ACK를 기다립니다.
윈도우 크기: 송신자와 수신자는 각각 개별 패킷의 ACK를 수신하고 전송 상태를 추적합니다.
TCP는 데이터 전송의 신뢰성을 보장하기 위해 두 가지 주요 제어 기법인 흐름 제어와 혼잡 제어를 사용합니다.
흐름 제어의 주요 구성 요소로는 송신 버퍼
와 수신 버퍼
가 있습니다. 송신 버퍼는 송신 호스트가 전송할 데이터를 임시로 저장하는 버퍼이고 수신 버퍼는 수신 호스트가 수신한 데이터를 임시로 저장하는 버퍼입니다.
TCP의 흐름 제어는 슬라이딩 윈도우
기법을 통해 이루어집니다.
슬라이딩 윈도우 기법은 송신자가 수신자로부터 ACK를 받기 전에도 여러 패킷을 전송할 수 있도록 하여, 전송 효율성을 높이는 방법입니다. 슬라이딩 윈도우의 구성 요소에는 윈도우가 있습니다. 윈도우는 데이터 전송에서 송신자와 수신자 간의 데이터 흐름을 조절하는 범위로 송신자가 전송할 수 있는 데이터의 범위를 정의합니다. 윈도우는 송신 윈도우
와 수신 윈도우
로 나뉘는데 송신 윈도우는 송신자가 전송할 수 있는 데이터의 범위이고, 수신자의 버퍼 크기와 송신자의 현재 상태에 따라 결정됩니다. 수신 윈도우는 수신자가 수신할 수 있는 데이터의 범위이고 수신자의 버퍼 크기와 현재 수신 상태에 따라 결정됩니다.
흐름 제어의 목적
1. 수신 호스트가 데이터 처리 속도에 따라 송신 속도를 조절하여, 데이터 손실을 방지하고 효율적인 전송을 보장합니다.
2. 수신 호스트의 버퍼가 가득 차면 송신 호스트는 데이터를 더 이상 전송하지 않으며, 이를 통해 버퍼 오버플로우를 방지합니다.
혼잡 제어는 네트워크의 트래픽이 과도해져서 패킷 손실이나 지연이 발생할 수 있는 상황을 조절하는 기법입니다. 네트워크가 혼잡해지면 패킷이 손실되거나 지연될 수 있으므로, 이를 방지하기 위해 송신 호스트가 전송 속도를 조절해야 합니다.
혼잡 제어의 주요 구성 요소로는 혼잡 윈도우
가 있습니다.
혼잡 윈도우는 송신 호스트가 네트워크 혼잡 상태를 고려하여 송신할 수 있는 데이터의 양을 정의하는 윈도우입니다. 혼잡 윈도우는 네트워크의 혼잡 정도에 따라 조정됩니다.
주요 혼잡 제어 알고리즘은 세 가지가 있습니다.
느린 시작 알고리즘의 작동방식은 송신 호스트가 연결을 시작할 때, 혼잡 윈도우를 작게 설정하고, ACK 세그먼트가 수신될 때마다 혼잡 윈도우 크기를 증가시킵니다. RTT(왕복 시간)마다 혼잡 윈도우를 2배로 증가시켜 네트워크 혼잡을 피하면서 최대 전송 속도를 점진적으로 찾아가는 것입니다.
혼잡 회피 알고리즘의 작동 방식은 혼잡 윈도우가 일정 크기에 도달하면, 매 RTT마다 혼잡 윈도우를 1씩 증가시킵니다. 혼잡 회피의 목표는 혼잡 상태를 예방하기 위해, 전송 속도를 천천히 증가시키면서 네트워크의 혼잡을 방지합니다.
빠른 회복 알고리즘의 작동 방식은 패킷 손실이 감지되면, 혼잡 윈도우 크기를 급격히 감소시키고, 손실된 패킷을 빠르게 재전송합니다. 손실된 패킷이 재전송된 후, 혼잡 윈도우를 점진적으로 증가시킵니다. 빠른 회복 알고리즘의 목표는 패킷 손실이 발생했을 때, 느린 시작을 건너뛰고 빠르게 네트워크 상태를 회복하는 것입니다.
이러한 혼잡 제어를 통해서 네트워크의 혼잡을 완화하고, 자원을 효율적으로 사용할 수 있습니다.