0) 네트워크 프로그래밍
디바이스간의 데이터를 주고 받을 수 있도록 프로그래밍 하는 것을 의미한다. 온라인 게임들을 게임 서버와의 상호작용을 통해 로직을 수행하고 데이터를 주고 받는데, 이것을 네트워킹이라고 할 수 있겠다. 싱글 플레이 게임과 온라인 게임에서 고려해야할 차이는 무엇일까?
아마 '서버와의 통신'이라는 것에서 생길 핑(Ping)이다. 지연시간(Latency) 라고도 하는데, 빛이 물리적으로 이동하여 데이터를 주는데 걸리는 시간이다. 당연히 같은 컴퓨터 내에서의 데이터 연산이야 눈 깜짝할 새도 아니겠지만, 지구 한바퀴를 도는데는 133ms 정도가 걸린다. 실제로 스타크래프트2를 통해 북미서버(특히나 동부)나 유럽서버를 가보면 핑이 100을 넘어가며 가끔씩은 300까지 튈 때가 있다. 이러한 경우 프로브를 움직일 때 지연시간 0.1초나 되며, 이는 매우 답답하게 느껴진다.
133ms의 경우 초당 60프레임 기준 8프레임 정도가 밀리는 것이다.
두번째는 유저의 PC 환경이 아닐까? 대표적으로 클라이언트 프리징이 발생하여 데이터에서 패킷이 밀려버린다면, 동시에 플레이하고 있는 게임 세계에서 서로 이상한 행동만 취하는 것으로 보일지 모른다.
세번째는 보낸 패킷이 저기 어딘가에서 떠돌다가 아주 늦게 도착할 수도 있다는 것이다. 서버에서 보낸 패킷은 서버와 클라이언트가 다이렉트로 이어져있는 것이 아니라, 여러 지점을 거쳐서 이어져있다. 따라서 패킷의 이동 경로 또한 일정하지 않아 이번에 보낸 패킷과 다음에 보낼 패킷 중 어떤 것이 먼저 도착할 지 알 수 없다는 것이다(패킷을 쪼개서 나눌때 순서를 명시하곤 한다).
1) 게임 클라이언트 서버
게임에서는 클라이언트와 서버의 동작 방식이 어떻게 될까? 동기화하느냐에 따라에 따라 동기와 비동기의 방식이 있고, 연결에 따라 클라이언트와 서버, P2P와 Hosting으로 나눌 수 있다.
1-1) 동기와 비동기
동기는 말 그대로 동기화하여 데이터를 주고받는 것이다. 어떤 값에 대한 확인을 받으면 다음 행동을 실행한다.
1-2) 클라이언트와 서버
이 예제는 동기방식의 서버이다. 보통 Stateful 이라고 하며, 실시간 온라인 게임에 적용된다.
사용자의 컴퓨터에 깔리는 클라이언트와, 게임사의 서버가 있다고 보자.
다음과 같이 클라이언트가 서버에 로그인을 요청하면, DB에서 서버가 저장된 정보를 받아온다. 클라이언트가 보내온 데이터에 따라 메모리에 실시간으로 컨텐츠 로직 결과를 처리하고, 클라이언트와 주고 받는다.
로그아웃을 요청받으면, 서버는 실행된 결과를 DB에 저장하는 방식이다.
1-3) P2P (Peer-to-Peer)
Peer-to-Peer는 클라이언트끼리의 연결을 통해 로직 계산 후 서로에게 그 결과를 넘겨주는 방식으로 동작한다. 서버의 리소스 소모는 적을 것이다. 이 때도 몇가지 방식이 있는데, 대표적으로 호스팅(Hosting)과 풀리커넥션(Fully Connection) 방식이 있다.
호스팅은 한 명이 서버의 역할을 하는 것이다. 각자의 결과를 호스트(워크래프트나 스타크래프트의 방장)가 받고, 결과를 다시 나누어주는 방식이다. 워크래프트 유즈맵을 해보았다면 방장이 튕길때 다같이 튕기는 경험을 해보았을 것이다...
풀리커넥션은 서로가 다 연결이 되어있어 방장이라는 개념이 없다. 즉 한 명이 튕겨도 상관이 없지만, 서로가 다 이어져있기 때문에 관리가 복잡하여 비용이 더 든다. 로직이 분산되어 동기화 면이나 검증 면에서 약점이 있다. 즉 핵과 치트를 검증하는 기준이 애매하다.
서버의 부하를 줄이기 위해 클라이언트에서 일부를 처리하고, 중요도가 높은 로직의 경우 서버가 처리한다.
그럼 클라이언트와 서버는 어떤식으로 데이터를 주고 받을까? 주고받는 데이터를 패킷이라고 하며, 이를 알기 위해선 네트워크적 지식이 조금 더 필요하다.
1-2-0) 네트워크 구조
*Protocol: 약속, 규약
컴퓨터 전공자라면 인터넷 프로토콜 또는 컴퓨터 네트워크 과목을 통해서 OSI 7계층 내지는 5계층에 대해서 들어본 적이 있을 것이다. 이것은 네트워크 프로토콜로 '각 계층에서 어떤 역할을 하자'라는 것을 의미한다.
응용 계층 | 응용 프로세스 관리 |
표현 계층 | 사용자 명령어 표현 |
세션 계층 | 세션 관리 |
전송 계층 | 패킷 생성 및 전송, TCP/UDP |
네트워크 계층 | 경로, 주소 선택, IP |
데이터링크 계층 | 정보 전달 수행을 도와준다. (오류검출, 흐름제어, 재전송), MAC |
물리 계층 | 전기적, 물리적인 인터페이스 규정 |
가장 위의 세션, 표현, 응용을 응용 계층으로 묶어 5계층으로 부르기도 한다.
1-2-1) IP
패킷을 보내면 게이트웨이(Gateway)에 모인다. 10.10.0.0의 게이트웨이가 10.10이라는 IP가 붙은 패킷을 모두 수신하고, 패킷의 그 뒤에 붙은 22.1이 어느 컴퓨터에 해당하는지를 찾아 분배해준다.
*IPv4와 IPv6
IP의 주소 부족을 해결하기 위해 IPv6가 고안되었다. 32비트 -> 128비트의 주소로 확장하였으며 체크섬을 삭제하며 헤더 포맷을 변경하는 개선 과정으로 라우팅 속도를 향상시켰다.
1-2-2) TCP/UDP
TCP와 UDP에는 포트 정보가 담겨있다. 컴퓨터로 들어가는 문이라고 볼 수 있는데, 패킷이 이 컴퓨터에서 방문하고자 하는 곳을 해당 포트를 통해 들어갈 수 있다.
어떤 문은 특정 기능을 위해서 할당되어 있다. 예를들어 HTTP 프로토콜을 이용해서 들어오는 패킷은 80번 포트를 이용한다.
맞는 포트에 들어가더라도, 문이 잠겨있다면 들어가지 못하듯이 포트에 연결이 거부되어 있으면 들어갈 수 없다.
* TCP와 UDP 차이
TCP는 동기 방식으로, UDP는 비동기 방식으로 TCP는 정확한 데이터 전송에, UDP는 일부 데이터에 손상이 있어도 되는 스트리밍 서비스에 사용된다.
TCP는 동기 방식이다. TCP의 특징은 신뢰성과 연결성이다. 서버와 클라이언트 사이에 연결이 되어 데이터 송수신이 가능하고, 이를 신뢰할 수 있는 시스템이다. 유저가 서버에 로그인을 요청하고, 로그인이 완료되었다는 것에 어떻게 신뢰성을 더하는 것일까? 이는 연결 시 3-way handshake와 연결 종료시 4-way handshake를 이용한다.
* 3-way handshake
client는 SYN(connect) 패킷을 하나 보낸다. 그럼 server가 client에게 SYN(accept)과 ACK를 보내고, SYN(accept)를 받았다는 것에 대한 확인 패킷인 ACK 패킷을 server에게 다시 보내 연결이 성립된다. (SYN -> SYN/ACK -> ACK)
* 4-way handshake
client가 연결 종료를 위한 FIN 패킷을 보내고, 서버가 FIN 패킷을 받았다는 확인 패킷으로 ACK와 함께 연결을 종료하겠다는 FIN을 보낸다. 그럼 클라이언트에서 이를 또 잘 받았다는 ACK 패킷을 보내 연결을 종료한다.
3-way와 4-way를 보면, ACK를 통해서 상대가 의도한 패킷이 잘 도착했다는 것을 확인하고, 다음 행동을 취한다. 한 행동에 대한 대답을 받았을 경우에 동작하는 동기 방식이다. (FIN -> ACK -> FIN -> ACK)
* 긴급 포인터(urgent pointer)
긴급한 패킷은 TCP 헤더에 URG flag = true로 설정하여 빠르게 처리하도록 명시한다.
UDP의 경우에는 전송의 정확도 보다, 어느 정도의 오류를 감안하고서도 속도가 더 중요할 때 사용한다. 예를들어 스포츠 경기를 스트리밍으로 보는데, 일부 픽셀이 조금 깨졌다고 해서 크게 지장이 가지 않는다. 오히려 모든 화면을 제대로 송출하기 위해 버퍼링을 하는 선택이 더 좋지 못할 것이다.
속도의 경우에는 UDP니까 게임에서 써야할 것 같은데, 데이터가 정확하게 전달되기도 해야한다. 왜냐면 유저가 보스의 공격을 피한다고 방향키를 눌렀는데 그 패킷이 전송되지 않아 죽는 것은 게임 개발자로서 슬픈일 이니까..
그래서 고안해낸 것이 Reliable UDP로, 프로그래밍을 통해서 UDP에 TCP 특성을 입혀주는 것이다.
1-2-3) 캐스트 방식
서버가 클라이언트에 패킷을 보낼 때, 4가지의 방식으로 분류할 수 있다.
① 유니캐스트(Unicast)
1:1로 데이터를 통신하는 방식이다. 자신의 MAC 주소와 목적지 MAC 주소를 넣어 전송하면, 해당 네트워크에 존재하는 모든 시스템이 받아 목적지 MAC이 자신의 MAC과 같은지 비교하는 방식이다.
② 브로드캐스트(Broadcast)
1:다 방식이다. 해당 네트워크의 모든 시스템에게 보내는 방식인데, 자신의 브로드캐스트용 주소로 패킷이 오면 CPU가 처리하는 방식으로, 성능에 부하가 생길 수 있다. 목적지의 MAC 주소를 알지 못하거나, 모든 시스템에게 패킷을 줄 때, 라우터끼리 정보를 교환할 때 이용된다.
③ 멀티캐스트(Multicast)
같은 네트워크의 일부에게만 전송하는 방식으로, 특정 그룹에 전송하는 경우다. 라우터가 멀티캐스트를 지원해야 사용할 수 있다.
④ 애니캐스트(Anycast)
가장 가까운 장비에 전송하는 방식이며 IPv6 기반이다.
2) IOCP
'CS지식' 카테고리의 다른 글
운영체제(OS, Operating System) (0) | 2022.08.08 |
---|---|
C, C++, C# (0) | 2022.08.03 |
컴퓨터 그래픽스 (0) | 2022.08.02 |
자료구조와 STL (0) | 2022.06.23 |
[인공지능] Basic (0) | 2022.03.11 |
댓글