서버란 - 영업중인 식당과 유사하다. 손님이 올 수 있도록 식당을 열고 대기중인 상태.
※ 서버의 종류
1. 웹서버 (HTTP)
ㆍ 손님이 음식을 받아서 떠나면 그 후론 연락이 끊긴다.
ㆍ 질의/응답의 형태
ㆍ 드물게 정보를 요청/갱신한다
ㆍ 실시간 Interaction이 필요하지 않다.
ㆍ 식당에서 손님한테 먼저 접근할 일은 없다
ㆍ 주문 후 손님이 떠나면, 손님의 상태를 당분간 잊고 지낸다 (Stateless)
- 웹서버는 정말 엄청 많다 상황에 맞게 사용하면 된다. 처음부터 만드는 경우는 거의 없다고 보면 된다. -
ASP.NET (C#)
Spring (Java)
NodeJs (Javascript)
DJango,Flask (Python)
2. 게임서버 ( TCP Server, Binary Server, Stateful Server)
ㆍ <일반 식당>
ㆍ 서빙 징원이 와서 손님에게 물어볼 수도 있고, 손님이 추가 주문하기도 하고, 실시간 Interaction이 있다.
ㆍ 요청/갱신 횟수가 많다
ㆍ 실시간 Interation이 필요하다
ㆍ 언제라도 직원이 손님한테 접근이 가능해야 한다.
ㆍ 손님이 식당에 머무는 동안, 손님의 상태를 보며 최상의 서비스를 제공한다(Stateful)
- 게임서버는 게임에 따라 요구하는 사항이 너무 다르다. 직접 만드는경우가 많다 -
ㆍ 최적의 프레임워크 라는 것이 존재하기 애매함
ㆍ 예를들어 초밥, 삼겹살, 호텔뷔페 등등 메뉴가 다른데 식당인테리어와 채용 직원 수가 동일할 수 없다.
ㆍ 그럼 무엇을 고려해야할까?
고려할 대상 | 게임 서버의 유사성 |
손님 한도(몇 명 까지 받을 수 있는지) | 최대 동시 접속자 |
한 방에 들어갈 수 있는 손님의 일행 한도(인테리어) | 게임 장르 및 채널링 |
직원 역할 구분(겸직 가능) | 게임 로직(요리사), 네트워크(서빙), DB(결제) |
직원은 몇 명을 둘지? | 쓰레드 개수 |
요리사 / 서빙 / 결제직원 비율은 어떻게? | 쓰레드 모델 |
주문은 어떻게 받을까? (손님이 불러서?, 벨눌러서?) | 네트워크 모델 |
손님이 기다릴 수 있는 시간 한도 | 반응성(FPS,MMO RPG) |
장부 및 결제는 어떻게? | 데이터베이스 |
클라서버 vs P to P 서버
ㆍ 옛날엔 P to P 방식을 사용했었는데 요즘은 거의 사용하지 않고, 클라서버 방식을 많이 사용한다.
ㆍ 같은 클라이언트 끼리는 연결되어 있지 않고 클라이언트는 서버와만 연결되어 있다.
ㆍ 서버와 클라가 어떻게 소통할 것인지.... 그걸 잘 생각을 해야된다.
ㆍ 전자 방식이 데디케이트 서버. 언리얼에서 지원하는 데디서버가 있다.
클라 작업을 하면서 서버와 소통을 고려할만한 것들이 뭐가있을까?
정~말 많은게 있지만 크게 5개만 보자
1. 이동 동기화
ㆍ 당연히 이동에 대한 부분은 mmo든 fps든 대부분의 게임이 중요할 것이다.
ㆍ 내가 컨트롤하는건 내 플레이어1개이고 나머지는 다른 사람들이 하든 뭐든 할거다... 서버에서 이동에 대한 동기화만을 처리하는 그런 부분이 있어야 할 것
ㆍ 클라에서 요청을 할지..? 서버가 허락하면 움직일지??
2. FPS에서 슈팅을 해서 적을 피격, 출혈
ㆍ 시작되는 부분의 시작점은 어디일까? 클라이언트카 쐇다는걸 서버에게 알리면!
-> 서버에서 처리해서 누구누구가 피격을 받았다! 라는걸 다른 모든 클라이언트에게 알린다.
ㆍ 출혈 이펙트는 서버에서 해야할까?? 클라에서 해야할까??
-> 이런건 클라이언트가 처리해도 될거다. 그래서 게임해보면 서버 이상하면 피는 튀기는데 데미지는 안들어가고 이런 상황 본적있을것
3. MMO RPG에서 캐릭터 스텟창UI열기
ㆍ 서버에게 요청해서 이창을 열겠다할까? 아니면 서버에게 요청해서 열어달라할까?
-> 그냥 메모리에서 가지고있는 정보를 여는거니 클라에서 하면 될듯?
-> 변동되는hp나 mp같은건 서버에게 요청해서 받아낼태지만 초기값은 처음 서버에게 모두 받아왔었을 것이다.
-> 즉 스탯창 열었다는 사실은 서버에게 알릴 필요는 없다.
4. 귓말 시스템을 이용해 Season이라는 아이디를 가진 사람에게 욕설
ㆍ 귓말 시스템.. 시작은 클라에서 명령을 내리겠지?? 그럼 서버에선 특정 유저에게 타겟팅해서 해당 ID를 찾고 그 유저에게만 패킷을 보내서 처리를 하면될듯
5. 배그에서 자기장이 생성됨을 알림
ㆍ 자기장이 생성되었다... 이건 서버가 주도적으로 해야겠다. 모두에게 어처피 다 뿌려줘야 하니까
언리얼의 데디케이트 서버를 사용하지 않으면 저런 모~~든 상황들을 다 구현해서 사용해야 한다. 하지만 온라인게임에서 일반적으로 사용하는 그런 부분들은 언리얼에서 지원하는 데디서버를 사용하면 되겠다.
서버 기초에대한 재밌는 영상
https://www.youtube.com/watch?v=YHswt4VCeJs
출처: 유튜버 코딩애플님 영상
귀에 쏙쏙박힌다
'서버 > 서버 이론' 카테고리의 다른 글
HTTPS (0) | 2024.01.18 |
---|---|
HTTP와 HTTP 메시지 (0) | 2024.01.18 |
OSI 7계층 (0) | 2024.01.17 |
패킷과 패킷통신, TCP/IP (0) | 2024.01.17 |