안녕하세요!

FE 개발자 유진주입니다.

CS/네트워크

[컴퓨터네트워크] Chapter3.6 TCP 신뢰 전송과 흐름 제어

ypearl 2023. 12. 14. 02:07

Chapter3.6 TCP 신뢰 전송과 흐름 제어

  • TCP 세그먼트 전송 규칙
    - 누적 수신확인(Cumulative Acknowledgement)
    - 단일 타이머(Single Timer)
  • 재전송 기반 오류 복구
    - Timeout에 의한 재전송
    - 빠른 재전송(Fast Retransmission
  • 흐름 제어(Flow Control)

 

TCP 세그먼트 전송 규칙

- 누적 수신 확인(Cumulative Acknowledgement)

  • 누적적으로 완전하게 수신된 바이트 스트림 번호 확인
  • 중복 ACK 세그먼트 수신 가능

 

- 중복 ACK(Duplicate ACK)

  • 이미 수신한 확인번호(Acknowledgement Number)를 가진 ACK

 

- 중복 ACK 수신

  • 순서가 바뀐 세그먼트 도착
  • 중간 세그먼트 손실

 

 

- 단일 타이머(Single Timer)

  • 누적 수신 확인이 되지 않은 가장 오래된 세그먼트에 대한 재전송 타이머 유지

*오른쪽 그림에서

139까지 정상 수신되었기에, ACK가 100이 아닌, 140이 된다.(누적수신확인)

 

 

재전송 기반 오류 복구

- Timeout에 의한 재전송

  • Timeout 동안 누적 미수신 세그먼트 재전송
  • 라우터 버퍼 오버플로우(Buffer Overflow)에 의한 세그먼트 손실
  • 네트워크 혼잡 상황에 따른 버퍼 오버플로우 발생
  • 충분히 긴 시간(timeout) 동안 ACK 미수신

* 누적 수신 확인하기 때문에,
ACK 세그먼트를 받지 않았다고 해서, 그 세그먼트를 반드시 재전송 하는 것은 아니다!

 

 

- 빠른 재전송(Fast Retransmission)

  • 세그먼트가 손실된 상황에서 Timeout까지 불필요한 긴 시간 대기 회피
  • 3개 중복 ACK가 도착하면 Timeout과 무관하게 누적 수신 확인 다음 세그먼트 재전송

 

*Timeout에 의해 패킷이 손실되었다고 판단하는 것이 아니라,

중복된 ACK 세그먼트 3개를 받았을 때 Timeout 보다 더 빨리 손실을 판단하는 것

→ 더 빠르게 재전송 가능 재전송 시간 줄임 네트워크 성능 높임

 

 

- Timeout 전에 중복 ACK 발생 상황 이유

  • 순서가 바뀐 세그먼트 도착
  • 중간 세그먼트 손실

 

- 순서가 바뀐 세그먼트 도착

  • 1~2개의 중복 ACK 후에 정상 ACK 회신
  • 연속된 세그먼트의 도착 시간에 큰 차이가 없음
  • 3개 이상의 중복 ACK가 발생하면 순서 문제가 아니라고 판단  손실!

 

- 중간 세그먼트 손실

  • 라우터에 경미한 버퍼 오버플로우 발생
  • 오버플로우 상황이 바로 개선되어 다음 세그먼트들은 정상 도착

 

[그림] 빠른 재전송

 

 

 

흐름 제어(Flow Control)

: 송신 TCP가 지나치게 많은 데이터를 한꺼번에 송신함으로써
  수신 TCP의 버퍼가 넘쳐(overflow) 데이터 손실이 발생하는 문제를 방지하는 메커니즘

 

- 방안

  • 수신 TCP자신의 수신 버퍼내의 여유 공간의 크기를 송신 TCP에게 통지하고,
    송신 TCP는 통지된 여유 공간의 크기보다 적은 양의 데이터를 송신

 

 

- 수신윈도우(RecvWindow, rwnd)

  • 수신 버퍼 내의 여유 공간의 크기

 

- 수신윈도우 변화

  • 연결 설정 시에 수신버퍼크기와 동일하게 설정
  • 수신 데이터의 버퍼 저장과 응용 프로세스에 의한 버퍼 데이터 읽기 과정에서 수신 윈도우 변화

*변하는 수신윈도우의 상태를 송신자에게 반드시 알려주어야 한다. (by. ACK 세그먼트를 통해)

 

 

- 수신윈도우 통보

  • 수신 TCP가 송신 TCP로 전달하는 세그먼트의 수신윈도우 필드에 포함되어 통보

 

- 송신 TCP의 흐름 제어

  • 마지막으로 송신한 바이트 번호와 확인 세그먼트를 통해
    마지막으로 수신 확인된 바이트 번호의 차이가 항상 수신윈도우보다 작게 유지
  • 마지막송신바이트번호 - 마지막수신확인바이트번호 ≤ 수신윈도우
  • (LastByteSent - LastByAcked ≤ rwnd)

 

- 수신윈도우 0

  • 송신 TCP는 더 이상 데이터를 전송하지 않고 수신 TCP로부터 변경된 수신윈도우가 도착하길 기다림
  • 수신 TCP는 송신 TCP로 전송할 확인 세그먼트가 없어 수신윈도우 변화를 통보하지 못함
  • Deadlock 상태 진입

*ACK 세그먼트 (rwnd=0)

 

 

- 윈도우 프로브(Probe) 세그먼트

  • 수신윈도우가 0일 때 송신 TCP가 수신 TCP에게 주기적으로 전송하는 1바이트 세그먼트
  • 수신 TCP는 프로브 세그먼트에 대한 확인 세그먼트를 통해 최신 수신윈도우 정보를 송신 TCP에게 제공