Shine's dev log

TCP Flow Control 본문

컴퓨터 네트워크

TCP Flow Control

dong1 2021. 2. 24. 21:41

1. TCP window

 

앞서 TCP는 pipelining을 통해 여러개의 패킷들을 동시에 송/수신하며, 이를 관리하기 위한 window가 존재한다고 하였다.

만약 window 크기가 크면 한번에 많은 양의 패킷을 송/수신하며, window 크기가 작으면 한번에 적은 양의 패킷을 송/수신할 수 있다.

 

아래 그림의 TCP header에서 볼 수 있는 window size 값은 receiver 입장에서 수용 가능한 window 크기를 상대방에게 알려주는 것이다.

이때, receiver의 수용 가능한 window size는 receiver의 비어있는 버퍼 크기라고 생각하면 된다.

 

TCP header

 

 

 

2. TCP flow control

 

flow control은 다음과 같이 정의할 수 있다.

 

receiver의 buffer 눈치를 보고 sender의 window size를 조절하는 것

 

TCP에서 flow control은 receiver 측의 소켓에 존재하는 버퍼를 기준으로 삼는다. 

 

소켓의 버퍼에 데이터가 계속 쌓이면, application layer에서 데이터를 계속 가져간다.

 

그런데, application layer에서 가져가는 속도보다, 버퍼에 데이터가 쌓이는 속도가 더 빠르면 중간에 데이터가 유실될 수 있으므로 속도를 조절해줘야 한다.

 

이렇게 receiver측의 소켓 버퍼 상황을 고려해서 window size를 조절하는 것이 바로 TCP에서 flow control이다.

 

중요한 것은 flow control은 sender가 조절하는게 아니라, receiver가 sender에게 명령하는 것이다. (나 상황 이러니까 너가 보내는 속도 조절해라!)

 

TCP receiver buffer

 

즉 receiver 버퍼에 따라서 flow control이 발생하며, 이 receiver 버퍼는 application이 얼마나 활동하느냐에 따라 달라진다.

 

 

 

3. TCP persist timer

 

senderTCP header의 Window size 값을 통해 receiver의 버퍼가 다 찼다고 판단되면 더이상 데이터를 보내지 않고 lock에 걸린다. 이것이 바로 flow control이다.

 

그렇다면, receiver의 버퍼 데이터를 application layer가 가져가서 빈 공간이 생기면 어떻게 이를 sender에게 알려줄까? 아래 그림과 같이 receiver는 자신의 버퍼에 여유 공간이 생기면 알아서 sender에게 알려준다.

 

receiver buffer

 

하지만, 만약에 receiver가 sender에게 버퍼에 여유 공간이 생겼음을 알려주는 메시지가 유실되면 sender측은 계속해서 receiver측의 버퍼가 가득 차있는 것으로 생각하기 때문에, sender측은 데드락에 걸려버리게 된다.

 

따라서 이를 해결하기 위해 TCP persist Timer를 사용한다.

 

TCP persist Timer는 아래 그림과 같이 sender가 receiver 버퍼에 빈 공간이 있는지 알아보려고 주기적으로 1byte짜리 메시지로 찔러보기 위한 타이머이다.

 

TCP persist timer

 

정리해보면, receiver 버퍼에 공간이 없다가 생기면, receiver가 알아서 한번 알려주고, sender는 또 나름대로 1byte씩 확인차 찔러보기를 계속 하는 것이다.

 

 

위 내용을 정리해보면,

 

1. pipelined 된 패킷 통신을 할때는 window가 존재하는데, TCP header에 수용 가능한 window 크기가 적혀있다.

 

2. TCP flow control은 receiver의 소켓 버퍼가 수용 가능한지를 따져 sender가 전송량을 조절하는 것이다.

 

3. receiver의 소켓 버퍼가 가득 차있다 여유가 생기면 sender에게 알려준다. 동시에 sender는 receiver에게 여유가 있는지 주기적으로 계속 찔러보는데 이를 TCP persist Timer라 한다.

 

위 내용은 공부하며 정리한 것으로, 오류가 있을 수 있습니다.