(인프런) 김영한님의 모든 개발자를 위한 HTTP 웹 기본 지식을 공부하고 리뷰한 글입니다.
4. 비 연결성(connectionless)
1. 연결을 유지하는 모델
TCP/IP는 연결을 유지하는 모델이다.
1) 클라이언트1&서버 TCP/IP 연결
클라이언트1은 서버와 연결된 후, 요청과 응답을 주고 받는다.
현재 클라이언트 1은 서버와 연결이 유지된 상태이다.
2) 클라이언트2&서버 TCP/IP 연결
클라이언트2는 서버와 연결된 후, 요청과 응답을 주고 받는다.
현재 클라이언트1, 2는 서버와 연결이 유지된 상태이다.
3) 클라이언트3&서버 TCP/IP 연결
클라이언트3은 서버와 연결된 후, 요청과 응답을 주고 받는다.
현재 클라이언트1, 2, 3은 서버와 연결이 유지된 상태이다.
4) 클라이언트1&서버 요청, 응답
클라이언트1은 이미 연결된 상태이므로 TCP/IP 연결을 하지 않고, 요청과 응답을 주고 받는다.
현재 클라이언트 1, 2, 3은 서버와 연결이 유지된 상태이다.
2. 연결을 유지하지 않는 모델
1) 클라이언트1&서버 TCP/IP 연결
클라이언트1은 서버와 연결된 후, 요청과 응답을 주고 받는다.
현재 클라이언트1은 서버와 연결이 유지된 상태이다.
2) 클라이언트1&서버 TCP/IP 연결 종료
클라이언트1은 필요한 요청, 응답이 끝나면 서버와 연결을 종료한다.
현재 서버와 연결이 유지된 클라이언트는 없다.
3) 클라이언트2&서버 TCP/IP 연결
클라이언트2는 서버와 연결된 후, 요청과 응답을 주고 받은 후, 연결을 종료한다.
현재 서버와 연결이 유지된 클라이언트는 없다.
4) 클라이언트3&서버 TCP/IP 연결
클라이언트3은 서버와 연결된 후, 요청과 응답을 주고 받은 후, 연결을 종료한다.
현재 서버와 연결이 유지된 클라이언트는 없다.
4) 클라이언트1&서버 TCP/IP 연결
필요한 자원이 있으면, 클라이언트1은 서버와 연결된 후, 요청과 응답을 주고 받은 후, 연결을 종료한다.
현재 서버와 연결이 유지된 클라이언트는 없다.
3. 비 연결성
- HTTP는 기본이 연결을 유지하지 않는 모델
- 일반적으로 초 단위 이하의 빠른 속도로 응답
- 1시간 동안 수천 명이 서비스를 사용해도 실제 서버에서 동시에 처리하는 요청은 수십개 이하로 매우 작음
e.g 웹 브라우저에서 계속 연속해서 검색 버튼을 누르지는 않음, 같은 초 단위에 검색하는 사용자가 많지 않음
- 서버 자원을 매우 효율적으로 사용
4. 비 연결성 - 한계와 극복
<한계>
1) TCP/IP 연결을 새로 맺어야 함 → 3 way handshake 시간 추가
e.g. 검색을 해서 보다가 어떤 게시글을 또 새로 누르는 경우, TCP/IP 연결을 새로 맺어야함
2) 웹 브라우저로 사이트를 요청하면 HTML, 자바스크립트,css, 추가 이미지 등 수많은 자원이 함께 다운로드 → 자원을 다운로드 받을 때마다 3 way handshake를 해야 하는 문제..
<극복>
1) 지금은 HTTP 지속 연결(Persistent Connections)로 문제 해결
2) HTTP/2, HTTP/3 에서 더 많은 최적화
5. HTTP 초기 - 연결, 종료 낭비
연결 → 자원 요청/HTML 응답 → 종료
필요한 자원이 있을 때마다, 위 과정을 무한 반복한다.
6. HTTP 지속 연결(Persistent Connections)
연결 → 자원 요청/HTML 응답 → 자원 요청/자바스크립트 응답 → ... → 종료
필요한 자원이 있으면 연결을 유지하고 더이상 필요한 자원이 없을 때 연결을 종료한다.
- 매커니즘 마다 연결 지속 시간의 차이는 있으나, 보통 HTML 한 페이지에 필요한 자원을 모두 받을 때까지는 연결을 유지한다.
7. Stateless를 기억하자
서버 개발자들이 어려워하는 업무 = 같은 시각에 딱 맞춰 대용량 트래픽이 발생하는 경우
e.g. 선착순 이벤트, 명절 KTX 예매, 수강 신청 등 → 수만명 동시 요청
하지만, 최대한 Stateless 하게 설계하는 것이 중요하다!!
- 보통 첫 페이지는 로그인도 필요없는 정적 페이지(순수 HTML)을 뿌린 다음, 이벤트 참여 버튼을 누르게 하는 방식으로 구현
<Stateless와 Connectionless의 차이>
1) Stateless - 클라이언트 서버 사이에 상태를 유지하지 않는다
2) Connectionless - TCP/IP 커넥션 연결을 지속하지 않는다
3-4. 비 연결성(connectionless) 질문 정리
Q. Persistent Connections 가 언제까지 유지되어야하는 규칙이 있는지? Persistent Connections 를 비연결성과 연결성의 중간 지점이라고 생각해도 되는지?
기본적으로 http는 연결을 유지하지 않는 모델로 비 연결성 특징이 있다.
비 연결성은 클라이언트의 요청이 올 때마다 3 way handshake를 해야 한다는 한계를 갖고 있다. 그래서 불필요하게 많은 3 way handshake의 횟수를 줄이기 위해 Persistent Connections이라는 것이 나오게 되었다. 한 번 연결이 되면 일정 시간동안 연결을 유지하고 필요한 자원의 요청과 응답을 어느정도 하고 난 후, 연결을 종료하는 것이다. 연결 지속 시간은 보통 60초 정도를 유지하고 서버쪽에서 해당 설정을 할 수 있다. 요즘에는 웹 서버에서 기본적으로 Persistent Connection을 적용하기 떄문에, 따로 설정해 줄 필요는 없다. 정리하자면, Persitent Connections 는 기본은 비연결성이지만 성능 최적화를 위해 약간의 연결을 유지하는(연결성)의 특성을 갖고 있다고 생각하면된다.
[출처] https://www.inflearn.com/questions/112546
Q. 접속량이 많은 경우, 대기열을 부여하는 경우가 많다. 서버가 여러 대가 있을 때, 대기인원의 순서 동기화가 어떻게 이루어지는가?
A. 보통 별도의 대기열을 관리하는 서버를 두고 거기서 대기열 순서를 관리한다.
[출처] https://www.inflearn.com/questions/158752
Q. http 프로토콜과 3way-handshake는 어떤 관계인가?
우선 서버에 대해 TCP/IP 연결을 진행하고(TCP 기반), 연결이 완료되면 HTTP 요청과 응답을 주고 받게된다.(HTTP 기반)
브라우저에서 URL을 입력하고 엔터를 누르면
1) DNS 서버에서 해당 URL의 ip를 조회한다.
2) 해당 ip에 해당하는 서버와 TCP/IP 연결을 한다.
3) 연결이 되면, HTTP 요청/응답을 한다.
[출처] https://www.inflearn.com/questions/313406
Q. HTTP 프로토콜은 TCP 기반인데, TCP는 연결지향, HTTP는 비연결성이라는 특성을 가지고 있는 이유는?
1) TCP는 UDP와는 다르게 3 way-handshkae를 통해 요청을 보낼 서버와 연결할 수 있는지 체크한다는 점에서 연결지향적인 것이다.
2) HTTP는 SOCKET 통신과 다르게 클라이언트가 요청을 할 때마다 연결을 하고 응답이 끝나면 연결을 종료하는 비연결성인 것이다.
TCP가 연결지향적이다라고 말하는 부분과 HTTP가 비연결성이라고 말하는 부분은 다른 부분이다.그렇기 때문에, HTTP가 TCP기반인데 어떻게 HTTP는 비연결성이고 TCP는 연결지향적이냐라고 말하는 것이 모순된 것이 아니다.
[출처] https://www.inflearn.com/questions/523506
'Spring > 모든 개발자를 위한 HTTP 웹 기본 지식' 카테고리의 다른 글
[모든 개발자를 위한 HTTP 웹 기본 지식] 04. HTTP 메서드 - HTTP API를 만들어보자 (0) | 2022.05.27 |
---|---|
[모든 개발자를 위한 HTTP 웹 기본 지식] 03. HTTP 기본 - HTTP 메시지 (0) | 2022.05.27 |
[모든 개발자를 위한 HTTP 웹 기본 지식] 03. HTTP 기본 - Stateful, Stateless (2) | 2022.05.27 |
[모든 개발자를 위한 HTTP 웹 기본 지식] 03. HTTP 기본 - 모든 것이 HTTP, 클라이언트 서버 구조 (0) | 2022.05.26 |
[모든 개발자를 위한 HTTP 웹 기본 지식] 02. URI와 웹 브라우저 요청 흐름 - URI, 웹 브라우저 요청 흐름 (0) | 2022.05.26 |