[CS] TCP/IP 흐름제어 & 혼잡제어

박상민·2022년 12월 28일
0

Computer Science

목록 보기
1/29

📌 TCP 통신이란?

  • 네트워크 통신에서 신뢰적인 연결방식
  • 신뢰성을 보장할 수 있도록 하는 프로토콜
  • realiable network 를 보장하는데 4가지 문제점이 존재
    1. 손실 → packet 이 손실될 수 있는 문제
    2. 순서 바뀜 → packet 의 순서가 바뀌는 문제
    3. Congestion → 네트워크가 혼잡한 문제
    4. Overload → receiver 가 overload 되는 문제

📌 흐름제어 / 혼잡제어란?

  • 흐름제어
    • 송신측과 수신측의 데이터 처리 속도 차이를 해결하기 위한 기법
    • Flow Control 은 receiver 가 packet 을 지나치게 많이 받지 않도록 조절하는 것
    • 기본 개념은 receiver 가 sender 에게 현재 자신의 상태를 feedback 한다는 점 (ACK)
  • 혼잡제어
    • 송신측의 데이터 전달과 네트워크의 데이터 처리 속도 차이를 해결하기 위한 기법

📌 전송 과정

  • sender 는 sender buffer 에 송신 패킷을 저장한다.
  • receiver 는 receiver buffer 에 수신 패킷를 저장한다.
  • application layer 에서 준비가 되면 sender buffer 에 있는 것을 읽기 시작하여 전송을 한다.
  • flow control 의 핵심은 receiver buffer 가 넘치지 않게 하는 것이다.

✔ 송신

  1. Application layer
    • 실제 데이터를 응용계층에 넘기며, 데이터를 인코딩하고 수신자와 통신할 준비를 한다.
  2. Transport layer
    • 데이터에 TCP 헤더를 붙힌다.
    • 데이터 크기가 크면 MTU 단위로 나누고, 나눈 조각들을 segment 라고 한다.
    • segment 를 송신할 때마다 나눠진 데이터의 순서를 알 수 있도록 Sequence 번호가 TCP 헤더에 기록된다.
    • 네트워킹 상황에 따라 수신지에 도착하는 데이터의 순서가 바뀌거나, 수신지에서 패킷이 누락되었는지 여부를 확인하기 위해 Sequence 번호를 사용한다.
    • 데이터단위 → segment
  3. Internet layer
    • segment 에 IP 헤더를 붙힌다.
    • 데이터단위 → packet
  4. Network Interface layer
    • packet 에 Ethernet 헤더와 Tail (FCS) 를 붙힌다.
    • 헤더 정보에는 송신자와 수신자의 MAC 주소가 담겨있다.
    • Tail 에는 FCS (Frame Check Sequence) 가 있다.
    • FCS 는 데이터 전송 도중에 에러가 있는지 판별하는데 사용된다.
    • 데이터단위 → frame

✔ 수신

  1. Network Interface layer
    • Ethernet 헤더를 검사하여 Destination MAC 주소가 자신의 주소와 일치하는지 비교 후 일치하면 상위 계층으로 보낸다.
  2. Internet layer
    • IP 헤더를 검사하여 Destination IP 주소 값이 자신의 IP 주소와 일치하는지 비교 후 일치하면 상위 계층으로 보낸다.
  3. Transport layer
    • TCP 헤더의 Sequence 번호를 검사하여 데이터들이 누락되지 않았는지 확인하고, 데이터들이 모두 수신될 때까지 대기한 후 재조립한다.
  4. Application layer
    • 데이터를 디코딩하여 사용자에게 데이터를 넘긴다.

📌 흐름제어 (송신 ↔ 수신 / 송수신 패킷 수를 제어하는 기능)

  • 송신측의 속도가 빠를 경우 문제가 생긴다.
  • 수신측에서 제한된 저장 용량을 초과한 이후에 도착하는 데이터는 손실할 수 있으며, 만약 손실 된다면 불필요하게 응답과 데이터 전송이 송/수신 측 간에 빈번이 발생한다.
  • 이러한 위험을 줄이기 위해 송신 측의 데이터 전송량을 수신측에 따라 조절해야 한다.

✔ 해결방법

  1. Stop and Wait
    • 매번 전송한 패킷에 대해 확인 응답을 받아야만 그 다음 패킷을 전송하는 기법
    • 확인 응답이 올 때까지 대기
    • 하나씩 보내기 떄문에 비효율적인 방법
  2. Sliding Window (Go Back N ARQ)
    • 수신측에서 설정한 윈도우 크기만큼 송신측에서 확인응답없이 패킷을 전송할 수 있게 하여 데이터 흐름을 동적으로 조절하는 제어 기법
    • Window
      • 메모리 버퍼의 일정 영역
      • TCP/IP 를 사용하는 모든 호스트들은 송신하기 위한 윈도우, 수신하기 위한 윈도우 총 2개의 윈도우를 가지고 있다.
      • 호스트들은 실제 데이터를 보내기 전에 ‘3 way handshaking’ 을 통해 수신 호스트의 receive window size 에 자신의 send window size 를 맞추게 된다.
      • 수신자는 acked 를 보낼 때 TCP 헤더에 윈도우 크키를 담아서 보낸다.
    • 목적 → 전송은 되었지만 acked 를 받지 못한 byte 의 숫자를 파악하기 위해 사용되는 프로토콜
    • 동작방식
      1. 윈도우에 포함되는 패킷을 acked 를 받기 전까지 보냄
      2. acked 를 보내면 슬라이딩 윈도우 사이즈를 충족할 수 있게끔 윈도우를 옆으로 옮김
      3. acked 를 받으면 그만큼 윈도우를 옆으로 옮기고 1의 과정을 반복

📌 혼잡제어 (송신 ↔ 네트워크 / 네트워크 내의 패킷 수를 조절)

  • 데이터의 양이 라우터가 처리할 수 있는 양을 초과하면 초과된 데이터는 라우터가 처리하지 못한다.

  • 라우터가 처리못한 데이터를 손실데이터로 간주하여 계속 재전송하면 네트워크만 혼잡해진다.

  • 송신 측의 전송 속도를 적절히 조절하는 것으로 예방할 수 있다.

  • 제어기법

    • AIMD (Additive Increse / Multicative Decrease)
      • 합 증가/곱 감소 방식 (선형적 증가)
      • 처음에 하나씩 전송
      • 문제없이 도착하면 윈도우 크기를 + 1 씩
      • 문제가 발생하면 윈도우 크기를 반으로 줄임
      • 윈도우 크기를 조금씩 늘리기 때문에 제대로 된 속도로 통신하기 까지 시간이 오래걸림
    • Slow Start
      • 지수적 증가
      • 처음에 하나씩 전송
      • 문제없이 도착하면 윈도우 크기를 * 2 씩
      • 문제가 발생하면 윈도우 크기를 1로
      • 윈도우 크기가 조금 느리게 증가하지만, 시간이 가면 갈수록 윈도우 크기가 점점 빠르게 증가함
    • 빠른 재전송 (Fast Retransmit)
      • 수신자 입장에서 세그먼트로 분할된 내용들이 순서대로 도착하지 않는 경우가 있음
      • 수신측에서는 순서대로 잘 도착한 마지막 패킷의 다음 순번을 ACK 패킷에 실어서 보낸다.
      • 중복 ACK 패킷을 3번 받으면 재전송이 이루어진다. (3번 받았다는 것은 중간에 누락된 패킷이 있다는 것과 같다)
      • 송신측은 자신이 설정한 타임 아웃 시간이 지나지 않았어도 바로 해당 패킷을 재전송할 수 있기 때문에 보다 빠른 재전송률을 유지할 수 있다.
    • 빠른 회복 (Fast Recovery)
      • Slow Start → 반으로 줄임 → AIMD 로 전환
      • 혼잡한 상태가 되면 윈도우 크기를 1로 줄이지 않고, 반으로 줄이고 선형증가 시킨다.
      • 혼잡 상태를 한번 겪으면 AIMD 방식(선형적 증가) 으로 동작
profile
💡 클린코드를 지향하는 Backend Developer

0개의 댓글