Flow Control
세그먼트의 흐름을 제어하는 것
1:1 상황에서 자신의 윈도우가 넘치지 않을 정도로만 세그먼트를 보내도록 리시버가 남은 버퍼의 크기를 센더에게 알려주는 것을 '흐름 제어' 라고 한다.
센더는 리시버로부터 여유 공간에 맞게 추가 데이터를 보냄으로써 리시버의 버퍼가 넘치지 않도록한다.
위 그림은 리시버의 프로토콜 스택을 보여준다.
sender가 보낸 데이터는 IP 헤더 (녹색) 이 붙은 채로 3계층 (네트워크 계층) 을 지나고,
3계층에서 TCP로 payload를 넘겨줄 것이다.
이 payload 데이터는 TCP 소켓의 receiver buffer에 담겨있다가, 어플리케이션이 데이터를 읽어가면 그때 버퍼에서 데이터를 삭제한다.
그런데 만약 어플리케이션이 다른 로직을 수행하느라 바빠서 데이터를 읽어가는 속도가 버퍼에 데이터가 들어오는 속도를 따라가지 못한다면, 리시버의 버퍼에는 계속 데이터가 쌓일 것이다.
그러면 리시버 버퍼의 남은 공간 크기가 줄어들어서 센더가 데이터를 보내도 데이터를 리시버가 받지 못하는 일이 생길 수 있다.
따라서 TCP 세그먼트 헤더의 receive window (rwnd) 필드에 현재 남아있는 버퍼의 가용 공간 크기를 byte단위 수로 담아서 센더에게 보내준다.
만약 이걸 알려주지 않으면, 센더는 계속해서 데이터를 보내고, 리시버는 들어온 데이터를 버퍼에 담을 수 없으니 버리는 과정을 의미없이 반복할 것이다. 이는 리시버 입장에서는 성능의 감소이고, 전체 트래픽 관점에서 보면 대역폭의 낭비이다.
이를 통해 리시버는 센더가 데이터를 너무 많이, 너무 빠르게 보내지 않도록 컨트롤해서 자신의 버퍼가 넘치지 않도록 관리할 수 있다.
참고로 리시버 버퍼의 크기는 소켓을 생성할 때 RcvBuffer 크기를 직접 지정할 수 있다.
(보통은 4096byte를 사용하는 것이 일반적이다.)
또는 OS가 네트워크 트래픽 상황을 보고 버퍼의 크기를 키우거나 줄이는 식으로 조절하기도 한다.
위 그림 기준으로 센더는 free buffer space의 크기만큼 추가 데이터를 전송할 수 있다.
(ACK를 받지 않은, 전송중인 데이터의 양을 rwnd 의 크기만큼으로 제한할 수 있다.)
이때 중요한 점은, 기존에 보냈던 것을 재전송하는 것은 free buffer space 제한에서 제외한다.
즉, 리시버는 ACK를 보냈는데, 그게 오지 않아서 재전송하는 경우는 제외한다는 것이다.
왜냐하면 리시버가 이미 ACK를 보냈는데 이에 대해 재전송하면, 버퍼가 남아있든 남아있지 않든 그냥 ACK를 보내고 수신한 데이터는 버릴 것이기 때문이다.
'CS > 컴퓨터 네트워크' 카테고리의 다른 글
[컴퓨터 네트워크] 23. Transport Layer (9) : TCP Congestion Control (혼잡 제어) (0) | 2024.05.31 |
---|---|
[컴퓨터 네트워크] 22. Transport Layer (8) : TCP 연결 설정 (3-way handshake) (0) | 2024.05.28 |
[컴퓨터 네트워크] 20. Transport Layer (6) : TCP (0) | 2024.05.27 |
[컴퓨터 네트워크] 19. Transport Layer (5) : Go-Back-N (GBN), Selective Repeat (SR) (0) | 2024.05.24 |
[컴퓨터 네트워크] 18. Transport Layer (4) : rdt 3.0 (0) | 2024.04.24 |