Head-of-line blocking은 병목현상을 가리킨다.
패킷들의 큐에서 가장 앞단에 있는 패킷이 처리되는 과정에서 그 뒤의 패킷들이 계속 기다리면서 움직이지 못하는 병목현상이다.
TCP연결에서는 TCP가 메시지가 정확히 순차적으로 전달되게끔 보장하는 매커니즘 때문에 HOL Blocking이 발생한다. 첫번째 메시지가 너무 커서 작업 시간이 오래 걸리면, 그 뒤 메시지들은 비록 더 빨리 처리될 수 있음에도 기다려야 하기 때문이다.
여길 보면 첫번째 Get 요청이 서버로 간다. 그리고 GET1과 GET2가 동시에 갔는데, 이때는 GET1이 먼저 처리돼야 GET2도 처리된다. GET3요청이 오면, 앞단의 요청들이 처리돼야 처리가 될 수 있다.
1) HTTP/1.1의 연이은 요청
웹페이지를 로딩할 때, HTML/CSS/images/etc 등의 자원들이 순차적으로 요청이 된다. 이미지가 로딩에 매우 큰 시간이 걸리면, css나 javascript같은 작은 파일들이 딜레이되고 페이지 렌딩 자체가 느려지게 된다.
2)TCP와 네트워크 스위칭
여러 패킷이 네트워크 스위치의 입력 포트에 도착할 떄, 첫번째 패킷이 혼잡한 출력 포트로 가는 경우 이후의 모든 패킷은 혼잡이 적은 포트로 가는 패킷이라도 차단된다.
3) 모바일 네트워크와 HTPP/1.1
모바일 앱이 단일 TCPㅇ녀결로 여러 HTTP요청을 보낼 때, 첫번째 요청이 지연시간이 높으면 후속 요청도 지연된다.
1) HTTP/2또는 gRPC: 멀티 플랙싱을 통해 이전 요청이 완료될 때까지 기다리지 않고 다닝 연결을 통해 여러 요청을 봰ㄴ다. 병령 요청 처리를 가능하게 해서 HOL차단을 줄인다.
2) QUIC: 구글이 개발한 전송 계층 네트워크 프로토콜로, UDP위에 구축돼 단일 연결 내에서 독립적인 스트림을 허용한다. 한 스트림의 패킷 손실로 인해 다른 스트림이 지연되지 않도록 해서 HOL차단을 방지한다(재전송이 없으므로)
참고자료
Head-of-Line Blocking: Explanation and Designing a Flexible Network Layer