백엔드 개발자

TCP 본문

CS/네트워크

TCP

임잠탱 2024. 10. 17. 16:37

1. TCP

TCP는 연결 지향적이며, 신뢰성 있는 데이터 전송을 보장하는 전송 계층(Transport Layer)의 프로토콜입니다.
TCP는 IP위에서 동작하는데, IP가 데이터를 목적지로 라우팅하는 역할을 한다면, TCP는 그 데이터가 정확하고 순서대로 도착하도록 관리하는 역할을 합니다. TCP는 패킷 손실, 패킷의 순서 뒤바뀜, 혼잡한 네트워크 상황 등 다양한 네트워크 문제를 해결하기 위해 고안된 여러 메커니즘을 포함하고 있습니다.
TCP의 동작 흐름을 크게 보면 연결을 생성하고, 데이터 전송, 연결 종료의 순으로 이루어집니다.


2. 3-Way Handshake (3단계 핸드셰이크)

TCP는 연결 지향적 프로토콜이기 때문에, 데이터를 전송하기 전에 송신자와 수신자 간에 연결을 설정하는 과정이 필요합니다.
이 과정을 통해 연결을 생성하는데 이것을 3-Way Handshake라고 부르며, 3단계로 연결이 이루어집니다.

동작 방식:

  1. SYN (Synchronize):
    • 클라이언트가 서버에 연결을 요청합니다. 이때 클라이언트는 SYN 플래그가 설정된 패킷을 서버에 보냅니다. SYN 패킷은 임의의 시퀀스 번호(Initial Sequence Number, ISN)를 포함하고 있으며, 이 번호는 이후의 데이터 전송에 사용될 패킷의 순서를 결정하는 기준점입니다.
  2. SYN-ACK (Synchronize-Acknowledgment):
    • 서버는 클라이언트의 연결 요청을 수락하며, 응답으로 SYN-ACK 패킷을 보냅니다. 이 패킷에는 서버의 시퀀스 번호와 클라이언트의 시퀀스 번호에 1을 더한 값인 ACK 번호가 포함됩니다. 이때 ACK 번호는 클라이언트가 보낸 시퀀스 번호에 1을 더한 값입니다. 이 값은 다음에 클라이언트가 전송할 데이터를 나타냅니다.
  3. ACK (Acknowledgment):
    • 클라이언트는 서버로부터 받은 SYN-ACK 패킷을 확인하고, 마지막으로 ACK 패킷을 서버에 보냅니다. 이 패킷에는 클라이언트가 받은 서버의 시퀀스 번호에 1을 더한 ACK 번호가 포함되어 있습니다. 이제 양측 간에 연결이 완전히 설정되었습니다.

이 과정을 통해 클라이언트와 서버는 서로 데이터를 주고받을 준비가 된 상태임을 인식하고, 이후 데이터 전송이 시작됩니다.
3-Way Handshake는 신뢰성 있는 데이터 전송을 위한 연결을 설정하는 데 중요한 절차인데, 이 과정을 통해 양측은 서로의 시퀀스 번호를 교환하며, 이후 데이터 전송시에도 이 번호에 따라 패킷에 순차적으로 매겨집니다. 데이터가 순서대로 도착했는지, 누락된 것이 없는지 확인할 수 있고, 재전송을 통해 복구가 가능하게 해줍니다.


3. 슬라이딩 윈도우 (Sliding Window)와 흐름 제어 (Flow Control)

TCP는 흐름 제어를 통해 네트워크 성능을 최적화하고, 송신자와 수신자 간의 데이터 전송 속도를 조절합니다. 흐름 제어는 수신자가 처리할 수 있는 데이터의 양을 송신자가 초과하지 않도록 보장하는 메커니즘입니다. 이를 실현하는 핵심이 슬라이딩 윈도우 기법입니다.

우선 이 그림은 TCP 세그먼트 구조입니다. 헤더와 데이터로 구성이 되어 있는데 헤더에 포함된 다양한 데이터 중 윈도우 크기 데이터를 통해 수신자가 현재 받을 수 있는 윈도우 크기를 알 수 있고 이에 맞춰 받을 수 있을 만큼만 데이터를 보내 흐름을 제어합니다.

동작 방식:

  1. 윈도우 크기 (Window Size):
    • TCP 연결에서는 수신자가 한 번에 처리할 수 있는 데이터의 양을 윈도우 크기로 설정합니다. 송신자는 이 크기만큼의 데이터만 한 번에 전송할 수 있습니다. 수신자는 데이터를 받으면 송신자에게 ACK를 보내며, 자신의 버퍼에 여유가 있는 경우 윈도우 크기를 갱신합니다.
  2. 윈도우 슬라이딩:
    • 송신자가 데이터를 전송하고, 그 데이터에 대한 ACK를 받으면 윈도우는 "슬라이딩"되어 앞으로 이동합니다. 즉, 수신자가 이전 데이터를 성공적으로 처리했으므로 송신자는 새로운 데이터를 전송할 수 있게 되는 것입니다.
  3. 윈도우 크기 조절:
    • 네트워크 상황이나 수신자의 상태에 따라 윈도우 크기가 조절될 수 있습니다. 만약 수신자의 버퍼가 가득 찼다면, 윈도우 크기를 줄여 더 적은 데이터를 요청하게 됩니다. 반대로, 여유가 있다면 윈도우 크기가 커져 송신자는 더 많은 데이터를 전송할 수 있습니다.

윈도우 크기는 수신자가 받을 수 있는 여유 공간을 말하고, 슬라이딩 윈도우는 전송할 데이터의 범위를 나타내는 것입니다.

그림처럼 윈도우 사이즈 만큼 슬라이딩 윈도우의 크기가 설정되고, 데이터를 전송하여 수신자의 ACK 응답을 받으면 슬라이딩 윈도우가 이동하여 이후 전송할 데이터의 범위가 달라집니다. 슬라이딩 윈도우는 송신자가 수신자의 처리 능력에 맞춰 데이터 전송을 조절함으로써, 패킷 손실이나 데이터 오버플로우 같은 문제를 예방할 수 있습니다. 또한, 네트워크 혼잡을 줄이고 전송 속도를 최적화하는 데 중요한 역할을 합니다.


4. 신뢰성 있는 데이터 전송 (Reliable Data Transfer)

TCP는 신뢰성 있는 데이터 전송을 보장하는 프로토콜로, 데이터가 손실되거나 순서가 뒤바뀌는 상황에서도 복구할 수 있는 여러 가지 메커니즘을 포함하고 있습니다. 이를 실현하기 위한 주요 기술로는 시퀀스 번호, ACK, 타이머 등이 있습니다.

동작 방식:

  1. 시퀀스 번호(Sequence Number):
    • TCP는 전송하는 각 데이터 세그먼트에 시퀀스 번호를 부여합니다. 이 번호는 데이터가 전송된 순서를 추적하는 데 사용됩니다. 수신자는 시퀀스 번호를 통해 데이터가 도착한 순서를 확인하고, 만약 누락된 패킷이 있다면 이를 재요청할 수 있습니다.
  2. ACK와 재전송 (Retransmission):
    • 수신자는 받은 데이터에 대한 응답으로 ACK를 보냅니다. ACK에는 마지막으로 성공적으로 받은 시퀀스 번호가 포함됩니다. 송신자는 일정 시간 동안 ACK를 받지 못하면 해당 데이터를 손실된 것으로 판단하고, 데이터를 다시 전송합니다.
  3. 타이머 (Timeout):
    • TCP는 각 패킷에 대한 타이머를 설정하여 일정 시간 내에 ACK를 받지 못하면 재전송을 시작합니다. 이 타이머는 네트워크 지연 시간에 따라 동적으로 조정될 수 있습니다.
  4. 순서 재조합 (Out-of-order Reassembly):
    • 데이터가 네트워크 경로를 통해 도착하는 과정에서 순서가 뒤바뀌는 경우가 발생할 수 있습니다. TCP는 이를 해결하기 위해 수신자가 시퀀스 번호를 기반으로 데이터를 재조합하고, 누락된 패킷이 있으면 송신자에게 재전송을 요청합니다.

TCP의 신뢰성 있는 전송 메커니즘은 데이터가 손실되지 않고, 순서가 뒤바뀌거나 중복되지 않도록 보장합니다. 이는 신뢰성 있는 통신이 필요한 애플리케이션에서 매우 중요한 요소입니다. 예를 들어 파일 전송, 이메일 전송, 웹 브라우징 같은 응용 프로그램에서는 데이터의 정확한 전송이 필수적입니다.


5. 혼잡 제어 (Congestion Control)

네트워크의 상태는 시간에 따라 변동되며, 갑작스러운 트래픽 증가로 인해 혼잡한 상황이 발생할 수 있습니다. TCP는 네트워크 혼잡을 관리하기 위해 혼잡 제어 알고리즘을 사용합니다. 혼잡 제어는 네트워크의 혼잡 상태를 감지하고, 전송 속도를 조절하여 혼잡을 완화하는 역할을 합니다.

동작 방식:

  1. Slow Start (느린 시작):
    • TCP는 처음 연결될 때 갑작스럽게 많은 데이터를 보내는 것을 방지하기 위해 느리게 시작합니다. 처음에는 작은 크기의 윈도우로 데이터를 전송하고, ACK를 받을 때마다 윈도우 크기를 점진적으로 늘려나갑니다.
  2. Congestion Avoidance (혼잡 회피):
    • 네트워크가 혼잡해지는 것이 감지되면, 윈도우 크기를 더 이상 증가시키지 않고 천천히 줄여서 혼잡 상태를 완화합니다. 혼잡이 해결되면 다시 속도를 천천히 높이기 시작합니다.
  3. Fast Retransmit (빠른 재전송) 및 Fast Recovery (빠른 복구):
    • 네트워크에서 패킷 손실이 감지되면, TCP는 빠르게 재전송을 시도합니다. 패킷 손실을 감지하는 방법은 타이머 설정된 시간안에 전송한 데이터에 대한 ACK을 받지 못한 경우가 있는데 이 타이머가 만료되기 전 수신자로부터 중복된 ACK을 받으면 감지할 수 있습니다. 1, 2, 3 데이터를 보냈는데 2를 받지 못한 경우 1에 대한 ACK를 중복으로 보내게 되고, 이를 감지하며 빠르게 재전송합니다. 재전송 후에도 혼잡 상태를 빠르게 회복하기 위해 줄인 윈도우 크기를 유지하며, 혼잡이 해결되었을 때 속도를 다시 올립니다.
    네트워크 혼잡은 어떻게 감지하지?
    • 기본적으로 패킷의 손실이 일어나면 네트워크가 혼잡하다고 판단합니다. 또 RTT(Round Trip Time Increase)의 증가가 있습니다. RTT는 패킷이 송신되어 수신자에게 도달한 후, 그 패킷에 대한 ACK가 송신자에게 다시 돌아오기까지 걸리는 시간인데, RTT가 길어지면 네트워크가 혼잡하다고 판단할 수 있습니다.

혼잡 제어는 네트워크의 안정성을 유지하고, 트래픽이 갑작스레 폭증하는 상황에서도 데이터 손실을 최소화하는 중요한 기법입니다. 혼잡 제어는 네트워크 전체의 성능을 향상시키고, 공평한 자원 분배를 가능하게 합니다.


6. 4-Way Handshake (연결 종료)

연결을 설정하는 것만큼, 연결을 종료하는 과정도 중요합니다. 4-Way Handshake는 TCP에서 연결을 종료할 때 사용하는 절차로, 양측에서 모두 안전하게 연결을 끊을 수 있도록 도와줍니다.

동작 방식:

  1. FIN (Finish):
    • 데이터를 모두 전송한 송신자는 수신자에게 연결을 종료하겠다는 FIN 플래그가 설정된 패킷을 보냅니다.
  2. ACK (Acknowledgment):
    • 수신자는 FIN 패킷을 받고, 이를 확인하는 ACK 패킷을 송신자에게 보냅니다. 이때, 수신자는 아직 전송해야 할 데이터가 남아 있을 수 있습니다.
  3. FIN (Finish):
    • 수신자는 자신이 보낼 데이터를 모두 전송한 후, FIN 패킷을 송신자에게 보냅니다.
  4. ACK (Acknowledgment):
    • 송신자는 수신자의 FIN 패킷을 받고, 마지막으로 ACK 패킷을 보내 연결을 완전히 종료합니다.

4-Way Handshake는 연결이 끝났음을 양쪽 모두 확실하게 인지할 수 있도록 하는 절차입니다. 이를 통해 모든 데이터가 완벽히 전송되었는지 확인하고, 안전하게 연결을 끊을 수 있습니다.


결론

TCP는 매우 신뢰성 있는 데이터 전송을 보장하기 위해 여러 가지 복잡한 메커니즘을 갖추고 있습니다. 3-Way Handshake로 연결을 설정하고, 슬라이딩 윈도우와 혼잡 제어로 네트워크 자원을 효율적으로 사용하며, 신뢰성 있는 데이터 전송 메커니즘을 통해 데이터의 손실과 순서 뒤바뀜을 해결합니다. TCP의 이러한 메커니즘들은 오늘날 인터넷과 다양한 네트워크 기반 애플리케이션에서 필수적인 역할을 수행하고 있습니다.

'CS > 네트워크' 카테고리의 다른 글

HTTP & HTTPS  (2) 2024.10.31
IP 인터넷 프로토콜  (0) 2024.10.24
UDP  (2) 2024.10.17
Comments