CS

비연결성(Connectionless)과 무상태(Stateless)

흰곰돌이 2024. 4. 22. 23:41

[ Stateless vs Connectionless ]

 

Stateless (무상태성): 클라이언트와 서버 사이에 상태를 유지하지 않는다는 뜻

필요한 상태에 대한 정보를 클라이언트가 가지고 오기 때문에 클라이언트의 요청에 어느 서버가 응답해도 상관 없다. 따라서 클라이언트의 요청이 대폭 증가하면 서버를 증설해 해결할 수 있다.

 

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

클라이언트가 서버에 요청을 하고 응답을 받으면 바로 TCP/IP 연결을 끊어 연결을 유지하지 않음으로써 서버의 자원을 효율적으로 관리하고 수 많은 클라이언트의 요청에 대응할 수 있게 한다.

 

즉, 무상태성은 클라이언트와 서버 간에 상태 정보를 들고있지 않아 클라이언트가 상태 정보를 일일히 http에 실어 요청해야되는 것을 말하고, 비연결성은 클라이언트와 서버 간에 네트워크 연결이 끊어져 단절된다고 이해하면 된다.

 

 

[ HTTP ]

 

연결을 유지한다면, 서버와 클라이언트의 연결은 서로의 네트워킹 요청이 없더라도 계속해서 유지된다.
자원이 계속해서 사용된다.

이러한 점 때문에, HTTP는 기본이 연결을 유지하지 않는 모델이다. (비연결성) 

즉, 서버와 클라이언트의 Connection 연결을 지속하지 않는다.

 

 

[ 지속 연결 (Persistent Connection) ]

 

연결을 유지하지 않는다면, 서버의 자원을 효율적으로 사용할 수 있다.

다만, 클라이언트가 연결을 계속 끊는다는 것은 TCP/IP 연결을 매번 새롭게 맺어야 한다는 것을 뜻한다.

즉, TCP 3 way handshake를 매번 해야하고, 이는 시간이 걸린다.

이러한 문제는 지금 HTTP 지속 연결(Persistent Connections)로 문제 해결하고 있다.

즉, 기본은 비연결성인데, 성능 최적화를 위해서 약간의 연결 유지를 가져간다고 생각하면 된다.

 

 

[ 연결 지향성 vs 연결성 ]

 

헷갈리면 안되는게, 연결 지향성과 연결성은 다른 것이다.

연결 지향성은 3 way handshake와 같이 먼저 요청 보낼 곳과 연결할 수 있는 지를 체크하는 것이고,

연결성은 응답 이후에도 계속 연결이 되어있음을 뜻한다.

 

 

[ HTTP와 TCP ]

 

HTTP는 TCP가 기반이기 때문에 3 way handshake 방식의 연결 지향성을 가진다.

그리고 비연결성과 약간의 연결성의 특징을 모두 가지는 지속 연결의 특징을 가진다.

그리고 서버가 클라이언트의 상태를 저장하지 않는, Stateless하다. 

반대로 TCP는 응답 후에도 연결을 유지하는 연결성의 특징을 가지며 Stateful하다.

 

 

[ Stateful vs Stateless ]

<Stateful>
고객: 이 바나나 얼마인가요?
점원 : 4000원입니다.

고객 : 2개 구매할게요.
점원 : 8000원 입니다. 신용카드, 현금 중에 어떤걸로 결제하시겠어요?
          (구매 상품과 수량에 대한 state 저장/유지)

고객 : 신용카드로 하겠습니다.
점원 : 8000원 결제 완료되었습니다.
         (구매 상품, 수량, 결제 수단에 대한 state 저장/유지)

 

 서버가 클라이언트의 상태를 저장하는 Stateful의 경우에 점원이 바뀐다면, 지니고 있던 상태 정보를 다른 점원에게 미리 알려주어야 한다.

   만약 상태 정보(문맥)을 전달하지 않는다면, 다음 점원은 고객의 말을 이해하지 못할 것이다.

● 클라이언트는 통신하던 서버와 계속 통신해야 하므로, 서버 장애 발생 시 문제가 커진다.

 따라서 서버의 확장이 쉽지 않다.

 

<Stateless>
고객 : 이 바나나 얼마인가요?
점원 : 4000원 입니다.

고객 : 바나나 2개 구매할게요.
점원 : 바나나 2개는 8000원입니다. 신용카드, 현금 중에 어떤걸로 결제하시겠어요?

고객 : 바나나 2개를 신용카드로 결제하겠습니다.
점원 : 8000원 결제 완료되었습니다.

 

● 클라이언트가 서버에게 정보를 추가적으로 알려주어야 한다.   ex) 2개 구매  바나나를 2개 구매

● 서버가 클라이언트의 상태를 저장하지 않기 때문에, 서버(점원)이 바뀌어도 하던 일을 이어서 진행할 수 있다.

 클라이언트의 요청이 증가해도 서버를 대거 투입할 수 있다.  Scale out : 응답서버를 쉽게 바꿀 수 있다.

 

 

 

참고 출처 :

1. https://www.inflearn.com/course/http-%EC%9B%B9-%EB%84%A4%ED%8A%B8%EC%9B%8C%ED%81%AC

2. https://m42-orion.tistory.com/106