본문 바로가기
공부/Network

[Network] TCP RDT

by 웅대 2023. 4. 27.
728x90
반응형

sequence number

이전 포스팅에서 파일을 보낼 때 패킷을 보낼 때마다 sequence number를 부여했다고 했다.

 

이 sequence number를 통해 패킷의 순서를 확인할 수 있는데 sequence number가 구체적으로 어떻게 부여되는지 보려고 한다.

 

다음 그림은 파일 크기가 500,000 bytes이고 MSS(Maximum Segement Size)가 1,000 bytes일 때의 sequence number 예시이다

우선 sequence number는 byte 단위로 부여된다.

 

단순히 순서를 의미하는게 아니고 byte 단위로 부여되기 때문에 MSS가 1,000 bytes라면 0, 1000, 2000... 이렇게 segement의 MSS 단위로 늘어난다.

 

sequence number가 0인 segment를 보냈을 때 잘 도착했다면 수신측에서는 다음인 1000번을 달라는 ACK를 보내게 된다.

 

잘 도착하지 않았다면 0번인 ACK를 보내서 0번을 다시 달라고 요청하게 되는 것이다.

 

그리고 cumulative ACK를 사용하기 때문에 신측에서 특정 ACK를 받으면 그 이전 ACK들은 모두 받았다고 생각한다.

 

텔넷을 기준으로 문자 'C'를 보낸다고 하자.

문자 'C'를 보내면 수신 측에서도 문자 'C'를 보내고 송신 측에서는 다시 이 'C'를 받아서 출력하는 형식으로 이루어진다.

 

'C'를 보내고 바로 'C'를 출력하지 않는 이유는 'C'가 출력된다는 것은 데이터를 보내고 받았다는 뜻이므로 통신이 이루어진다는 것을 확인하기 위해서이다.

 

보다시피 문자 'C'는 1 byte이기 때문에 sequence number가 1씩 증가하는 모습을 확인할 수 있다.

 

<FSM>

참고로 타이머는 하나이다.

 

retransmission의 과정은 다음과 같다.

 

lost ACK

타임 아웃이 발생하고 다시 보내게 된다.

 

참고로 seq 92번을 두 번째 받을 때에는 수신 측의 버퍼에 이미 존재한다.

 

premature timeout

ACK를 받기 전에 timeout이 발생한 경우이다.

 

수신자 입장에서보면 이미 자신은 seq 92와 seq 100번을 받아서 버퍼에 보관중인 상황이다.

 

그런 상황에서 seq 92번을 다시 받았을 때 ACK 100을 보내는 게 아니라 ACK 120을 보내게 되고 이것이 cumalative ACK이다.

 

 

cumulative ACK

두 개의 ACK를 보냈는데 앞선 ACK가 유실된 상황이다.

 

그런데 뒤에 보낸 ACK 120을 송신 측이 받으면 당연히 seq 100은 수신 측에서 받았겠구나 생각하게 된다.

 

만약 seq 100을 받지 못했다면 ACK 100을 보냈을테니 말이다.

 

즉 cumulative ACK인 것이다.

 

위에서 타이머는 하나라고 했는데 ACK120을 받은 순간 수신 측의 타이머를 멈춘다.

 

FSM을 자세히 보면 ACK를 받았을 때 아직 ACK를 받지 못한 segment가 없다면 타이머를 멈춘다고 했다.

 

그리고 새로운 데이터를 보낼 때 다시 시작하는 것이다.

 

수신측 입장에서 ACK를 보내는 방법을 살펴보면

 

  1. segment가 순서대로 온다면 바로 ACK를 보내는 것이 아니라 잠시 기다린다. 그 다음 segment가 오지 않으면 ACK를 보낸다.
  2. segment를 받고 기다리는 와중에 그 다음 segment가 온다면 누적 ACK를 보낸다. ACK를 보내는 횟수를 줄여 네트워크 성능을 향상시킬 수 있다.
  3. 기다리는 segment 이후의 segment가 온다면 그 즉시 받지 못한 segment를 달라고 ACK를 보낸다. 받은 것은 버퍼에 저장해둔다.

아래 그림에서 노란색이 segment를 받지 않았고 초록색이 segment를 받았다고 하자.

이 상황에서 1번을 다시 달라고 요청을 해서 받게 되면 1, 2, 3번이 연속적으로 완성되었기 때문에 receive base를 4로 바꾸어 window를 이동시킨다.

728x90
반응형

댓글