Stateless 와 Connectionless 의 차이

Snoop So·2023년 8월 19일
0

HTTP는 통신 시 정보를 한 번씩 주고받은 후 바로 끊는 형태로 처리함. 이렇게 상태 정보를 저장하지 않는 통신 형태를 stateless 라고 하며 HTTP는 대표적인 무상태 프로토콜이다.

stateful은 서버가 클라이언트의 이전 상태를 보존한다는 의미. 반대로 무상태(stateless)는 서버가 클라이언트의 이전 상태를 보존하지 않는다는 의미.

connectionless 는 클라이언트가 서버에 요청을 하고 응답을 받으면 바로 TCP/IP 연결을 끊어 연결을 유지하지 않는 것. 이를 통해 서버의 자원을 효율적으로 관리하고, 수많은 클라이언트의 요청에도 대응할 수 있게 함
HTTP는 연결을 유지하지 않는 모델을 기본으로 함. 수 천명이 서비스를 사용해도 실제 서버에서 동시에 처리하는 요청은 수 십개 이하로 작음.

Stateless 하기 때문에 Redis를 둠.

왜 HTTP는 Stateless 구조를 채택하고 있을까요?

  • 단순성, 확장성, 무상태 연결, 성능, 데이터 일관성 때문.
  • 각 요청은 서로 독립적이어야 함. 서버에 요청에 대한 정보를 기억할 필요가 없으므로 개발과 유지 보수가 더 단순해짐.
  • 서버가 각 클라이언트의 상태를 추적할 필요가 없으므로 수천 또는 수백만 사용자를 처리하는 대규모 서비스에 적합함. 상태 정보를 저장하고 관리하지 않아도 되므로, 서버 자원을 효율적으로 사용할 수 있고, 로드 밸런싱이 쉽게 구현됨.
  • 각 요청과 응답이 독립적이므로, 여러 서버가 동일한 요청을 처리할 수 있음. 이는 분산 시스템에서 매우 중요
  • 클라이언트 상태를 유지할 필요가 없으므로 서버는 빠르게 응답을 보낼 수 있음, 또 여러 서버 사이에서 데이터 일관성 문제가 발생할 가능성이 줄어듦.
  • 예전에는 TCP를 끊는게 좋을 것 같았는데, 이게 점점 복잡도가 올라가다 보니 Keep-alive 설정을 디폴트로 해놓아버린 것.

HTTP Persistence Connection 이 무엇인가요?

  • HTTP keep-alive 또는 HTTP connection reuse라고 불리기도 함.
  • 하나의 TCP 연결을 HTTP 요청 및 응답을 보내거나 받을 때 사용하기 위한 개념
  • HTTP 1.0 이전 일 때에는 응답을 보낸 후에 서버와의 connection이 항상 닫혀있었음.
  • 1.0 이후에는 비공식적인 익스텐션이었던 keep-alive가 여러개의 응답 및 요청의 연결을 재사용하게 했음
  • header에 아래와 같이 포함됨
Connection: keep-alive

server가 이 요청을 받거나 응답을 생성하면, 만약 keep-alive를 지원하면 위와 같은 헤더를 포함한다.
서버가 conversation이 끝나고 "Connection: close"라는 헤더를 뱉어낼 경우에 연결이 종료됨.

  • HTTP 1.1 부터는 별도의 선언 없이는 종료되지 않음.

이게 필요한 이유는 TCP, SSL/TCP connection request 수가 줄어들면서 네트워크 혼잡이 감소, 비용이 감소, latency(지연 시간) 감소를 기대할 수 있기 때문이다.

TCP의 keep-alive와 HTTP의 keep-alive의 차이는 무엇인가요?

  • HTTP: Socket 에서 IN/OUT의 Access 가 마지막으로 종료된 시점에서 정의된 시간까지 Access가 없어도 대기하는 구조
  • TCP: Keep-Alive 를 사용하여 장애 감지

0개의 댓글