<Stop & Wait>
: TCP에서는 신뢰성 보장을 위해 패킷마다 Sequence 번호를 붙인다. 패킷이 제대로 갔는지를 확인하기 위해 Receiver는 ACK를 보내서 어디까지 받았는지를 응답해준다.
=> 이렇게 한번 데이터를 보내면 ACK을 받을 때까지 기다리고, ACK이 도착해야만 다음 데이터를 한번 보내는 방식을 Stop & Wait 방식이라고 한다. 이는 TCP의 신뢰성 하나 때문에 택하는 방식으로, 시간이 오래 걸리고 비효율적이다.
이를 트럭 운송업에 비유한다면, 트럭 한대를 인천에서 부산으로 보내고, 빈 트럭이 돌아와야만 다음 트럭을 보내는 프로세스와 유사하다고 볼 수 있다.
=> 이때, 트럭을 한대씩 보내고 받기 보다는 트럭을 한꺼번에 10대를 보낸다면 약간 더 효율적일 것이다.
: 하지만 트럭을 100대, 1000대를 보낼 수도 있지만 부산에서 소화할 수 있을 정도의 화물만 보내야 한다.
=> 즉, 이를 정리하면 보내는 쪽이 받는 쪽이 얼마나 더 받을 수 있는가를 확인해 가며 데이터를 보내야 한다는 것이다. (Overflow가 발생하지 않을 만큼만)
- Window 란?
Window는 sender가 보낼 수 있는 maximum 데이터 크기이다.
=> 상황에 따라 데이터가 소비되는 속도가 다르기 때문에 빈 공간은 때에 따라 다르다. 따라서 reciever는 sender에게 계속 window size를 알려줘야 한다.
=> Window Size는 header에 존재하고, 최초 연결 요청 시에 rwnd값도 같이 실어져서 온다.
- Send & Receive window in TCP
1) 패킷 하나를 보내고, ACK이 온 상태이다. 이 ACK 헤더에 rwnd값이 100이라고 적혀 있다.
2) 다음에 보낸 packet들이 100byte 남은 빈공간을 채울 것이다. 이때 window size는 이미 보냈지만 ACK을 아직 받지 못한 바이트 까지 포함이 되어야 한다.
=> ACK를 받았을 때와 Data를 보내는 상황엔 시간 차이가 있다. ( Receiving buffer에서 소비가 되었을 수도, 안될 수도 있다.) 그러므로 확실하게 rwnd가 sender에게 도착하기 전까지는 섣불리 데이터를 더 전송하지 않고, 이미 보낸 데이터를 삭제하지도 않고 잘 갖고 있어야 한다.
3) 마지막으로 이미 보낸 데이터들에 대한 ACK이 돌아온 상태에서만 acknowledged 된 바이트를 버리고, 윈도우가 오른쪽으로 이동이 가능하다.
<EXAMPLE>
: 한 application에서 sending buffer & receiving buffer를 둘 다 가지고 있어야 한다.
-> Sending buffer: 보낸 데이터에 대한 ACK이 오면 keep해놓고 있던 데이터를 버리고 window를 전체적으로
오른쪽으로 이동한다.
-> Receiving buffer : 받은 데이터를 소비하고 나면 빈 공간은 버리고 window를 역시 전체적으로 오른 쪽으로 이동한다.
'Computer Science > Computer Network' 카테고리의 다른 글
Flow Control이란? (0) | 2020.10.26 |
---|---|
Time-wait은 왜 발생하는가? (0) | 2020.10.25 |