IT 프로그래밍/컴퓨터네트워크

[컴퓨터네트워크] TCP -

기술1 2024. 12. 3. 21:08
  • 1대1 통신 서비스 one sender, one receiver
  • 신뢰성있고 순서대로 전달, byte steam
  • 파이프라인 지원
  • send & receive buffer 각각 가지고 있음
  • cumulative ACKs
  • 양방향 지원 (MSS, maximum segment size)
  • connection-oriented (연결지향형) (handshaking)
  • flow control 지원

TCP seq #'s and ACKS

1. TCP의 데이터 구조

  • TCP는 데이터를 **바이트 스트림(byte stream)**으로 취급합니다.
    즉, 애플리케이션에서 보낸 데이터를 구조화된 메시지로 구분하지 않고 연속적인 바이트 흐름으로 간주합니다.
  • 각 바이트는 고유의 번호를 가지며, 이 번호는 Sequence NumberACK Number로 표현됩니다.

2. Sequence Number

  • Sequence Number는 송신자가 해당 세그먼트의 첫 번째 바이트의 번호를 나타냅니다.
  • 바이트 번호는 전체 데이터 스트림에서의 위치를 기준으로 합니다.
  • MSS (Maximum Segment Size): TCP 세그먼트에 담을 수 있는 데이터의 최대 크기 (예: 1000 바이트).

예시: Sequence Number

  • 애플리케이션 데이터가 3000 바이트이고 MSS=1000MSS = 1000이라고 가정:
    • 첫 번째 세그먼트: 바이트 0 ~ 999
      • Sequence Number: 0
    • 두 번째 세그먼트: 바이트 1000 ~ 1999
      • Sequence Number: 1000
    • 세 번째 세그먼트: 바이트 2000 ~ 2999
      • Sequence Number: 2000

3. ACK Number

  • ACK Number는 수신자가 다음에 기대하는 바이트의 번호를 나타냅니다.
  • 즉, 수신자가 이미 받은 데이터 다음의 첫 번째 바이트를 가리킵니다.

예시: ACK Number

  • 첫 번째 세그먼트 (Sequence Number = 0, 바이트 0 ~ 999)가 도착하면:
    • 수신자는 바이트 1000을 다음에 기대.
    • ACK Number: 1000
  • 두 번째 세그먼트 (Sequence Number = 1000, 바이트 1000 ~ 1999)가 도착하면:
    • 수신자는 바이트 2000을 다음에 기대.
    • ACK Number: 2000

4. 전송 및 응답 흐름

  1. 첫 번째 세그먼트 전송
    • 송신 측: 첫 번째 세그먼트를 보냄
    • 헤더의 Sequence Number: 0.
    • 수신 측: 데이터를 정상적으로 수신 후, ACK Number = 1000인 ACK 응답을 보냄.
  2. 두 번째 세그먼트 전송
    • 송신 측: 두 번째 세그먼트를 보냄 
    • 헤더의 Sequence Number: 1000.
    • 수신 측: 데이터를 정상적으로 수신 후, ACK Number = 2000인 ACK 응답을 보냄.

TCP timeout

timeout value 설정 방법

  • 기본적으로 RTT보다 커야함
  • 너무 짧아도 커도 안됩ㄴ디ㅏ.

Sample RTT 측정

  • 재전송되는 Segment는 무시 ACK가 올 때까지 Sample RTT 측정
  • 편차가 크기에 조금 더 완만한 형태의 값을 측정해야함 ( 평균 취하기 )

 EstimateRTT (평균치 사용)

  • 가중 평균치 사용 (EWMA)

 

TCP의 EstimateRTT

여유분 추가

  • 편차가 커지면 여유분도 추가로 줌

DevRTT

  • Sample RTT와 estimate RTT와 얼마나 차이나는지 보고 값을 조절하는 것 
  • (1-B) * DevRTT + B* | SampleRTT - EstimatedRTT |

 

TimeourInterval = EstiamtedRTT + 4 * DevRTT

 

TCP Reliable data transfer

TCP는 IP의 비신뢰적인 서비스에서 rdt service를 제공합니다.

  • 파이프라인 기법 적용
  • 누적 ack 적용
  • 단일 재전송 타이머를 사용

TCP는 기본적인 RTT에 추가적인 개선사항만 반영을 합니다. TCP에서의 재전송은 2가지 이벤트에 의해서 발생을 하게 됩니다.

  • Timeout events
  • Duplicate acks

simplified TCP sender : 

  • 중복된  ack는 무시
  • flow control 및 congestion control 무시

Simplified TCP sender events

data rcvd from app

  • Sequence number segment 생성
  • Seq #는 1번재 데이터 바이트의 stream number
  • timer 시작
  • 타임아웃 value는 TimeOutInterval 

timeout

  • 타임아웃 유발한 세그먼트만 재전송
  • 타이머 재시작

Ack rcvd

  • 이전 Ack 되지 않은 Segment가 Ack 수신
  • Ack 된 것을 업데이트하고 타이머 동작시킴

Fast Retransmit

1. 기본 개념

  • 손실된 세그먼트가 발생하면 수신자는 중복된 ACK(Duplicate Acknowledgment, DupACK)를 송신자에게 여러 번 보냅니다.
  • 이는 송신자가 보낸 데이터 중 일부가 손실되었음을 나타내는 신호입니다.
  • Fast Retransmit는 송신자가 DupACK의 패턴을 감지해 Timeout 이벤트를 기다리지 않고 빠르게 손실된 데이터를 재전송하도록 합니다.

2. Fast Retransmit 동작

  1. 손실 발생 상황
    • 송신자가 연속된 세그먼트를 전송 (Seq=1,2,3,4Seq = 1, 2, 3, 4).
    • 세그먼트 2가 손실되었다고 가정.
  2. 수신 측 반응
    • 수신자는 세그먼트 1을 정상적으로 수신하고 ACK = 2를 송신자에게 보냄.
    • 세그먼트 2가 손실되었으므로 세그먼트 3을 받더라도 ACK = 2를 계속 반복해서 보냄.
  3. 중복 ACK 감지
    • 송신자는 동일한 ACK 번호(예: ACK = 2)를 여러 번 수신:
      • 첫 번째 DupACK: 손실 가능성 의심.
      • 두 번째 DupACK: 손실 가능성 증가.
      • 세 번째 DupACK: 손실된 세그먼트로 간주.
  4. 손실 감지와 재전송
    • 송신자는 세 번째 DupACK 수신 시, Timeout 이벤트를 기다리지 않고 손실된 세그먼트(여기서는 세그먼트 2)를 즉시 재전송.

3. Timeout 대비 Fast Retransmit의 장점

  • Timeout은 손실된 세그먼트를 재전송하기 전에 일정 시간(상대적으로 긴 시간)을 기다려야 합니다.
  • Fast Retransmit는 DupACK을 통해 손실을 더 빠르게 감지하여 재전송 지연을 줄이고 데이터 전송의 효율성을 높입니다.

4. Fast Retransmit의 한계

  • DupACK이 반드시 손실을 의미하지 않을 수도 있음:
    • 네트워크에서 세그먼트가 지연되어 순서가 어긋난 경우에도 DupACK이 발생할 수 있음.
  • 손실을 정확히 감지하려면 TCP의 다른 메커니즘(예: Fast Recovery)과 함께 사용됩니다.

Fast retransmit algorithm

중복된 ACK의 개수만 카운트하면 됩니다. 중복된 ACK의 개수가 3이면 재전송하는 것입니다.