flow control이란?

tcp 통신시 각 노드에게는 send buffer / receive buffer가 존재한다. cumulative ack를 사용하는 특성으로 인해 패킷유실, 네트워크환경 등에 의해서 순서대로 오지 못한 패킷들을 임시로 저장해놓기 위해서이다.

 

process가 소켓에서 read를 하게 되면 갖고 있는 receive buffer에서 데이터를 올려받게 된다. 따라서 컴퓨터의 성능이나 다른 해야할 작업들이 많은 상황에서 receive buffer의 데이터들이 올라가는것이 딜레이가 될 수 있다. 이런 다양한 이유로 receiver가 데이터를 받을 수 있는 역량, 즉 receiver buffer의 남은 용량을 고려하여 통신이 진행될 수 있도록 하는 것이 flow control이다. flow는 하천, 강물과 같은 느낌이 있다. flow control는 이 flow를 조절하면서 통신하는 것이라고 기억하면 편할 것 같다.

 

 

구현방식

구현 방식은 생각보다 매우 간단한다. tcp segment의 header에 receiver buffer라는 필드가 있다. receiver는 ack를 보낼때 receiver buffer 필드의 수용가능한 데이터 용량을 기입하게 된다.

 

issue

A와 B가 tcp 통신 중이라고 가정해보자. 통신이 진행되는 중간에 B의 receive buffer가 가득차게 되어서 B는 receive buffer필드에 0을 넣은 ACK를 A에게 보내게 된다. 이것을 받은 A의 반응은 무엇일까? B의 버퍼가 가득차서 B에게 데이터를 보낼 수 없으니 아무것도 할 수 있는게 없다.

 

=> 실제 TCP구현에서는 A가 데이터가 들어있지 않는 세그먼트를 주기적으로 B에게 보내는 방식으로 처리된다.

+ Recent posts