HTTP는 기본적으로 연결을 유지하지 않는다. 요청과 응답이 끝나면 TCP/IP 연결을 끊는다.

놀고 있는 연결에 묶이는 자원

서버 자원을 아끼려는 것이다.

응답은 보통 초 단위 이하로 빠르게 끝난다. 그리고 사람은 검색 버튼을 쉬지 않고 누르지 않는다. 1시간 동안 수천 명이 서비스를 써도 서버가 동시에 처리하는 요청은 수십 개 이하인 경우가 많다.

그런데 연결을 계속 붙들고 있으면 놀고 있는 연결에도 자원이 묶인다. 끊었다가 필요할 때 다시 맺는 편이 훨씬 효율적이다.

다시 맺는 비용과 지속 연결

연결을 유지하지 않는다는 것은 매번 TCP/IP 연결을 새로 맺어야 한다는 뜻이고, 3-way handshake 시간이 그때마다 붙는다. 웹 페이지 하나를 열면 HTML만 오는 것이 아니라 CSS, 자바스크립트, 이미지까지 수많은 자원이 함께 내려오므로, 자원 하나마다 연결을 새로 맺으면 낭비가 크다.

지금은 지속 연결(Persistent Connections)로 푼다. 한 번 맺은 연결로 여러 자원을 주고받고 나서 끊는다. HTML을 받고 그 연결로 CSS와 이미지까지 받은 뒤 닫는 것이다. HTTP/2와 HTTP/3에서 더 최적화되었다.

무상태와 짝을 이루는 성질

연결을 끊어버리니 상태를 서버에 둘 수도 없다. 비연결성과 무상태는 짝이라서, 대용량 트래픽이 한 시점에 몰릴 때 무상태 설계가 왜 결정적인지도 같은 자리에서 나온다.

관련

출처