HTTP/2 서버 푸시에 대해 이야기하기 전에 먼저 HTTP/2가 HTTP/1.x의 많은 단점을 해결하도록 설계되었다는 점을 알아야 합니다. 최신 웹 페이지는 HTML, 스타일시트, 스크립트, 이미지 등 다양한 리소스를 사용합니다. HTTP/1.x에서는 이러한 각 리소스를 명시적으로 요청해야 합니다. 이는 느린 과정일 수 있습니다. 따라서 브라우저는 HTML을 가져오는 것부터 시작한 다음 페이지를 구문 분석하고 평가하면서 점차적으로 더 많은 리소스를 가져옵니다. 서버는 브라우저가 모든 요청을 수행할 때까지 기다려야 하기 때문에 네트워크가 유휴 상태이거나 사용량이 적은 경우가 많습니다.
지연 시간을 개선하기 위해 HTTP/2는 서버 푸시를 도입했습니다. 이를 통해 브라우저가 명시적으로 리소스를 요청하기 전에 서버가 브라우저에 리소스를 푸시할 수 있습니다. 서버는 종종 페이지에 많은 추가 리소스가 필요하다는 것을 알고 브라우저의 첫 번째 요청에 응답할 때 해당 리소스를 푸시하기 시작할 수 있습니다. 이를 통해 서버는 잠재적으로 유휴 상태인 네트워크를 완전히 활용하여 페이지 로드 시간을 향상시킬 수 있습니다.
serverpush.svg.png
프로토콜 계층에서 HTTP/2 서버 푸시는 push_promise 프레임에 의해 구동됩니다. 즉, 서버는 브라우저가 곧 발행할 요청을 예측합니다. 브라우저는 PUSH_PROMISE를 수신하자마자 서버가 이 리소스를 전송할 것임을 즉시 알게 됩니다. 나중에 브라우저가 리소스가 필요하다는 것을 발견하면 새 요청을 보내는 대신 푸시가 완료될 때까지 기다립니다. 이렇게 하면 브라우저가 네트워크를 기다리는 데 소요되는 시간이 줄어듭니다. net/http 패키지의 서버 푸시
go1.8에는 http.Server의 푸시 응답 지원이 도입되었습니다. 이 기능은 실행 중인 서버가 HTTP/2 서비스이고 들어오는 연결이 HTTP/2를 사용하는 경우 사용할 수 있습니다. 모든 HTTP 처리기에서 http.ResponseWriter가 새로운 http.Pusher 인터페이스를 구현하는지 확인하여 서버 푸시를 지원하는지 여부를 확인할 수 있습니다.
예를 들어 서버가 app.js가 페이지 렌더링을 요청한다는 것을 알고 있는 경우 http.Pusher를 사용할 수 있으면 핸들러는 푸시를 시작할 수 있습니다.
http.HandleFunc("/", func(w http.ResponseWriter, r *http.Request) { if pusher, ok := w.(http.Pusher); ok { // Push is supported. if err := pusher.Push("/app.js", nil); err != nil { log.Printf("Failed to push: %v", err) } } // ... })
위의 소개를 읽으신 후 방법을 마스터하셨다고 생각합니다. 더 흥미로운 정보를 보려면 PHP 중국어 웹사이트
기타 실행할 때 JS 엔진은 어떻게 생겼나요?네이티브 JS가 AJAX 및 JSONP를 구현하는 방법JS를 사용하는 동안 콘솔 객체를 사용자 정의하는 방법위 내용은 HTTP/2 서버 푸시 정보의 상세 내용입니다. 자세한 내용은 PHP 중국어 웹사이트의 기타 관련 기사를 참조하세요!