[혼자 공부하는 네트워크] 4-3 TCP의 오류, 흐름, 혼잡 제어

술술·2024년 9월 9일
0

오류 제어: 재전송 기법

  • TCP는 잘못된 세그먼트를 재전송

오류 검출과 재전송

  • 체크섬은 신뢰성을 보장하기는 부족
    • 세그먼트의 훼손 여부만 나타낼 뿐이고, 체크섬 값이 잘못되었다면 호스트는 해당 패킷을 읽지 않고 폐기
    • 송신 호스트가 세그먼트 전송 과정에 문제가 있다는 것을 인지할 수 없음
  • TCP가 신뢰성을 보장하려면
    • 송신 호스트가 송신한 세그먼트에 문제가 발생했음을 인지
    • 오류를 감지하게 되면(세그먼트가 잘못 전송되었음을 알게 되면) 해당 세그먼트를 재전송
  • TCP가 오류를 검출하고 세그먼트를 재전송하는 상황
    • 중복된 ACK 세그먼트를 수신했을 때
    • 타임아웃 발생했을 때


1. 중복된 ACK 세그먼트를 수신했을 때

  • 만일 수신 호스트 측이 받은 세그먼트의 순서 번호 중에서 일부가 누락되었다면 중복된 ACK 세그먼트를 전송


    오류 X오류 O



    • RTT(Round Trip Time): 메시지를 전송한 뒤 그에 대한 답변을 받는 데까지 걸리는 시간

2. 타임아웃이 발생했을 때

  • TCP 세그먼트를 송신하는 호스트는 모두 재전송 타이머(retransmission timer)라는 값을 유지
  • 타임아웃(timeout): 호스트가 세그먼트를 전송할 때마다 재전송 타이머를 시작, 이 타이머의 카운트다운이 끝난 상황
  • 타임아웃이 발생할 때까지 ACK 세그먼트를 받지 못하면 세그먼트가 상대 호스트에게 정상적으로 도착하지 않았다고 간주하여 세그먼트를 재전송




ARQ: 재전송 기법

  • ARQ(Automatic Repeat Request): 자동 재전송 요구
    • 수신 호스트의 답변(ACK)과 타임아웃 발생을 토대로 문제를 진단하고, 문제가 생긴 메시지를 재전송함으로써 신뢰성을 확보하는 방식
    • Stop-and-Wait ARQ, Go-Back-N ARQ, Selective Repeat ARQ


Stop-and-Wait ARQ

  • 제대로 전달했음을 확인하기 전까지는 새로운 메시지를 보내지 않는 방식
  • 메시지를 송신하고, 이에 대한 확인 응답을 받고, 다시 메시지를 송신하고, 이에 대한 확인 응답을 받는 것을 반복
  • 단순하지만, 높은 신뢰성 보장
  • 네트워크의 이용 효율이 낮아질 수 있음

Go-Back-N ARQ

  • 파이프라이닝(pipelining): 연속해서 메시지를 전송할 수 있는 기술
  • 파이프라이닝 방식을 활용해 여러 세그먼트를 전송하고, 도중에 잘못 전송된 세그먼트가 발생할 경우 해당 세그먼트부터 전부 다시 전송하는 방식
  • 순서 번호 n번에 대한 ACK 세그먼트는 n번까지의 확인 응답 → 누적 확인 응답(CACK, Cumulative Acknowledgement)
오류 X오류 O

  • 빠른 재전송(fast retransmit): 재전송 타이머가 만료되기 전이라도 세 번의 ACK 세그먼트가 수신되었다면 해당 세그먼트를 곧바로 재전송하는 기능

Selective Repeat ARQ

  • 선택적으로 재전송하는 방법
  • 수신 호스트 측에서 제대로 전송받은 각각의 패킷들에 대해 ACK 세그먼트를 보내는 방식
  • 개별 확인 응답(Selective Acknowledgement)
  • 송신 호스트는 올바르게 수신받지 못한 ACK 세그먼트가 있는지 검사하고, 만일 응답받지 못한 세그먼트가 존재한다면 해당 세그먼트를 재전송
  • 대부분 호스트가 지원하지만 만약 지원하지 않는다면 Go-Back-N ARQ 방식으로 동작
    • 지원 여부는 TCP 세그먼트 헤더의 옵션 필드에 속한 SACK(Selective Acknowledgement) 허용 필드를 통해 알 수 있음




흐름 제어: 슬라이딩 윈도우

  • TCP의 흐름 제어란 송신 호스트가 수신 호스트의 처리 속도를 고려하며 송수신 속도를 균일하게 유지하는 것
  • 수신 버퍼: 수신된 세그먼트가 애플리케이션 프로세스에 의해 읽히기 전에 임시로 저장되는 공간
  • 버퍼 오버플로(buffer overflow): 버퍼가 넘치는 문제 상황
  • 윈도우: 송신 호스트가 파이프라이닝 할 수 있는 최대량
    • 윈도우의 크기만큼 확인 응답을 받지 않고도 한 번에 전송 가능하다
  • 수신 호스트는 TCP 헤더(윈도우 필드)를 통해 송신 호스트에게 자신이 받아들이고자 하는 데이터의 양을 알림
  • 슬라이딩 윈도우(sliding window): 파이프라이닝 과정에서 송수신 윈도우는 점차 오른쪽으로 미끄러지듯이 움직이게 됨




혼잡 제어

  • 혼잡(congestion): 많은 트래픽으로 인해 패킷의 처리 속도가 늦어지거나 유실될 우려가 있는 네트워크 상황을 의미
  • 모든 호스트가 라우터에게 전송 가능한 최대의 양으로 세그먼트를 전송하면 라우터에 과부하가 생겨 모든 정보를 한 번에 처리하지 못할 수 있다
  • 흐름 제어의 주체가 수신 호스트라면 혼잡 제어의 주체는 송신 호스트
  • 혼잡 윈도우(CWND, Congestion WiNDow): 혼잡 없이 전송할 수 있을 법한 데이터 양
  • 혼잡 윈도우의 크기는 송신 호스트가 어느 정도의 세그먼트를 전송해야 혼잡을 방지할 수 있는지를 직접 계산하여 알아내야 함

혼잡 제어 알고리즘

AIMD(Additive Increase/Multiplicative Decrease)

  • 합으로 증가, 곱으로 감소
  • 혼잡이 감지되지 않는다면 혼잡 윈도우를 RTT마다 1씩 선형적으로 증가
  • 혼잡이 감지되면 혼잡 윈도우를 절반으로 떨어뜨리는 동작을 반복
  • 혼잡 윈도우는 톱니 모양으로 변화
  • AIMD 방식은 처음 연결이 수립된 뒤 혼잡 윈도우 크기가 증가되는 속도가 느림
  • 선형적으로 혼잡 윈도우를 증가시켜서 초기 전송 속도가 확보되지 않는다

느린 시작 알고리즘

  • 혼잡 윈도우를 1부터 시작해 문제없이 수신된 ACK 세그먼트 하나 당 1씩 증가시키는 방식
  • 결과적으로 혼잡 윈도우는 RTT마다 2배씩 지수적으로 증가
  • 혼잡 윈도우의 지수적인 증가를 활용해 초기 전송 속도를 어느 정도 빠르게 확보 가능
  • 혼잡 윈도우를 언제까지나 지수적으로 증가시킬 수는 없다. 언젠가는 혼잡 상황을 마주할 확률이 높아지기 때문
  • 느린 시작 임계치(SSTHRESH, Slow Start THRESHold)라는 값이 정해져 있음
  • 혼잡 윈도우 값이 계속 증가하다가 느린 시작 임계치 이상이 되거나, 타임아웃이 발생하거나, 세 번의 중복된 ACK 세그먼트가 발생하여 혼잡이 감지되면 다음 3개 방법 중 하나 선택

혼잡 회피 알고리즘

  • RTT마다 혼잡 윈도우를 1 MSS(Maximum Segment Size)씩 증가시키는 알고리즘
  • 혼잡 윈도우의 크기를 선형적으로 증가
  • 느린 시작 임계치를 넘어선 시점부터는 혼잡이 발생할 우려가 있으니 조심해서 혼잡 윈도우를 증가시키는 방식
  • 혼잡 회피 도중 타임아웃이 발생하면 혼잡 윈도우 값은 1로, 느린 시작 임계치는 혼잡이 감지된 시점의 혼잡 윈도우 값의 절반으로 초기화 한 뒤 다시 느린 시작 수행
  • 혼잡 회피 도중 3번의 중복 ACK 세그먼트가 발생되었을 때는 혼잡 윈도우 값과 느린 시작 임계치를 대략 절반으로 떨어뜨린 뒤 빠른 회복 알고리즘을 수행
    • 타임아웃이 발생한 세그먼트나 3번의 중복 ACK 세그먼트가 발생한 세그먼트는 재전송

빠른 회복 알고리즘

  • 세 번의 중복 ACK 세그먼트를 수신했을 때 느린 시작은 건너뛰고 혼잡 회피를 수행하는 알고리즘
  • 빠른 회복 도중이라도 타임아웃이 발생하면 혼잡 윈도우의 크기는 1로, 느린 시작 임계치는 혼잡이 감지된 시점의 절반으로 떨어뜨린 후 다시 느린 시작 수행
profile
Hello

0개의 댓글

관련 채용 정보