네트워크 - Stateless와 Connectionless

네민·2025년 1월 22일
0

우당탕탕 cs 공부

목록 보기
8/14

Stateless (무상태)

서버가 클라이언트의 상태를 저장하지 않는 것을 의미한다.

이때는 서버가 클라이언트의 요청에 대해 단순 응답만 보내는 역할을 한다. 대신 필요에 따라 외부DB (Redis 같은~)에 저장하여 관리할 수 있다.

쉽게 말해서, 클라이언트의 상태를 저장하지 않기 때문에 클라이언트는 요청할 때마다 “나 누구고 지금 이런 상태니까 이거 해줘!!” 이런 느낌으로 자신의 부가 정보까지 포함해서 보내야한다. → 더 많은 데이터가 소모된다.

그래서 이걸 어디서 사용하냐?

HTTP, UDP에서 사용이 된다. HTTP는 애초에 클라이언트와 서버 사이의 요청과 응답을 독립적으로 처리하도록 설계된 거라서, 한 번 요청하고 끝나면 잊어버린다. UDP도 비슷하게 동작한다.

그럼 stateless를 쓸까?

앞서 말한 것처럼 서버에서 굳이 클라이언트의 상태를 굳이 저장할 필요가 없는 경우에 쓴다. 상태를 저장하려고 하면 서버의 리소스를 더 많이 사용해야 되기 때문이다. 그리고 서버에 저장을 하지 않기 때문에 서버가 멈추거나 어떠한 이유로 못 쓰게 된다고 해도 문제가 생기지 않는다!! 클라이언트는 그냥 다른 서버로 요청을 보내면 되기 때문이다.

stateful은?

stateful은 이와 반대 개념이다. 서버가 클라이언트의 상태를 저장하고, 그 상태를 기반으로 다음 요청을 처리한다. 하지만 이렇게 하면 서버가 상태 정보를 계속 들고 있어야 하니까, 서버 간 데이터를 동기화해야 하는 부담이 생긴다. 예를 들어, A 서버에서 작업 중이던 클라이언트가 A 서버에 문제가 생겨서 B 서버로 넘어가야 한다고 하면, B 서버가 클라이언트 상태를 모른다면 문제가 생길 수 있다. 그렇다고 모든 서버가 정보를 공유하면 메모리를 많이 쓰게 되고, 관리도 복잡해진다.

결론

그래서 상황에 따라 Stateless와 Stateful 중 뭐가 더 적합한지를 결정해야한다. 서버가 간단히 요청과 응답만 처리하면 되는 경우엔 Stateless가 훨씬 효율적이고, 클라이언트의 상태를 유지해야 하는 시스템에서는 Stateful이 더 나을 수도 있다.


Connectionless (비연결성)

연결없이 데이터를 주고받는 방식을 의미한다.

마치 편지를 보내는 것처럼, 보내는 쪽에서 “보냈다!”하고 끝이고, 받는 쪽에서는 “왔다!”하고 받으면 끝이다.

데이터를 전송하기 위해 미리 연결을 설정하거나 연결 상태를 유지하지 않아도 된다는 걸 의미한다. UDP가 비연결성의 대표적인 예이다.

그럼 Connectionless가 어디에 쓰일까?

속도가 중요한 상황에서 사용된다! 예를 들면, 온라인 게임이나 스트리밍 서비스처럼 실시간성이 중요한 곳에서 사용이 된다. 이때는 데이터 몇 개가 사라져도 큰 문제가 없고 빠르게 데이터를 주고받는게 중요하기 때문이다.

그럼 왜 쓸까?

아까 말했듯이 연결 과정이 없기 때문에 전송 속도가 빠르고, 간단하고, 리소스가 적게 든다.

하지만…!!

단점은 역시 데이터가 사라질 가능성이 있기 때문에, 데이터 하나하나가 중요하다면 TCP 같은 방식을 사용하도록 해야한다.


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

TCP의 keep-alive란?

TCP의 Keep-Alive는 활성화된 TCP 연결이 유효한지 확인하기 위한 메커니즘이다. 연결이 일정 시간 동안 유휴 상태일 때, 연결이 여전히 살아 있는지 확인하려고 TCP 패킷을 주기적으로 보내는 것이다.

동작 방식

  1. 지속적인 확인: 연결이 일정 시간 동안 데이터 전송 없이 유지되면, TCP는 작은 “Keep-Alive 패킷”을 보내서 여전히 연결 상태인지 확인한다.

  2. 응답 확인: 상대방이 응답하면 연결이 유지된다고 판단하고, 응답이 없으면 연결이 끊어진 걸로 생각한다.

    운영체제마다 Keep-Alive 패킷의 간격, 재전송 횟수, 타임아웃 시간 등이 다를 수 있다.

HTTP의 keep-alive란?

HTTP에서 Keep-Alive는 HTTP 요청/응답 후에도 TCP 연결을 끊지 않고 재사용하는 기능이다. HTTP 1.1에서는 기본적으로 활성화되어 있고, 연결을 재사용하지 않으려면 Connection: close 헤더를 명시해야 한다.

이거는 웹소켓이나 SSE 알림 구현할 때 지속적인 연결을 위해 건드려 본 기억이 난다.


느낀점
이때까지는 cs 공부하고 알게 된걸 단순 정리하는 형식으로 적었었는데, 공부하면서 블로그 글들을 읽어보니 너무 불편하고 처음 보는 사람 입장에서는 잘 모르겠다는 생각이 들었었다. 그래서 앞으로 글을 적을 때는 예시를 적을 수 있다면 적고 최대한 풀어서 적어야겠다는 생각을 했다.
나만 보는 글이 아니라 남들이 보고 이해할 수 있는 글을 적고 싶어졌다.

profile
기록하자

2개의 댓글

comment-user-thumbnail
2025년 1월 24일

잘 보고 갑니다

1개의 답글