TCP

  • 연결형 프로토콜

  • Stateful 프로토콜

      클라이언트-서버 관계에서 서버가 클라이언트의 상태를 보존함을 의미한다.  
      클라이언트의 이전 요청이 서버에 잘 전달되었을 때, 클라이언트의 다음 요청이 이전 요청과
       관계가 이어지는 것을 의미한다.
      
      - 상태에 대해 저장해야하기 때문에 백업 스토리지가 요구된다.
      - 상태 저장에 대한 요청은 서버 측 상태에 따라 달라지게 된다.
      - 예) TCP통신의 경우 server와 client는 1. establishing connection, 2. Trasmitting
         data 3. Terminating connection 이라는 TCP handshake 과정을 통해서 연결되며 데이
         터를 전송하여, 서버가 클라이언트의 세션 정보를 저장한다.
    

Stateful

클라이언트-서버 관계에서 서버가 클라이언트의 상태를 보존함을 의미한다.
클라이언트의 이전 요청이 서버에 잘 전달되었을 때, 클라이언트의 다음 요청이 이전 요청과 관계가 이어지는 것을 의미한다.

  • 상태에 대해 저장해야하기 때문에 백업 스토리지가 요구된다.
  • 상태 저장에 대한 요청은 서버 측 상태에 따라 달라지게 된다.
  • 예) TCP통신의 경우 server와 client는 1. establishing connection, 2. Trasmitting data 3. Terminating connection 이라는 TCP handshake 과정을 통해서 연결되며 데이 터를 전송하여, 서버가 클라이언트의 세션 정보를 저장한다.

https://velog.io/@adc0612/stateful%EA%B3%BC-stateless-%EC%B0%A8%EC%9D%B4-7tfkp7a4

TCP 연결

Three-way handshake

  • SYN , ACK 사용
  • TCP가 연결을 수립하는 과정
    1. 연결 시작시 SYN 비트가 1로 초기화된 세그먼트를 보냄
    2. SYN 비트와 ACK 비트가 1로 초기화 된 세그먼트를 보냄
    3. ACK 비트가 1로 초기화된 세그먼트를 보냄
  • 액티브 오픈 : 연결을 요청하는 호스트
  • 패시브 오픈 : 연결을 수락하는 호스트

연결 종료

4 way handshake

  • FIN , ACK 사용
  • TCP가 연결을 종료하는 과정
    1. FIN 을 보냄
    2. ACK를 보냄
    3. FIN을 보냄
    4. ACK를 보냄
  • 액티브 클로즈 : 연결을 종료하려는 호스트
  • 패시브 클로즈 : 연결 종료를 받아들이는 호스트

액티브 클로즈 호스트는 마지막 ACK를 보낸 뒤 일정시간을 기다리고 연결을 종료 이유

  • 마지막 ACK 세그먼트의 유실 대비
  • 또 다른 연결 과정에서의 패킷 혼선 방지

TCP 상태 목록

  • CLOSED : 연결이 닫혀 있는 상태
  • LISTEN : 서버가 클라이언트의 연결 요청을 기다리는 상태
  • SYN-SENT : 클라이언트가 연결 요청을 보낸 후 응답을 기다리는 상태
  • SYN-RECEIVED : 서버가 연결 요청을 수신하고 응답을 보낸 상태
  • ESTABLISHED : 클라이언트와 서버 간의 연결이 성공적으로 설정된 상태
  • FIN-WAIT-1 : 연결 종료 요청을 보낸 후 상대방의 응답을 기다리는 상태
  • FIN-WAIT-2 :  상대방의 연결 종료 요청을 수신한 후, 자신의 종료 요청을 보낸 상태
  • CLOSE-WAIT :  상대방이 종료 요청을 보낸 후, 종료 작업을 기다리는 상태
  • CLOSING : 연결이 종료 중인 상태
  • LAST-ACK : 마지막 ACK 패킷을 기다리는 상태
  • TIME-WAIT : 연결이 종료된 후, 잠시 동안 상태를 유지하는 상태

상태값을 이용하여 트러블 슈팅을 할 수도 있음

TCP의 신뢰성 보장

  • 오류제어 (재전송 기반) : 잘못 전송된 경우 재전송
    • 중복된 ACK 세그먼트를 수신했을 때
    • 타임아웃이 발생했을 때
  • 흐름 제어 : 받을 수 있는 만큼만 받기
  • 혼잡 제어 : 보낼 수 있는 상황에서만 보내기
    • 혼잡 제어 알고리즘
      • AIMD(Additive Increase Multiplicative Decrease), Slow Start, Congestion Avoidance

TCP 오류 제어

ARQ(자동 재전송 요구)

  • Automatic Repeat Request
  • 재전송 기반으로 잘못된 전송을 바로 잡는 것
    • Stop-and-Wait ARQ
    • Go-Back-N ARQ
    • Selective Repeat ARQ
  • 오늘날은 2,3번이 자주 쓰임

Stop-and-Wait ARQ

  • 수신측으로부터 ACK를 받을 때까지 대기하는 방식
  • 송신자는 데이터를 전송한 후, 수신자로부터 ACK를 받을 때까지 기다립니다.
  • 수신자가 잘못된 데이터를 받으면 NAK을 보내며, 송신자는 ACK를 받을 때까지 재전송하지 않습니다.
  • 장점: 구현이 간단하고 직관적입니다.
  • 단점: 대기 시간이 길어질 수 있으며, 특히 대역폭이 큰 네트워크에서는 비효율적일 수 있습니다.

Go-Back-N ARQ

  • 오류가 난 지점부터 전송한 지점까지 모두 재전송 하는 기법
  • 송신자는 여러 개의 세그먼트를 한 번에 전송할 수 있으며, 수신자는 마지막으로 올바르게 수신된 세그먼트의 ACK를 보냅니다.
  • 만약 손실이 발생하면, 해당 세그먼트 이후의 모든 세그먼트를 재전송해야 합니다.
  • 장점: Stop-and-Wait ARQ보다 더 많은 데이터를 동시에 전송할 수 있어 효율적입니다.
  • 단점: 손실된 세그먼트 이후의 모든 세그먼트를 재전송해야 하므로, 대역폭 낭비가 발생할 수 있습니다.

Selective Repeat ARQ

  • 손실된 패킷만 재전송
  • 송신자는 여러 세그먼트를 한 번에 전송하며, 수신자는 개별적으로 세그먼트에 대한 ACK를 보냅니다.
  • 장점: Go-Back-N ARQ보다 훨씬 더 효율적이며, 대역폭 낭비를 줄일 수 있습니다.
  • 단점: 구현이 복잡할 수 있으며, 수신자가 누락된 세그먼트를 재조합해야 하므로 메모리 요구 사항이 증가합니다.

TCP 흐름 제어

  • 송신 호스트가 수신 호스트 처리 속도를 고려하며 송수신 속도를 균일하게 맞추는 것
  • 송신 버퍼 : 애플리케이션 계층에서 전송할 데이터 임시 저장
  • 수신 버퍼 : 네트워크 계층에서 수신할 데이터 임시 저장
  • 버퍼 오버플로우
    • 수신 버퍼보다 더 많은 데이터를 전송하면 발생
    • 데이터가 유실 될 수 있음

슬라이딩 윈도우 사용

TCP헤더 window 필드를 통해서 처리 가능한 양을 알려줌

윈도우 : 파이프라이닝 가능한 순서번호 범위

윈도우 크기 : 확인 응답을 받지 않고도 한번에 보낼 수 있는 최대 양

TCP 혼잡 제어

  • 혼잡(congestion)
  • 많은 트래픽으로 인해 패킷 처리 속도가 느려지거나 유실 될 우려가 있는 상황
  • 혼잡 붕괴 현상
    • 혼잡 제어가 되지 않는다면 과부하 유실 과부하 유실 반복됨

혼잡 붕괴 현상을 방지하기 위해 혼잡제어가 만들어짐

혼잡제어: 혼잡이 생기지 않을 정도로만 조금씩 보내는 방법

  • 혼잡 윈도우 : 혼잡없이 전송할 수 있을 법한 양
  • 송신 호스트

tcp 헤더에 포함되어 있지 않음

최소값(수신 윈도우, 혼잡 윈도우)>= 마지막으로 송신한 바이트 - 마지막으로 수신 확인된 바이트 송신쪽 윈도우를 말함

AIMD

  • Additive Increase Multicative Decrease
  • 기본 동작 형태
  • Additive Increase
    • 혼잡 윈도우를 서서히 증가시키는 방식으로, 새로운 ACK 세그먼트가 수신될 때마다 혼잡 윈도우를 1씩 증가
  • Multiplicative Decrease
    • 혼잡이 발생했을 때, 혼잡 윈도우를 급격히 감소시키는 방식

혼잡 제어 알고리즘

  • 느린 시작
  • 혼잡 회피
  • 빠른 회복

확인 명령어

느린 시작(slow starter) 2. ACK 세그먼트가 수신될 때마다 혼잡 윈도우 1증가 (RTT마다 혼잡 윈도우 2배 증가) 3. 초기에 빠른 전송속도 확보 4. 특정 임계치(sshresh)까지

임계점 (Threshold)

임계점은 여기까지만 Slow Start를 사용하겠다 라는 의미를 가진다.
slow start threshold (ssthresh) 라고도 한다.

RTT(Round Trip Time)

메세지를 전송한 뒤 그에 대한 답변을 받는 시간

혼잡 회피

  1. 매RTT마다 혼잡 윈도우 1씩 증가
  2. 세번의 중복 세그먼트가 발생했을 경우 빠른 회복 수행

빠른 회복

  1. 세번의 중복 ACK세그먼트가 수신되었을 때 느린 시작을 건너뛰고 혼잡 회피를 수행하는 알고리즘

TCP Tahoe(빠른 회복 미수행)

TCP Reno (빠른 회복 수행)