※"컴퓨터 네트워킹 하향식 접근 8판" 책을 간단하게 정리한 내용의 글입니다.※
3.4절에서는 일반적인 상황에서의 신뢰적인 데이터 전송 문제를 다룬다.
3.4 신뢰적인 데이터 전송의 원리
신뢰적인 데이터 전송을 구현하는 문제는 트랜스포트 계층뿐만 아니라 다르 계층에서도 발생할 수 있는 문제이고, 네트워킹에서 가장 중요한 문제일 것이다.
각 계층은 위의 이미지처럼 상위 계층에게 데이터를 신뢰적으로 전송할 수 있는 추상화된 서비스를 제공할 수 있다.
신뢰적인 채널에서 전송된 데이터는 손상되지 않고(0은 0으로 1은 1로 정확히 전달되고) 손실되지 않는다. 그리고 모든 데이터는 전송된 순서 그대로 전달된다. 이것이 TCP가 인터넷 애플리케이션에게 제공하는 서비스 모델이다.
위에서 언급한 것은 신뢰적인 데이터 전송 프로토콜(reliable data transfer protocol)의 의무이다. 이는 전송 프로토콜 바로 아래 계층이 신뢰적이지 않아서 어렵다. 이 절에서는 하위 계층을 간단히 비신뢰적인 점대점 채널로 볼 것이다.
위의 이미지에서 rdt는 신뢰적인 데이터 전송(reliable data transfer)을 의미하고, udt는 비신뢰적인 데이터 전송(unreliable data transfer)을 의미한다. 이 절에서는 모든 패킷이 유실될 순 있지만, 보내진 순서대로 전달되는 것을 가정한다.
이 절에서는 단방향 데이터 전송(unidirectional data transfer)의 경우만 고려하는데, 단방향임에도 송신 측과 수신 측이 양방향으로 패킷을 전달할 필요가 있다. rdt의 송신측과 수신 측 모두 udt_send()를 호출함으로써 다른 쪽에 패킷을 전송한다.
< 3.4.1 신뢰적인 데이터 전송 프로토콜의 구축 >
- 3.4.1.1 완벽하게 신뢰적인 채널상에서의 신뢰적인 데이터 전송: rdt1.0
위는 rdt1.0의 송신자(a)와 수신자(b)의 동작을 정의한 유한상태 머신(finite state machine)이다.
가로선 위의 명령어는 상태 전이에 대한 조건이고, 가로선 아래의 명령어는 상태 전이 시에 취해지는 행동(action)이다.
rdt1.0은 간단한 프로토콜로 데이터 단위와 패킷의 차이점이 없다. 완벽하게 신뢰적인 채널을 가정하고 있기 때문에 오류가 생길 일이 없고, 수신측은 송신 측에 어떤 피드백(feedback)도 할 필요가 없다.
- 3.4.1.2 비트 오류가 있는 채널상에서의 신뢰적 데이터 전송: rdt2.0
rdt2.0에서는 완벽하게 신뢰적인 채널을 가정했던 rdt1.0과 달리 패킷 안의 비트들이 하위 채널에서 손상될 수 있음을 가정한다.
이때 수신 측은 올바른 메시지를 받았는지 여부를 반환해줘야 한다. 컴퓨터 네트워크 설정에서 그러한 재전송을 기반으로 하는 신뢰적인 데이터 전송 프로토콜은 자동 재전송 요구(Automatic Repeat reQuest, ARQ) 프로토콜로 알려져 있다.
- ARQ에서는 다음과 같은 세 가지 부가 기능이 요구된다.
- 오류 검출: 오류를 검출하기 위한 별도의 체크섬 필드가 필요하다.
- 수신자 피드백: 수신자의 수신 상태를 송신자에게 알리기 위해 한 비트가 필요하다. 긍정 확인응답(ACK)과 부정 확인응답(NAK)가 있다.
- 재전송: 오류가 검출된 패킷에 대해 송신자는 재전송 해야 한다.
위의 rdt2.0의 FSM(유한 상태 머신)을 보면 송신 측은 상위 계층으로부터 메시지를 받으면 이를 보내고 수신 측으로부터 ACK나 NAK 응답을 기다린다. 그리고 응답으로 NAK를 받을 경우 다시 보내고 응답을 기다린다.
rdt2.0은 ACK를 받아서 수신자가 현재의 패킷을 정확하게 수신했음을 확신하기 전까지 새로운 데이터를 전달할 수 없다. 그래서 rdt2.0은 전송 후 대기(stop-and-wait) 프로토콜로 알려져있다.
rdt2.0은 치명적인 결함이 있다. ACK와 NAK 패킷이 손상될 수 있는 가능성을 고려하지 않았다는 것이다. 이를 해결하기 위한 여러 가능성들이 있지만, TCP를 포함한 모든 현존하는 데이터 전송 프로토콜은 데이터 패킷에 새로운 필드를 추가하고 이 필드 안에 순서 번호(sequence number)를 삽입해서 송신자가 번호를 붙이는 방식으로 이 문제를 해결한다.
한 비트 순서 번호(0 또는 1)를 통해 수신자는 송신자가 이전에 전송된 패킷을 다시 전송한 것인지 새로운 패킷을 전송한 것인지 판단할 수 있다. 패킷이 손실되지 않는 것은 가정했기 때문에, ACK와 NAK는 각각 어떤 데이터에 대한 응답인지 송신 측과 수신 측 모두 알 수 있다.
rdt2.1은 rdt2.0보다 상태가 2배로 늘었다. 이는 0과 1에 대해 각각 기술하기 위함이다.
rdt2.1과 rdt2.2의 차이는 rdt2.2는 ACK만을 응답한다는 것이다. 수신자는 응답 ACK를 보낼 때 어떤 순서 번호에 대한 ACK인지를 같이 보내서 송신자에게 수신자가 올바르게 수신했는지를 알게 한다.
- 3.4.1.3 비트 오류와 손실 있는 채널상에서의 신뢰적인 데이터 전송: rdt3.0
이제 패킷 손실을 어떻게 검출하고, 패킷 손실이 발생했을 때 어떤 행동을 할 것인지 알아보자.
손실된 패킷 검출과 회복 책임은 송신자에게 부여한다.
rdt3.0에서는 타이머를 도입해서 타이머가 타임 아웃이 되면 패킷의 실제 손실 여부에 상관 없이 재전송을 한다. rdt2.2에서 이미 패킷이 중복되었을 경우를 처리하기 위한 충분한 기능(순서 번호)이 있기 때문에 rdt3.0은 rdt2.2에서 timer와 timeout만 추가된 것이다. 이는 송신자 대 수신자 채널에서 중복 데이터 패킷(duplicate data packet)의 가능성을 포함한다.
rdt3.0은 기능적으로 신뢰적으로 동작하는 정확한 프로토콜이다. 하지만 전송 후 대기(stop-and-wait) 프로토콜이라는 점 때문에 성능 문제가 있다.
< 3.4.2 파이프라이닝된 신뢰적인 데이터 전송 프로토콜 >
만약 두 종단 시스템이 매우 멀리 떨어져있어서 전파 지연(RTT)이 전송 시간보다 매우 크다면, 전송 후 대이(stop-and-wait) 프로토콜에서 전체 걸린 시간에 대한 실제 데이터 비트를 전송하는데 걸린 시간의 비율인 이용률(utilization)이 매우 작을 것이다.
모든 메시지에 대해 수신자의 정확한 수신 여부를 판단하고 다음 패킷을 보내기 때문에 매우 비효율적일 수 밖에 없다.
그래서 대안으로 파이프라이닝이라는 것을 활용한다. 전송 후 대기 방식 대신에 송신자가 확인 응답을 기다리지 않고 여러 패킷을 전송하도록 허용하는 것이다. 만약 응답을 확인하지 않고 송신자가 3개의 패킷을 전송할 수 있게 한다면 이용률은 3배가 될 것이다.
파이프 라이닝에서는 동시에 여러 개의 패킷을 전송하기 때문에 각 패킷을 식별하기 위해 순서 번호의 범위가 커져야 한다. 그리고 송신 측과 수신 측은 여러 패킷에 대해 재전송할 수 있어야 하기 때문에 패킷 하나 이상을 버퍼링 해야 한다.
대표적인 파이프라인 오류 회복의 두 가지 접근 방법으로 GBN(Go-Back-N, N부터 반복)과 SR(Selective Repeat, 선택적 반복)이 있다. 이를 다음 게시글에서 정리하겠다.
'CS > 컴퓨터네트워크' 카테고리의 다른 글
[하향식 접근 8판] Chapter 3 - 3.5 연결지향형 트랜스포트: TCP (1) | 2024.11.09 |
---|---|
[하향식 접근 8판] Chapter 3 트랜스포트 계층 (3.4.3 GBN, 3.4.4 SR) (0) | 2024.11.08 |
[하향식 접근 8판] Chapter 3 트랜스포트 계층 (3.3 비연결형 트랜스포트: UDP) (1) | 2024.11.02 |
[하향식 접근 8판] Chapter 3 트랜스포트 계층 (3.1 ~ 3.2) (0) | 2024.11.01 |
[하향식 접근 8판] Chapter 2 애플리케이션 계층 - 2.4~ (0) | 2024.10.16 |