# 퀘이크 실행 파일(quake.exe)은 어떻게 TCP/IP 스택을 갖추게 되었나

> Clean Markdown view of GeekNews topic #24465. Use the original source for factual precision when an external source URL is present.

## Metadata

- GeekNews HTML: [https://news.hada.io/topic?id=24465](https://news.hada.io/topic?id=24465)
- GeekNews Markdown: [https://news.hada.io/topic/24465.md](https://news.hada.io/topic/24465.md)
- Type: GN+
- Author: [neo](https://news.hada.io/@neo)
- Published: 2025-11-19T10:18:52+09:00
- Updated: 2025-11-19T10:18:52+09:00
- Original source: [fabiensanglard.net](https://fabiensanglard.net/quake_chunnel/index.html)
- Points: 11
- Comments: 4

## Summary

1996년의 **퀘이크(Quake)** 는 단순한 FPS 게임이 아니라, **DOS와 Windows 95의 경계에서 TCP/IP 네트워킹을 구현한 실험적 하이브리드 시스템**이었습니다. id Software는 `djgpp`와 **DPMI 구조**를 활용해 하나의 실행 파일로 두 환경을 모두 지원했고, Mpath의 **Chunnel 시스템**을 통해 DOS에서도 **Winsock 기반 인터넷 플레이**를 가능하게 했습니다. 이 복잡한 구조는 이후 WinQuake로 단순화되었지만, 당시로서는 **운영체제 전환기에서의 창의적 엔지니어링**의 정수를 보여주는 사례입니다. 지금 봐도 “가능할 리 없다” 싶은 일을 해낸 개발자들의 집요함이 인상적입니다.

## Topic Body

- 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 전용화로 단순화되었지만, 당시로서는 **운영체제 전환기에서의 기술적 도전과 혁신**을 상징하는 구조였음

## Comments



### Comment 46641

- Author: bungker
- Created: 2025-11-21T11:44:33+09:00
- Points: 1

그 시절에 존 카맥 하면 천재중에 천재 개발자였죠

### Comment 46582

- Author: thinkpad
- Created: 2025-11-20T11:29:11+09:00
- Points: 1

좋은 글 읽어서 정말 재미있었습니다.

### Comment 46579

- Author: ipuris
- Created: 2025-11-20T11:08:17+09:00
- Points: 1

ㅋㅋ 재밌네요.

### Comment 46524

- Author: neo
- Created: 2025-11-19T10:18:52+09:00
- Points: 1

###### [Hacker News 의견](https://news.ycombinator.com/item?id=45962654) 
- 예전 DJGPP와 DPMI로 직접 실험하던 시절이 떠오름  
  그때는 정말 **미래적인 기술**처럼 느껴졌음  
  특히 *Star Wars: Dark Forces*를 하다가 로딩 속도가 너무 느려서 DOS/4GW를 다른 **DOS 익스텐더**로 바꿔봤는데, 놀랍게도 3~5배 빨라졌음  
  아마도 새 익스텐더가 실모드로 전환하지 않고 **보호 모드에서 직접 디스크 하드웨어를 호출**했기 때문인 듯함  

- 리눅스 초창기, 네트워킹이 없던 시절에는 **KA9Q TCP/IP 스택**을 사용했음  
  [KA9Q 코드 링크](https://www.ka9q.net/code/ka9qnos/)  
  이건 DOS에서 동작했지만 리눅스로 쉽게 포팅 가능했음  
  최근에도 CWSDPMI 클라이언트를 써봤는데, 32비트 프로그램이 DOS와 Windows 양쪽에서 동작하게 해줌  
  [CWSDPMI 위키](https://en.wikipedia.org/wiki/CWSDPMI)  

- 어릴 때 납땜을 배우게 된 이유가 **널모뎀 케이블**을 직접 만들기 위해서였음  
  이후엔 저항의 존재를 알게 되었고, 병렬 포트용 사운드 카드인 [Covox Speech Thing](https://en.wikipedia.org/wiki/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](https://en.wikipedia.org/wiki/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](https://github.com/Henrique194/chocolate-quake/pull/60) 프로젝트에 기여하고, [버그 리포트](https://github.com/Henrique194/chocolate-quake/issues/57)도 남겼음  
    나도 내 [chocolate Doom 3 BFG fork](https://github.com/klaussilveira/chocolate-doom3-bfg)에서 OpenGL 문제 해결에 도움을 받고 싶음  
  - 아마도 그 방향으로 가고 있는 듯함  
    하지만 Quake는 Doom보다 훨씬 **복잡한 세계**라서, 단순히 책 한 권으로 다루기엔 어려움  

- 90년대에는 친구 전화번호로 **모뎀 연결**만 하면 Quake나 Doom을 쉽게 멀티플레이할 수 있었는데,  
  지금은 서버 없이는 거의 불가능한 게 아이러니함  
  - DOOM은 1993년 12월부터 **시리얼 멀티플레이**를 지원했고, 1994년엔 IPX 네트워킹까지 가능했음  
    TCP/IP는 처음엔 없었지만, 나중에 **iDOOM TCP 드라이버**로 해결됨  
    대학 기숙사에서 테스트했을 때 진짜 혁신적이었음  
  - 요즘은 **STUN 서버**나 Steam의 [Steam Datagram Relay](https://partner.steamgames.com/doc/features/multiplayer/steamdatagramrelay)로 NAT 문제를 해결함  
    일종의 **엔진 내 Hamachi** 같은 개념임  
  - 혹시 **Tailscale**로 예전처럼 쉽게 할 수 있는 방법이 있을까 궁금함  
  - 사실 라우터에서 **포트 포워딩**만 해도 가능함  
    다만 요즘은 게임사들이 **스킨 판매 수익**을 위해 개인 서버를 막는 경우가 많음  
    Valve는 예외적으로 TF2 커스텀 서버를 허용했고, Minecraft도 여전히 인증을 끄고 친구들과 놀 수 있음  

- Windows 95가 TCP/IP를 내장하면서, 예전엔 **TCP를 따로 설치**하던 시절이 끝났음  
  - 그때는 네트워크가 기업용 중심이라, 집에서 설치하는 건 거의 **매니악한 취미**였음  
    네트워크 카드가 소비자용으로 보급되면서 세상이 바뀌었음  
    다만 Windows는 네트워크 카드가 없으면 TCP/IP를 설치하지 않았고, **ping 명령어조차 없었음**  
    오늘날 Windows 11은 네트워크 없이 설치하면 어떻게 될지 궁금함  
  - Windows 3.1 시절엔 [Trumpet Winsock](https://en.wikipedia.org/wiki/Trumpet_Winsock)을 썼었음  
  - Windows 95의 TCP/IP 스택이 **FreeBSD에서 가져온 것**이라는 얘기도 있었음  

- 아직도 25년 전 내가 쓴 **DJGPP/NASM 튜토리얼**이 구글 검색에 걸림
