퀘이크 실행 파일(quake.exe)은 어떻게 TCP/IP 스택을 갖추게 되었나
(fabiensanglard.net)- 1996년 출시된 퀘이크(Quake) 는 3D 가속기, 인터넷, 그리고 MS-DOS에서 Windows 95로의 전환이라는 세 가지 기술 변화를 동시에 맞이한 게임
- id Software는 DOS와 Windows 95 모두에서 실행 가능한 단일 실행 파일을 만들기 위해
djgpp컴파일러와 DPMI 호환 구조를 활용 - Mpath의 ‘Chunnel’ 시스템을 통해 DOS용 퀘이크가 Windows 95의 Winsock TCP/IP 스택에 접근할 수 있도록 구현
- 이 구조는
quakeudp.dll,genvxd.dll,mgenvxd.vxd등의 구성요소로 이루어져 있으며, DOS 실행 파일이 Win32 네트워크 API와 통신하도록 중계 - 이후 id Software가 Win32 전용 실행 파일(WinQuake, GLQuake) 로 전환하면서 이 복잡한 구조는 사라졌음
퀘이크와 운영체제 전환기
- 1996~1997년 사이 MS-DOS의 시장 점유율이 절반으로 감소, Microsoft는 Windows 95와 NT로 전환을 추진
- 일부 개발사(예: Blizzard North)는 Windows 95 전용 게임을 개발했으나, id Software는 하나의 실행 파일(quake.exe) 로 DOS와 Windows 모두 지원
-
quake.exe는 DJGPP의 DPMI 클라이언트를 사용해 DOS용cwsdpmi.exe또는 Windows 95의 DPMI 서버와 호환되도록 설계 - Microsoft 엔지니어 Raymond Chen은 이를 “이질적인 확장기에서 프로그램이 정상 작동하는 놀라운 사례”로 설명
DOS 환경에서의 퀘이크 실행
- DOS에서 퀘이크를 실행하려면
quake.exe,config.cfg,pak0.pak,cwsdpmi.exe네 개의 파일만 필요 - 멀티플레이어는 모뎀, NullModem, IPX, TCP/IP 네 가지 방식을 지원
- IPX는 LAN용, TCP/IP는 인터넷용이지만 DOS에는 TCP/IP 스택이 기본 제공되지 않음
- 유일한 DOS용 TCP/IP TSR은 Beame & Whiteside의 BWNFS, 가격은 395달러(1996년 기준)로 매우 비쌌음
Windows 95 환경에서의 실행
- Windows 95의 가상 DOS 박스(dos-box) 에서
quake.exe를 실행하면 동일한 방식으로 동작 - Windows 95의 DPMI 서버를 사용하므로
cwsdpmi.exe는 불필요 - 실행은 원활했지만, RAM 16MB 이상 필요, DOS보다 메모리 오버헤드가 큼
- VGA 접근이 직접 허용되어 전체화면에서도 성능 저하 없이 실행 가능
q95.bat와 Mpath의 Chunnel
-
q95.bat은 단순히 퀘이크를 실행하는 스크립트가 아니라, Mpath의 Winsock 터널링 시스템(Chunnel) 을 통해 TCP/IP 연결을 활성화 - Mpath Interactive는 온라인 게임 서비스(Mplayer) 를 운영하며, 퀘이크와 언리얼을 포함한 여러 게임의 인터넷 플레이를 지원
- 당시 Mpath 엔지니어 Larry Hastings는 퀘이크 초기 빌드에서 id Software 팀과 인터넷 데스매치를 진행한 일화를 소개
- Mpath는 퀘이크 소스 코드를 받아 Mplayer 네트워크 스택과 통신하도록 수정, Chunnel 기술을 id에 라이선스 제공
Chunnel의 기술 구조
-
q95.bat은qlaunch.exe를 실행하며, 이는quakeudp.dll을 로드-
quakeudp.dll은 Winsock(wsock32.dll)과의 브리지 역할을 수행 -
genvxd.dll을 통해 가상 장치 드라이버mgenvxd.vxd를 로드하고, 인터럽트0x48을 통해 Win32와 통신
-
- 퀘이크의 BSD 소켓 구현(
mpplc.c)은 Mpath 제공 코드로, 소프트웨어 인터럽트를 통해 네트워크 호출을 전달 -
genvxd.dll은 이 호출을 언마샬링(unmarshalling) 하여 Winsock으로 전달 -
mgenvxd.vxd의 심볼에는 John Cash의 이름이 포함되어 있음 - 이 기술은 Mpath의 독점 특허 기술로, 소스 코드는 공개되지 않음
- 1996년 12월 이후 id Software가 Win32 전용 실행 파일(WinQuake, GLQuake, QuakeWorld) 로 전환하면서 Chunnel 구조는 폐기됨
결론
- 퀘이크의 TCP/IP 지원은 DOS 실행 파일이 Windows 95의 네트워크 스택을 간접적으로 호출하는 독창적 구조로 구현
- 이는 DOS와 Windows의 경계에서 작동한 하이브리드 기술로, 1990년대 중반 게임 네트워킹의 과도기를 보여주는 사례
- 이후 Win32 전용화로 단순화되었지만, 당시로서는 운영체제 전환기에서의 기술적 도전과 혁신을 상징하는 구조였음
Hacker News 의견
-
예전 DJGPP와 DPMI로 직접 실험하던 시절이 떠오름
그때는 정말 미래적인 기술처럼 느껴졌음
특히 Star Wars: Dark Forces를 하다가 로딩 속도가 너무 느려서 DOS/4GW를 다른 DOS 익스텐더로 바꿔봤는데, 놀랍게도 3~5배 빨라졌음
아마도 새 익스텐더가 실모드로 전환하지 않고 보호 모드에서 직접 디스크 하드웨어를 호출했기 때문인 듯함 -
리눅스 초창기, 네트워킹이 없던 시절에는 KA9Q TCP/IP 스택을 사용했음
KA9Q 코드 링크
이건 DOS에서 동작했지만 리눅스로 쉽게 포팅 가능했음
최근에도 CWSDPMI 클라이언트를 써봤는데, 32비트 프로그램이 DOS와 Windows 양쪽에서 동작하게 해줌
CWSDPMI 위키 -
어릴 때 납땜을 배우게 된 이유가 널모뎀 케이블을 직접 만들기 위해서였음
이후엔 저항의 존재를 알게 되었고, 병렬 포트용 사운드 카드인 Covox Speech Thing을 직접 만들어봄
정말 즐거운 시절이었음- 그 병렬 포트 사운드 카드는 한동안 내 주력 사운드 카드였음
Maplin에서 큰 저항을 잔뜩 사서 엉성하게 납땜했지만, 처음부터 완벽하게 작동했음 - 납땜 인두를 허락받지 못해서, 일반 시리얼 케이블을 잘라서 널모뎀으로 개조했음
친구들과 OMF2097을 같이 하려고 만든 건데, 키보드 한 개로 싸우지 않아도 돼서 좋았음 - 나도 그 시절에 납땜을 배웠음
직접 만든 장치로 Mod 파일을 재생해서 휴대용 스피커로 들을 때 정말 멋졌음
나중에 플럭스(Flux)를 알고 나서 납땜이 훨씬 쉬워졌음
- 그 병렬 포트 사운드 카드는 한동안 내 주력 사운드 카드였음
-
“DJGPP 엔지니어들”이라는 표현을 보고, 사실상 DJ Delorie 한 사람이었다는 걸 떠올림
GCC 전체 툴체인을 DOS/Windows로 포팅한 건 정말 엄청난 업적이었음
그가 id Software의 요청으로 기능을 추가했는지, 아니면 그냥 재미로 했는지는 모르겠지만 존경스러움- 당시 DJGPP는 꽤 큰 커뮤니티였고, Quake 최적화의 공은 Charles Sandmann에게도 큼
그는 CWSDPMI의 저자로, id와 직접 협업했음 - 나도 그 둘 사이에 실제로 CWSDPMI 관련 소통이 있었던 걸로 기억함
오픈소스 프로젝트라 표현이 좀 이상하긴 하지만, 사실일 가능성이 높음
그리고 Quake가 VM에서 돌아간다는 걸 놀라워하는 건, 아마 VM86 모드를 몰라서일 듯함 - DJ Delorie의 인터뷰를 꼭 보고 싶음
- 그의 웹사이트를 봤는데, 대학 시절 사격 과목을 수강한 기록이 있더라
미국에서는 그런 체육 과목이 흔한지 궁금함 - DJGPP 덕분에 프로그래밍을 처음 배웠음
- 당시 DJGPP는 꽤 큰 커뮤니티였고, Quake 최적화의 공은 Charles Sandmann에게도 큼
-
“Chunnel”이라는 이름은 아마 Channel Tunnel에서 따온 것 같음
- 혹은 1995년 방영된 Seinfeld의 “The Pool Guy” 에피소드에 등장한 가상의 영화 ‘Chunnel’ 에서 영감을 받았을 수도 있음
-
예전에 Quake의 TCP/IP 멀티플레이어를 설정하려고 TECHINFO.TXT를 읽었던 기억이 있음
거기엔 Beame & Whiteside TCP/IP 스택을 사용한다고 되어 있었음
ftp.cdrom.com에서 소프트웨어를 구해 설치했지만, 당시엔 네트워킹 지식이 부족해서 설정이 매우 힘들었음
결국 지연이 심하고 성능도 나빠서 WinQuake로 NetQuake를 하는 게 훨씬 나았음 -
Fabian이 Quake 관련 리서치를 시작한 것 같다는 생각이 듦
- 실제로 chocolate-quake 프로젝트에 기여하고, 버그 리포트도 남겼음
나도 내 chocolate Doom 3 BFG fork에서 OpenGL 문제 해결에 도움을 받고 싶음 - 아마도 그 방향으로 가고 있는 듯함
하지만 Quake는 Doom보다 훨씬 복잡한 세계라서, 단순히 책 한 권으로 다루기엔 어려움
- 실제로 chocolate-quake 프로젝트에 기여하고, 버그 리포트도 남겼음
-
90년대에는 친구 전화번호로 모뎀 연결만 하면 Quake나 Doom을 쉽게 멀티플레이할 수 있었는데,
지금은 서버 없이는 거의 불가능한 게 아이러니함- DOOM은 1993년 12월부터 시리얼 멀티플레이를 지원했고, 1994년엔 IPX 네트워킹까지 가능했음
TCP/IP는 처음엔 없었지만, 나중에 iDOOM TCP 드라이버로 해결됨
대학 기숙사에서 테스트했을 때 진짜 혁신적이었음 - 요즘은 STUN 서버나 Steam의 Steam Datagram Relay로 NAT 문제를 해결함
일종의 엔진 내 Hamachi 같은 개념임 - 혹시 Tailscale로 예전처럼 쉽게 할 수 있는 방법이 있을까 궁금함
- 사실 라우터에서 포트 포워딩만 해도 가능함
다만 요즘은 게임사들이 스킨 판매 수익을 위해 개인 서버를 막는 경우가 많음
Valve는 예외적으로 TF2 커스텀 서버를 허용했고, Minecraft도 여전히 인증을 끄고 친구들과 놀 수 있음
- DOOM은 1993년 12월부터 시리얼 멀티플레이를 지원했고, 1994년엔 IPX 네트워킹까지 가능했음
-
Windows 95가 TCP/IP를 내장하면서, 예전엔 TCP를 따로 설치하던 시절이 끝났음
- 그때는 네트워크가 기업용 중심이라, 집에서 설치하는 건 거의 매니악한 취미였음
네트워크 카드가 소비자용으로 보급되면서 세상이 바뀌었음
다만 Windows는 네트워크 카드가 없으면 TCP/IP를 설치하지 않았고, ping 명령어조차 없었음
오늘날 Windows 11은 네트워크 없이 설치하면 어떻게 될지 궁금함 - Windows 3.1 시절엔 Trumpet Winsock을 썼었음
- Windows 95의 TCP/IP 스택이 FreeBSD에서 가져온 것이라는 얘기도 있었음
- 그때는 네트워크가 기업용 중심이라, 집에서 설치하는 건 거의 매니악한 취미였음
-
아직도 25년 전 내가 쓴 DJGPP/NASM 튜토리얼이 구글 검색에 걸림