Ch 4. TCP(2) - TCP 연결과 흐름제어


TCP 연결 설정

  • 능동적 열림(Active open)
    • 클라이언트는 서버가 열어 놓은 포트로 TCP연결을 요청
  • 수동적 열림(Passive open)
    • 서버는 네트워크 응용을 수행하기 위해 정해진 포트를 열고 클라이언트의 요청을 기다림

세 방향 핸드쉐이크(Three-way handshake)

  • 두 호스트는 TCP 연결을 위해 3개의 패킷이 송/수신되어야함
  1. 클라이언트는 서버에게 자신을 연결하라는 의미로 클라이언트 측 SEQ번호(순서번호)와 함께 SYN = 1 플래그가 저장된 세그먼트를 전송
  2. 이를 수신한 서버는 클라이언트에게 이에 대한 수락으로 ACK=1, 서버를 클라이언트에 연결하라는 의미로 SYN=1 플래그를 저장하며 클라이언트로부터 수신한 패킷의 SEQ+1를 ACK필드 값에, 서버 측의 순서번호를 SEQ필드에 저장하여 전송
  3. 서버로부터 SYN 패킷가 수신된 클라이언트는 서버에게 순서번호를 인지했다는 의미로 ACK=1플래그, ACK 필드 값은 수신한 패킷의 SEQ+1로 저장하여 전송

네 방향 핸드쉐이크(Four-way handshake)

  • 두 호스트의 연결 종료는 4개의 패킷으로 이루어짐
  1. 연결을 종료하려는 클라이언트는 서버에게 FIN 플래그 값을 1로 설정하여 전송
  2. 이를 수신한 서버는 메시지 정상 수신에 대한 응답으로 ACK 메시지를 전송, 서버 측 응용 프로그램에게 클라이언트가 연결을 종료하려고함을 알림
  3. 응용 프로그램이 연결 종료에 대한 처리를 한 서버는 서버 측 또한 연결을 종료하기 위해 FIN=1 플래그가 담긴 ACK 메시지를 전송(ACK 필드 값은 2의 ACK 필드 값과 동일)
  4. 이를 수신한 클라이언트는 ACK 메시지를 보내 서버에게 해당 메시지가 정상 수신됨을 알려줌 이를 수신한 서버는 연결을 종료, 클라이언트는 서버로부터 누락된 패킷을 확인하기 위해 일정 시간 대기한 후 종료(Time-Waited 타이머)

TCP 흐름 제어

  • 데이터 통신에서 송신측의 데이터 전달 속도가 수신측의 처리 속도보다 빠르다면 데이터의 손실과 같은 문제가 발생할 수 있음
  • 수신자가 송신되는 데이터의 크기 및 속도를 제어하여 문제의 발생을 방지

슬라이딩 윈도우

  • 수신측에서 설정한 윈도우 크기만큼 송신측에서 수신측의 확인응답 없이 TCP 패킷을 전송할 수 있게 하여 흐름을 동적으로 제어하는 기법
  • 윈도우 크기: 전송했으나 아직 확인 응답 받지 못한 데이터 크기 + ACK 없이 전송할 수 있는 데이터의 크기
  • 송신 윈도우의 범위는 수신측 여유 버퍼 공간을 반영하여 동적으로 변화함(세그먼트의 window size 필드에 송신 측이 보낼 수 있는 윈도우 크기를 설정하여 전송)

비정상 윈도우 신드롬(Silly Window Syndrome)

  • 슬라이딩 윈도우 사용의 부적절한 결과
  • 송신측 응용프로그램이 전송하는 데이터 크기가 작은 경우 IP헤더, TCP헤더가 붙어 1바이트의 전송에도 40바이트가 추가적으로 전송되야 함, 이는 최악의 전송 효율을 나타냄

Nagle 알고리즘

  • 비정상 윈도우 신드롬을 해결하기 위한 송신측 알고리즘
  • 전송할 데이터를 어느정도 모아 한번에 전송하는 방법
  • 송신측은 다음 세 조건중 하나가 만족되는 경우에만 세그먼트를 전송
  1. 응용 프로그램으로부터 받은 데이터를 버퍼에 저장하고 저장된 데이터의 크기가 MSS가 된 경우
  2. 수신측으로부터 확인 응답을 받은 경우
  3. 타이머가 완료된 경우(MSS 값이 상당이 클 경우 발생)
  • 네트워크와 응용 프로그램의 데이터 처리 요구를 동시에 고려함
    • 네트워크 처리 속도가 빠르다면 작은 세그먼트에 대해서도 신속한 처리가 가능 (ACK 수신)
    • 네트워크 처리 속도가 느리다면 데이터를 모아서 전송, 네트워크의 불필요한 오버헤드를 줄일 수 있음

Clark 해결책

  • 비정상 윈도우 신드롬을 해결하기 위한 수신측 알고리즘
  • 수신측 윈도우 크기가 0이 되었을 경우 수신 버퍼가 최대 세그먼트 크기만큼 남았을 때 또는 버퍼의 여유 공간이 버퍼 크기의 절반이 될 때 까지 수신 윈도우 크기를 0으로 하여 ACK 전송

지연 확인 응답(Delayed Acknowledgement)

  • 수신 버퍼에 충분한 공간이 생기기 전에는 확인 응답을 보내지 않음
  • 수신측은 여분의 버퍼 공간을 확보할 수 있음
  • 송신 측에서의 재전송이 계속 발생할 수 있으므로 200ms마다 ACK 송신

슬로우 스타트(Slow Start)

  • 송신 측에서 네트워크 상태에 따라 흐름을 제어하는 기법
    • 네트워크의 전송 처리 능력을 반영하기 위해 혼잡 윈도우(congestion window)를 두어 전송 속도를 제어
    • 혼잡 윈도우는 확인 응답을 받을 때마다 증가
  • MSS 크기만큼의 세그먼트 단위 혼잡윈도우를 이용
    • cwnd=1에서부터 시작하여 ACK 세그먼트의 수신시마다 1씩 증가함
    • 1개 세그먼트 송신 -> 1개 ACK 세그먼트 수신 -> 2개 세그먼트 송신 -> 2개 ACK 세그먼트 수신 -> 4개 세그먼트 송신 -> 4개 ACK 세그먼트 수신 -> ~
  • 실제 송신측에서 ACK 없이 전송 가능한 윈도우의 크기는 min(수신측 윈도우 크기, 혼잡 윈도우 크기)

TCP 혼잡 제어

  • 세그먼트 수가 네트워크 장비의 큐 용량보다 많이 도착했을 경우 큐는 오버플로우가 발생하여 세그먼트를 폐기함 (혼잡)
  • 혼잡으로 인한 전송 지연때문에 세그먼트를 재전송한다면 이는 더 큰 혼잡을 초래한다

혼잡 윈도우

  • TCP는 네트워크 혼잡 상황을 반영하기 위해 혼잡 윈도우(cwnd)를 사용
  • 임계값(SlowStart Threshold size)보다 작을 경우 cwnd는 2배씩 증가

혼잡 회피(Congestion Avoidence)

  • 혼잡 윈도우 크기(cwnd)와 슬로우 스타트 임계값 값에 의해 제어
  • 주어진 연결에 대해 cwnd는 1, 임계값은 65,535로 초기화
  • 혼잡 윈도우 크기가 임계값에 도달할 경우 혼잡 회피 모드로 돌입
  • 혼잡 회피 모드에서는 cwnd는 윈도우 안의 모든 세그먼트들이 확인 되었을 때에만 1씩 증가
  • 혼잡 윈도우의 다중 감소 기법을 사용
    • 혼잡이 타임아웃에 의해 발생했다면 cwnd는 1부터 재시작
    • 임계값(ssth)는 cwnd의 절반으로 설정
    • 슬로우 스타트 모드로 동작
  • 중복 확인 응답(duplicated ACK)에 의해 혼잡이 발생한 경우 신속한 재전송 기법 사용

신속한 재전송

  • 세그먼트가 누락된 경우 수신측은 순서가 다른 세그먼트를 받음
  • 수신측은 누락된 세그먼트를 수신할 때까지 누락된 세그먼트를 요청하는 확인 응답을 반복
  • 송신측은 누락된 세그먼트에 대한 확인 응답 수신시 두가지를 고려
    • 세그먼트 전송 지연: 도착할 세그먼트이므로 재전송하지 않음
    • 세그먼트 분실: 세 개의 중복된 확인응답 메시지를 수신할 때까지 기다리도록 권장
  • 세 개의 중복된 확인응답(Duplicated ACK) 수신시 재전송 타이머의 타임아웃을 기다리지 않고 해당 세그먼트에 대한 재전송을 수행
    • RTO 값은 그대로 유지(네트워크 혼잡상황이 아닌 특정 세그먼트의 손실)
    • cwnd는 현재의 $\frac{1}{2}$로 변경, 혼잡 회피 모드로 동작
  • 누락되었던 세그먼트 수신시 수신한 모든 세그먼트에 대해 누적 확인 응답을 전송

신속한 복구

  • 손실된 세그먼트에 대해 신속한 재전송을 수행하면 혼잡 회피는 수행하지만 슬로우 스타트는 수행하지 않음
  • 중복된 확인응답을 수신했다는 것은 다른 세그먼트는 정상적으로 수신되고 있음을 의미
  • 두 호스트 간의 데이터 전송량을 급격히 줄이지 않기 위해 사용

출처: 정진욱, 김현철 공저. “TCP/IP와 인터넷”, pp 194-233. 2004. (주)생능출판사

댓글