연결을 유지하는 모델일 경우
기본적으로 TCP/IP 는 소켓으로 연결하는데, 이 연결이 끊키지 않는다고 가정해보자
서버는 연결을 계속 유지하고, 서버 자원또한 계속 소모가 된다. ( 연산을 하고, 메모리를 할당하는등,,, )
이럴 경우 문제점이 무엇일까?
-> 다른 클라이언트가 아무것도 안하고 놀고 있더라도, 서버는 연결을 유지시켜야 한다.
연결을 유지하지 않는 모델일 경우
서버는 자원을 요청을 연결하고 주고 받을때만 사용하고, 유지하는 자원을 최소한으로 줄인다.
이 상황이 만약 클라이언트가 10만명이었다고 가정한다면, 연결을 유지하는 서버라면 엄청난 과부하가 왔을 것이다.
비 연결성
- HTTP 는 기본이 연결을 유지하지 않는 모델
- 일반적으로 초 단위 이하의 빠른 속도로 응답
- 1시간 동안 수천명이 서비스를 사용해도 실제 서버에서 동시에 처리하는 요청은 수십개 이하로 매우 작음
ex ) 웹 브라우저에서 연속해서 1시간 내내 검색 버튼을 누르지는 않는다.
- 서버 자원을 매우 효율적으로 사용할 수 있음.
비 연결성 한계와 극복
- TCP/IP 연결을 새로 맺어야 함 -> 3 way handshake 시간 추가
( 검색을 하다가 다음 페이지로 넘어갔다 가정한다면, TCP/IP 연결을 새로 맺어야함 )
- 웹 브라우저로 사이트를 요청하면 HTML 뿐만 아니라 자바스크립트, css, 추가 이미지 등 등 수 많은 자원이 함께 다운로드 된다.
- 지금은 HTTP 지속 연결(Persistent Connections)로 문제 해결
- HTTP/2, HTTP/3에서 더 많은 최적화
HTTP 초기 - 연결, 종료 낭비
대략 초기의 HTTP 는 위와 같은 형태의 통신을 하였다고 한다. 매번 연결과 종료 프로세스가 실행된다.
HTTP 지속 연결(Persistent Connections)
연결을 해둔채로 요청과 응답을 주고받는 것이 현재의 HTTP 통신이다.
몇 초동안 유지하는등의 내부 메커니즘이 있는데, 대부분 HTML 하나를 모두 받아질만큼의 시간동안 연결이 이루어져 있는것이다.
HTTP/2 , HTTP/3 에서는 이러한 부분들이 훨씬더 개선되어 나왔다. ( UDP 통신을 사용한 빠른 연결 등)
Stateless 를 기억하자
서버 개발자들이 어려워하는 업무
정말 같은 시간에 딱 맞추어 발생하는 대용량 트래픽
예) 선착순 이벤트, 명절 KTX 예약, 학과 수업 등록
예) 저녁 6:00 선착순 1000명 치킨 할인 이벤트 -> 수만명 동시 요청
이러한 경우 어떻게든 최대한 Stateless 하게 짜는것이 중요하다.
Stateless 하다면, 서버를 확 늘려버려서 대응하는것이 가능
-> 이런경우 자주 사용하는 방법은 첫 페이지는 로그인도 필요없는 단순한 페이지 ( 아무상태가 없는 ) 를 보여준다.
이곳에서 사람들을 놀게하고 시간을 보내게 한다음 이벤트 버튼같은것을 누르게 하는등의 방법을 많이 사용한다고 한다.
( 동일한 시간의 트래픽을 줄이는것 )
'CS > HTTP' 카테고리의 다른 글
HTTP API 를 만들어보자 - URI 설계 (0) | 2022.09.06 |
---|---|
HTTP 메시지 (0) | 2022.09.06 |
무상태 프로토콜 ( Stateless ) 지향 (0) | 2022.09.05 |
HTTP 란 무엇을 의미하는가? (0) | 2022.09.05 |
웹 브라우저 요청 흐름 (0) | 2022.09.05 |