이론 48

게임 네트워크 - 보안

패킷 스니핑 중간자 공격을 막기 위해서는 민감한 데이터를 암호화해야 한다. 평범한 리플리케이션 같은 정도라면 중간자가 감청해봤자 별 소용이 없을 것이다. 그럼에도 패킷 스니핑 측면에서는 암호화도 고려할만 한다. 모든 네트워크 게임은 호스트 머신에서 수행하는 패킷 스니핑에 노출되어 있다고 봐야 한다. 아무리 암호화를 해도 실행 파일 어딘가에는 암호를 해독하는 체계가 있을 것이고 이런 체계를 밝히는 것은 시간 문제이다. 그럼에도 잠재적인 치터가 분석하기 어렵도록 암호화를 하는 게 좋다. 더 나아가 암호 키와 메모리 오프셋을 주기적으로 변경하는것이 좋은데, 치터를 귀찮게 할 수 있기 때문이다. 어쨋든 결국에 암호화는 뚫릴 것이기 때문에 호스트에게 내려주는 정보를 제한하는 것도 하나의 방법이다. (ex. FPS..

이론/네트워크 2023.09.17

네트워크 - 스코프

객체 스코프 멀리 떨어져서 알 필요 없는 플레이어의 정보를 동기화 하는것은 리소스 낭비이다. 따라서 어떤 객체가 특정 클라이언트의 동기화 대상이라면, 해당 객체가 클라이언트의 스코프 내에 있다 혹은 해당 클라이언트와 연관성(relevancy)이 있다라고 표현할 수 있다. 스코프를 나눌 때, 얼마나 떨어져 있는지를 기준으로 쓸 수 있다. 그러나 FPS의 줌같은 개념때문에 거리만 가지고 판단하는것은 애매하다. 또 벽 뒤나 등 뒤에 있는 객체들은 거리만 가지고 판단하기 애매한데, 그래서 가시성을 객체 스코프 판정에 활용하기도 한다. . 스태틱 존 스코프에 포함되는 잠재적인 객체 수를 줄이는 방법 중 하나로, 월드를 고정된 여러 지역으로 나눌 수 있다. 이렇게 나준 지역을 스태틱 존이라고 한다. 가령 MMORP..

이론/네트워크 2023.09.10

네트워크 - 레이턴시 및 신뢰성

레이턴시 레이턴시 원인 네트워크가 아닌 레이턴시로 입력 샘플링, 랜더링, 인풋렉 등등이 있을 수 있다. 네트워크에 해당하는 레이턴시에는 다음 지연들이 포함된다. 처리 지연 : 네트워크 주소 변환이나 암호화 => 요즘 라우터 성능이 좋아서 크게 신경쓰지 않아도.. 전송 지연 : 물리적 매체에 비트를 기록하는 시간. => 서버의 물리적 위치 조정이나, 패킷을 가능한 크게 만들어서 헤더 비중이 적게 만들어 개선할 수 있음. 큐잉 지연 : 라우터의 처리 용량보다 많은 패킷이 도착했을 때 큐잉해놓고 나중에 처리. 이때 대기열에 머무르는 시간 => 적은 수의 큰 패킷을 보내는게 유리하다. 전파 지연 : 매체를 타고 전파되는데 걸리는 시간. => 일단 물리적 거리를 가깝게 할 수 있음. 그러나 라우터등의 배치에 따라..

이론/기초 2023.09.01

게임 네트워크 토폴로지

개요 네트워크 토폴로지란 여러 컴퓨터가 네트워크상에서 연결되어 있는 모습을 말한다. 대표적으로 클라이언트 - 서버 P2P 가 있으며, 둘을 섞은 토폴로지도 존재한다. . 클라이언트 - 서버(CS) CS 토폴로지에서는 게임 인스턴스 하나를 서버로 두고 나머지 게임 인스턴스는 그 서버에 접속하는 클라이언트가 된다. 각 클라이언트는 오직 서버하고만 통신하며, 서버는 이들 모든 클라와 통신을 전담한다. 클라가 n개면 O(2n)개의 연결이 존재하게 된다. 각 클라가 초당 b바이트 데이터를 보낸다면, 초당 b*n 바이트를 수신할 수 있도록 서버의 대역폭을 확보해야 한다. 즉, 클라가 증가할수록 서버의 대역폭도 선형으로 늘어난다. 클라이언트가 받는 데이터의 양도 작게나마 늘어나긴 한다. 받아야 하는 데이터가 많아지기..

이론/기초 2023.08.27

OS - 라이브러리

라이브러리 여러 프로그램에서 자주 사용하는 함수와 데이터들을 실행이 가능한 바이너리 형태로 묶어놓은 파일을 의미한다. 다음 코드를 보자 #include int main() { printf("Hello"); return 0; } 실행 가능한 printf 함수의 바이너리는 어디에 있을까? stdio.h에 있을까? 그 안에 존재하는 것은 printf함수의 정의가 아니라 선언이다. 그럼 어디에있음? "라이브러리"에 있다. 라이브러리는 정적 라이브러리랑 동적 연결 (Dynamic link)라이브러리로 나눌 수 있다. . 정적 라이브러리(static library) static library를 만드는 상상을 해보자. 헤더에 함수를 선언하고, 적절히 정의도 해놨다. foo.h / foo.cpp 이렇게하고 컴파일 돌리..

이론/기초 2023.08.20

OS - 메모리 관리 기초

메모리 페이지의 상태 페이지의 상태는 Reserve/Commit/Free가 있음. Commit상태는 하드랑 RAM모두 포함한다. 힙 메모리를 할당받으면 해당 메모리 페이지가 Commit 상태가 되는 것. 처음에는 Free상태였다가 할당받으면 Commit 문제없지? 그러면 Reserve는 왜 필요할까? 그냥 나중에 할지도 모르니까 예약해두는거임. 이러면 다른 요청에 의해서 reserve된 페이지는 할당에서 제외시킴 . 페이지 할당 가상 메모리 시스템은 페이지 관리로 관리되기 때문에 페이지 중간부터 할당을 시작할 수 없고, 페이지 크기의 배수 단위 할당만 가능함. 그러면 메모리 할당 시작 주소는? 페이지 크기일까? => 아님, 그러면 메모리 파편화가 심해질 수 있음 그래서 더 넓은 값을 할당의 경계로 삼는다..

이론/기초 2023.08.13

OS - 쓰레드

컨텍스트 스위칭 프로세스와 마찬가지로 쓰레드도 컨텍스트 스위칭이 존재하는데, 프로세스보다는 훨씬 빠르다. 주된 이유는 캐쉬 메모리때문인데, 프로세스와 달리 쓰레드끼리는 스택영역을 제외한 메모리들을 공유하기 때문에 캐쉬 활용율이 높다. + 프로세스 전환에 비하여 일부 레지스터를 더 공유할 수 있긴 한데 이런 차이는 크지 않을 것. . 커널모드 유저모드 프로세스는 독립된 메모리 공간을 갖는데, 시스템 함수 등의 호출을 위해서 본인에게 할당받은 메모리 공간을 벗어날 필요가 있다. 이런 경우를 지원하기 위해 커널모드가 있으며, 커널이 실행되어야 하는 경우에 프로세스가 커널모드에서 돈다. 커널에 접근할 필요가 없는 경우라면 프로세스는 유저모드에서 돌고, 커널 영역으로의 접근이 차단된다. 그러나, 이런 모드 전환은..

이론/기초 2023.08.06

OS - 프로세스

프로세스 프로세스란? 프로세스는 실행 중인 프로그램을 의미한다. 프로그램을 실행하는 순간, 메모리 할당이 이뤄지고 이 공간으로 바이너리 코드가 올라간다. 이 순간부터 프로그램은 프로세스라고 불린다. . 프로세스의 구성 요소 메모리 프로세스의 메모리는 4가지 영역으로 구성된다. Data영역 : 전역변수나 static변수의 할당을 위해 존재 Stack영역 : 지역변수 할당과 함수 호출시 전달되는 인자들이 저장되는 영역. Heap영역 : 동적 할당을 위해 존재 Code 영역 : 실행파일을 구성하는 명령어들이 올라가는 영역. . 레지스터 셋(register set) 프로그램을 실행하면 CPU의 레지스터들이 해당 프로그램을 위한 데이터로 채워질탠데 이런 데이터 상태 또한 프로세스의 일부로 볼 수 있다. . 프로세..

이론/기초 2023.07.30

아스키코드 & 유니코드

문자의 표현방법 아스키코드는 1바이트임. 알파뱃+확장문자 해도 256개가 넘지 않으니까. 그런데 이러면 다른 영어가 아닌 언어들은 '곤란' 그래서 유니코드는 2바이트를 씀. 이러면 65536개 표현 가능. 문자셋에 대해 알아보자. 문자셋은 약속된 문자의 표현방법을 의미한다. SBCS, MBCS, WBCS로 나눌 수 있다. SBCS(Single Byte Character Set) : 모든 문자를 1바이트로 표현한다. 아스키코드가 대표적 WBCS(Wide Byte Character Set) : 모든 문자를 2바이트로 표현한다. 유니코드가 대표적이다. MBCS(Multi Byte Character Set) : 모든 문자를 '여러 바이트' 즉 어떤 문자는 1바이트로 어떤 문자는 2바이트로 표현하는 식이다. 이 ..

이론/기초 2023.07.23

컴퓨터 구조 기초 - 4

메모리 보통 메모리라고 하면 RAM을 생각하지만 CPU의 레지스터, 캐쉬, 하드디스크, USB등도 메모리라고 할 수 있다. . 메모리 계층 구조 일반적으로 메모리 계층을 레지스터 / L1 캐시 / L2캐시 / RAM / 기타 저장장치(HDD,SDD, 플래시 메모리) 위와 같이 구분할 수 있는데, 당연히 레지스터 접근이 가장 빠르다. 레지스터가 아닌 메모리에서 데이터를 입출력 하기 위해서는 메모리 버스를 거쳐야 한다. 그만큼 느리겠지? 메인메모리를 제외한 L1, L2캐쉬에 필요한 데이터가 존재할 확률은? 무려 90%이상! 물론 세팅마다 다르겠지만 어 그러면 그냥 캐쉬를 1테라 쓰면 안됨? ㅇㅇ 안됨. 너무 비싸고 기술적인 문제도있음 . 캐시 템퍼럴 로컬리티 (Temporal Locality) : 한 번 접..

이론/기초 2023.07.16