9P by GN⁺ 2일전 | ★ favorite | 댓글 4개
  • 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.exeDJGPP의 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.batqlaunch.exe를 실행하며, 이는 quakeudp.dll을 로드
    • quakeudp.dllWinsock(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 덕분에 프로그래밍을 처음 배웠음
  • “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보다 훨씬 복잡한 세계라서, 단순히 책 한 권으로 다루기엔 어려움
  • 90년대에는 친구 전화번호로 모뎀 연결만 하면 Quake나 Doom을 쉽게 멀티플레이할 수 있었는데,
    지금은 서버 없이는 거의 불가능한 게 아이러니함

    • DOOM은 1993년 12월부터 시리얼 멀티플레이를 지원했고, 1994년엔 IPX 네트워킹까지 가능했음
      TCP/IP는 처음엔 없었지만, 나중에 iDOOM TCP 드라이버로 해결됨
      대학 기숙사에서 테스트했을 때 진짜 혁신적이었음
    • 요즘은 STUN 서버나 Steam의 Steam Datagram Relay로 NAT 문제를 해결함
      일종의 엔진 내 Hamachi 같은 개념임
    • 혹시 Tailscale로 예전처럼 쉽게 할 수 있는 방법이 있을까 궁금함
    • 사실 라우터에서 포트 포워딩만 해도 가능함
      다만 요즘은 게임사들이 스킨 판매 수익을 위해 개인 서버를 막는 경우가 많음
      Valve는 예외적으로 TF2 커스텀 서버를 허용했고, Minecraft도 여전히 인증을 끄고 친구들과 놀 수 있음
  • Windows 95가 TCP/IP를 내장하면서, 예전엔 TCP를 따로 설치하던 시절이 끝났음

    • 그때는 네트워크가 기업용 중심이라, 집에서 설치하는 건 거의 매니악한 취미였음
      네트워크 카드가 소비자용으로 보급되면서 세상이 바뀌었음
      다만 Windows는 네트워크 카드가 없으면 TCP/IP를 설치하지 않았고, ping 명령어조차 없었음
      오늘날 Windows 11은 네트워크 없이 설치하면 어떻게 될지 궁금함
    • Windows 3.1 시절엔 Trumpet Winsock을 썼었음
    • Windows 95의 TCP/IP 스택이 FreeBSD에서 가져온 것이라는 얘기도 있었음
  • 아직도 25년 전 내가 쓴 DJGPP/NASM 튜토리얼이 구글 검색에 걸림