리눅스 네트워크 기초 - TCP 프로토콜

김명주·2025년 1월 3일
post-thumbnail

TCP 프로토콜

TCP란?

TCP(Transmission Control Protocol)는 네트워크 핵심 프로토콜 중 하나로, 신뢰성 있는 데이터 전송을 보장한다. 이 프로토콜은 네트워크 연결 지향적이며, 데이터 패킷의 순서를 보장하고 오류를 검출하여 재전송하는 기능을 제공한다.

  • 연결이 정상적으로 맺어져 있는지 확인 후, 데이터 전송

TCP 헤더와 플래그

TCP 헤더

TCP 헤더는 데이터 전송의 제어와 관리를 위한 중요한 정보를 포함하고 있다.
주요 필드로는 출발지 포트, 목적지 포트, 시퀀스 번호, 확인 응답 번호, 데이터 오프셋, 예약 필드, 제어 비트(플래그), 윈도우 크기, 체크섬, 긴급 포인터 등이 있다.
이러한 필드들은 TCP 연결의 설정, 유지, 종료 및 데이터의 신뢰성 있는 전송을 가능하게 한다.

  • SEQ (Sequence Number)
    • 데이터 스트림에서 각 바이트의 순서를 나타내는 번호
    • 초기 SEQ 번호는 랜덤하게 선택되며, 이후 전송된 데이터의 바이트 수만큼 증가
    • 수신자가 데이터의 순서를 올바르게 재구성하고 중복을 방지하는데 사용됨.
  • ACK (Acknowledgment Number)
    • 수신자가 다음에 받기를 기대하는 데이터의 SEQ 번호
    • 일반적으로 마지막으로 성공적으로 수신한 데이터의 SEQ 번호에 1을 더한 값
    • 송신자에게 어떤 데이터까지 성공적으로 수신했는지 알려주는 역할
  • 윈도우 크기 (Window Size)
    • 수신자가 현재 받을 수 있는 데이터의 양을 나타낸다.
    • 네트워크 혼잡을 제어하고 흐름 제어를 위해 사용됨. (흐름제어, 혼잡제어)
    • 동적으로 조절되어 네트워크 상황에 따라 최적의 전송 속도를 유지한다.

SEQ 와 ACK 번호를 통해 데이터의 순서를 유지하고, 손실된 패킷을 감지하여 재 전송을 요청할 수 있다.

TCP 플래그

TCP 헤더는 연결의 상태와 패킷의 목적을 나타낸다. 주요 TCP 플래그는 다음과 같다.

  • SYN (Synchronize) : 연결 설정 요청을 나타낸다. 초기 시퀀스 번호를 설정하는 데 사용된다.
  • ACK (Acknowledgment) : 데이터 수신 확인을 나타낸다. 거의 모든 패킷에 설정된다.
  • FIN (Finish) : 연결 종료 요청을 나타낸다.
  • RST (Reset) : 연결을 즉시 중단하고 재설정한다.
  • PSH (Push) : 수신 측에 데이터를 즉시 애플리케이션에 전달하도록 요청한다.
  • URG (Urgent) : 긴급 데이터가 포함되어 있음을 나타낸다.

TCP 연결과 종료

3-way handshake (연결 수립 과정)

클라이언트                              서버
    |                                 |
    |           SYN (seq=x)           |
    |-------------------------------->|
    |                                 |
    |     SYN-ACK (seq=y,ack=x+1)     |
    |<--------------------------------|
    |                                 |
    |   ACK[+data] (seq=x+1,ack=y+1)  |
    |-------------------------------->|
    |                                 |
    |          (연결 설정 완료)        |
    |                                 |
  1. SYN (Synchronize): 클라이언트가 서버에 연결을 요청
  • 클라이언트는 초기 시퀀스 번호(x)를 선택하고 SYN 플래그가 설정된 세그먼트를 전송.
  • 이 단계에서 클라이언트는 SYN_SENT 상태가 된다.
  1. SYN-ACK (Synchronize-Acknowledge): 서버가 클라이언트의 요청을 수락하고 응답
  • 서버는 자신의 초기 시퀀스 번호(y)를 선택한다.
  • ACK 필드를 클라이언트의 시퀀스 번호에 1을 더한 값(x+1)으로 설정한다.
  • SYN 과 ACK 플래그가 모두 설정된 세그먼트를 전송한다.
  • 서버는 SYN_RECEIVED 상태가 된다.
  1. ACK (Acknowledge): 클라이언트가 서버의 응답을 확인
  • 클라이언트는 서버의 시퀀스 번호에 1을 더한 값(y+1)을 ACK 필드에 설정헌다.
  • 자신의 시퀀스 번호는 x+1 로 설정한다.
  • ACK 플래그가 설정된 세그먼트를 전송한다.
  • 이 단계에서 클라이언트와 서버 모두 ESTABLISHED 상태가 되어 연결이 완료된다.
  • 이 시점부터 클라이언트는 데이터 전송을 시작할 수 있고, 서버 역시 클라이언트로부터 데이터를 수신할 준비가 완료된다

이렇게 3-way handshake를 통해 TCP 연결이 설정되면, 클라이언트와 서버는 안정적인 양방향 통신 채널을 확보하게 된다. 이 연결을 통해 데이터를 주고받을 수 있으며, 각 패킷의 순서와 전달 여부를 확인할 수 있다. 연결이 더 이상 필요하지 않을 때는 4-way handshake를 통해 연결을 종료하게 된다.

4-way handshake (연결 종료 과정)

클라이언트                서버
    |                      |
    |    FIN (seq=u)       |
    |--------------------->|
    |                      |
    |    ACK (ack=u+1)     |
    |<---------------------|
    |                      |
    |    FIN (seq=v)       |
    |<---------------------|
    |                      |
    |    ACK (ack=v+1)     |
    |--------------------->|
    |                      |
    |     연결 종료 완료    |
    |                      |
  1. FIN (Finish): 클라이언트가 연결 종료를 요청

    • 클라이언트는 FIN 플래그가 설정된 세그먼트를 전송
    • 이 단계에서 클라이언트는 FIN_WAIT_1 상태가 된다.
  2. ACK: 서버가 클라이언트의 종료 요청을 확인

    • 서버는 클라이언트의 시퀀스 번호에 1을 더한 값(u+1)을 ACK 필드에 설정하여 응답.
    • 서버는 CLOSE_WAIT 상태가 되고 클라이언트는 FIN_WAIT_2 상태가 된다.
  3. FIN: 서버가 연결 종료 준비를 마치고 종료를 요청

    • 서버는 FIN 플래그가 설정된 세그먼트를 전송
    • 서버는 LAST_ACK 상태가 된다.
  4. ACK: 클라이언트가 서버의 종료 요청을 확인

    • 클라이언트는 서버의 시퀀스 번호에 1을 더한 값(v+1)을 ACK 필드에 설정하여 응답
    • 클라이언트는 TIME_WAIT 상태가 되고 일정 시간 후 CLSOED 상태가 됨.
    • 서버는 이 ACK를 받으면 즉시 CLOSE 상태가 됨.

handshake 과정을 통해 TCP는 신뢰성 있는 연결 설정과 종료를 보장한다.
각 단계에서 시퀀스 번호와 확인 응답을 사용하여 데이터의 순서와 전송을 정확히 관리한다.

흐름제어

흐름제어란 송신자와 수신자 간의 데이터 전송 속도를 조절하여 수신자의 버퍼 오버플로우를 방지하는 중요한 메커니즘이다.
TCP는 네트워크의 효율성을 높이고 데이터 손실을 최소화하기 위해 여러 흐름 제어 방식을 사용한다. 그 중 대표적인 것이 Stop-and-Wait 방식과 윈도으 크기를 활용한 방식이다.

Stop-and-Wait 방식

Stop-and-Wait은 가장 단순한 흐름 제어 방식으로, 송신자가 하나의 패킷을 보내고 수신자의 확인(ACK)을 받을 때까지 기다리는 방식이다.

이 방식은 간단하지만 응답이 돌아올 때 까지 계속해서 대기하는 상황이 발생하고 이로 인해 네트워크 자원을 비효율적으로 사용하며, 특히 긴 지연시간을 가진 네트워크에서 성능이 떨어진다.

윈도우 크기를 활용한 방식

확인 응답을 기다리지 않고 서로 약속했던 윈도우 크기 만큼의 패킷을 한번에 전달하는 방식이다.
윈도우 크기는 확인 응답을 기다리지 않고 한 번에 전송할 수 있는 데이터의 양을 나타낸다. 이를 통해 네트워크 자원을 더 효율적으로 사용할 수 있다.
TCP의 표준 구현에서 이 기능은 기본적으로 활성화되어 있어 대부분의 TCP 연결에서 자동으로 사용된다. 이는 인터넷 프로토콜 스택의 핵심 요소로, 신뢰성 있는 데이터 전송과 효율적인 네트워크 사용을 동시에 달성하는 데 중요한 역할을 한다.

윈도우 크기를 사용하면 여러 패킷을 연속으로 전송할 수 있어, 네트워크 지연 시간을 효과적으로 활용할 수 있다. 이는 특히 대역폭이 크고 지연시간이 긴 네트워크에서 큰 성능 향상을 가져온다.

윈도우 사이즈가 크면 무조건 좋을까?

반드시 그렇지는 않다. 사이즈가 너무 크면 네트워크 혼잡이 발생할 수 있고, 패킷 손실 시 재전송해야 할 데이터의 양이 증가하여 오히려 성능이 저하될 수 있다. 따라서 네트워크 상황과 수신자의 처리 능력을 고려한 적절한 윈도우 설정이 중요하다.

ARQ (Automatic Repeat reQuest)

ARG는 TCP가 사용하는 오류 제어 메커니즘으로, 데이터 전송의 신뢰성을 보장하는 데 중요한 역할을 한다. 이 방식은 흐름 제어와 밀접하게 연관되어 있으며 다음과 같은 특징을 가진다.

  • 오류 감지 : 수신자는 체크섬을 통해 수신된 패킷의 오류를 감지한다.
  • 확인 응답 : 오류 없이 수신된 패킷에 대해 ACK를 보낸다.
  • 재전송 : 송신자는 일정 시간 내에 ACK를 받지 못하면 해당 패킷을 재전송한다.

ARG의 주요 방식

  1. Stop-and-Wait ARQ: 각 패킷을 보낸 후 ACK를 기다리는 가장 기본적인 방식. 단순하지만 비효율적일 수 있다.
  2. Go-Back-N ARQ: 여러 패킷을 연속으로 전송하고, 오류 발생 시 해당 패킷부터 모두 재전송하는 방식. 윈도우 사이즈 중간에서 유실이 발생했다고 하면, 그 유실이 발생한 구간부터 다시 요청하는 방식이다.
  3. Selective Repeat ARQ: 오류가 발생한 특정 패킷만을 선택적으로 재전송하여 효율성을 높이는 방식. 단, 추가적인 리소스 소모가 있을 수 있다.

TCP는 주로 Selective Repeat ARQ와 유사한 방식을 사용하여 효율적인 데이터 전송과 오류 복구를 수행한다. 이는 윈도우 기반 흐름 제어와 결합되어 네트워크 자원을 최적화하고 신뢰성 있는 데이터 전송을 보장한다.

네이글 알고리즘

네이글 알고리즘은 TCP 연결에서 작은 패킷들의 과도한 전송을 줄이기 위해 설계된 알고리즘이다. 이 알고리즘은 다음과 같은 방식으로 작동한다.

  • 소량의 데이터 축적 : 작은 크기의 데이터를 즉시 전송하지 않고 일정량이 모일 때 까지 기다린다.
  • 지연 전송 : 이전에 전송한 데이터의 ACK를 받을 때 까지 새로운 데이터의 전송을 지연시킨다.
  • 버퍼 채우기 : 최대 세그먼트 크기(MSS)에 도달하면 즉시 전송한다.
    • MSS : TCP 세그먼트로 보낼 수 있는 최대 크기. 즉 페이로드의 크기

네이글 알고리즘의 주요 목적은 네트워크 효율성을 높이고 불필요한 패킷 오버헤드를 줄이는 것이다. 그러나 실시간 애플리케이션에서는 지연을 유발할 수 있어 필요에 따라 비활성화 할 수 있다.

네이글 알고리즘, 언제 유용할까?

네이글 알고리즘은 주로 대화형 애플리케이션이나 작은 데이터를 자주 전송하는 애플리케이션에 유용하다. 그러나 실시간 게임이나 스트리밍 서비스와 같이 즉각적인 응답이 중요한 경우엔 오히려 성능을 저하시킬 수 있다.

혼잡 제어

TCP의 혼잡제어는 네트워크의 과부하를 방지하고 전체 네트워크의 효율성을 유지하기 위한 중요한 메커니즘이다. 혼잡제어는 네트워크의 상태를 지속적으로 모니터링하고 네트워크 혼잡 상황에 따라 데이터 전송 속도를 조절한다.

혼잡제어의 주요 알고리즘

  1. 슬로우 스타트 (Slow Start) : 연결 초기에 전송 속도를 점진적으로 증가시킨다.
  2. 혼잡 회피 (Congestion Avoidance) : 네트워크 용량에 근접했을 때 전송 속도를 완만하게 조절한다.
  3. 빠른 재전송 (Fast Retransmit) : 중복된 ACK를 받으면 패킷 손실로 간주하고 즉시 재전송한다.
  4. 빠른 회복 (Fast Recovery) : 패킷 손실 후 전송 속도를 급격히 줄이지 않고 점진적으로 회복한다.

이러한 알고리즘들은 TCP가 네트워크 상황에 동적으로 대응하여 효율적인 데이터 전송을 가능하게 한다. 혼잡제어는 개별 TCP 연결의 성능뿐만 아니라 전체 네트워크의 안정성과 효율성을 향상시키는데 중요한 역할을 한다.

혼잡제어와 흐름제어의 차이점

흐름제어는 송신자와 수신자간의 데이터 전송 속도를 조절하여 수신자의 처리 능력을 초과하지 않도록 하는 반면, 혼잡제어는 전체 네트워크의 부하를 관리하여 네트워크 혼잡을 방지한다. 흐름제어는 엔드포인트 간의 문제를, 혼잡제어는 네트워크 전체의 문제를 다룬다.

profile
개발자를 향해 달리는 사람

0개의 댓글