[CS][게임네트워킹의 이해] 10. Socket Programming
Socket Programming
- Server Authority 방식의 내용이나 개념 자체는 별 것이 없음
- 하지만 MMORPG는 동접자수가 상당히 많은데 이를 서버가 관리하는 것은 어려운 일이다. 따라서 massvie한 user를 어떻게 handling하냐가 서버 프로그래밍의 매우 큰 관건
소켓 프로그래밍
- 마치 코드를 콘센트에 꽂으면 전기가 연결되는 것처럼, 소켓을 연결하면 패킷을 주고받는 연결이 되는 것
컴퓨터에서 네트워킹이 일어나는 곳?
- 하드웨어의 NIC(Network Interface Controller)
- 네트워크 카드, 랜 카드, 물리 네트워크 인터페이스 등이라고도 하며, 네트워크 인터페이스 카드, 네트워크 어댑터, 이더넷 카드 등으로도 부른다.
- OSI 계층 1(물리 계층)과 계층 2(데이터 링크 계층) 장치를 가지는데, MAC 주소를 사용하여 낮은 수준의 주소 할당 시스템을 제공하고 네트워크 매개체로 물리적인 접근을 가능하게 한다. 사용자들이 케이블을 연결하거나 무선으로 연결하여 네트워크에 접속할 수 있다.
- 예전에는 프로그래머가 이 하드웨어를 직접적으로 제어해서 했는데, 문제는 제조사마다, 제품마다 하드웨어가 다르기 때문에 그거에 맞춰서 프로그래밍해야하는 것이었다.
- 그래서 OS에서 HAL이라는 추상화된 layer를 제공하여, 서로다른 하드웨어가 연결되어있다고 하더라도 그 layer 위에서 하드웨어를 신경쓰지 않고 프로그래밍할 수 있도록 하였다. 일종의 Adapting. (DirectX 같은 것도 HAL이라고 볼 수 있을까..?)
- NIC와 HAL, 프로그램 사이를 소켓이 연결시켜주는 것, 그것을 소켓 프로그래밍이라고 한다.
Socket: Input / Output
- Read와 Write
- 동기식(Synchronose), 비동기식(Asynchronose) 방식으로 나뉜다.
동기식
- Read 요청이 왔을 때, 이것이 완료될 때까지 프로그램 진행이 더이상 되지 않는다.
- 서버는 하나의 커넥셔만 핸들링하는 것이 아니기 때문에 서버에서 사용하기에 적합하지는 않다.
비동기식
-
요청만 걸어놓고 딴일 보러 간다. 딴일하다가 요청한 일이 됐다고 하면 그제서야 그일을 하는 방식.
-
Select 방식(Pre-request)와 IOCP(Post-request) 방식으로 크게 두 가지로 나뉜다.
Select
- 싱글스레드로 다중 I/O를 처리하는 멀티플렉싱 통지모델의 가장 대표적인 방법
- 모든 FD(파일 디스크립터)를 순회하면서 작업(Read/Write/Error)가 있는지 확인하는 방법
- 일의 주체는 나고, 내가 계속 확인해봐야함
IOCP
- 전보를 보내고 요청하는 것과 비슷. 전보 보내달라고 요청하고 딴일 보러가면 됨.
- Input Output Completion Port로 I/O처리 완료를 담당하는 포트
- OS 커널 단에서 IO처리
- WIndows에서 사용하는 방식(리눅스에서는 epoll 등을 사용)
- Golang 같은 경우에는 패키지가 워낙 잘되어있어서 내부적인 동작을 딥하게 알지 못해도 프로그래밍 할 수는 있지만 당연히 원리를 알아두면 고급 프로그래머가 되는 길
- 일의 주체는 내가 아니고 누구(OS:Windows)한테 맡기고, 결과를 걔가 큐에 쌓아놓으면 나는 결과가 왔는지 확인해보기만 하면됨. OS가 일을 대신해주고 성능을 컨트롤해주기 때문에 IOCP 방식이 효율적이라고 할 수 있음. 하지만 Select는 구현하기가 편리함.