본문 바로가기
Computer Science/컴퓨터 네트워크

컴퓨터 네트워크: Error Control

by 청량리 물냉면 2021. 10. 7.
반응형

TCP: Transmission Control Protocol

8. Error Control

 

Error Control

  • TCP는 신뢰할 수 있는 transport layer 프로토콜이다.
  • 즉, TCP로 데이터 스트림을 전송하는 응용 프로그램은 TCP에 의존해 전체 스트림을 반대쪽 끝에 있는 응용 프로그램에 오류 없이 순서대로 전달할 수 있다.
  • TCP의 Error Control(오류 제어)는 checksum, acknowledgment, and time-out의 세 가지 tool을 사용하여 수행된다.

 

알아두기

  • ACK에 대한 ACK은 존재하지 않는다. 즉, 내가 보낸 ACK을 상대방이 잘 받았는지 확인하는 ACK은 존재하지 않는다.
  • 데이터는 순서가 잘못된 상태로 도착하여 receiving TCP에 의해 일시적으로 저장될 수 있지만, TCP는 순서가 잘못된 데이터가 프로세스에 전달되지 않도록 보장한다. → TCP는 receiving buffer에서 application으로 데이터를 전송할 시 제대로 된 데이터만 올려보낸다(신뢰성 보장). 순서 바뀐 것은 아예 process로 전달되지 않음

 

 

Normal operation

  • 일반적인 데이터 전송 과정.
  • sender가 data를 보내면 receiver는 보낸 data를 잘 받았고 다음 패킷을 보내달라는 의미로 ACK을 전송한다.
  • 이때 상대에게 전송하는 ACK의 갯수를 줄이기 위한 Rule 1, 2, 3이 존재

양방향. Client, Server에는 Sending Buffer, Receiving Buffer이 각각 존재.

 

Rule 1

데이터를 받았을 때 ACK을 보내야 하는데 ACK을 바로 보내는 게 아니라 Buffer에 보낼 데이터가 있는지 확인하고 보낼 데이터가 있으면 같이 보낸다

(= ACK가는 김에 데이터도 같이 가자)

 

Rule 2

Sender는 패킷을 송신하고 나면 별도로 정의된 Timer(ACK-delaying timer)를 켜놓고 정해진 시간 동안 대기한다. 위의 그림에서는 지연 시간을 50ms로 설정하였다. 50ms까지 기다려도 Buffer에 보낼 데이터가 없을 시 데이터 없이 ACK만 전송한다.

 

Rule 3

timer를 켜놓고 기다리는 중에 패킷이 하나 더 도착하면 더 이상 안 기다리고 바로 ACK을 전송한다.

(=데이터가 없는 상황에 패킷 2개 들어오면 2개당 ACK 하나는 보내자)

 

 

* Ack 전송 시 Ack Field를 1로 셋팅하면 상대측에서 Ack을 의미있는 정보로 받아들이고, 0으로 셋팅 시 상대는 쓰여진 Ack번호를 무시한다. 

* 만약 그림의 맨 아래 Ack:7001 패킷이 Server에게 도착하기 이전 유실되면, Sever 입장에서는 위의 Seq: 5001-6000 / Ack: 1401패킷Seq: 6001-7000 / Ack: 1401패킷 두 개 모두 Client가 못 받았다고 생각.

 

 

Lost segment (패킷 유실)

Ack 갯수 줄이다 응급상황이 발생할 시 바로 Ack을 전송한다. 

Rule 4

잃어버린 패킷이 존재할 시 바로 Ack 전송

 

Rule5

못 받은 패킷을 받은 경우 바로 Ack 전송

 

* RTO timer

  • RTO : Retransmission Timeout, 재전송 타임아웃 시간
  • 패킷 제대로 받았는지 패킷마다 확인하는 타이머. 패킷마다 넉넉한 시간을 부여하고, 그 시간 안에 패킷에 대한 Ack이 도착하지 않은 경우 패킷이 정상적으로 상대방에게 도착하지 않았다고 간주하고 패킷을 재전송한다.
  • RTO설정 또는 계산 = 전송된 한 세그먼트에 대한 확인응답을 기다려야 하는 시간 = TCP 재전송 타이머 값
  • 송신 TCP는 매 세그먼트를 전송할 때 마다 재전송 타이머(RTO) 가동함
  • RTO는 TCP 연결의 RTT(왕복시간) 보다 약간 크면 이상적임. 즉, 세그먼트 전송부터 확인응답 받기까지의 시간 보다 약간 크면 좋음. 얼마나 커야 하는지 즉, RTT 예측에 대해 여러 계산 방식들이 있음

* Sender가 보낸 데이터가 중간에 유실된 경우에도 Sender는 계속 데이터를 전송한다. → Ack을 못 받더라도 window size가 허락하는 한 데이터를 계속 전송한다.

* Resent: 지정된 시간 안에 전송한 패킷의 Ack이 도착하지 않을 시 상대방이 패킷을 수신하지 못한 것이라 가정하고 해당 패킷을 재전송

 

 

 

Fast retransmission 

패킷이 없어진 경우 빠르게 재전송

 

* Culumative Ack의 장점

  • 패킷 두 개당 하나씩 Ack 나가므로 Ack 갯수 절약 가능(Rule3)
  • Fast retransmission 같은 기능을 쉽게 구현 가능

  • 상대가 보낸 패킷이 도착하지 않는 경우(뒷 번호의 패킷은 들어오는데 앞 번호의 패킷이 들어오지 않은 경우), Receiver에서는 해당 패킷을 받고 싶다는 의미로 상대방에게 받고 싶은 패킷의 Ack을 계속해서 보낸다.
  • Sender 측으로 세 개의 중복된 Ack이 들어오면 Sender는 Ack으로 들어오는 해당 패킷이 없어졌을 가능성이 높다고 생각하고 RTO timer가 time out되기 전이라도 패킷 재전송(→ Fast retransmit)
  • 뒤에 Receiver가 Ack 701번을 보낸 경우 그 앞의 700번 패킷까지는 다 받았다고 간주

 

 

Lost acknowledgment (Ack 유실)

  • ACK에 대한 ACK은 존재하지 않는다. 즉, 내가 보낸 ACK을 상대방이 잘 받았는지 확인하는 ACK은 존재하지 않는다.
  • 하지만 중간에 Ack이 하나 유실되었다 할지라도 큰일이 나는 것은 아님.
  • 뒤에 Receiver가 Ack:901을 전송하고 Sender가 그 Ack을 이상없이 수신했다면, Sender는 Receiver가 이전 900번 패킷까지는 이상없이 수신했다는 뜻으로 해석하기 때문.

 

 

Lost acknowledgment corrected by resending a segment (세그먼트 재전송을 통한 Ack 유실 수정)

 

 

Rule6

  • Receiver가 Sender에게 패킷을 잘 받았다는 Ack을 전송하는 상황에 Ack이 유실되었다.
  • 위의 Lost acknowledgment과 다른 점은 다음 Ack이 도착하기 이전 RTO timer가 time out되었다는 것이다.
  • RTO timer: 패킷마다 넉넉한 시간을 부여하고, 그 시간 안에 패킷에 대한 Ack이 도착하지 않은 경우 패킷이 정상적으로 상대방에게 전송되지 않았다고 간주하고 패킷을 재전송한다.
  • time out에 의해, Sender는 상대방이 패킷을 수신하지 못했다고 간주하고 패킷을 재전송한다. 그림에서는 나타나지 않지만, 뭘 못 받았는지 모르기 때문에 501-600, 601-700번 패킷을 같이 전송한다. 
  • Receiver는 중복된 패킷이 도착하면 바로 Ack을 전송한다. 

 

알아두기

적절히 처리되지 않은 경우 Lost acknowledgments는 deadlock을 발생시킬 수 있다. 

  • Receiver가 rwnd=0을 보내 Sender가 데이터 송신을 멈춘 상황.
  • Receiving Buffer에 MSS만큼의 공간이 생기거나 1/2만큼 빈 공간이 생길 때 Receiver는 rwnd=k (k: 빈 공간 용량)를 보내 상대방을 깨운다.
  • 이때 상대방을 깨우려고 보낸 Ack이 유실된다면, Sender는 Receiver가 자신을 깨우기를 기다리고 Receiver는 Sender가 데이터를 보내주기를 무한정으로 기다리게 되는 deadlock이 발생한다. 

 

해결방안: Persistence Timer 사용

 

  • Receiver가 rwnd=0을 보내 Sender가 데이터 송신을 멈춘 상황. 이 때 persistence timer가 작동한다.
  • persistence timer가 time out이 되었는데도 상대방에게서 아무런 반응이 없으면, Sender는 일단 작은 사이즈의 데이터(probe segment)를 상대방에게 보내본다.
  • 데이터를 보내면 해당 데이터에 대한 Ack이 도착한다. rwnd가 여전히 0이면 상대방 수신버퍼가 아직 비워지지 않았다는 의미. rwnd = k이면 중간에 Receiver가 보낸 Ack이 유실되었을 가능성이 존재

 

 

 


자료 출처:

  • TCP/IP Protocol Suite 4th Edition Slide
    (Behrouz A. Forouzan 저, McGraw-Hill, 2010)
  • 정보통신기술용어해설-RTO (http://www.ktword.co.kr/test/view/view.php?m_temp1=1687)

 

but TCP guarantees that no out-of-order data are delivered to the process.

반응형