더북(TheBook)

수신 윈도를 너무 작게 잡으면 TCP 송신에 병목 현상이 발생한다. 이를 피하려면 이론상 대역폭 최대치가 호스트 사이 링크 계층의 최대 전송률을 넘어서도록 수신 윈도를 충분히 큰 값으로 잡아야 한다.

그림 2-16을 보면 호스트 B가 나중에 연달아 두 개의 ACK 패킷을 보내는데, 이는 대역폭을 효율적으로 사용하지 못하는 예이다. 두 번째 ACK 패킷의 ACK 번호가 첫 번째 ACK를 내포하므로 앞의 것은 굳이 필요치 않기 때문이다. 이때 IP 헤더와 TCP 헤더만 합쳐도 40바이트가 낭비되고 있다. 링크 계층 프레임도 고려하면 더 많은 부분을 낭비하는 셈이다. 이렇게 비효율적으로 헤더에 낭비하는 것을 줄이고자 TCP에 지연 ACK(delayed acknowledgment)라는 규정을 두었다. 명세서에 따르면 TCP 세그먼트를 받는 호스트는 즉각 응답할 필요가 없으며 최대 500밀리초까지 기다려보고, 시간 내에 다음 세그먼트가 오지 않는 경우에만 ACK를 보내도 상관없다. 앞서 예제에 적용해 보자. 세그먼트 1001번을 수신한 후 500밀리초 내에 세그먼트 1101번이 도착하면 1001번의 ACK는 생략하고 1101번에 대한 ACK만 보내면 되는 것이다. 많은 데이터를 보내는 스트림의 경우, ACK를 반 넘게 생략하는 효과가 있을뿐더러, 지연 시간 동안 호스트가 데이터를 소비할 여유가 약간 생겨 ACK와 같이 보낼 수신 윈도값도 결과적으로 넉넉해지는 장점이 있다.

신간 소식 구독하기
뉴스레터에 가입하시고 이메일로 신간 소식을 받아 보세요.