네트워크에서 데이터를 전송할 때 만약 전송지가 수신지의 처리속도보다 더 빨리 전송한다면 제한된 용량을 초과해 이후에 도착하는 데이터가 손실되는 문제가 발생할 수 있다. 이 문제를 해결하려면 전송지와 수신지의 처리속도 차이를 해결해야 하는데, 이를 위해 수신지에서 자신의 상태에 대한 정보를 보내 데이터 전송을 조절하도록 하는 작업을 흐름제어라고 한다. TCP는 종단간 신뢰성을 보장하기 위해 흐름제어를 수행한다.
정지-대기 방식
정지-대기(Stop and Wait) 방식은 전송한 세그먼트에 대한 확인응답을 받은 후 그 다음 세그먼트를 전송하는 것이다. 전송지에서 세그먼트를 하나 보내면 수신지에서는 그 세그먼트의 오류 유무를 판단해 전송지에 ACK나 NAK를 보낸다. 전송지는 ACK를 수신했을 경우에만 다음 세그먼트를 전송하며, NAK를 수신하거나 일정 시간 동안 ACK, NAK 등의 응답을 수신하지 못하면 해당 세그먼트를 재전송한다. 이 방식은 구현이 단순하지만 전송지가 응답을 받을 때까지 다음 세그먼트를 전송할 수 없으므로 효율이 떨어진다. 현재는 거의 쓰이지 않는다.
슬라이딩 윈도우 방식
정지-대기 방식의 비효율적인 단점을 개선하기 위해 고안된 것이 슬라이딩 윈도우(Sliding Window) 방식이다.
슬라이딩 윈도우 방식을 이해하려면 먼저 원도우의 동작 원리를 이해해야 한다. 윈도우란 호스트가 데이터 전송을 위해 사용하는 버퍼로, 윈도우에 들어있는 데이터는 ACK를 받지 않아도 즉시 전송할 수 있다. TCP의 슬라이딩 윈도우 방식은 바이트를 기본단위로 한다.
슬라이딩 윈도우는 왼쪽 경계와 오른쪽 경계를 고려해 동작한다. 윈도우의 동작에는 열림, 닫힘, 축소 동작이 있으며 이 동작들은 수신지의 제어에 따라 움직인다. 위 그림은 그 동작을 보여준다. 여기서 n은 사용자 데이터를 바이트 단위로 나타낸 순서번호이다.
수신지로부터 ACK가 도착하면 윈도우의 오른쪽 경계가 오른쪽으로 이동하는데, 이것이 윈도우의 열림 동작이다. 윈도우가 열리면 더 많은 데이터 전송이 가능하다. 오른쪽 경계가 오른쪽으로 이동하면 윈도우가 커져서 그만큼 ACK와 무관하게 데이터를 전송할 수 있기 때문이다. 데이터가 전송된 후에는 윈도우의 왼쪽 경계가 오른쪽으로 이동하는데, 이것이 윈도우의 닫힘 동작이다. 닫힘 동작은 데이터가 정상적으로 전송되었고 ACK를 받았음을 뜻한다. 윈도우의 오른쪽 경계가 왼쪽으로 이동하는 것은 축소 동작으로, 전송할 데이터의 적합성에 문제가 있음을 나타낸다. 만일 데이터가 이미 전송된 상태라면 심각한 문제를 초래하므로 축소 동작은 발생하지 않도록 주의해야 한다.
댓글