[꼼꼼한 개발자] 꼼코더

10. 모든 개발자를 위한 HTTP 웹 기본 지식 - [HTTP 기본] - 비 연결성(connectionless) 본문

HTTP

10. 모든 개발자를 위한 HTTP 웹 기본 지식 - [HTTP 기본] - 비 연결성(connectionless)

꼼코더 2022. 11. 8. 10:12
반응형

🤼‍♂️ 연결 유지 모델과 비연결 유지 모델

  • 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은 서버와 연결된 후, 요청과 응답을 주고 받은 후, 연결을 종료한다.
  • 현재 서버와 연결이 유지된 클라이언트는 없다.

🖇 비 연결성

  • 클라이언트와 서버는 요청(Request)시에만 연결이되며 그 외에는 연결을 유지하지 않고, 않아야 한다.
  • 계속 연결을 유지하는것도 결국 비용이고 연결을 최소한으로 함으로써 비용을 절약한다.
  • HTTP는 기본이 연결을 유지하지 않는 모델
  • 일반적으로 초 단위 이하의 빠른 속도로 응답
  • 1시간 동안 수천 명이 서비스를 사용해도 실제 서버에서 동시에 처리하는 요청은 수십개 이하로 매우 작음
  • → 웹 브라우저에서 계속 연속해서 검색 버튼을 누르지는 않음, 같은 초 단위에 검색하는 사용자가 많지 않음
  • 서버 자원을 매우 효율적으로 사용

 

🖐 비 연결성 - 한계와 극복

<한계>

1) TCP/IP 연결을 새로 맺어야 함 → 3 way handshake 시간 추가

→ 검색을 해서 보다가 어떤 게시글을 또 새로 누르는 경우, TCP/IP 연결을 새로 맺어야함

2) 웹 브라우저로 사이트를 요청하면 HTML, 자바스크립트,css, 추가 이미지 등 수많은 자원이 함께 다운로드

→ 자원을 다운로드 받을 때마다 3 way handshake를 해야 하는 문제.

 

<극복>

1) 지금은 **HTTP 지속 연결(Persistent Connections)**로 문제 해결

2) HTTP/2, HTTP/3 에서 더 많은 최적화


🤝 HTTP 연결(클라이언트 ↔ 서버)

👀 HTTP 초기 - 연결, 종료 낭비

  • 연결 → 자원 요청/HTML 응답 → 종료

  • 필요한 자원이 있을 때마다, 위 과정을 무한 반복한다.

 

 

 

 

 

 

 

 

 

 

 


👀 HTTP 지속 연결(Persistent Connections)

  • 연결 → 자원 요청/HTML 응답 → 자원 요청/자바스크립트 응답 → ... → 종료

  • 클라이언트와 서버가 연결을 한 뒤 필요한 자원을 요청/응답으로 다운받는다.
  • 각각의 자원이 별도의 연결/종료가 되는 것이 아니라 한 연결에 필요 정보를 모두 다운받은 뒤 종료된다. 그럼으로써 연결/종료에 걸리는 시간을 단축할 수 있다.

 

 

 

 

 

 

 


👀 Stateless를 기억하자

서버 개발자들이 어려워하는 업무 = 같은 시각에 딱 맞춰 대용량 트래픽이 발생하는 경우

예)선착순 이벤트, 명절 KTX 예매, 수강 신청 등 → 수만명 동시 요청

하지만, 최대한 Stateless 하게 설계하는 것이 중요하다!!

  • 보통 첫 페이지는 로그인도 필요없는 정적 페이지(순수 HTML)을 뿌린 다음, 이벤트 참여 버튼을 누르게 하는 방식으로 구현

🍀 Stateless와 Connectionless의 차이

1) Stateless(무상태 유지) - 클라이언트 서버 사이에 상태를 유지하지 않는다

2) Connectionless(비 연결성) - TCP/IP 커넥션 연결을 지속하지 않는다


🙋🏻‍♂️ Q&A

Q. Persistent Connections(지속 연결) 가 언제까지 유지되어야하는 규칙이 있는지? Persistent Connections 를 비연결성과 연결성의 중간 지점이라고 생각해도 되는지?

 

A. 기본적으로 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는 어떤 관계인가?

 

A. 우선 서버에 대해 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

 

참고 : https://hseungyeon.tistory.com

 

위 자료는 김영한님의 ‘모든 개발자를 위한 HTTP 웹 기본 지식’ 강의를 참고하여 작성하였습니다.
https://www.inflearn.com/course/http-웹-네트워크/dashboard
Comments