모든 해커가 한때 알았던 것들 (2017)
(catb.org)- 한때 해커라면 자연스럽게 알던 ASCII 비트 구조, RS-232, 하드웨어 터미널, 모뎀 지식은 장비와 네트워크 환경이 바뀌며 더 이상 입문 과정에서 전수되지 않게 됨
tty,SIGHUP,core dump,README,Ctrl-D같은 표현은 사라진 도구의 잔재라서, 유래를 알면 현대 Unix와 개발 관습을 더 잘 이해할 수 있음- ASCII, 36비트 머신, 8진수, RS-232 설정, MIME, termios, curses, ANSI 터미널 제어는 현재 시스템에 남은 역사적 호환성의 층을 보여줌
- 대중 인터넷 이전에는 UUCP, USENET, BBS, FidoNet, FTP, Gopher, 상용 타임셰어링, 학술 WAN이 각자 파일 전송·메일·포럼·협업을 맡았음
- 공개 저장소 기반 개발은 DECUS 테이프, FTP와 이메일, USENET 소스 그룹,
patch(1), SCCS/RCS/CVS, SourceForge, Subversion을 거쳐 2005년 Git에 이르러 형성됨
사라진 하드웨어가 남긴 Unix의 흔적
- 젊은 해커들이 ASCII의 비트 구조와 특이한 제어 문자를 모르게 된 것은 개인의 문제가 아니라 하드웨어 터미널과 RS-232가 일상에서 사라진 결과임
- 예전 터미널은 소프트웨어 창이 아니라 중앙 컴퓨터에 연결된 비디오 디스플레이 터미널(VDT) 이었고, 그 전에는 종이에 출력하는 teletype 계열 장치가 쓰였음
- Unix의
tty는 teletype의 약어에서 왔고,/dev/lp의lp는 line printer, 일부 BSD Unix의/dev/drum은 초기 회전 드럼 장치에서 유래함 \rCarriage Return은 프린트 헤드를 줄 왼쪽으로 보내는 동작이고, Unix는 줄 끝을\n하나로 처리했지만 다른 운영체제는\r\n을 계속 사용함\r\n순서가 된 이유는 초기 하드웨어에서 carriage return이 한 글자 전송 시간보다 오래 걸려 먼저 실행해야 했기 때문임
- 여러 사용자가 하나의 중앙 컴퓨터 CPU를 나눠 쓰던 방식은 timesharing으로 불렸고, 현대 Unix의 여러 가상 터미널 구조에도 그 흔적이 남아 있음
RS-232, 모뎀, AT 명령
- RS-232는 1960년대 초 teletypewriter와 모뎀이 통신하도록 개발된 하드웨어 프로토콜이며, USB 이전의 “serial” 링크는 보통 RS-232를 뜻했음
- 모뎀은 디지털 신호를 전화선으로 보내게 해 주는 장치였고, 해커들은 별도 박스 형태의 외장 모뎀을 많이 사용함
- 내장 모뎀은 케이스 내부 RF 잡음에 취약했고, 외장 모뎀의 표시등은 문제 진단에 유용했음
- 연결 성공과 동기화 실패는 모뎀의 삐·쉬 소리로 어느 정도 구분할 수 있었음
- Unix의
SIGHUP에서HUP는 Hang Up이며, 원래는 모뎀 연결이 끊겨 제어 터미널이 사라진 상황을 가리킴 - 모뎀 속도는 110bps에서 1990년대 말 56kbps까지 올라갔고, 1984~1991년경의 안정기에는 9600bps가 일반적이었음
- 이 때문에 남아 있는 serial-protocol 장비가 기본값으로 9600bps를 쓰는 경우가 많음
- Hayes Smartmodem의
AT명령 접두사는 1981년 이후 사실상 보편화됐고,ATDT뒤에 전화번호를 붙여 전화를 걸 수 있었음AT비트 패턴은 수신기가 전송 속도를 몰라도 인식하기 쉬운 형태라 자동 동기화에 유리했음- 2017년에도 스마트폰의 3G/4G 셀룰러 모뎀 제어 기능에서 AT 명령이 발견됐고, 한 널리 배포된 종류에는
AT+QLINUXCMD=가 칩 펌웨어의 Linux 인스턴스에 명령을 전달하는 접두사로 쓰임
“core”, 36비트 머신, 8진수
- 1955~1975년경 반도체 메모리 이전의 주류 메모리는 작은 페라이트 고리와 구리선으로 만든 core memory였고,
in core,core dump같은 Unix 용어가 여기서 생김 - 2000년 이후 멀티프로세서 시스템이 데스크톱에도 흔해지면서
core는 processor core의 축약어로도 쓰이게 됐고, 예전 메모리 의미는 점점 덜 이해됨 - 8비트 바이트와 16/32/64비트 워드 계층이 사실상 보편화된 것은 1983년 이후이며, 그 전에는 36비트 워드 아키텍처 전통이 컸음
- DEC PDP-10과 Symbolics 3600 Lisp machine이 대표적 36비트 머신이었음
- PDP-10 취소는 1983년에 이 계열의 종말을 알렸고, Symbolics 3600은 이후 약 10년 더 버팀
- 36비트 워드는 3비트 필드 12개로 나뉘어 8진수 표현이 자연스러웠고, 메모리 덤프에 7보다 큰 숫자가 보이는지로 32비트 계열과 36비트 계열을 구분할 수 있다고 여겨졌음
- C의 숫자 리터럴에서 앞의
0이 8진수를 뜻하는 문법은 B와 PDP-7/PDP-11의 역사에서 왔고, Java·Python 등 여러 언어가 C의 저수준 어휘 규칙을 따라 이 흔적을 물려받음- Python 3, Perl 6, Rust는 위험한 leading-0 8진수 문법을 제거했지만 Go는 유지함
- x86 명령어 집합도 설명은 보통 16진수를 쓰지만, 큰 부분은 3비트 필드로 이해하면 8진수 표현이 더 자연스러움
RS-232 설정 지옥과 7비트 세계
- TCP/IP 링크는 보통 깨끗한 8비트 바이트 스트림처럼 보이지만, RS-232 장비는 양쪽이 선 속도, 바이트 프레이밍, parity, stop bit를 맞춰야 했음
- 1984년 이후에는
8N1—8비트, no parity, 1 stop bit—가 흔해졌지만, 그 전에는 다양한 조합이 쓰였고 설정이 맞지 않으면 baud barf라고 부르는 무작위 8비트 쓰레기만 보였음 - POSIX/Unix 터미널 인터페이스
termios(3)에 현대적으로는 의미가 잘 보이지 않는 복잡한 옵션이 많은 이유는 이런 RS-232 설정을 조작해야 했기 때문임 - parity가 켜져 있으면 8비트 바이너리 데이터의 상위 비트가 훼손될 수 있었고, 상위 비트
0x80을 망가뜨리지 않는 네트워크와 소프트웨어를 8-bit clean이라고 불렀음- 이메일용 MIME 인코딩과 MIME64는 이런 7비트 제약이 남아 있던 환경 때문에 등장함
- MIME 이전에는 8비트 데이터를 7비트로 바꾸는
uuencode/uudecode가 Unix 환경에서 쓰였고, 오늘날에도 가끔 마주칠 수 있음
- RS-232 커넥터도 DB-25와 DB-9가 섞였고, gender changer, DB-25↔DB-9 어댑터, breakout box, null modem 같은 장비가 필요했음
- 2000년 이후에는 DB9/DB25의 표준 RS-232와 회로 보드의 TTL serial이 같은 RS232 표기를 쓰는 함정이 생김
- TTL serial은 3.3V 또는 5V 수준이고, 표준 RS-232는 훨씬 큰 전압 스윙을 쓰므로 level shifter 없이 연결하면 TTL 쪽 부품이 손상됨
- RS-232는 1990년대 중후반 공통 상식에서 사라졌지만, 2010년 무렵까지 범용 컴퓨터에서 완전히 사라지지 않았고 POS 장비, 상용 라우터 진단 콘솔, 임베디드 디버깅 콘솔, GPS 센서, IoT 장비에 남아 있음
인터넷 이전의 WAN과 커뮤니티
- 오늘날 WAN은 거의 TCP/IP 인터넷으로 수렴했지만, 1970년대 말부터 1990년대 중반까지는 여러 pre-Internet WAN이 공존했음
- UUCP는 Unix to Unix Copy Program의 약자로, 1979년 Bell Labs 밖으로 나온 뒤 1990년대 중반 대중 인터넷 확산 전까지 모뎀과 전화망으로 Unix 사이트 간 저비용 네트워킹을 제공함
- 원래는 소프트웨어 업데이트 전파용 store-and-forward 시스템이었지만, 주요 용도는 이메일과 1980년에 시작된 USENET이 됨
- 전화 요금이 local 정액과 long-distance 종량제로 나뉘어 있던 구조에서, UUCP 트래픽은 local hop을 이어 장거리 전달을 우회할 수 있었음
- USENET은 소스 코드 공유 그룹에서 현대 오픈소스 관습의 씨앗이 되었고,
README,NEWS,INSTALL같은 프로젝트 메타데이터 파일 이름이 1980년대 초 그곳에서 자리 잡음- 1987년 Great Renaming은 USENET 그룹 이름 계층 재편이었음
- 1993년 AOL이 사용자에게 USENET 접근을 열면서 “September that never ended”가 시작됐고, 대규모 신규 사용자의 유입이 문화 적응을 어렵게 함
- UUCP 주소는
…!bigsite!foovax!barbox!user같은 bang-path 형태였고, 1990년대 초 인터넷 접근이 늘면서user@hostname형식으로 대체됨- 전환기에는
%로 UUCP 라우팅과 인터넷 라우팅을 결합한 하이브리드 주소도 있었음
- 전환기에는
- BBS는 보통 모뎀 하나가 붙은 컴퓨터에서 한 번에 한 명씩 접속해 메시지, 파일 업로드·다운로드, 게임을 제공하는 시스템이었음
- 첫 BBS는 1978년 Chicago에서 운영됐고, 이후 18년 동안 10만 개가 넘는 BBS가 생겼다가 사라짐
- 1984년부터 FidoNet이 BBS 간 이메일과 USENET 비슷한 포럼 시스템을 지원함
- XMODEM, YMODEM, ZMODEM은 BBS 문화의 거의 유일하게 남은 기억이며, 2018년에도 Cisco 장비 일부는 serial port를 통한 XMODEM 업로드로 패치를 받음
- AOL, CompuServe, GEnie, The Source, Prodigy 같은 상용 타임셰어링 서비스와 CSNET, BITNET, EARN, VIDYANET 같은 학술 WAN도 있었고,
listserv라는 말은 BITNET의 이메일 reflector에서 유래함
FTP, Gopher, 웹 이전의 정보 접근
- World Wide Web이 1990년대 초 몇 년 만에 보편화되기 전, 1971년 이후 인터넷 사이트 간 파일 전송은 보통 ftp와 File Transfer Protocol로 이뤄졌음
- 웹 브라우저가 FTP 프로토콜을 직접 말할 수 있게 되면서 ftp 사용은 대부분 브라우저에 흡수됐고,
ftp:URL 접두사는 FTP 서버와 통신해야 함을 나타냄 - 1991년 Tim Berners-Lee가 World Wide Web을 만들던 같은 해, University of Minnesota의 해커들은 메뉴 중심 하이퍼텍스트 프로토콜 Gopher를 만들었음
- Gopher는 초기 Web과 몇 년 동안 경쟁했지만, 1993년 초 대학이 구현에 라이선스 비용을 부과하기로 하면서 채택이 둔화됨
- 초기 웹 브라우저가 Gopher 프로토콜과 문서 표시를 지원했지만, 2000년에는 Gopher가 사실상 사라졌고 일부 서버만 향수와 아이러니의 의미로 운영됨
터미널 에뮬레이터와 VDT의 유산
- 현대 Unix의 터미널 에뮬레이터는 teletype을 흉내 낸 초기 디스플레이, 즉 glass TTY와 dumb terminal에서 이어진 마지막 형태에 가까움
- 최초의 이런 장치는 1969년에 출하됐고, 잘 기억되는 모델로는 1975년의 ADM-3가 있음
- 초기 VDT는 ASR-33처럼 대문자만 표시할 수 있었고, Unix와 2018년의 Linux는 로그인 이름이 대문자로 시작하면 모든 입력을 대문자로 바꾸는 모드로 전환하는 동작을 유지함
- 1975년부터 등장한 ADM-3A와 1978년 DEC VT-100 같은 “smart terminal”은 펀치 카드에서 온 80자 폭과 24x80 또는 25x80 기본 화면 크기를 남김
- cursor addressing, bold, underline, reverse-video 같은 제어 기능은 흔해졌고, 이를 추상화하기 위해 Unix의 terminfo 데이터베이스와
curses(3)라이브러리가 사용됨 - 1979년 이후 DEC VT-100 기반 ANSI 터미널 제어 코드가 확산됐고, 1990년대 초에는 VDT에서 ANSI 호환성이 거의 보편화됨
- 1992년 무렵 개인용 컴퓨터의 bitmapped color display가 단색 VDT 수준의 dot pitch와 선명한 텍스트 표시를 따라잡으면서 범용 컴퓨팅에서 VDT 시장이 급격히 무너짐
- Unix 명령행은 VDT보다 앞선 printing terminal 시대에서 왔고, 출력한다는 뜻으로 “printing”이라는 말을 쓰는 이유도 여기에 있음
vi(1),top(1),mutt(1)같은 문자 기반 2차원 인터페이스는 VDT 시대의 고급 시각 인터페이스였고, 나중에 GUI라는 말이 일반화된 뒤 TUI라는 이름이 붙음- screensaver는 CRT의 phosphor burn-in을 막기 위해 화면 이미지를 바꾸는 소프트웨어에서 시작됐고, flat screen에서는 원래 목적이 사라짐
초기 bitmapped display와 8-bit 미학
- 오늘날의 픽셀 단위 조작 디스플레이로 이어지는 생산 시스템의 첫 사례는 1973년 Xerox PARC의 Alto였음
- Alto의 디스플레이는 608x808 픽셀이었고, 1024x1024급이었다는 기억은 후대 디스플레이와 혼동된 것임
- 1981년 Dandelion은 1024x809를 달성했고, Xerox Star로 상용화하려는 시도는 실패함
- 1982년 Sun Microsystems의 Sun-1은 1024x800 픽셀을 제공했고, Sun급 워크스테이션은 많은 해커가 갖고 싶어 하던 대상이 됨
- 개인용 컬러 컴퓨터는 1975년부터 primitive bitmapped display를 제공했지만, Apple II의 Hi-res 모드는 280x192에 불과했음
- 해커들은 프로그래밍에 좋은 텍스트 표시가 필요했고 1024x1024급 워크스테이션 그래픽을 알고 있었기 때문에, 소비자용 TV 기반 컬러 디스플레이를 거의 쓸모없는 장난감처럼 여기는 경우가 많았음
- 1984년 original Macintosh는 512x342 흑백 전용 bitmapped display를 갖춘 첫 소비자용 기계였고, 곧 IBM EGA와 클론들이 640x350 16색을 제공함
- 1990년경에야 1024x1024 컬러 모니터가 소비자 시장 고급형에 도달했고, 1992년경 일반화되면서 PC 제조사가 워크스테이션 벤더를 압박하기 시작함
- 1980년대 중반의 젊은 해커 일부는 낮은 해상도 컬러 디스플레이와 초기 사운드 하드웨어에서 최대 성능을 끌어내려 했고, 그 결과물인 chunky graphics, pixelated sprites, chirpy/buzzy 사운드는 21세기 게임에서 8-bit 향수로 쓰임
GUI 이전의 게임 문화
- bitmapped color display가 보편화되기 전에는 텍스트 인터페이스와 VDT의 문자 셀 그래픽만으로 동작하는 게임 전통이 강했음
- Trek 계열은 1971년으로 거슬러 올라가는 게임군으로, 플레이어가 Enterprise를 조종해 Klingon, Romulan 등과 싸우는 형태였음
- teletype용으로 설계된 매우 거친 인터페이스 뒤에 initiative, tactical surprise, logistics가 중요한 비교적 정교한 워게임이 숨어 있었음
- Colossal Cave Adventure는 1977년의 첫 dungeon-crawling adventure game이며, “You are in a maze of twisty little passages, all alike”와
xyzzy가 이 게임에서 나옴- PDP-10의 6문자 파일명 때문에 초기 사용자들은 이 게임을 ADVENT로 부르기도 했음
- 현대 C 포트인 ADVENT도 있음
- Zork는 1979년 MIT 해커들이 PDP-10에서 처음 공개한 ADVENT의 직접 후계작이며, 나중에 상업적으로 성공함
- zorkmid, Great Underground Empire, grue 같은 표현이 여기서 나옴
- roguelike는 1980년 Rogue에서 이름을 딴 게임군이며, top-down 지도 형태의 던전에서 몬스터와 싸우고 보물을 찾는 방식이었음
- Hack은 1982년, Nethack은 1987년에 등장함
- Nethack은 개발 그룹이 인터넷을 통한 분산 협업으로 의식적으로 조직된 가장 이른 프로그램 중 하나였고, 그 새로움이 프로젝트 이름에 반영됨
- Rogue의 후손들은 가장 인기 있고 성공한 TUI 게임들이었고, 1990년대 중반 이후 보편 상식에서는 사라졌지만 오늘날에도 소수의 헌신적인 팬층을 유지함
ASCII의 비트 구조와 제어 문자
- ASCII는 1960년대 초 teletype 문자 코드 계열에서 발전했고, Unicode의 낮은 127개 코드 포인트가 ASCII로 설계됐기 때문에 오래 살아남을 가능성이 큼
- UTF-8을 알고 있다면 모든 ASCII 파일은 올바른 UTF-8 파일이기도 함
- 키보드의 Control modifier는 기본적으로 입력 문자의 상위 3비트를 지워 하위 5비트만 남기고 0~31 범위의 제어 문자로 매핑함
Ctrl-SPACE,Ctrl-@, `Ctrl-``는 모두 NUL을 뜻함
- 매우 오래된 키보드는 Shift를 키에 따라 32 또는 16 비트를 토글하는 방식으로 구현했고, 이 때문에 ASCII의 소문자·대문자 관계와 숫자·기호 관계가 규칙성을 가짐
- 1963년 원래 ASCII는 현재 쓰이는 1967년 ASCII와 달랐고, tilde와 vertical bar가 없었으며
5E는 caret이 아니라 up-arrow,5F는 underscore가 아니라 left arrow였음 - 제어 문자 0~31 중 다수는 teletype 프로토콜의 잔재이고, 일부는 텍스트나 Unix 관습, 일부는 바이너리 데이터 프로토콜에 남아 있음
NUL: C 문자열 종료자EOT/Ctrl-D: Unix 터미널에서 end of file 입력BEL/Ctrl-G: teletype의 bell 또는 VDT의 attention signalBS,HT,LF,FF,CR,ESC,DEL: 비교적 잘 알려진 제어 문자 집합DC1/DC3: XON/XOFF 소프트웨어 flow control로 쓰였고 Unix, CP/M, DOS에도 구현됨SUB/Ctrl-Z: DOS와 Windows의 end-of-file 문자이며 CP/M과 DEC 미니컴퓨터 OS에서 이어짐; Unix에서는 process suspend 키로 쓰임ESC: VT100, ANSI VDT, 현대 터미널 에뮬레이터의 제어 시퀀스 introducer로 계속 쓰임
DEL의 값0x7F는 paper tape에서 7개 구멍으로 어떤 ASCII 문자든 덮어쓸 수 있었던 데서 유래했고, tape reader는 DEL과 NUL을 건너뛰었음- Meta 또는 Alt 키는 VDT에서 보통 ASCII keycode에 128을 더했지만, 현대 터미널 에뮬레이터는 수정된 키 앞에
ESC를 넣는 방식도 많이 씀 - ASCII 비트 구조는 ascii(1)로 살펴볼 수 있고, 글의 ASCII 표들도 이 도구로 생성됨
분산 협업의 느린 탄생
- 현대에는 공개 분산 버전 관리와 원격 협업을 당연하게 여기지만, 그 기반 도구와 사용 관습은 오래 걸려 형성됐음
- 초기 조상 중 하나는 1961년 설립된 Digital Equipment Corporation Users' Group인 DECUS의 테이프 공유였음
- DEC 사용자들이 public-domain 소프트웨어를 담은 magnetic tape를 순환시켰고, 1976년에는 이 관습이 자리 잡아 있었음
README관습은 USENET을 통해 Unix 세계에 들어왔지만, DECUS 테이프에서 전파된 흔적으로 보임
- 1970년대에는 이메일로 소스를 주고받고 FTP 사이트에 배포를 올리는 학술 소프트웨어 협업이 있었음
- 네트워크 이메일은 1971년에 발명됐고, 1973년에는 ARPANET 트래픽의 75%를 차지할 정도로 널리 쓰였음
- Donald Knuth의 TeX는 1978년에 시작된 이 시기의 대표적 생존 사례임
- 1980년 이후에는 전용 USENET newsgroup에 소스 코드를 공개하고 외부 기여자가 이메일로 패치를 보내는 방식이 빠르게 관습화됨
comp.sources.unix는 Unix 해커들이 새 코드를 찾는 일상적 장소였음
- 완전한 탈중앙 개발에는 version control, patching, forge가 필요했음
- SCCS는 1972년에 태어났지만 1977년에야 Bell Labs 밖으로 나왔고, 독점 라이선스가 확산을 늦춤
- RCS는 1982년에 나온 자유롭게 재사용 가능한 대안이었음
patch(1)은 1984년에 나왔고, 그 전에는 바뀐 파일 전체를 주고받는 방식이 일반적이었음
- Nethack은 1987년에 시작된 roguelike 게임이며, 개발자들이 이메일로 전체 파일과 이후 패치를 주고받고 SCCS/RCS를 지역 복사본 관리에 쓰던 초기 완전 분산 개발 사례였음
- CVS는 1990년에 등장했고, 1993년에 네트워크 원격 동작 기능이 추가된 뒤 FreeBSD와 NetBSD 같은 주요 프로젝트가 빠르게 채택함
- Linux는 1991년 분산 협업 노력으로 발표됐지만, 초기 개발은 Nethack처럼 이메일 패치 방식이었고 공개 Linux 저장소는 아직 없었음
- SourceForge는 1999년에 등장한 첫 전용 software forge였고, 처음에는 CVS만 지원했지만 2000년에 나온 Subversion 채택을 가속함
- Subversion은 2000~2005년에 보편 상식이 됐고, 2005년 Linus Torvalds가 Git을 만들면서 이전 버전 관리 시스템들이 빠르게 구식이 됨
기억해야 할 시기 흐름
- 1969년에는 Ken Thompson이 Unix가 될 작업을 시작했고, 첫 상용 VDT가 출하됐으며, ARPANET에서 첫 패킷이 교환됨
- 1970년 DEC PDP-11이 출하됐고, 이후 Intel과 ARM을 포함한 아키텍처 계열에 큰 영향을 줌
- 1971년에는 초기 ARPANET에서 네트워크 이메일과
@기호 사용이 발명됨 - 1973년 Xerox Alto가 고해상도 디스플레이와 마우스를 갖춘 네트워크 개인용 컴퓨터인 workstation을 선도함
- 1977년 Unix가 Interdata로 포팅되며 커널 대부분이 C로 작성된 첫 버전이 됐고, SCCS가 공개됐으며 Colossal Cave Adventure가 출하됨
- 1980년 Rogue가 발명되고 USENET이 시작됨
- 1981년 IBM PC가 출하됐고, 4.1BSD Unix의 VAX-11/780에서 TCP/IP가 구현되며 ARPANET과 Unix 문화가 합류하기 시작함
- 1983년 PDP-10이 취소되고 ARPANET은 기술적 변화를 거쳐 Internet이 됨
- 1987년 USENET Great Renaming, Perl 발명, Nethack 프로젝트 시작이 있었음
- 1991년 Linux와 World Wide Web이 각각 시작됐고 Python이 발명됨
- 1993년 Linux는 TCP/IP 기능을 얻어 취미용 장난감에서 진지한 OS로 이동했고, AOL의 USENET 개방으로 “September That Never Ended”가 시작됐으며, Mosaic은 Web에 그래픽과 이미지 기능을 추가함
- 1994년 미국에서 대중 인터넷이 본격화됐고 USB가 공표됨
- 1995~1996년은 UUCP/USENET과 BBS 문화의 정점이자 대중 인터넷 압력으로 무너진 시기임
- 1999년 SourceForge가 시작됐고, Linux가 PC에서 동작하면서 Sun 등 독점 Unix workstation 시장이 붕괴함
- 2005년에는 주요 제조사가 CRT 생산을 중단하고 flat-panel로 이동했으며, AOL이 USENET 지원을 중단하고 Git이 처음 출하됨
- 2007~2008년에는 대중 PC의 64비트 전환으로 32비트 시대가 끝나고, iPhone과 Android가 Unix 기반 OS와 함께 처음 출하됨
댓글과 토론
Hacker News 의견들
-
흥미로운 건 이 글이 현대 세계와 연결하는 방식이 꽤 부정확하다는 점임. 예를 들어 Hayes 명령 접두사
AT가 회선 속도 자동 동기화에 유용한 성질을 가진다고 설명한 직후, 2017년에도 3G/4G 셀룰러 모뎀 제어에 AT 명령이 쓰인다고 함
하지만 현대 모뎀은 직렬로 연결되지 않고, 회선 속도 개념도 없음. 이 성질은 현대 하드웨어에는 무관하며, 기존 코드베이스를 새 환경으로 확장하기 쉬웠다는 설명이 훨씬 그럴듯함
“IoT devices still speak RS-232”도 위험하게 틀린 말임. RS-232는 0에 양전압, 1에 음전압을 쓰고 각각 3~15V 범위라서, 현대 IoT 기기의 직렬 인터페이스에 RS-232를 직접 연결하면 기기를 망가뜨릴 가능성이 큼. 예전 직렬과 현대 장치의 직렬 포트가 공유하는 부분은 RS-232 범위 밖의 것들, 예컨대 8N1 프레이밍은 RS-232가 정의하지 않음
“모든 ASCII 파일은 올바른 UTF-8”이라는 말도 애매함. ASCII는 문자 집합이지 디스크 표현을 정의하지 않으며, 문자를 7비트로 패킹해 저장한 ASCII 파일은 조작 없이는 UTF-8이 아님. 앞에서 다양한 워드 길이와 8비트 클린하지 않은 전송 형식을 다뤘다는 점을 생각하면 이상한 주장임
Git이 이전의 모든 버전 관리 시스템을 빠르게 구식으로 만들었다는 말도 Perforce를 생각하면 과장임. Git은 CVS와 SVN보다 큰 개선이었지만, 그 이전 모든 것을 퇴물로 만들었다는 건 소프트웨어 산업의 큰 부분을 모르는 주장처럼 보임
물론 이건 지나치게 꼬투리 잡는 얘기지만, 글 전체의 톤이 잘난 척하며 꼼꼼하게 따지는 식이라면 같은 기준으로 비판해도 불공평하진 않음- “IoT 기기가 RS-232를 여전히 쓴다”는 말은 실제로 꽤 맞음. 저전압 현대 장치를 떠올린 것 같지만, 산업 현장에서는 Modbus와 RS-485/RS-232가 여전히 살아 있고 IoT도 활발함
현대 모뎀이 직렬로 연결되지 않는다는 말도 맞지 않음. 꼭 RS-232라고 부를 형태가 아닐 뿐, 몇 년 전에도 보통 USB 라인을 썼고 USB도 직렬 버스임
AT 명령은 거의 모든 모뎀에서 여전히 쓰이며, 주머니 속 휴대폰에도 있음. 셀룰러 모뎀이 전화망에 통화를 설정하는 방식이고, 유서 깊은ATDT도 네트워크 호출 설정에 계속 쓰임. AT 명령 집합은 통화 설정과 최대 속도, 허용 프로토콜 같은 통화 속성 제어용이었고, 자동 협상은 네트워크/모뎀 계층의 별도 단계임. 예전 모뎀은 그 과정을 스피커로 들려줬지만, 지금은 들리지 않을 뿐임 - 꼼꼼하게 따지자면 UTF-8도 디스크 표현을 정의하지 않고, Unicode 문자 집합의 문자 인코딩일 뿐임. 다만 비트 표현을 정의한다는 점에서는 “ASCII는 UTF-8로도 유효하다”는 문장이 맞음
이런 문자 집합이 다른 프로토콜 위에서 어떻게 운반되는지는 정의 범위 밖임 - “현대 모뎀은 직렬로 연결되지 않고 회선 속도 개념도 없다”는 건 누가 정한 건지 모르겠음. 지금도 두 번째 화면에서 LTE Cat M1 모뎀에 직렬 링크로 연결된 마이크로컨트롤러를 디버깅 중임
기본은115200 8n1회선이고 속도도 바꿀 수 있으며, 속도 자동 감지도 있음. 모뎀이 별도 라인으로 준비 상태를 알린 뒤 원하는 속도로AT를 보내면 보통 세 번째쯤 응답함 - 이 글은 상식 수준의 설명을 목표로 한 글임. 소프트웨어 산업 전체를 다루는 게 아니라 해커라면 알 만한 부분만 다룬다고 명시함
그런 의미에서 지금은 Git이 소스 코드의 분산 협업에 쓰이는 사실상 유일한 버전 관리 시스템임 - 이건 정말 지나치게 꼼꼼한 반응처럼 보임. 문맥상 8비트 바이트로 저장된 ASCII를 뜻한다고 보면 됨
- “IoT 기기가 RS-232를 여전히 쓴다”는 말은 실제로 꽤 맞음. 저전압 현대 장치를 떠올린 것 같지만, 산업 현장에서는 Modbus와 RS-485/RS-232가 여전히 살아 있고 IoT도 활발함
-
노땅의 보충 설명을 하자면, 전화 모뎀에서 56K는 정말 최대치였음. 전화망 내부가 8비트 샘플을 초당 8천 번 전송해서 64Kbps였는데, 가끔 낮은 비트가 다른 신호용으로 빼앗겼고 전화 고객에게는 들리지 않았음
모뎀을 그 빼앗긴 비트에 동기화하려 하기보다 신뢰 가능한 7비트만 쓰는 편이 쉬웠고, 그래서 56Kbps가 됨. https://en.wikipedia.org/wiki/Robbed-bit_signaling
사실상 터미널 속도로 쓰인 9600bps는 9600bps 모뎀보다 더 오래된 관습임. 80년대 중후반쯤 9600bps 모뎀이 대단한 물건이었고, 터미널 사용자에게는 충분히 빠르면서 당시 터미널에는 감당 가능한 속도였음. Volker-Craig 4404로 기억하는 터미널은 9600bps를 못 따라가서 4800bps쯤 낮춰 써야 했음- 터미널에서 9600bps가 표준 속도가 된 이유는 10비트 프레이밍(시작/바이트/정지)으로 80×24 전체 화면을 2초 안에 보낼 수 있으면서도, 여러 사용자를 처리할 때 분수 MIPS급 호스트에 인터럽트나 DMA 부담을 과하게 주지 않았기 때문임
미니컴퓨터 터미널 멀티플렉서는 보통 가능할 때 전송을 묶어서, DMA로 메모리에서 문자 묶음을 가져와 보낸 뒤 CPU에 “완료” 인터럽트만 보냈음. 문자 모드에서도 수신 버퍼가 차거나 캐리지 리턴 같은 순서 문자가 들어왔을 때만 CPU에 알렸음
그래서 많은 메인프레임과 미니컴퓨터가 블록 모드 터미널을 사용했음. 애플리케이션은 폼 API를 쓰고 편집과 입력은 터미널에서 처리됨. 컴퓨터가 전체 폼을 터미널로 보내고, 사용자가 오류 수정과 숫자/영숫자 필드 같은 검증까지 마친 뒤 명시적 “완료” 동작으로 필드 내용을 컴퓨터에 전송함
완전한 대화형 사용에서도 이런 시스템은 현재 줄 내용이 특정 동작 때만 전송되고 줄 편집은 터미널에서 일어나는 라인 모드를 선호했음. UNIX식 “raw” 모드는 터미널 비용이 조금 더 들더라도 시스템이 감당해야 할 사용자 수에 비해 오버헤드가 너무 컸음 - 56k 모뎀이 있어도 광대역이 널리 보급되기 전까지는 28.8 연결에 묶인 사람이 많았음. 시골 전화선은 56k를 안정적으로 처리하는 경우가 드물었음
- 4800bps라니, 예전에는 2400만 나와도 행복했음
슬프게도 나는 1200 보드였고, 삼촌은 첫 모뎀이 300이었다고 했음
110 설정도 기억나는데, 1948년 베를린 공수작전까지 거슬러 올라갈지도 모름
- 터미널에서 9600bps가 표준 속도가 된 이유는 10비트 프레이밍(시작/바이트/정지)으로 80×24 전체 화면을 2초 안에 보낼 수 있으면서도, 여러 사용자를 처리할 때 분수 MIPS급 호스트에 인터럽트나 DMA 부담을 과하게 주지 않았기 때문임
-
4G 모뎀에서 AT 명령을 쓰는 걸 처음 만졌을 때 정말 웃음이 나왔음. 손에 익은 감각이 그대로 통했음. 다만 다이얼링과 모뎀 소리가 없다는 건 좀 아쉬웠음
3G/4G 모뎀 업계가 장치와 대화할 더 나은 방식을 만들지 못했다는 건 놀라움. ISDN조차 널리 구현된 제대로 된 API가 있었음- 3G/4G일 필요도 없음. ESP8266에서 Wi-Fi를 다루면 아마 AT 명령을 쓰고 있을 가능성이 큼. 물론 Hayes 명령 집합과는 거의 다른 물건임
어쨌든 향수와 경외감과 공포가 같은 비율로 듦
https://docs.espressif.com/projects/esp-at/en/latest/esp32/A... - 위성 통신 실험을 했을 때 Iridium에 연결하면서 AT 명령 집합으로 핸드셰이크해야 해서 깜짝 놀랐음
- 요즘 대부분의 3G/4G 모뎀은 USB로 연결되고, Quectel 칩셋에서는 QMI, 그리고/또는 MBIM을 지원해서 소프트웨어에서 AT보다 쓰기 쉬움
그래도 AT로 대화하는 가상 통신 포트는 남아 있고, 몇몇 진단 작업에는 여전히 필요할 수 있음
QMI/MBIM으로 데이터 연결을 설정하는 건 AT와 PPP를 만지작거리는 것보다 훨씬 쉽고 효율적임 - 웃어야 할지 울어야 할지 몰랐던 건, 셀룰러 모뎀에 HTTPS로 바이너리 파일 다운로드를 시키려고 AT 명령을 날렸을 때였음. 익숙한 명령 집합을 계속 쓰고 싶다는 건 이해하지만, 원래 형태를 알아볼 수 없을 만큼 늘려놨음
- 더 나은 프로토콜은 어떤 모습이어야 할까? 여러 영역에서는 하위 호환성이 꽤 좋은 장점임
- 3G/4G일 필요도 없음. ESP8266에서 Wi-Fi를 다루면 아마 AT 명령을 쓰고 있을 가능성이 큼. 물론 Hayes 명령 집합과는 거의 다른 물건임
-
“역사적 USENET 아카이브는 Google Groups에서 찾을 수 있다”기보다는 archive.org를 추천함. USENET 그룹을 mbox 파일로 저장한 훌륭한 컬렉션이 많고 내려받을 수 있음
mboxgrep같은 걸 설치하거나 메일 리더로 가져오거나, 그냥 텍스트 파일로 읽으면 됨
예시는 여기임
https://archive.org/details/usenet-comp -
1980년대 중반, 런던의 한 대학 컴퓨터(Imperial의 CDC Cyber였던 듯)에서 다른 대학 컴퓨터(Queen Mary였던 듯)에 접속해 Unix 미니컴퓨터에만 있던 기호 대수 패키지를 써보려 했음
중간 소프트웨어들의 올바른 터미널 설정과 구성값을 찾는 데만 꼬박 2시간을 썼고, 차라리 8비트 2MHz 64K 기계에서 할 수 있는 만큼 직접 코딩하는 게 낫겠다는 기분이 들었음- 맞음. 그 시절에는 영국에서 컴퓨터 과학 학위를 하던 사람들이 ZX Spectrum/BBC Micro에서 Elite, Jet Set Willy, Manic Miner를 해킹하며 Z80이나 6502 기계어를 실전으로 익혔을 가능성이 꽤 높았음
-
소프트웨어에는 “위에 계속 쌓는” 문제가 있음. 건설에서는 기존 건물과 구성요소를 재사용하거나, 내부 몇 가지를 업그레이드하거나, 철거 후 새로 지을 수 있음
그런데 소프트웨어는 그렇게 하지 않음. 납 파이프, CAT-3 전선, 말총 단열재, 단창을 새 마천루에 그대로 설치함. 더 나은 PVC, CAT-6, 분사 단열재, 삼중창을 발명하기보다 수십 년 된 낡은 기술 위에 계속 쌓는 편이 쉽기 때문이거나, 아직 낡은 건물이 쓰는 표준을 구식으로 만들기 싫고 건물주들이 업그레이드 비용을 내기 싫어하기 때문임
그래서 작동하는 마천루는 생기지만, 어째서인지 새 엔지니어에게 말총 단열재를 교육해야 함- 사람들은 언제나 완전히 새롭고 더 나은 소프트웨어 기술을 만들려고 함. 하지만 그러면 기존 것들과의 하위 호환성이 깨져 도입이 크게 어려워짐
그래서 대부분 실험적 연구 프로젝트에 머물고, 운이 좋으면 가장 좋은 부분만 시간이 지나며 기존 프로젝트에 점진적으로 들어감 - 지난 60년 넘는 컴퓨터 진화에서 배울 가치가 없다고 보는 듯한 반응이 많아서 흥미로움
놓치고 있는 건 이 “낡고 형편없는 기술” 상당수가 아직 남아 있는 이유임. 그것들은 시간의 시험을 견뎠음. 현대 기술이 순수한 향수 때문에 이런 것들을 유지하는 게 아님. 대체로 문제를 우아하게 풀거나, 더 현대적인 시스템 위에서 유용한 추상화를 제공하거나, 기존 시스템과의 호환성을 피할 수 없기 때문에 여전히 유용함
물론 이런 낡은 기술에도 흠은 있음. 몇십 년 뒤에는 여러분의 코드도 전부 그럴 것임
표준에 관한 XKCD가 뭐였더라?
- 사람들은 언제나 완전히 새롭고 더 나은 소프트웨어 기술을 만들려고 함. 하지만 그러면 기존 것들과의 하위 호환성이 깨져 도입이 크게 어려워짐
-
1997년생으로 소프트웨어 업계에서 일하면서 배운 한 가지는, 소프트웨어 공학이라는 분야가 때로는 시스템의 역사 이해에 가깝다는 것임. 이런 글을 읽으면 어떤 개념이 갑자기 딱 맞아떨어질 때가 있어 좋음
-
임베디드 시스템에서 일하는 입장에서는 이 내용 상당수가 아직도 관련 있음. RS-232 자체, 즉 물리 계층 명세는 덜 쓰이지만, 그 아래의 UART 통신 프로토콜은 여전히 건재함
예를 들어 Beaglebone 개발 보드는 XModem으로 부트로더를 업로드해 부팅할 수 있음- 작은 마이크로컨트롤러 상당수도 여전히 UART 포트와 직렬 프로토콜로 장치를 다시 플래시함. 하드웨어 인터페이스의 최소공통분모이자 작동하는 가장 단순한 방식임
-
사실 ASR-33이 원래 쓰던 더 오래된 TTY 인터페이스가 있었고, 전신 회로에서 유래한 전류 루프라고 불렸음. 1970년대에는 RS-232도 지원하는 듀얼 모드 ASR-33이 나오기 시작했고, 결국 RS-232가 전류 루프를 완전히 대체함
KIM-1(https://en.wikipedia.org/wiki/KIM-1)이 이 방식을 쓰고, 전류 루프(https://en.wikipedia.org/wiki/Current_loop) 인터페이스는 산업 제어 맥락에서 아직도 꽤 흔함. MIDI(https://en.wikipedia.org/wiki/MIDI#Electrical_specifications)의 기반이기도 함- 전류 루프는 케이블 길이가 매우 길 수 있는 곳에서 쓰임. 한쪽 끝에서 20mA를 넣으면 길이와 관계없이 반대쪽에서 얻을 수 있다는 걸 알 수 있는데, 전압 방식에서는 그렇지 않음
- 전류 루프는 80년대까지도 흔히 쓰였고, 긴 케이블 구간이 필요한 곳이면 어디든 사용됐음. 기억으로는 VAX 780이 19200을 지원했지만 20mA 루프에서만 가능했음
-
FF(Form Feed), 즉 Ctrl-L을 많은 영상 표시 터미널이 “화면 지우기” 명령으로 해석했고, 소프트웨어 터미널 에뮬레이터도 가끔 아직 그렇게 함
이건 Usenet에서 스포일러 표시로 흔히 쓰였음. 사용자가 PgDn 같은 키로 넘어가기 전까지 메시지 나머지가 표시되지 않았기 때문임. 화면에는^L로 보여서 뒤에 더 있다는 걸 알 수 있었고,^L이 화면 밖으로 스크롤될 때까지 나머지 화면은 지워졌음