참고 :
http://cafe.naver.com/netrain.cafe?iframe_url=/ArticleRead.nhn%3Farticleid=71Window size는 한번에 받을 수 있는 데이터의 양이랍니다.
통신을 할 때 상대방에게 자신의 Windows size를 알려주면, 상대방은 그만큼의 양을 한번에 전송을 하고 상대방이 다 처리했는지 확인 후에 다음 데이터를 전송하는 것입니다.
TCP 헤더의 한 부분인 이것은 unsigned short 형인 16bits 숫자입니다. 즉 0 에서 65535 를 표시 할수 있습니다.
이 숫자가 의미하는것은 TCP 는 1 : 1 통신입니다.
양측이 서로 데이터를 송/수신 하는데, "내가 처리할 수 있는 정도는 이만큼이야" 라고 상대방에게 알려주는 겁니다.
쉽게 예를 들어보겠습니다.
TCP/IP 를 처리하는 프로세서가 충분히 빨라서 네트워크 전송속도를 능가한다면 이 값은 항상 최대값인 65535 입니다. 반대로 프로세서가 어떤 이유로 상당히 느리게 동작하여 네트워크를 통해 전달되는 데이터를 실시간으로 처리할 수 없는 상태라면 이 값은 줄어들게 됩니다.
버퍼의 개념으로 생각하면 더 간단해 지는데요, 65535 Bytes 크기의 TCP/IP 버퍼가 존재한다고 가정을 합니다. 처음에는 비어있고 네트워크를 통해 데이터가 이 버퍼에 쌓이게 됩니다. 프로세서는 기다리고 있다가 쌓인 데이터를 처리하고 버퍼를 비운후,
"내 버퍼는 비어있어서 65535 만큼 가능해"
라고 상대방에게 알려줍니다. 또는 너무 바빠서 버퍼에 쌓여가는 데이터를 모두 처리할수 없을때,
"내가 지금 바빠서 버퍼를 모두 못 비웠어. 지금은 50000 만큼 가능해"
라고 상대방에게 알려줍니다.
이 값이 결국 0이 되면 상대방은 버퍼가 여유가 있을때까지 데이터를 보내지 않습니다. 그런시간이 일정시간 이상 지속된다면 연결을 끊을 수 있습니다. 그렇게 약속된 항목이 Window Size 입니다.
TCP Header에 Window size라는 Field가 있는데, 전체 16bit로 되어 있습니다. 즉 2^16까지 표시할 수 있고 단위는 Byte가 됩니다. 65535byte가 최대 표시할 수 있는 용량이겠군요. 즉, Window size의 최대 크기는 64Kbyte가 된다고 생각하시면 됩니다.
하지만, 요즘 1Gbps, 10Gbps 속도가 향상되고 있고, 전송할 데이터의 양도 많아지고 있죠! 그래서, 이 최대값을 변경할 수 있도록 만들었습니다. 그렇다고 TCP Header는 Fixed Header를 가지고 있기 때문에 16bit를 변경할 수 없습니다. 그럼 어떻게 Window size를 변경할 수 있을까요? 뒤의 자리는 무시해 버리는 방식을 사용합니다. 예를 들어 16bit 중 마지막 1bit를 무시한다고 하면 bit를 하나씩 shift 시켜서 2^17 까지 표시할 수 있겠죠.
하지만, 아직까지는 64Kbyte가 최대값이라고 생각하시는게 좋습니다. 그게 기본이니까요.
Default Window size는 시스템마다 다른데 Window Server 2003 같은 경우는 1Mbps 보다 저속에서는 8K, 1-100Mbps에서는 17K, 100Mbps 이상에서는 64K의 Window size를 사용합니다. 물론 1Gbps 이상이 되면 shift를 시켜 더 크게 만들고요.
기억하여야 하는 것은 TCP Header에 들어있는 Window size는 데이터를 받는 PC의 Window size라는 겁니다. 상대방은 그 정보를 보고 나서 Window size만큼 한번에 전송 후에 ACK를 기다리게 되는 것이죠. 그리고, Window size는 고정되어 있지 않습니다. 문제없이 전송이 되면 Window size를 늘리고, 중간에 데이터가 유실되거나 문제가 발생하면 Window size를 줄입니다.
즉, 통신이 잘되면 한번에 많은 데이터를 전송할 수 있는 것이고, 통신에 문제가 생기면 한번에 적은 양의 데이터를 전송하게 되죠. 이것을 우리는 'Sliding Window'라고 합니다.