[네트워크📶/TCP] Silly Window Syndrome 과 Nagle 알고리즘
Silly Window Syndrome 이란
TCP 에서 전송할때 작은 segment도 하나하나씩 보낸다고 가정해봅시다.
TCP는 작은 segment 하나 전송을 위해 3-Way Handshake 과정을 거쳐야 하고,
1 바이트 전송을 위해 40바이트의 헤더가 들어갑니다.
그 비효율성은 마치 큰 트럭에 조그만한 지우개 하나를 태워 보내는 것과 같습니다.
전체 트럭의 수용량(MSS)를 전혀 사용하지 못하죠.
이를 해결하기 위해 silly window syndrome avidance 가 이루어집니다.
즉, receiver가 받을 수 있는 수용량이 매우 적다면, 조금조금씩 받을 수 밖에 없겠죠?
그럼 이러한 비효율적인 일이 벌어집니다.
따라서, reciever 의 수용량이 아주 적을 때, 차라리 sender에게는 0-window ACK 을 전송해, 모아서 나중에 보내게끔 합니다. 이는 양방향 전송에서 모두 이루어집니다.
"Be liberal in what you accept, and conservative in what you send" (Postel's Law, RFC 1122)
받을 것은 자유롭게, 보내야 되는것은 꼭 보존하면서.
Nagle's algorithm
full segment을 만들 수 있다면, 조그만한 segment가 있다 하더라도 바로 보냅니다.
보낼 데이터가 매우 작다면 그 segment 는 보내지 않고 send socket buffer에 저장해둡니다.
앞서 전송한 데이터에 대해 ACK를 받는다면 그때 socket buffer에 저장해뒀던 데이터를 모두 전송합니다.
문제점
1. 네트워크의 효율성은 좋아질 수 있으나, 즉각적인 반응을 보여야 하는, 게임, 마우스 움직임 등에서는 처리 속도가 확연히 떨어지게 됩니다.
2. Delayed ACK timer 방식과 충돌이 일어나, 전송이 강제로 진행될 수 있습니다.