게임에서 서버 측은 게임의 논리와 규칙, 데이터 지속성, 보안 및 연결된 모든 클라이언트 간의 게임 상태 동기화와 같이 클라이언트에서 수행되지 않는 모든 처리를 담당한다.
OSI 전송 계층에 있는 연결 지향적이고 신뢰할 수 있는 바이트 스트림 서비스다. 기본적으로 두 호스트 간의 연결을 설정하고 데이터를 교환하는데 사용하며 송신측에서 수신측으로 데이터를 보낼 때 서로 응답을 주고받으며 데이터가 손실되거나 잘못 수신되지 않게끔 하는 인터넷 프로토콜 이다.
체크썸은 세그먼트(데이터를 나누는 단위)에서 오류 검사를 수행하는데 사용되는 TCP 헤더의 16비트 필드입니다.
보통 데이터 무결성을 보장하기 위해서 사용합니다.
데이터가 변경되지 않았음을 보장하는 것이다.
CheckSum의 과정을 간단하게 살펴보면
1.TCP 스택은 전송된 데이터의 체크섬 값을 계산하여 데이터와 함께 수신 시스템으로 보냅니다.
2.수신 시스템은 체크섬을 다시 계산하여 데이터와 함께 전송된 값을 비교하여 일치한지 안하는지 확인한다.
2-1. 값이 일치한다면 전송된 데이터는 변경되지 않았음을 의미하고
2-2. 값이 다르면 TCP에서 수신된 데이터의 가능한 변경 가능성을 감지하고 수신기는 손실되거나 손상된 데이터 패킷의 재전송을 요청한다.
세그먼트란 위에서도 말했다시피 데이터를 나누는 단위인데 물리적으로 데이터를 나누어 저장하는 것이 아닌 논리적으로 나누는 것이다. - 세그멘 테이션 기법
(단순히 일정한 길이만으로 나누는 것이 아닌 종류로써 나누는 것이다.)
세그멘테이션 기법을 쳐보면 OS에서 작동하는 세그멘테이션 기법이 많이 나오는데 OS의 방식처럼 내부에 세그멘테이션 테이블을 만들어서 메모리의 주소값을 저장하는 방식이 아닌 각종 데이터를 그대로 실어서 보내주는 것이다.
게임서버와 게임 클라이언트 간의 링크 설정이다.
이 연결은 게임의 요구 사항에 따라서 영구적이거나 비영구적이며 이는 서버가 여러 클라이언트 간의 데이터 동기화를 처리하여 플레이어가 동일한 가상 환경에서 서로 상호작용할 수 있도록 하는 멀티플레이 게임에서 정말 중요하다.
게임이 서버의 컴퓨팅 파워,메모리,스토리지 및 네트워킹 기능을 사용하는 방식을 광범위하게 나타낸다.
이런 리소스는 게임 성능과 응답성을 보장하는데 매우 중요하기에 지속적으로 모니터링을 해줘야하는데
CPU 사용량,메모리 사용율,스토리지 용량,네트워크 대역폭/데이터 베이스 성능을 주로 모니터링 한다.
개발자는 늘 서버를 만들 때 비효율적인 코드로 인하여 리소스 사용량이 증가하는것을 염두에 두고 개발을 해야만 한다.
단일 TCP 세그먼트에서 수신할 수 있는 최대 데이터 양을 정의하는 TCP 기능이다. => 즉 한번에 얼마나 수신할 수 있는지에 대해서 설정
데이터 링크 계층 MTU(Maximum Transmission Unit) - TCP 및 IP 헤더의 크기
여기서 MTU란 네트워크에 연결된 장치가 받아들일 수 있는 최대 데이터 패킷 크기이다.
이 방법은 IP계층에서 단편화를 방지하여 전송된 데이터 패킷이 네트워크 경로에 최적화되도록 하여 잠재적인 전송 비효율성 또는 패킷 손실 문제를 방지한다.
여기서 말하는 단편화는 기억장치의 빈공간 또는 자료가 여러개의 조각으로 나뉘는 현상인데 OS의 페이징기법이나 세그먼트 기법에서는 8byte의 빈공간에 어떻게 넣을 것인지에 대한 최적,최악 기법 등이 있지만
여기서 말하는 단편화라는 것은 해당 패킷을 얼마나 조각낼지에 대해서다.
최대 세그먼트 스케일링이 높다면 => 데이터를 한번에 수신할 수 있는 양이 늘어날 것이고 => 그렇다면 단편화를 많이 하지 않더라도? 데이터를 송수신하는데 문제가 없다.
다만 너무 높아도 문제가 좀 있겠지만..
MongoDB의 ObjectID에서 unix 시간으로 설정해놓은 것이었다만..
서버 측 게임 개발에서 특정 이벤트가 발생한 날짜와 시간을 인코딩하는 일련의 문자다.
위의 사진과 같은 개념인데 즉, 특정 이벤트가 발생한 날짜와 시간을 기록해두는 것이다.
이렇게 기록한 타임스탬프는 특정 이벤트가 발생한 시퀀스를 추적하거나 문제를 디버깅,로깅하거나 모든 종류의 데이터 분석을 수행할 때 중요하다.
이런 타임스탬프는 마지막으로 수정된 시점을 클라이언트에 알리기 위해서 HTTP 헤더에 포함되는 경우가 많다.
서버와 클라이언트 또는 서버 자체의 다양한 구성 요소 간의 데이터 이동을 의미한다.
플레이어의 점수,게임 상태 및 업데이트와 같은 게임 데이터는 일관되고 업데이트 된 게임 환경을 보장하기 위해 자주 전송된다.
효율적이고 안전한 데이터 전송이 중요하다.
네트워크에서 패킷 손실을 처리하는 효율성을 향상시키기 위해 TCP에 도입된 메커니즘이다.
기본적으로 TCP는 패킷 손실 감지시, 성공적으로 수신되었는지에 대한 여부에 관계없이 손실된 패킷 이후에 전송된 모든 패킷을 재전송한다.
그렇지만 SACK를 사용하게되면 수신자가 연속되지 않은 패킷을 인식할 수 있게되어 어떤 패킷이 수신되었는지 / 수신되지 않았는지를 정확하게 알 수 있게 된다. => 그렇기에 수신되지 않은 패킷만 다시 요구할 수 있게 된다.
DoS는 인터넷 트래픽의 홍수로 네트워크 또는 서버에 무수히 많은 불필요한 요청으로 네트워크,서비스 또는 서버의 정상적인 기능을 방해하려는 악의적인 시도이다.
라이엇 서버가 맞은 DDos(분산 서비스 거부)란 무엇일까?
이 사진처럼 DDos는 여러대의 컴퓨터로 서버에 계속 요청을 보내어 서버를 과부하시켜버리는 것이다.
이런 DoS나 DDos는 게임의 가용성과 성능에 큰 영향을 미친다.
권한이 없는 사용자가 두 노드 또는 엔드포인트 간의 유효한 연결에 침입하는 것이다.
공격자는 이 두 노드간의 트래픽을 가로채서 연결을 '하이재킹(빼앗는다)'한다.
공격자는 빼앗은 연결을 통해서 중요한 데이터를 노출하거나 전송 중인 데이터를 위변조하거나 클라이언트를 비인가 서버로 리디렉션(사용자가 처음 요청한 URL이 아닌 다른 URL로 보내는 것) 할 수 있다.
따라서 보안 프로토콜의 구현이 중요하다.
게임 중 특정 작업을 방지하거나 허용하기 위해서 자주 사용된다.
LOL의 CC기를 생각하면 된다.
티모의 실명 다트를 맞게되면 평타가 전부 다 빗나가게 되는 것과 같은 개념이다.
이 거부권에서 중요한 것은 플레이어나 캐릭터의 특정 작업을 방지하였는데 허용이 되거나, 작업을 허용했음에도 할 수 없게 되는 버그가 발생하는지 확인해야만 한다.
ㅈ망겜
UDP(사용자 데이터그램 프로토콜)은 인터넷을 통해 데이터를 전송하는데
TCP와 달리 송수신자간의 연결을 설정하지 않고 독립적이고 불연속적인 데이터 패킷을 전송합니다.
또한 서로가 데이터를 송수신했음을 서로에게 알려주지 않는다.
그렇기에 TCP와 다르게 안정성이 떨어지지만 속도는 빠르다.
=> 실시간으로 처리해야할 때 자주 사용했었다.
UDP와 같은 프로토콜을 사용하는 네트워크 통신에서 데이터를 전송하는 기본 단위이다.
데이터 그램은 서로 독립적으로 작동하므로 전송된 순서와 다른 순서로 수신되거나 전혀 수신되지 않을 수도 있다.
TCP와는 다르게 이런걸 전송 순서나 전송 확인을 하지 않게되므로 속도가 빠르고 효율적이다.