# ARQ protocol in Transport Layer (2/2)

**Contents**

---

**1️⃣** 단순 프로토콜 (Simple Protocol)  
**2️⃣** 정지-대기 프로토콜 (Stop-and-Wait-Protocol)  
**3️⃣** N-프레임-후퇴(Go-Back-N) 프로토콜  
**4️⃣** 선택적 반복 (Selective Repeat) 프로토콜  
**5️⃣** 피기배킹(Piggy-backing)

---

**ARQ 프로토콜(Automatic Repeat reQuest protocol)**은 전송 계층에서 데이터 전송의 신뢰성을 보장하기 위해 사용되는 **오류 제어 프로토콜(error control protocol)**이다. 데이터 전송 중 오류가 발생하거나 패킷이 손실되었을 때, 수신자가 송신자에게 **재전송 요청(retransmission request)**을 보내 데이터가 정확히 전달되도록 한다. ARQ프로토콜은 크게 4가지로 나뉜다. 이 프로토콜 덕분에 네트워크 환경에서 데이터가 손실되거나 손상될 가능성이 높은 상황에서도 신뢰할 수 있는 통신이 가능해지게 된다. 이번 시간에서는 전송계층의 오류제어가 어떻게 발전되어 왔는지 대해서 큰 흐름을 공부해본다.

* 단순 프로토콜 (Simple Protocol)
    
* 정지-대기 ARQ (Stop-and-Wait ARQ)
    
* Go-Back-N ARQ
    
* Selective Repeat ARQ
    

---

## **1️⃣** 단순 프로토콜 (Simple Protocol)

**<mark>💡요약: </mark>** 단순 프로토콜(Simple Protocol)은 송신자가 데이터를 보내고, 수신자는 이를 즉시 처리할 수 있다고 가정하는 방식으로, 오류 제어나 흐름 제어가 없는 간단한 프로토콜이다. 주로 네트워크 초기에 간단한 통신이 필요할 때 사용되며, 연결 설정 및 오류 재전송 과정이 없어 효율적이지만 안정성은 낮다는 단점이 있다.

![](https://cdn.hashnode.com/res/hashnode/image/upload/v1730460794695/c1381759-bd25-47bf-ade8-4f9af616a9c3.png align="center")

* **비연결형 프로토콜(connectionless protocol)**: 단순 프로토콜은 수신 측에서 별도의 수신 확인을 보내거나, 송신 측에서 데이터를 재전송하는 등의 과정이 없다.
    
* **흐름제어 없음(no flow control)**: 데이터를 보내는 속도나 양을 제어하지 않고, 단순히 데이터를 전송한다.
    
* **오류제어 없음(no error control)**: 오류가 발생하더라도 재전송하지 않으며, 데이터가 손상되지 않는다고 가정한다.
    
* **즉시 처리 가능한 가정(assumption of immediate processing)**: 수신자가 수신한 패킷을 즉시 처리할 수 있다고 가정한다.
    

**💡예시상황**: 두 친구 A와 B가 서로 편지를 주고받는 상황이라고 하자. A는 B에게 "안녕"이라고 적은 편지를 보냈다.

* **송신 과정**: A는 편지를 쓰고, 바로 우편함에 넣는다. 편지가 B에게 도착하기 전이나 도착했는지 여부에 대해 A는 알 수 없다.
    

* **수신 과정**: B는 편지를 받으면 바로 편지를 읽고 끝낸다. 만약 편지가 손상되거나 잃어버렸더라도 A는 알 수 없다.
    

---

### 단순 프로토콜의 흐름도🔽

**단순 프로토콜(Simple Protocol)**은 **흐름 제어(Flow Control)**와 **오류 제어(Error Control)**가 없는 매우 단순한 데이터 전송 방식이다. 송신자가 데이터 전송을 요청하면 패킷을 보내고, 수신자는 이를 바로 받아들인다 (핑크색 화살표 참조). 중간에 오류가 발생하더라도 재전송이 없고, 단순히 전송과 수신 과정만 이루어진다.

![](https://cdn.hashnode.com/res/hashnode/image/upload/v1730461021995/3f956afc-2582-4880-b84c-c31c00c3114f.png align="center")

* **송신자(Sender)**는 전송 계층에서 **데이터 전송 요청(Request)**을 받으면 패킷을 수신자에게 전송한다.
    
* **수신자(Receiver)**는 송신자로부터 온 패킷을 즉시 받아들이고 처리한다.
    
* 중간에 패킷 손실이나 오류가 발생하더라도 다시 보내지지 않으며, **오류 제어(Error Control)**와 **흐름 제어(Flow Control)**가 없다.
    
* **시간(Time)**의 흐름에 따라 송신자가 연속적으로 패킷을 전송하고 수신자가 이를 순차적으로 받는 구조이다.
    

💡**분홍색 화살이 아래로 기울어져 있는 이유**는 **시간(Time)**의 흐름을 나타내기 위함이다. **패킷이 송신자로부터 수신자에게 전송되는 과정에서의 시간 경과**를 보여주며, 전송이 즉시 이루어지는 것이 아니라 약간의 **지연(Delay)**이 존재함을 알수 있다. 실제 네트워크에서는 데이터가 전송되면서 여러 요소로 인해 시간이 걸리기 때문에, 이러한 시간 차이를 시각적으로 표현한 것이다.

💡**예시상황:** 두 사람이 카카오톡으로 간단히 채팅한다고 가정하자. 한 사람이 메시지를 보내면 다른 사람은 그냥 메시지를 읽는다.

* **전송 과정**: 첫 번째 사람은 "안녕하세요"라고 메시지를 보내고, 상대방이 메시지를 읽었는지 확인하지 않고 다음 메시지를 보낸다.
    
* **수신 과정**: 상대방은 메시지를 받자마자 읽는다. 중간에 메시지가 손실되거나 도착하지 않으면, 두 사람은 그 사실을 알지 못하고 대화가 진행된다.
    

---

## **2️⃣** 정지-대기 프로토콜 (Stop-and-Wait-Protocol)

**<mark>💡요약: </mark> 정지-대기 프로토콜(Stop-and-Wait Protocol)**은 송신자가 한 번에 하나의 패킷만 보내고, 수신자로부터 **확인 응답(ACK)**을 받을 때까지 기다리는 방식으로 **흐름 제어(Flow Control)**와 **오류 제어(Error Control)**를 제공한다. 이를 통해 데이터 전송의 신뢰성을 보장할 수 있게 된다. 송신자는 타이머를 설정하여 ACK를 기다리며, 타이머가 만료되면 오류로 간주하고 재전송한다.  

* **슬라이딩 윈도우(Sliding Window)** 크기가 1로 설정되어, 송신자는 <mark>한 번에 하나</mark>의 패킷만 전송하고, 수신자로부터 확인 응답(ACK)을 받을 때까지 대기한다.
    

* 송신자가 패킷을 전송한 후, **확인 응답(Acknowledgement, ACK)**을 받을 때까지 **다음 패킷을 전송하지 않는다.** (흐름제어 Flow Control)
    
* 수신자는 패킷을 받으면 **검사 필드(Checksum)**를 통해 오류를 확인한다. 오류가 없는 경우에만 송신자에게 ACK를 보낸다. 만약 오류가 있으면 패킷을 **조용히 폐기**(Silent Discard)하며, 송신자에게 부정 응답(NACK)을 보내지 않는다. 송신자는 타이머를 통해 일정 시간 동안 ACK가 도착하지 않으면 패킷이 손실되었다고 판단하고 재전송을 시도하게 된다. (오류 제어 Error Control)
    
* **타이머(Timer)**: 송신자는 패킷 전송 후 특정 시간 동안 ACK를 기다리며, 타이머가 끝날 때까지 응답이 없으면 오류가 발생했다고 가정하고 패킷을 재전송하게 된다.
    

  
💡**예시상황:** 두 컴퓨터 A와 B가 파일을 전송한다고 가정해보자

* **전송 과정**: 컴퓨터 A는 첫 번째 파일 조각을 컴퓨터 B에게 보낸다.
    
* **수신 및 응답**: 컴퓨터 B가 파일 조각을 받으면 검사 후 이상이 없을 시 **확인 응답(ACK)**을 A에게 보낸다. 오류가 있는 경우 B는 조용히 패킷을 폐기한다.
    
* **타이머와 재전송**: 만약 A가 B의 ACK를 타이머가 만료될 때까지 응답을 받지 못하면, A는 해당 파일 조각을 재전송하게 된다.
    

---

### 정지-대기 프로토콜(Stop-and-Wait Protocol)의 동작 방식

**<mark>💡요약: </mark>** 송신자가 한 번에 하나의 패킷만 전송하고, 수신자로부터 **확인 응답(ACK)**을 받을 때까지 다음 패킷을 전송하지 않는 방식으로, 신뢰성 있는 데이터 전송을 보장한다. 송신자는 **타이머(Timer)**를 설정하여 ACK를 기다리며, 시간 내에 ACK를 받지 못하면 해당 패킷을 재전송하게 된다. 수신자는 오류가 있는 패킷을 조용히 폐기하고, 순서에 맞는 패킷만 받아들인다.

![](https://cdn.hashnode.com/res/hashnode/image/upload/v1730461549681/4fbea845-d1ff-430d-a464-f37ff770016c.png align="center")

* **송신 윈도우(Send Window)**: 송신자는 한 번에 하나의 패킷만 보내고, 그 패킷에 대한 **확인 응답(ACK)**을 받기 전까지는 다음 패킷을 보내지 않는다.
    
* **수신 윈도우(Receive Window)**: 수신자는 순서대로 도착한 패킷만 받아들이며, 순서에 맞지 않거나 오류가 있는 패킷은 **조용히 폐기(Silently Discard)**한다.
    
* **타이머(Timer)**: 송신자는 패킷을 보낸 후, 일정 시간 동안 ACK를 기다리게 된다. 타이머가 만료되면 ACK가 도착하지 않았다고 판단하고 해당 패킷을 재전송한다.
    
* **순서 번호(seqNo)**와 **확인 번호(ackNo)**: 송신자는 각 패킷에 고유한 순서 번호(seqNo)를 부여하며, 수신자는 ACK 응답 시 해당 패킷의 순서 번호를 확인 번호(ackNo)로 되돌려 보낸다. 이를 통해 송신자는 올바른 패킷이 도착했는지 확인할 수 있게 된다.
    
* **논리 채널(Logical Channel)**: 송신자와 수신자 간의 통신 경로를 의미하며, 패킷과 ACK가 이 논리 채널을 통해 오간다.
    
* **Checksum**: 패킷의 **오류를 검사(Error Detection)**하는 역할을 한다. 예를 들어, 송신자가 패킷을 보낼 때 데이터 합계가 1234라면, 수신자가 받은 데이터도 1234이어야 한다. 값이 다르면 오류가 발생한 것이다.
    

---

### 순서 번호(Sequence Number)와 확인응답번호(Acknowledgement Number)의 역할

**<mark>💡요약: </mark> 순서 번호(Sequence Number)**와 **확인응답번호(Acknowledgement Number)**는 **정지-대기 프로토콜(Stop-and-Wait Protocol)**에서 데이터의 순서를 관리하고, 중복된 데이터 수신을 방지하는 오류 제어 역할을 한다. 순서 번호는 패킷의 순서를 식별하고, 확인응답번호는 수신자가 다음에 받을 패킷을 명확히 알려준다. 이 번호들은 데이터 전송 중 패킷의 순서를 추적하고, 신뢰성을 보장하기 위한 중요한 요소이다.

  
☑️**순서 번호(Sequence Number)**

* **역할**: 중복 수신을 방지하기 위해 사용된다.
    
* 송신자는 패킷의 순서를 관리하기 위해 **패킷 헤더에 순서 번호 필드**를 추가한다(seqNo)
    
* 수신자가 특정 순서 번호를 가진 패킷을 수신하면, 그 다음 패킷에는 **순서 번호 + 1**이 할당된다. 예를 들어, x번 순서 번호를 수신한 후, 다음 패킷은 x+1번이 된다.
    
* 정지-대기 프로토콜에서는 **모듈로-2 연산(modulo-2 operation)**을 통해 1비트 필드만 사용하므로, 0과 1을 번갈아 사용하여 간단하게 순서를 구분한다.
    

☑️**확인응답번호(Acknowledgement Number)**

* **역할**: 수신자가 송신자에게 다음으로 기대하는 패킷의 순서 번호를 알려주는 번호이다.
    
* 예를 들어, 수신자가 순서 번호 0번 패킷을 받았다면, 다음 패킷은 순서 번호 1번을 기대하게 된다. 따라서, 수신자는 ACK를 보낼 때 다음 패킷의 순서 번호를 확인응답번호로 전송하여 송신자가 정확한 패킷을 보낼 수 있게 한다.
    

**💡예시상황:** 컴퓨터 A가 컴퓨터 B로 데이터를 전송한다고 가정해보자.

* **전송 과정**: 컴퓨터 A는 순서 번호 0을 가진 패킷을 B에게 보낸다.
    
* **수신 및 응답**: 컴퓨터 B가 패킷 0번을 성공적으로 받으면 확인응답번호(ACK)를 1로 설정하여 A에게 보낸다. 이는 B가 다음으로 순서 번호 1의 패킷을 기대한다는 의미이다.
    
* **다음 패킷 전송**: A는 B의 ACK 1을 받으면, 다음으로 순서 번호 1을 가진 패킷을 B에게 보낸다.
    

---

### 정지-대기 프로토콜(Stop-and-Wait Protocol)의 동작 과정

**<mark>💡요약: </mark>** 아래 동작 과정은 송신자가 하나의 패킷을 보내고 수신자로부터 **확인 응답(ACK)**을 받을 때까지 기다리는 방식으로 동작하며, 패킷이 손실되었을 경우 타이머에 의해 재전송되는 과정을 포함한다.

![](https://cdn.hashnode.com/res/hashnode/image/upload/v1730463151355/68e1a8af-2dd7-41dc-870c-b1e9f307d8e6.png align="center")

* **패킷 전송과 ACK 수신**: 송신자는 **순서 번호(Sequence Number)**가 0인 **패킷(Package 0)**을 보내고, 수신자로부터 확인 응답 ACK 1을 받는다. 이를 통해 패킷 0이 성공적으로 도착했음을 알 수 있다.
    
* **패킷 손실과 재전송**: 송신자가 순서 번호 1인 **패킷(Package 1)**을 전송했으나, 네트워크 문제로 인해 패킷이 손실되었다. 송신자는 설정된 **타이머(Timer)**가 만료되면 패킷 1을 다시 전송하게 된다.
    
* **중복 패킷 처리**: 송신자가 순서 번호 0인 패킷을 다시 전송하였으나, 해당 패킷이 중복으로 도착했음을 수신자는 인지하고, 이를 **조용히 폐기(Silently Discard)**하게 된다. 이는 송신자가 이미 패킷을 받은 것으로 가정하고 처리를 완료했음을 의미한다.
    
* **타이머 설정과 재전송**: 송신자는 패킷을 보낼 때마다 타이머를 설정하고, 수신자가 응답을 보내지 않으면 해당 패킷을 다시 보내게 된다.
    

**💡예시상황:** 컴퓨터 A가 컴퓨터 B로 데이터를 전송한다고 하자.

* **전송 과정**: A는 첫 번째 데이터 조각(순서 번호 0)을 B에게 보낸다.
    
* **수신 및 ACK 응답**: B는 데이터를 수신하고 ACK 1을 A에게 보낸다.
    
* **패킷 손실**: A가 두 번째 데이터 조각(순서 번호 1)을 보냈으나, 패킷이 손실되었다.
    
* **타이머와 재전송**: A는 ACK가 도착하지 않아 타이머 만료 후 패킷 1을 다시 전송한다.
    
* **중복 패킷 처리**: 만약 A가 다시 패킷 0을 보낸다면, B가 이를 중복으로 인지하여 폐기하게 된다.
    

---

### 정지-대기 프로토콜(Stop-and-Wait Protocol)의 장단점

**<mark>💡요약: </mark>** 송신자가 하나의 패킷을 전송하고, 수신자의 확인응답(ACK)을 받을 때까지 기다리는 방식은 단순하고 구현이 쉬워 데이터의 신뢰성을 보장하는 장점이 있지만, 낮은 네트워크 효율성과 전송 속도 저하, 지연 시간 증가로 인해 대역폭이 큰 네트워크에는 적합하지 않다는 단점이 있다.

###   
장점

1. **구현이 단순함**:
    
    * 정지-대기 방식은 기본적으로 하나의 패킷을 전송하고 ACK를 기다리는 구조이므로 프로토콜의 구현이 매우 간단하다.
        
    * 이는 네트워크 초보자나 기본적인 데이터 전송 환경에서 쉽게 사용할 수 있다.
        
2. **데이터의 신뢰성 보장**:
    
    * 매번 패킷 전송 후 확인응답을 받기 때문에, 패킷 손실이나 오류가 발생할 경우 쉽게 감지할 수 있다.
        
    * 오류가 발생하면 해당 패킷을 다시 전송하므로 데이터의 신뢰성을 보장한다.
        
3. **자원 절약**:
    
    * 수신자가 한 번에 하나의 패킷만 처리하기 때문에, 수신 측에서 많은 버퍼 공간을 필요로 하지 않는다.
        

### 단점

1. **낮은 네트워크 효율성**:
    
    * 한 번에 하나의 패킷만 전송하고 ACK를 기다리기 때문에, 전송 대기 시간이 발생하여 대역폭을 효과적으로 활용하지 못하게 된다.
        
    * 특히 전송 거리가 멀거나 대역폭이 넓은 네트워크에서는 비효율적이다.
        
2. **전송 속도 저하**:
    
    * 송신자가 매번 ACK를 기다리는 동안 다른 패킷을 전송하지 못하므로, 데이터 전송 속도가 느려지게 된다.
        
    * 높은 대역폭을 가진 네트워크에서는 이 방식이 전송 속도를 충분히 활용하지 못하게 된다.
        
3. **지연 시간 증가**:
    
    * 정지-대기 프로토콜은 패킷 하나를 전송한 후 확인응답을 기다려야 하기 때문에 지연 시간이 커질 수 있다.
        
    * 특히 응답 시간이 긴 네트워크(예: 위성 네트워크)에서는 더 큰 지연이 발생한다.
        
4. **확장성이 부족함**:
    
    * 정지-대기 프로토콜은 패킷 전송량이 많아질수록 더 많은 시간이 필요하므로, 대규모 데이터 전송에는 적합하지 않는다.
        

---

### 대역폭-지연 곱(Bandwidth-Delay Product)과 **효율(Efficiency)**

**<mark>💡요약: </mark>** 정지-대기 프로토콜(Stop-and-Wait Protocol)에서 네트워크의 효율성을 측정하는 두 가지 방법인 **대역폭-지연 곱(Bandwidth-Delay Product)**과 **효율(Efficiency)**에 대해 알아보자. 이 둘은 네트워크 성능을 평가하는 중요한 지표이다. 대역폭-지연 곱은 송신자가 수신자로부터 응답을 기다리는 동안 전송할 수 있는 최대 데이터 용량을 의미하며, 효율은 네트워크가 실제로 얼마나 효과적으로 데이터 전송을 하고 있는지를 나타낸다.  

* **대역폭-지연 곱(Bandwidth-Delay Product)**
    
    * **역할**: 네트워크의 성능을 나타내는 지표로, **송신측과 수신측 사이의 왕복시간(RTT, Round Trip Time)**과 **대역폭(Bandwidth, bps)**의 곱으로 계산된다.
        
    * **설명**: 송신자가 패킷을 보낸 후, 수신자로부터 응답을 기다릴 때 전송할 수 있는 **최대 비트 수(Maximum Bits)**를 의미한다. 대역폭-지연 곱이 클수록 네트워크의 데이터 전송 용량이 커짐을 나타낸다.
        
* **효율(Efficiency)**
    
    * **역할**: 네트워크가 실제로 전송할 수 있는 **최대 데이터량에 비해 실제로 얼마나 많은 데이터를 전송하고 있는지를 나타내는 비율**이다.
        
    * **설명**: 네트워크의 최대 데이터 전송 용량과 비교하여 실제 전송된 데이터가 얼마나 효율적인지 보여주는 척도이다. 효율이 높을수록 네트워크 자원을 더 효과적으로 활용하고 있음을 의미한다.  
        

**💡예시상황:** 네트워크의 대역폭이 1Mbps이고, 송신자와 수신자 간 왕복 시간이 0.5초라면 대역폭-지연 곱을 구할 수 있다.

* **대역폭-지연 곱 계산**: 1Mbps × 0.5초 = 0.5Mb, 즉, 송신자는 수신자로부터 응답을 받기 전까지 최대 0.5Mb의 데이터를 전송할 수 있다.
    
* **효율 예시**: 네트워크가 최대 0.5Mb를 전송할 수 있지만, 실제로는 0.4Mb만 전송한다면, 효율은 0.4Mb / 0.5Mb \* 100 = 80%가 된다.
    

---

### 정지-대기 프로토콜 네트워크 효율성 계산 문제풀이

![](https://cdn.hashnode.com/res/hashnode/image/upload/v1730526106473/6eca4e35-996e-4b53-b51c-3b896c03d9ee.png align="center")

* **대역폭-지연 곱(Bandwidth-Delay Product)** 계산:
    
    * 대역폭이 1Mbps이고 왕복 시간(RTT)이 20ms인 경우, **대역폭-지연 곱**은 다음과 같이 계산된다.
        
    * **(1Mbps) × (20ms)** = **20,000 비트(20,000 bits)**.
        
    * 이는 시스템이 응답을 기다리는 동안 최대 전송할 수 있는 데이터 양을 의미한다.
        
    * 추가로 대역폭 1Mbps를 비트 단위로 표현하면 **1Mbps = 1,000,000 bps**이므로 **1×10^61** 비트/초(bps)가 된다.
        
    * 왕복 시간(RTT)은 20ms로 주어졌다. 이를 초 단위로 변환하면 20ms = 0.02초이다. 20 × 1 0^−3 초로 표현된다.
        
    * 결과 적으로 1,000,000 × 0.02초의 결과 값은 20,000이 된다.
        
* **RTT 동안 전송할 수 있는 데이터량**:
    
    * 계산된 대역폭-지연 곱에 따라, 송신자는 **20,000비트**를 왕복 시간 동안 전송할 수 있게 된다.
        
* **패킷 길이(Packet Length)**:
    
    * 시스템에서 사용되는 **패킷의 길이가 1,000비트**로 정의되어 있다. 이는 패킷 하나의 크기이다.
        
* **효율(Efficiency)** 계산:
    
    * 패킷 하나가 1,000비트이며, 왕복 시간 동안 최대 전송할 수 있는 데이터량이 20,000비트이므로 **(1,000 / 20,000) × 100 = 5%**의 효율이 나오게 된다.
        
    * 이 예제에서는 **고속 회선에서 정지-대기 프로토콜이 비효율적**임을 보여준다. 이는 왕복 시간이 짧고 대역폭이 높은 경우, 정지-대기 프로토콜로 전송할 수 있는 데이터량이 전체 용량에 비해 작기 때문이다.
        

---

![](https://cdn.hashnode.com/res/hashnode/image/upload/v1730526111956/438bebbc-7f9c-403f-bdeb-4ac0327b7915.png align="center")

위 예제는 **정지-대기 프로토콜(Stop-and-Wait Protocol)**의 방식과 다르게, **확인응답(ACK)** 없이 데이터를 연속적으로 전송할 수 있는 새로운 프로토콜을 가정하여, 네트워크 효율을 계산하는 문제이다. 최대 15개의 패킷을 왕복 시간(RTT) 동안 전송할 수 있는 상황을 가정한다.

모든 계산과정은 위의 풀이와 동일하고 패킷의 길이만 1,000 × 15 = 15,000비트가 된다.

이를 송신자가 왕복 시간 동안 전송할 수 있는 최대 데이터량인 20,000비트와 곱하면 결과는 15,000/20,000 \* 100 = 75%로 정지-대기 프로토콜보다 높은 효율을 나타내고 있다.

만약 데이터 전송 중 **패킷 오류(Packet Error)**가 발생하면 패킷을 재전송해야 하므로, 네트워크 효율이 낮아질 수 있다는 단점이 있다. 이는 확인응답이 없기 때문에 오류가 발생해도 이를 감지하지 못해 재전송이 필요할 수 있다는 문제점이다. 요약하자면 이 예제는 **연속 전송 프로토콜**을 사용해 효율을 높일 수 있지만, **패킷 오류가 발생했을 때 재전송이 필요**해질 수 있는 단점이 있음을 보여준다.

---

## **3️⃣** N-프레임-후퇴(Go-Back-N) 프로토콜

**<mark>💡요약: </mark>** 이 프로토콜은 정지-대기 프로토콜의 단점을 개선하여, 확인응답(ACK)을 받기 전에도 여러 패킷을 동시에 전송할 수 있도록 하여 네트워크의 효율을 높이는 방법이다. 송신자는 확인응답을 받지 않은 이전 패킷의 복사본을 저장하여, 전송 실패 시 모든 복사본을 재전송함으로써 신뢰성을 유지한다.  

* **효율성 개선**:
    
    * **정지-대기 프로토콜(Stop-and-Wait Protocol)**의 비효율성을 보완하기 위해 **Go-Back-N 프로토콜**이 사용된다.
        
    * 송신자는 수신자로부터 확인응답을 기다리는 동안 한 개 이상의 패킷을 전송할 수 있어 채널의 효율을 높인다.
        
* **재전송을 위한 패킷 복사본 유지**:
    
    * 송신자는 **확인응답을 받지 않은 이전까지 전송한 패킷에 대한 복사본(Copy of Transmitted Packets)**을 유지한다. 만약 전송이 실패한 경우, 송신자는 해당 복사본을 다시 전송할 수 있도록 준비한다.
        
* **프레임 전송 실패 시 재전송**:
    
    * 송신자가 패킷 전송에 실패했다고 판단하면, 저장된 복사본을 사용해 모든 패킷을 다시 전송한다.
        
    * 수신자의 동작을 단순하게 하기 위해, 송신자는 확인응답을 받지 못한 모든 패킷을 **재전송**하게 된다. 이는 네트워크 자원을 다소 낭비할 수 있지만, 신뢰성 있는 데이터 전송을 보장할 수 있다.
        

**💡예시상황:** 송신자가 패킷 1, 패킷 2, 패킷 3을 연속적으로 전송한다.

* **수신 및 ACK 응답**: 수신자가 패킷 1에 대한 ACK를 송신자에게 보낸다.
    
* **전송 실패 및 재전송**: 만약 패킷 2가 손실되었다고 가정하면, 송신자는 패킷 3의 ACK를 받지 못해 패킷 2와 패킷 3을 모두 재전송한다.
    

---

### **N-프레임-후퇴(Go-Back-N) 프로토콜**의 동작 방식

**<mark>💡요약: </mark>** 송신 윈도우(Send Window)와 **수신 윈도우(Receive Window)**를 통해 여러 개의 패킷을 연속적으로 전송할 수 있도록 한다. 송신자는 ACK를 기다리지 않고 여러 패킷을 보내고, 수신자는 순서에 맞는 패킷만 받아들인다. ACK가 도착하지 않으면 타이머가 만료되어 필요한 패킷들을 재전송한다.

![](https://cdn.hashnode.com/res/hashnode/image/upload/v1730596539596/00630f21-e903-4523-a688-41692b1cb8b3.png align="center")

* **송신 윈도우(Send Window)**
    
    * **송신 윈도우(Send Window)**는 송신자가 확인응답(ACK)을 기다리지 않고도 연속적으로 전송할 수 있는 패킷의 수를 정의다.
        
    * **S\_f**는 **첫 번째 확인 대기 중인 패킷(First Outstanding Packet)**을 나타내며, **S\_n**은 **다음에 보낼 패킷(Next to Send)**을 가리킨다.
        
    * 송신자는 송신 윈도우 내에 있는 여러 개의 패킷을 연속으로 전송할 수 있으며, 수신자로부터 ACK를 받으면 그만큼 윈도우를 이동시키며 새로운 패킷을 전송할 수 있게 된다.
        
* **수신 윈도우(Receive Window)**
    
    * **수신 윈도우(Receive Window)**는 수신자가 순서대로 도착하는 패킷만 받아들일 수 있도록 한다.
        
    * **R\_n**은 **다음으로 받아야 할 패킷(Next to Receive)**을 가리키며, 이 번호에 맞지 않는 패킷이 도착하면 해당 패킷은 무시된다.
        
    * 수신자는 순서에 맞는 패킷만 수용하므로, 잘못된 순서의 패킷이 도착했을 경우 이를 저장하지 않고 다음 올 패킷을 기다리게 된다.
        
* **타이머(Timer)**:
    
    * 송신자는 패킷을 보낼 때 타이머를 설정하여, 일정 시간 동안 ACK가 도착하지 않으면 해당 패킷과 그 이후의 모든 패킷을 다시 전송한다.
        
    * 이로 인해 네트워크에서 손실된 패킷이 있을 경우 모든 패킷을 재전송함으로써 데이터가 정확히 전달되도록 보장한다.
        

  
**💡예시상황:** 송신자가 패킷 1, 2, 3, 4를 수신자에게 연속적으로 보내는 상황이다.

* **수신 응답 및 윈도우 이동**: 수신자가 패킷 1과 2에 대해 ACK를 송신자에게 보내면, 송신 윈도우는 앞으로 이동하며 새로운 패킷(5번 패킷)을 전송할 준비를 한다.
    
* **패킷 손실 발생 시 재전송**: 만약 패킷 3이 손실되어 ACK가 오지 않으면 타이머가 만료되고, 송신자는 패킷 3부터 이후의 모든 패킷을 다시 전송한다.
    

---

**💡중간 점검:** 정지-대기 프로토콜(Stop-and-Wait Protocol)과 **Go-Back-N 프로토콜**의 큰 차이점은 무엇일까? **Go-Back-N 프로토콜**에서 **송신자의 윈도우가 커짐**으로 인해 정지-대기 프로토콜과 달리 여러 개의 패킷을 동시에 보낼 수 있게 된 것이 주요 차이점이다.

---

### 순서 번호(Sequence Number)와 확인응답번호(Acknowledgement Number)의 역할

N-프레임-후퇴(Go-Back-N) 프로토콜에서 사용하는 순서 번호(seqNo)와 확인응답 번호(ackNo)의 역할을 알아보자.

**<mark>💡요약: </mark>** 순서 번호(seqNo)는 송신 측에서 각 패킷에 번호를 부여하여 순서를 확인하는 데 사용되며, **확인응답 번호(ackNo)**는 수신 측이 송신 측에 다음으로 기다리는 패킷 번호를 알려주는 역할을 합니다. 이로 인해 송신 측은 수신자가 패킷을 정상적으로 받았는지 파악할 수 있습니다.

  
☑️ **순서 번호(seqNo)**

* **m-비트(m-bit)**를 사용하여 순서 번호를 표시한다. 이 번호는 **modulo 2^m**으로 계산되며, 순환하여 반복된다.
    
* 예를 들어, m=3일 때 2^3 = 8 이므로, 순서 번호는 0부터 7까지 순환하며 사용된다.
    
* **정지-대기 방식(Stop-and-Wait Protocol)**은 m=1 을 사용하며, N-프레임-후퇴 프로토콜에서도 동일하게 적용될 수 있다. m=1 이라면 0과 1의 순서 번호만 반복된다.
    

☑️ **확인응답 번호(ackNo)**

* **수신 측이 기다리는 패킷의 순서 번호**를 나타낸다. 이는 송신자에게 수신 측이 다음으로 어떤 패킷을 기대하는지 알려주는 역할을 한다.
    
* **확인응답 번호보다 작은 순서 번호의 패킷**은 정상적으로 수신되었음을 의미하며, 이를 통해 수신 측에서 포괄적으로 이전 패킷들이 잘 도착했음을 알리는데 이를 **포괄적 수신확인(Cumulative Acknowledgment)**이라고 한다.
    

**💡N-프레임-후퇴와 정지-대기 프로토콜의 비교**

![](https://cdn.hashnode.com/res/hashnode/image/upload/v1730599087379/3b8d0563-1654-477e-8316-2c96010e3828.png align="center")

**1\. 순서 번호(Sequence Number)**

* **정지-대기 프로토콜(Stop-and-Wait Protocol)**:
    
    * **순서 번호**는 단순히 0과 1을 번갈아 가며 사용한다.
        
    * 한 번에 하나의 패킷만 전송하고, 그 패킷에 대한 확인응답(ACK)을 받으면 다음 패킷을 전송하므로, 복잡한 순서 번호가 필요하지 않는다.
        
    * 0과 1의 **2비트만으로도 충분**하며, 이를 **모듈로 2** 방식으로 순환할 수 있다.
        
* **N-프레임-후퇴 프로토콜(Go-Back-N Protocol)**:
    
    * **순서 번호**는 여러 패킷을 동시에 관리하기 위해 더 큰 범위의 번호가 필요하다.
        
    * N개의 패킷을 한 번에 전송할 수 있기 때문에, 순서 번호의 크기는 2^m (여기서 m은 순서 번호의 비트 수)로 정해진다.
        
    * 예를 들어, 순서 번호가 3비트라면, 0부터 7까지의 순서 번호가 사용되는 것이다.
        
    * 각 패킷에는 고유한 순서 번호가 붙어서 전송되며, 확인응답을 받은 패킷을 기준으로 송신 윈도우가 이동한다.
        

**2\. 확인응답 번호(Acknowledgment Number)**

* **정지-대기 프로토콜(Stop-and-Wait Protocol)**:
    
    * **확인응답 번호(ACK)**는 전송된 패킷 하나에 대해 개별적으로 응답을 보내는 방식이다.
        
    * 송신자는 확인응답 번호가 현재 전송한 패킷의 번호와 동일한지를 확인하여 다음 패킷 전송 여부를 결정한다.
        
    * 예를 들어, 패킷 0을 보낸 후 ACK 0을 수신하면 다음 패킷(1번)을 전송하고, ACK 1을 받으면 다시 0번 패킷을 전송하는 방식이다.
        
    * 이 방식에서는 **포괄적 확인응답(Cumulative ACK)이 필요하지 않으며**, 단일 패킷에 대한 응답만 처리하면 된다.
        
* **N-프레임-후퇴 프로토콜(Go-Back-N Protocol)**:
    
    * N-프레임-후퇴 프로토콜은 **포괄적 확인응답(Cumulative ACK)** 방식을 사용한다.
        
    * 수신자는 가장 마지막으로 연속해서 잘 수신된 패킷의 순서 번호에 대해 확인응답을 보낸다.
        
    * 예를 들어, 수신자가 패킷 0, 1, 2를 차례대로 잘 받았다면 ACK 3을 송신하여 송신자가 패킷 0, 1, 2까지 잘 수신되었음을 알리고, 송신자는 그 다음 패킷부터 전송을 시작할 수 있다.
        
    * 만약 중간에 패킷이 손실되거나 오류가 발생하면, 해당 패킷 이후의 모든 패킷을 다시 전송해야 한다.
        
    * 이러한 포괄적 확인응답 방식 덕분에 N-프레임-후퇴 프로토콜은 다수의 패킷을 동시에 관리할 수 있지만, 손실된 패킷 이후의 모든 패킷을 다시 보내야 하는 단점이 있다.
        

---

### Go-Back-N 프로토콜의 송신 윈도우의 #1 - 개념

**<mark>💡요약: </mark>** 송신 윈도우(Send Window)는 **첫 번째 미응답 패킷 번호(S\_f)**와 **다음 전송할 패킷 번호(S\_n)**로 구성되며, 윈도우의 크기(S\_size)는 최대 전송할 수 있는 패킷 수를 결정한다. 송신자는 확인응답을 받으면 윈도우를 이동시켜 추가 패킷을 전송할 수 있다.

![](https://cdn.hashnode.com/res/hashnode/image/upload/v1730600173800/89e79604-faef-47d4-b3b7-8564a68e5387.png align="center")

**송신 윈도우의 첫 번째 미응답 패킷 번호(S\_f)**:

* 송신 윈도우에서 **아직 확인응답(ACK)을 받지 못한 첫 번째 패킷 번호**를 의미한다.
    
* 이 번호부터 송신자는 순차적으로 확인응답을 기다리며, 확인응답이 도착하지 않으면 재전송을 고려하게 된다.
    

* **다음 전송할 패킷 번호(S\_n)**:
    
    * **송신 윈도우에서 다음으로 보낼 패킷 번호**를 나타낸다.
        
    * 송신자는 송신 윈도우 내에서 Sf 부터 S\_n​까지의 패킷을 전송할 수 있으며, 송신 윈도우의 크기만큼 전송 범위를 유지한다.
        
* **송신 윈도우의 크기(S\_size)**:
    
    ![](https://cdn.hashnode.com/res/hashnode/image/upload/v1730605607777/c97f38bf-8ee8-4980-accf-311b5a99eb0d.png align="center")
    
    * 송신 윈도우의 크기는 **2^m−1** 로 정의된다. 여기서 m은 순서 번호에 사용되는 비트 수를 의미한다.
        
    * 예를 들어, m=3 이면 S size = 2^3 − 1 = 7 이 되며, 송신자는 한 번에 최대 7개의 패킷을 전송할 수 있게 된다.
        
* **윈도우 이동**:
    
    * 송신자가 **S\_f​와 S\_n​ 사이의 패킷에 대한 확인응답을 받으면**, 송신 윈도우는 앞으로 이동한다.
        
    * 윈도우가 이동함으로써 송신자는 새로운 패킷을 추가로 전송할 수 있게 된다.
        

**💡예시상황:** 송신자는 송신 윈도우 크기가 4인 상태에서 패킷 0, 1, 2, 3을 전송합니다.

* **수신 응답(ACK)**: 수신자는 패킷 0과 1에 대한 확인응답(ACK)을 송신자에게 보낸다.
    
* **윈도우 이동**: 송신자가 ACK 0과 1을 받으면, 송신 윈도우가 앞으로 이동하여 패킷 4, 5를 추가로 전송할 수 있게 된다.
    

---

### Go-Back-N 프로토콜의 송신 윈도우 #2 - 구조

![](https://cdn.hashnode.com/res/hashnode/image/upload/v1730600341670/ea5df093-23f6-4ff7-b7c4-fbff4d2bffc0.png align="center")

* **S\_f (First Outstanding)**:
    
    * **S\_f**는 **첫 번째 미응답 패킷 번호(First Outstanding Packet)**를 나타낸다. 송신자는 이 번호부터 확인응답(ACK)을 기다리고 있게 된다.
        
    * 송신자가 이미 전송했지만 아직 확인응답을 받지 못한 패킷들이 이 지점부터 시작됩니다. 이 패킷들은 **Outstanding (sent, but not acknowledged)** 상태이다.
        
* **S\_n (Next to Send)**:
    
    * **S\_n**은 **다음 전송할 패킷 번호(Next to Send)**를 나타낸다. 송신자는 이 번호에 해당하는 패킷을 다음으로 보낼 준비가 되어 있다.
        
    * 송신 윈도우 내에서는 **Can be sent when accepted from process**로 표시된 범위의 패킷들이 전송될 수 있다. 이는 송신 프로세스에서 데이터를 받아 패킷을 만들어 전송 가능한 상태를 의미한다.
        
* **윈도우 크기(S\_size)**:
    
    * **송신 윈도우 크기(S\_size)**는 송신자가 동시에 관리할 수 있는 패킷의 수를 의미한다.
        
    * 윈도우 크기 내에서 송신자는 여러 개의 패킷을 연속적으로 전송할 수 있으며, 수신자로부터 확인응답이 도착할 때마다 윈도우가 앞으로 이동하게 된다.
        
* **패킷 상태 설명**:
    
    * **Sent, acknowledged, and purged**: 이미 전송되고 확인응답을 받아 더 이상 송신자가 관리할 필요가 없는 패킷
        
    * **Outstanding**: 전송은 되었지만 아직 수신자로부터 확인응답을 받지 못한 패킷
        
    * **Can be sent when accepted from process**: 송신 프로세스가 데이터를 보내는 즉시 전송 가능한 패킷
        
    * **Cannot be accepted from process**: 현재 윈도우 크기 밖에 있어 전송할 수 없는 상태. 수신자로부터 ACK가 도착해 윈도우가 이동해야 전송할 수 있다.
        

---

### Go-Back-N 프로토콜의 송신 윈도우 #3 - 이동 과정 (Sliding of the Send Window)

![](https://cdn.hashnode.com/res/hashnode/image/upload/v1730600560625/d257ca6d-5307-4c1c-8e9f-6658582c37e6.png align="center")

* **첫 번째 미응답 패킷 번호(S\_f)**:
    
    * **S\_f**는 **First Outstanding Packet**을 의미하며, 송신자가 아직 확인응답(ACK)을 받지 못한 첫 번째 패킷을 나타낸다. 이 번호부터 송신자는 ACK를 기다리며, 윈도우 내의 다른 패킷을 계속 전송할 수 있다.
        
* **다음 전송할 패킷 번호(S\_n)**:
    
    * **S\_n**은 **Next to Send**로, 다음에 전송할 패킷 번호를 가리킨다.
        
    * 송신 윈도우 내에서 송신자는 S\_n이후에 있는 패킷도 전송할 수 있다. 이 예시에서는 확인응답을 기다리는 동안에도 최대 윈도우 크기만큼의 패킷을 준비하고 전송할 수 있게 된다.
        
* **윈도우 이동 과정(Window Sliding)**:
    
    * a 단계에서는 S\_f가 4를 가리키고 S\_n이 0을 가리키며, 4~0 범위 내의 패킷들이 송신 윈도우에 포함되어 있다.
        
    * b 단계에서는 **확인응답 번호 6(ACK 6)**이 도착하여 윈도우가 이동한다. S\_f가 6으로 이동하면서 새로운 패킷이 윈도우에 포함된다.
        
    * 이로 인해 송신자는 7부터 추가 패킷을 전송할 준비가 된다.
        

  
**💡예시상황:** 송신자가 패킷 4, 5, 6을 전송하고, 4번 패킷에 대한 확인응답을 기다리는 상태

* **수신 응답(ACK)**: 수신자로부터 ACK 6이 도착하여, 4번, 5번, 6번 패킷이 성공적으로 수신되었음을 알린다.
    
* **윈도우 이동**: 송신 윈도우가 앞으로 이동하면서 송신자는 패킷 7부터 새로운 패킷을 전송할 준비가 된다.
    

---

### Go-Back-N 프로토콜의 송신 윈도우 #4 - 크기

**<mark>💡요약: </mark> Go-Back-N 송신 윈도우의 크기**는 2^m-1 보다 작거나 같아야 하며, **수신 윈도우의 크기는 항상 1이다.**  

* **송신 윈도우의 크기**:
    
    * 송신 윈도우의 크기는 순서 번호의 크기에 따라 결정된다.
        
    * **순서 번호가 m 비트**일 때, **송신 윈도우의 크기는** 2^m-1 **보다 작거나 같아야** 한다. 이렇게 해야 데이터의 흐름을 효율적으로 관리하고, 데이터의 중복이나 오류를 줄일 수 있게된다.
        
* **수신 윈도우의 크기**:
    
    * **수신 윈도우(Receive Window)**의 크기는 항상 1이다.
        
    * 이는 수신자가 한 번에 하나의 패킷만 처리할 수 있음을 의미한다. 따라서, 송신자는 수신자가 확인응답(ACK)을 보낼 때까지 기다렸다가 다음 패킷을 전송한다.  
        

**💡예시상황:** 순서 번호가 3비트로 표현된다면(즉, m=3), **modulo 2^m에 의해** 가능한 순서 번호는 0부터 7까지 총 8개가 된다.

* **윈도우 크기 설정**:
    
    * 송신 윈도우 크기는 2^{3-1} = 4로 설정할 수 있다. 따라서 송신자는 한 번에 4개의 패킷을 전송할 수 있게된다.
        
* **수신 동작**:
    
    * 수신자는 송신자가 보낸 패킷을 하나씩 받고, ACK를 송신자에게 보낸다. 송신자는 ACK를 받은 후 다음 패킷을 전송한다.
        

**💡 송신 윈도우 크기 비교**

![](https://cdn.hashnode.com/res/hashnode/image/upload/v1730602012614/51ac0e70-a5d9-4c79-892d-9186d56927ba.png align="center")

* **정지-대기 프로토콜**의 송신 윈도우 크기는 **1**이므로, 매번 한 패킷을 전송한 후 ACK를 기다려야 한다.
    
* **N-프레임-후퇴 프로토콜**은 송신 윈도우 크기가 **2^m−1이하**로 설정되어, 여러 패킷을 동시에 전송할 수 있다.
    

---

### Go-Back-N 프로토콜의 송신 윈도우 #5 - 크기가 네트워크 통신에 미치는 영향

**<mark>💡요약:</mark>**두 가지 경우를 비교하고 있으며, 송신 윈도우 크기가 2^m−1 과 2^m 일 때의 차이점을 보여준다. **송신 윈도우 크기**가 **2^m - 1**일 때는 중복된 패킷을 올바르게 폐기할 수 있지만, **2^m**일 경우에는 중복된 패킷이 새로운 데이터로 잘못 인식될 수 있다. 따라서, **N-프레임-후퇴(Go-Back-N) 프로토콜**에서 송신 윈도우 크기는 **2^m - 1**로 설정하는 것이 데이터의 신뢰성을 유지하는 데 더 적합하다.

![](https://cdn.hashnode.com/res/hashnode/image/upload/v1730602070280/e4589015-4700-4c09-b8e3-e1c7c007dd1a.png align="center")

* **송신 윈도우 크기 &lt; 2^m** (왼쪽 그림):
    
    * 여기서는 송신 윈도우 크기가 2^m−1인 경우.
        
    * 송신자가 패킷 0, 1, 2, 3을 연속으로 전송하고, 수신자가 순서대로 ACK 응답을 보낸다.
        
    * 만약 **패킷 0**이 손실되어 재전송될 경우, 수신자는 이미 받은 패킷을 중복으로 인식하고 **올바르게 폐기(Correctly Discarded)**한다.
        
    * 이 방식에서는 중복된 패킷을 식별하고 버릴 수 있어 데이터의 신뢰성을 유지할 수 있다.
        
* **송신 윈도우 크기 = 2^m** (오른쪽 그림):
    
    * 이 경우 송신 윈도우 크기가 2^m이다.
        
    * 송신자가 패킷 0, 1, 2, 3을 전송하고, 수신자는 ACK 응답을 보낸다. 만약 패킷 0이 손실되면 재전송된다.
        
    * 그러나, 수신 윈도우 크기가 1이므로 수신자는 재전송된 패킷 0을 **새로운 데이터로 잘못 받아들임(Erroneously Accepted)**. 이로 인해 데이터가 중복되거나 잘못 처리될 수 있다.
        
    * 이 방식은 데이터의 중복 수신을 유발할 수 있어 신뢰성에 문제가 생긴다.  
        

**💡예시상황:** 송신자가 패킷 0, 1, 2, 3을 전송하고, 수신자는 이를 차례대로 받는다.

* **패킷 손실 및 재전송**: 패킷 0이 손실되어 송신자가 타이머가 만료되면 다시 패킷 0을 전송한다.
    
* **수신 측 처리**:
    
    * 송신 윈도우 크기가 2^m - 1인 경우, 수신자는 패킷 0이 이미 받은 데이터임을 인식하고 이를 폐기한다.
        
    * 송신 윈도우 크기가 2^m인 경우, 수신자는 패킷 0을 새로운 데이터로 잘못 받아들일 수 있다.
        

---

### Go-Back-N 프로토콜의 수신 윈도우

**<mark>💡요약: </mark>** 수신 윈도우는 송신 윈도우와 다르게 크기가 1로 고정되어 있으며, 수신자가 올바른 순서의 패킷을 받으면 윈도우가 한 칸씩 이동하여 다음 패킷을 기다리게 된다.

![](https://cdn.hashnode.com/res/hashnode/image/upload/v1730602439985/f42ae083-0d94-4d87-88ef-d658edc4a8ff.png align="center")

* **R\_n (Next Expected)**:
    
    * **R\_n**은 수신자가 **다음에 수신할 것으로 기대하는 패킷 번호(Next Expected Packet)**
        
    * 수신자는 이 번호에 해당하는 패킷이 도착해야 다음 단계로 진행할 수 있다.
        
* **수신 윈도우의 크기(R\_size)**:
    
    * 수신 윈도우의 크기는 항상 **1**로 고정되어 있다.
        
    * 이는 수신자가 항상 순서대로 패킷을 수신해야 하며, 하나의 패킷이 도착한 후에야 다음 패킷을 받을 준비가 된다는 의미이다.
        
* **윈도우 이동**:
    
    * 수신자가 올바른 순서의 패킷을 받으면 수신 윈도우가 한 슬롯씩 앞으로 이동한다.
        
    * 예를 들어, 수신자가 패킷 5를 수신한 후에는 **R\_n**이 6으로 이동하며, 이제 6번 패킷을 기다리게 된다.  
        

**💡예시상황:** 송신자가 패킷 5, 6, 7을 전송하고 있다.

* **수신 응답(ACK)**: 수신자는 패킷 5를 수신하고, R\_n이 6으로 이동하여 6번 패킷을 기다리게 된다.
    
* **다음 패킷 수신**: 수신자가 패킷 6을 수신하면, 다시 윈도우가 이동하여 7번 패킷을 기다리게 된다.
    

---

## **4️⃣** 선택적 반복 (Selective Repeat) 프로토콜

**<mark>💡요약: </mark> 선택적 반복(Selective Repeat) 프로토콜**은 **전송 실패한 패킷만 재전송**하여 효율을 높이는 방식이다. 송신자는 송신 윈도우(Send Window)를 통해 여러 패킷을 전송하며, 실패한 패킷에 대해서만 다시 전송한다. 이는 **N-프레임-후퇴 프로토콜**보다 효율적이며, 특히 오류가 자주 발생하는 환경에서 유리하다.

* 이 프로토콜은 **전송에 실패한 패킷만 재전송**하는 방식으로, **N-프레임-후퇴 프로토콜**의 비효율성을 줄일 수 있다.
    
* **오류가 자주 발생하는 환경**에서도 유리하게 작동한다. 왜냐하면, 실패한 패킷만 재전송하기 때문에, 이미 전송된 패킷을 반복적으로 보내지 않아도 되기 때문이다.
    

* **송신 윈도우(Send Window)**:
    
    * **S\_f**: **첫 번째 미응답 패킷 번호(First Outstanding Packet)**를 나타낸다. 송신자는 이 번호부터 시작하여 ACK를 기다리고 있는다.
        
    * **S\_n**: **다음 전송할 패킷 번호(Next to Send)**를 의미하며, 송신자가 전송할 준비가 된 패킷의 번호이다.
        
    * **S\_size**: **송신 윈도우 크기(Send Window Size)**는 2^(m-1)로 설정된다. 여기서 m은 순서 번호에 필요한 비트 수를 의미한다.
        
* **윈도우 이동**:
    
    * 송신자는 **S\_f**에 대한 확인응답(ACK)을 받으면 송신 윈도우가 앞으로 이동하게 된다. 이를 통해 새로운 패킷을 전송할 수 있는 공간이 생긴다.
        

**💡예시상황:** 송신자가 패킷 0, 1, 2, 3을 전송했는데, 패킷 1이 손실되었다.

* **수신자 응답(ACK)**: 수신자는 패킷 0과 패킷 2, 3을 정상적으로 수신하고 각각의 ACK를 송신자에게 보낸다.
    
* **재전송**: 송신자는 패킷 1에 대한 응답이 없으므로, **패킷 1만 다시 전송**한다.
    
* **정상 수신**: 수신자가 패킷 1을 받으면, 선택적 반복 프로토콜을 통해 모든 패킷이 정상적으로 전달된다.
    

---

### **선택적 반복 (Selective Repeat) 프로토콜** #1 - 동작 방식

![](https://cdn.hashnode.com/res/hashnode/image/upload/v1730603138240/98c62414-2ec3-4d07-be42-0f23eef69106.png align="center")

* **송신 윈도우(Send Window)**:
    
    * **S\_f (First Outstanding)**: 송신 윈도우에서 확인응답(ACK)을 받지 못한 첫 번째 패킷을 가리킨다.
        
    * **S\_n (Next to Send)**: 송신 윈도우에서 다음에 보낼 패킷 번호를 나타낸다.
        
    * 송신자는 윈도우 내에서 여러 패킷을 전송할 수 있으며, 확인되지 않은 패킷을 관리한다. 확인받지 못한 패킷은 주황색, 순서가 어긋나게 확인된 패킷은 노란색으로 표시된다.
        
* **수신 윈도우(Receive Window)**:
    
    * **R\_n (Next to Receive)**: 수신 윈도우에서 다음으로 수신할 것으로 예상하는 패킷번호이다.
        
    * 선택적 반복 프로토콜에서는 수신자가 패킷을 순서대로 받을 필요는 없으며, 윈도우 내에서 받은 패킷을 따로 저장하고 관리한다. 이는 불완전한 순서로 도착한 패킷(노란색)이라도 보관하여, 나중에 제대로 전달될 수 있도록 준비한다.
        
* **타이머(Timer)**:
    
    * 송신자는 각 패킷 전송 시 타이머를 설정하고, 지정한 시간 내에 확인을 받지 못하면 해당 패킷만 다시 전송한다. 이를 통해 오류가 발생한 패킷만 선택적으로 다시 보낼 수 있게된다.
        

---

### **선택적 반복 (Selective Repeat) 프로토콜** #2 - 송신 윈도우의 구조

**<mark>💡요약: </mark>** 선택적 반복 프로토콜(Selective Repeat Protocol)은 **송신 윈도우(Send Window)**를 통해 여러 패킷을 동시에 전송하고, 오류가 발생한 패킷만 선택적으로 재전송한다. 송신자는 각 패킷의 상태를 관리하면서 확인응답이 도착하면 윈도우를 이동시켜 새로운 패킷을 전송할 수 있게 된다.

![](https://cdn.hashnode.com/res/hashnode/image/upload/v1730603464276/38f211c6-6555-49b1-a107-177f992d3e5e.png align="center")

* **S\_f (First Outstanding)**:
    
    * **S\_f**는 송신 윈도우에서 아직 **확인응답(ACK)을 받지 못한 첫 번째 패킷 번호**이다.
        
    * 이 패킷부터 송신자는 ACK를 기다리며, 확인되지 않은 상태에서 윈도우 내 다른 패킷들을 계속 전송할 수 있다.
        
* **S\_n (Next to Send)**:
    
    * **S\_n**은 **다음에 전송할 패킷 번호(Next to Send)**를 나타낸다.
        
    * 송신자는 S\_n이 가리키는 번호의 패킷을 전송할 준비가 되어 있으며, 송신 윈도우 내에서 여러 개의 패킷을 동시에 전송할 수 있다.
        
* **송신 윈도우 크기(S\_size)**:
    
    * **S\_size**는 송신 윈도우의 크기를 나타내며, 일반적으로 2^{m-1}로 설정된다. 여기서 m은 순서 번호에 필요한 비트 수를 의미한다.
        
* **패킷 상태 설명**:
    
    * **Packets already acknowledged**: 이미 전송되었고 수신자로부터 확인응답을 받은 패킷
        
    * **Outstanding packets, some acknowledged**: 전송되었으나 확인되지 않은 패킷들이다. 일부는 확인을 받았지만, 모두 완료되지 않은 상태이다. 주황색은 확인되지 않은 패킷, 노란색은 순서대로 도착하지 않은 패킷이다.
        
    * **Packets that can be sent**: 윈도우 내에서 송신자가 전송할 수 있는 패킷이다.
        
    * **Packets that cannot be sent**: 현재 송신 윈도우 크기를 벗어나 아직 전송할 수 없는 상태이다.
        

---

### **선택적 반복 (Selective Repeat) 프로토콜** #3 - 윈도우 크기

**<mark>💡요약: </mark> 송신 및 수신 윈도우의 크기**는 순서 번호 비트 수에 따라 결정된다. 송신 및 수신 윈도우 크기는 2^m-1보다 작거나 같아야 한다.

  
**송신 윈도우의 크기**:

![](https://cdn.hashnode.com/res/hashnode/image/upload/v1730605713087/eb1953cf-4b2c-409e-88b5-72f506da34e2.png align="center")

* **송신 윈도우의 크기**는 2^m-1보다 작거나 같아야 한다. 여기서 m은 **순서 번호의 비트 수(Number of Bits in Sequence Number)**를 의미한다.
    
* 예를 들어, 순서 번호가 3비트(m=3)로 표현된다면, 송신 윈도우의 크기는 2^3−1 = 4 이하로 설정되어야 한다.
    

**수신 윈도우의 크기**:

* **수신 윈도우의 크기**도 송신 윈도우와 동일한 크기를 가져야 한다.
    
* 이는 송신자와 수신자가 같은 범위 내에서 패킷을 주고받아 데이터의 일관성을 유지할 수 있도록 한다는 뜻이다.
    

**순서번호의 절반 이하**:

* 순서 번호의 범위는2^m이므로, **윈도우 크기는 이 범위의 절반 이하**로 설정해야 한다.
    
* 이는 순서 번호가 반복될 때 발생할 수 있는 중복 문제를 방지하고, 데이터가 순서대로 정확하게 수신되도록 한다.
    

  
**💡예시상황:** 순서 번호가 3비트로 표현된다면, 순서 번호 범위는 0에서 7까지 총 8개의 값이된다. (2³ = 8)

* **윈도우 크기 설정**: 이 경우, 송신 및 수신 윈도우의 크기는 2^(3-1) 4로 설정된다.
    
* **데이터 전송**: 송신자는 최대 4개의 패킷을 동시에 전송할 수 있으며, 수신자는 이 범위 내에서 순서에 맞게 데이터를 수신하고 재조립할 수 있다.
    

---

### **선택적 반복 (Selective Repeat) 프로토콜** #4 - 윈도우 크기

**<mark>💡요약: </mark> 송신 윈도우와 수신 윈도우의 크기**가 서로 다른 두 경우를 비교함으로써 윈도우 크기를 적절히 설정하는 것이 데이터 전송의 신뢰성에 얼마나 중요한지를 알아보자

![](https://cdn.hashnode.com/res/hashnode/image/upload/v1730604580146/109d2d23-1682-483f-b7a8-1b2129a9a0a4.png align="center")

1. **윈도우 크기 = 2m−1**(왼쪽 그림 a):
    
    * 이 경우 송신 윈도우와 수신 윈도우의 크기가 2^{m-1}로 설정되어 있다. 예를 들어, **순서 번호가 2비트(m=2)**라면, 윈도우 크기는 2^{2-1} = 2 이다.
        
    * 송신자가 패킷을 전송하고, 수신자는 올바르게 확인 응답(ACK)을 보냅니다.
        
    * **중복된 패킷(패킷 0)**이 재전송되었을 때, 수신자는 이를 중복으로 인식하고 **올바르게 폐기(Correctly Discarded)**한다.
        
    * 이 설정은 데이터가 중복되거나 잘못 처리되는 것을 방지한다.
        
2. **윈도우 크기 &gt; 2m−1** (오른쪽 그림 b):
    
    * 이 경우 송신 윈도우와 수신 윈도우의 크기가 2^{m-1}보다 경우이다. 이는 선택적 반복 프로토콜에서 권장하지 않는 설정이다.
        
    * 패킷이 중복되어 수신자에게 도착했을 때, 수신자는 이를 새로운 데이터로 **잘못 받아들여 저장(Erroneously accepted and stored as new data)**하게 된다.
        
    * 이로 인해 데이터가 중복되거나 잘못된 순서로 저장될 수 있으며, 데이터 전송의 신뢰성에 문제가 생긴다.
        

**💡예시상황:** 순서 번호가 2비트로 표현되어, 가능한 번호는 0, 1, 2, 3이다.

* **윈도우 크기 설정**:
    
    * **왼쪽 상황**: 윈도우 크기를 2^{2-1} = 2로 설정하여, 송신자와 수신자는 중복 패킷을 올바르게 폐기할 수 있다.
        
    * **오른쪽 상황**: 윈도우 크기가 3으로 설정되어, 중복된 패킷을 새로운 데이터로 오인하여 잘못 처리하게 된다.
        

---

### **선택적 반복 (Selective Repeat) 프로토콜** #5 - 수신 윈도우

**<mark>💡요약: </mark> 선택적 반복(Selective Repeat) 프로토콜**에서 **수신 윈도우(Receive Window)**는 **순서에 맞지 않는 패킷을 임시 저장**하여 나중에 올바른 순서로 데이터를 응용 계층에 전달하는 기능을 제공한다. 이는 패킷이 순서에 맞지 않게 도착해도 데이터의 일관성을 유지할 수 있도록 한다.  

* **R\_n (Next Expected Packet)**:
    
    * **R\_n**은 **수신자가 다음으로 기대하는 패킷 번호(Next Expected Packet)**를 의미한다. 수신자는 이 번호의 패킷이 도착할 때까지 대기하며, 이 번호에 맞는 패킷이 도착하면 해당 패킷을 처리할 준비가 된다.
        
* **R\_size (Receive Window Size)**:
    
    * **R\_size**는 수신 윈도우의 크기를 의미하며, **2^(m-1)**로 설정된다. 여기서 m은 순서 번호를 나타내는 비트 수이다.
        
    * 이 크기만큼의 패킷을 수신 윈도우에서 관리할 수 있으며, 수신자는 순서에 맞지 않는 패킷을 버리지 않고 임시로 저장한다.
        
* **도착 순서 관리**:
    
    * 수신자가 패킷을 수신했을 때, 도착 순서에 맞지 않는 패킷이라도 **내부 버퍼**에 임시 저장한다.
        
    * 이렇게 저장된 패킷들은 올바른 순서대로 정렬하여 응용 계층으로 전달되므로 데이터의 순서가 유지되게 된다.
        
    * 만약 먼저 도착한 패킷이 있다면, 순서에 맞는 패킷이 도착할 때까지 기다렸다가 모든 패킷을 순서대로 응용 계층으로 전달한다.  
        

**💡예시상황:** 송신자가 패킷 0, 1, 2, 3을 보냈고, 패킷 1이 손실되었다.

* **수신자 버퍼링**: 수신자는 패킷 0과 2, 3을 받지만, 패킷 1이 없기 때문에 버퍼에 임시 저장한다.
    
* **재전송**: 송신자가 패킷 1을 재전송하고, 수신자는 이를 받으면 모든 패킷이 순서에 맞춰진다.
    
* **정렬 및 전달**: 수신자는 버퍼에 저장된 패킷들을 순서대로 응용 계층에 전달한다.
    

---

### Go-Back-N 과 Selective Repeat의 차이점 #1 - 구현

**<mark>💡요약: </mark>** 두 프로토콜 모두 네트워크에서 데이터 전송의 신뢰성을 보장하기 위해 사용되지만, **오류 처리와 패킷 관리 방식**에서 차이가 있다. **N-프레임-후퇴(Go-Back-N) 방식**은 하나의 타이머와 포괄적 수신 확인을 통해 단순하게 구현되지만, 재전송 시 여러 패킷을 중복 전송해야 하는 번거로움이 있다. 반면에, **선택적 반복(Selective Repeat) 방식**은 각 패킷에 타이머를 설정하고 순서대로 패킷을 재정렬하여 필요한 패킷만 재전송할 수 있지만, 구현이 더 복잡해진다.

  
**구현의 복잡성(Implementation Complexity)**:

* **선택적 반복(Selective Repeat) 프로토콜**은 수신 측에서 **순서번호대로 패킷을 재정렬**하는 기능이 필요하다다. 이는 패킷이 순서대로 도착하지 않을 때 이를 저장하고 재정렬하는 작업이 필요하기 때문에, Go-Back-N 방식보다 구현이 더 복잡해지게 된다.
    

* **타이머 관리(Timer Management)**:
    
    * **N-프레임-후퇴 방식(Go-Back-N)**에서는 송신 측에서 하나의 타이머만 사용하여 재전송 여부를 판단한다. 만약 타이머가 만료되면 그 시점에서 재전송을 시작한다.
        
    * 반면, **선택적 반복(Selective Repeat)** 방식에서는 **각 패킷별로 타이머를 설정**해야 한다. 이렇게 패킷별로 타이머를 관리하는 것은 더 복잡하지만, 필요한 패킷만 재전송할 수 있어 효율적이다.  
        

**확인응답번호의 의미(Acknowledgment Number)**:

* **N-프레임-후퇴 방식**에서는 확인응답번호(ACK)가 **포괄적 수신 확인(Cumulative Acknowledgment)**의 의미를 갖는다. 즉, 특정 번호 이하의 모든 패킷이 수신되었음을 의미한다.
    
* **선택적 반복 방식**에서는 확인응답번호가 특정 패킷 하나에 대한 확인을 의미하며, 순서대로 오류 없이 수신된 패킷의 순서번호를 표시한다. 이 방식은 순서가 어긋난 패킷을 개별적으로 관리할 수 있게 한다.
    

**💡재정렬 작업의 복잡성**

**네트워크에서 순서대로 도착하지 않은 패킷을 재정렬하는 것은 단순한 작업이 아니다.** 수신자는 도착한 패킷을 임시로 저장하고, 예상된 순서대로 모든 패킷이 도착할 때까지 기다리면서 재정렬해야 한다. 특히, 패킷 손실이 빈번하거나 도착 순서가 많이 어긋나는 경우 재정렬 작업이 복잡해질 수 있다.  

**💡예시상황: 송신자가 패킷 0, 1, 2, 3을 전송했지만, 패킷 1이 손실된 상황**

1. **Go-Back-N 방식**: 송신자는 패킷 1에 대한 응답을 받지 못하면 패킷 1부터 다시 전송
    
2. **선택적 반복 방식**: 송신자는 패킷 1에 대한 응답만 받지 못하므로, 패킷 1만 다시 전송
    

---

### Go-Back-N 과 Selective Repeat의 차이점 #2 - 주요차이점

**<mark>💡요약: </mark>** 이 두 가지 프로토콜은 데이터 통신에서 패킷의 전송 및 오류 제어를 관리하는 방식으로, 각기 다른 방식으로 데이터의 신뢰성을 보장한다. 각각의 장단점이 있어 실제 네트워크 환경에서는 필요에 따라 이들 중 하나를 선택하거나 두 가지 방식을 혼합하여 사용하는 경우도 있다. **Go-Back-N 프로토콜**은 간단한 구현과 적은 메모리 사용이 장점이지만, 패킷 손실 시 여러 패킷을 재전송해야 한다. **선택적 반복 프로토콜**은 손실된 패킷만 재전송해 효율적이지만, 구현이 더 복잡하고 버퍼 사용량이 크다.

* **슬라이딩 윈도우(Sliding Window)**:
    
    * **Go-Back-N**: 송신측만 윈도우를 가지고 있으며, 수신측은 버퍼가 하나만 필요합니다. 따라서 간단하게 구현할 수 있다.
        
    * **선택적 반복(Selective Repeat)**: 송신측과 수신측 모두 동일한 크기의 윈도우 버퍼를 갖는다. 이를 통해 수신측은 순서가 뒤섞여 도착한 패킷도 임시로 저장할 수 있다.
        
* **수신확인(Acknowledgment)**:
    
    * **Go-Back-N**: 포괄적 수신 확인(Cumulative Acknowledgment)을 사용한다. 이는 특정 패킷 번호 이하의 모든 패킷이 제대로 수신되었음을 나타낸다.
        
    * **선택적 반복(Selective Repeat)**: 각 패킷에 대해 개별적인 수신 확인을 한다. 따라서 특정 패킷만 누락되었을 때도 그 패킷만 다시 전송하면 된다.
        
* **재요청 방식(Retransmission)**:
    
    * **Go-Back-N**: 오류가 발생하거나 패킷이 유실되면 그 이후의 모든 패킷을 다시 전송한다. 타임아웃이 발생하면 자동으로 재전송된다.
        
    * **선택적 반복(Selective Repeat)**: 오류가 발생한 특정 패킷만 재전송한다. 불필요한 데이터 전송이 줄어들어 효율적이다.
        
* **프레임 수신 방법(Frame Reception)**:
    
    * **Go-Back-N**: 송신 순서와 수신 순서가 동일해야 하다.
        
    * **선택적 반복(Selective Repeat)**: 수신 윈도우 내에서 순서와 상관없이 도착한 패킷들을 수신할 수 있다.
        
* **상위 계층으로 전달**:
    
    * **Go-Back-N**: 수신된 패킷을 하나씩 순서대로 상위 계층으로 전달한다.
        
    * **선택적 반복(Selective Repeat)**: 윈도우 크기만큼 도착한 패킷을 순서와 상관없이 상위 계층으로 전달할 수 있다.
        
* **장단점**:
    
    * **Go-Back-N**: 구현이 간단하고 수신측에서 적은 버퍼를 사용하지만, 많은 대역폭을 소비할 수 있다.
        
    * **선택적 반복(Selective Repeat)**: 구현이 복잡하고 많은 버퍼를 사용하지만, 재전송으로 인한 대역폭 소비가 적다.
        

**💡예시상황:** 송신자가 패킷 0, 1, 2, 3을 전송한다.

* **Go-Back-N 방식**: 패킷 1이 손실되면, 수신측은 패킷 2와 3도 버리고, 송신자는 1번 패킷부터 다시 전송한다.
    
* **선택적 반복 방식**: 패킷 1이 손실되면, 수신측은 패킷 2와 3을 버퍼에 저장하고, 송신자는 패킷 1만 재전송한다.
    

---

## **5️⃣** 피기배킹(Piggy-backing)

**<mark>💡요약: </mark>** 피기백킹은 네트워크에서 데이터를 양방향으로 교환할 때, 송신 데이터와 수신 데이터에 대한 **확인응답(ACK)** 정보를 함께 묶어 보내는 데이터 통신 기술이다. 이를 통해 불필요한 패킷 전송을 줄일 수 있게 된다.

  
**양방향 패킷 교환**:

* 일반적으로 데이터 패킷은 양방향으로 교환된다. 즉, 송신측과 수신측 모두 데이터를 보내고 받는다.
    
* 따라서, **확인응답(ACK)**도 양방향으로 교환되어야 한다. 데이터를 주고받을 때마다 따로 ACK 패킷을 보내는 것은 비효율적이기 때문이다.
    

**효율성**:

* 확인응답을 별도의 패킷으로 전송하면 네트워크 자원이 낭비된다. 매번 데이터를 보낼 때마다 ACK 패킷을 따로 보내면 대역폭을 더 많이 사용하게 된다.
    
* 피기백킹을 사용하면, **송신 데이터와 함께 수신 데이터에 대한 확인응답 정보도 같이 전달**할 수 있다. 이렇게 하면 ACK를 따로 보내지 않아도 되므로 네트워크 효율이 높아진다.
    

**피기백킹의 정의**:

* **피기백킹(Piggy-backing)**은 송신하는 데이터에 수신 데이터에 대한 ACK 정보를 포함시켜 한 번에 보내는 방식이다.
    
* 이는 데이터 통신에서 효율성을 극대화하기 위한 전략이다. 즉, 데이터를 보내는 동시에 그 데이터에 대한 응답을 전달하는 방식으로, 네트워크의 자원을 절약할 수 있다.  
    

**💡예시상황:** A와 B가 서로 데이터를 주고받고 있으며, A는 B에게 패킷을 전송하고 확인응답(ACK)을 기다리는 상황이다.

* **피기백킹 사용 전**: A와 B는 각각 데이터 패킷과 ACK 패킷을 따로 보낸다.
    
* **피기백킹 사용 후**: A가 B에게 데이터를 보낼 때, 그 데이터에 대한 ACK를 피기백킹으로 포함시켜 한 번에 보낸다. B도 A에게 데이터를 보낼 때 ACK 정보를 포함하여 전송한다.
    

---

### 피키배킹(Piggy backing)의 동작 구조

**<mark>💡요약: </mark>** 각 패킷에는 **순서 번호(seqNo)**와 **확인응답 번호(ackNo)**가 포함되어 데이터와 확인응답을 함께 처리한다.

![](https://cdn.hashnode.com/res/hashnode/image/upload/v1730605197562/4b6a3eab-0f6b-4028-9d22-14db9c96ff19.png align="center")

* **피기백킹의 기본 개념**:
    
    * **피기백킹(Piggy-backing)**은 **송신 데이터와 수신 데이터에 대한 확인응답(ACK)을 함께 묶어서 전송하는 방식**이다.
        
    * 예를 들어, 클라이언트(Client)가 서버(Server)로 데이터를 전송할 때, 서버는 해당 데이터에 대한 응답을 별도의 패킷으로 보내지 않고, 자신이 송신할 데이터에 확인응답 정보를 포함시켜 한 번에 보낸다.
        
* **패킷 구조**:
    
    * 각 패킷에는 **순서 번호(seqNo)**와 **확인응답 번호(ackNo)**가 포함되어 있다.
        
    * **순서 번호(seqNo)**는 현재 전송하는 데이터의 번호를 나타내며, **확인응답 번호(ackNo)**는 수신한 데이터에 대한 응답 정보를 포함한다.
        
    * 또한 **체크섬(checksum)**을 통해 데이터의 무결성을 확인한다.
        
* **피기백킹의 장점**:
    
    * **네트워크 자원 절약**: 피기백킹 방식은 별도의 확인응답 패킷을 줄일 수 있어, 대역폭을 절약하고 네트워크 효율성을 높인다.
        
    * **지연 시간 감소**: 데이터 전송과 확인응답을 한 번에 처리하여 전송 지연을 줄일 수 있다.
        

**💡예시상황:** 클라이언트(Client)가 서버(Server)로 데이터 패킷을 전송하는 상황이다.

* **피기백킹 사용**: 서버는 클라이언트의 데이터에 대해 확인응답(ACK)을 해야 하지만, 피기백킹 방식을 사용하여 별도의 ACK 패킷을 보내지 않고 자신이 송신할 데이터 패킷에 ACK 정보를 포함한다.
    
* **결과**: 클라이언트는 서버로부터 데이터를 받는 동시에, 자신의 전송 데이터에 대한 확인응답을 받게 된다.
    

---
