TCP를 통한 키보드 트래픽은 패킷마다 아주 작은 페이로드를 보낸다. 키 입력 하나가 40바이트 헤더로 감싸진 수십 바이트짜리 세그먼트가 되는 것이다. 느린 링크에서는 거의 데이터를 담지 않은 패킷이 네트워크를 범람하는데, Nagle은 이 문제를 소형 패킷 질환 또는 silly-window 질환이라고 불렀다.

순진한 해결책은 즉시 보내거나(대역폭 낭비) 전체 세그먼트가 버퍼에 찰 때까지 기다리는 것(지연 추가)이다. Nagle의 규칙은 그 사이에 있다. 작은 세그먼트 하나를 미해결 상태로 두고 나머지는 그에 대한 확인응답 뒤에 묶어 두는 것이다.

TCP가 이미 그 확인응답을 기다리고 있기 때문에 이 묶음 처리는 자연스럽다. 알고리즘은 그것을 우연이 아니라 규칙으로 만들 뿐이며, 대화형 앱은 패킷 수의 일부만으로 낮은 지연을 얻는다.

작은 패킷 하나를 보내고, ACK가 올 때까지 나머지를 묶어 둔다

1바이트 패킷은 바이트 대부분을 헤더에 낭비한다.

ACK 뒤에 묶어 두는 것은 새로운 고정 대기를 추가하지 않는다.

전체 세그먼트 버퍼링의 지연 없이 패킷 수를 줄인다.

낭비를 고치려면 작은 단위 하나를 허용하고 나머지는 그 확인응답 뒤에 묶어 두되, 비용을 이미 하고 있던 대기로 제한하라.

RFC 1122에서 중요한 TCP 요구사항으로 명시된 Nagle의 알고리즘은 사실상 모든 TCP 스택에 탑재되어 출시되었고, 약간의 지연을 큰 부하 감소와 맞바꾸는 고전적 사례가 되었다.

근거 확인하기

출처

  1. RFC 896: Congestion Control in IP/TCP Internetworks IETF · rfc-editor.org
  2. RFC 1122: Requirements for Internet Hosts - Communication Layers IETF · rfc-editor.org