2P by GN⁺ 21시간전 | ★ favorite | 댓글 1개
  • AVR64DD32 8비트 MCU만으로 웹사이트를 호스팅했으며, 24MHz CPU·8KB RAM·64KB Flash의 작은 환경에서 동작함
  • 직접 Ethernet 신호를 만들기에는 10BASE-T도 너무 빨라, Linux가 지원하는 SLIP으로 USB-Serial 링크를 네트워크 인터페이스처럼 사용함
  • SLIP은 패킷을 0xC0으로 감싸고 특수 바이트를 이스케이프하는 단순한 방식이라 MCU와 현대 Linux 연결에 적합함
  • IP는 단편화 비활성화 덕분에 단순해졌지만, TCP 구현은 연결 상태·재전송·예외 처리가 필요해 며칠이 걸렸고 버그도 남아 있음
  • 외부 접속은 VPS·WireGuard·프록시로 /mcu 요청만 전달하는 우회 구조이며, 공개 IPv4 비용과 IPv6 부재가 핵심 제약으로 드러남

8비트 AVR로 웹사이트를 호스팅한 구성

  • AVR64DD32는 Arduino로 알려진 Atmega328과 비슷한 8비트 AVR 계열 MCU이며, 같은 메모리 기준으로 더 저렴하고 단일 프로그래밍 핀과 더 나은 주변장치를 제공함
    • 최대 24MHz 단일 8비트 AVR 코어
    • 8KB 정적 RAM, 64KB Flash, 256바이트 EEPROM
    • 1.8~5.5V 전압 범위, $1~$2 가격대
  • MCU만으로 인터넷에 직접 연결하려면 Ethernet 신호를 만들어야 하지만, 가장 느린 10BASE-T도 이 환경에는 너무 빠름
    • 10BASE-T는 10Mbit/s로 동작하고, Manchester 인코딩 때문에 실제 선로에서는 20Mbit가 됨
    • AVR64DD32의 CPU는 24MHz까지 가능하지만 주변장치와 IO 핀은 12MHz 클록이 최대라 직접 신호 생성이 어려움
    • 전용 Ethernet 칩을 쓰는 방법이 정석이지만, 프로젝트 완성을 위해 몇 주 기다려야 했음
  • 대안으로 SLIP(Serial Line Internet Protocol, RFC 1055) 을 사용해 직렬 링크 위에 네트워크를 올림
    • 패킷 앞뒤를 0xC0 바이트로 감쌈
    • 패킷 안의 0xC00xDB 0xDC로, 기존 0xDB0xDB 0xDD로 바꿔 모호성을 피함
    • 과거 다이얼업 모뎀이 전화선 위에 직렬 링크를 만들고 컴퓨터가 그 위에서 네트워킹을 처리하던 방식과 이어짐
    • 현대 Linux도 SLIP을 지원해 USB-Serial 어댑터를 네트워크 인터페이스로 만들 수 있음
    • 사용 예시는 stty -F /dev/ttyUSB0 115200 raw cs8, slattach -m -F -L -p slip /dev/ttyUSB0 형태임
  • MCU 쪽 하드웨어는 단순하며, 외부 부품 없이도 동작함
    • www.c: 소스 코드
    • www.elf: 미리 빌드된 바이너리
    • LED와 전원 역연결 방지용 다이오드를 추가함
    • 소비 전력이 몇 mW 수준이라 USB-Serial 어댑터의 5V 레일만으로 서버 구동이 가능함

프로토콜 구현과 공개 접속 처리

  • IP 구현은 현대 환경의 제약 덕분에 단순해짐
    • 웹페이지가 사용자 컴퓨터에 도달하려면 패킷이 여러 네트워크를 지나야 하며, 각 패킷에는 출발지와 목적지 주소 등을 담은 40바이트 IP 헤더가 필요함
    • 예전 IP는 패킷 단편화 같은 기능 때문에 올바르게 처리하려면 많은 메모리가 필요했음
    • 현대 운영체제는 단편화를 비활성화하고, IPv6는 단편화를 제거했기 때문에 직접 처리하지 않아도 됨
    • 받은 패킷의 출발지와 목적지를 바꾸고 TTL 카운터를 재설정하면 응답 헤더를 만들 수 있음
  • TCP 구현은 연결 상태 추적, 손실 패킷 재전송, 여러 예외 상황 처리가 필요해 훨씬 어려움
    • 커스텀 TCP 구현이 충분히 동작하기까지 며칠이 걸렸고, 아직 몇 가지 버그가 남아 있음
    • HTTP는 별도로 구현하지 않고 서버가 항상 하드코딩된 “응답”을 클라이언트에 보냄
    • URL이 하나뿐인 사이트라면 이 방식으로 충분히 동작함
    • 로딩 과정은 Video 3에서 볼 수 있음
  • 외부 접속에는 공개 라우팅 가능한 IPv4 주소가 필요하지만, 비용과 집 인터넷 연결 품질이 걸림돌이 됨
    • 공개 라우팅 가능한 주소가 있는 머신은 Helsinki 근처 데이터센터의 VPS에 있음
    • Linux의 WireGuard로 인터넷 위에 가상 네트워크 링크를 만들고, 한쪽이 CGNAT 뒤에 있어도 동작하게 함
    • Linux 라우터 박스가 VPS에 연결되어 더 적절한 인터넷 연결을 얻는 구조가 됨
  • MCU에는 여전히 자체 공개 IP가 없기 때문에 VPS 주소의 모든 요청을 넘기면 기존 웹사이트가 깨짐
    • 대신 서버가 /mcu 아래 요청만 로컬 주소 블록을 사용해 MCU 서버로 프록시하도록 구성함
    • 방문자가 MCU의 TCP/IP 스택에 직접 연결하는 구조는 아니지만, Vape Server와 같은 방식임
    • SYN 패킷으로 망가뜨리기는 약간 더 어려워지지만, 사실상 다이얼업에 가까운 연결 위의 서버라 DDoS에는 취약함
  • IPv6 부재가 전체 우회 구성의 근본 원인으로 남음

댓글과 토론

Hacker News 의견들
  • 25년도 더 전에 가장 작은 웹 서버를 만드는 과시성 경쟁이 있었음: https://web.archive.org/web/20000815063022/http://www-ccs.cs...
    ACE1101 마이크로컨트롤러를 쓴 사람이 “우승”했는데, 원문 기사는 못 찾겠고 이런 것도 있음: https://conceptlab.com/fly/
    파리 위의 웹 서버였음

    • ACE1101 버전을 내가 만들었고, 미리 프로그래밍한 칩을 Saskatoon의 아티스트에게 우편으로 보냈음. Archive.org에 원래 설명이 남아 있음: https://web.archive.org/web/20020605032321/http://d116.com/a...
      코드를 줄여 넣는 과정이 정말 재미있었고, ping을 없애니 비트뱅잉 I2C와 EEPROM으로의 UDP 업로드를 넣을 공간이 생겼는데도 여전히 1024바이트 미만이었음
    • 그 작은 웹 서버를 며칠 전에도 떠올렸고 여기에도 올렸지만 별 반응은 없었음. 그때도 지금도 꽤 인상적이라고 봄
  • AVR DD, EA, EB 시리즈를 좋아하지만, Microchip의 최신 칩 출시는 AVR 팬에게 조금 걱정스럽게 보임: https://www.microchip.com/en-us/products/microcontrollers/32...
    PIC32 CM은 이벤트 시스템, MVIO, 5V 동작 등 AVR DD의 기능 대부분을 갖추면서도 더 크고 표준적인 ARM 32비트 M0+ 코어를 제공함
    이 때문에 AVR DD는 다소 구식이 된 것 같다는 걱정이 듦. AVR EA와 AVR EB는 16배 프로그래머블 이득을 가진 12비트 ADC가 있고, 노이즈는 좀 있어도 약 50마이크로볼트까지 민감해서 말도 안 되게 좋은 ADC/전류 센서라 안전해 보임
    반대로 이게 AVR 계열을 더 인기 있게 만들 수도 있음. 핀 호환되는 ARM32 Cortex M0+가 있다는 사실이 AVR 플랫폼 위에 만들 가능성을 높이는지 낮추는지 궁금함
    개인적으로는 주변장치가 가장 중요하다고 봄. AVR DD는 전력 소모가 더 낮을 가능성이 있고, 특히 1.8V 동작이 그렇지만 그걸로 충분한지는 모르겠음
    프로젝트 자체는 아주 흥미롭고, AVR DD는 어쨌든 훌륭한 칩이라 실제로 쓰는 모습을 보니 좋음
    10BASE-T는 10메가비트/초로 동작하고 맨체스터 인코딩 때문에 선로상으로는 20메가비트가 되는데, AVR EB에는 x2 PLL 타이머가 있어서 오래 붙잡고 다루면 맨체스터 인코딩을 출력할 수 있을지도 모름
    LUT, UART 주변장치, PLL로 올린 타이머 회로를 조합하면 고속 맨체스터 인코딩을 밀어낼 수 있을 듯하지만, 20Mbit까지 될지는 더 생각해봐야겠음

    • Microchip은 대부분의 회사보다 칩을 오래 지원하는 편으로 알려져 있음. 수요가 있는 한 사실상 계속 생산하고, Dx 시리즈도 꽤 최근 제품임
      Cortex-M0 경로를 만지작거리는 건 Dx 이후의 8비트 플랫폼 세대를 계속 개발하고 싶지는 않다는 신호일 수 있음. 같은 기능을 다른 CPU 코어로 가져온다면 그건 괜찮다고 봄
  • 페이지에 HTML이 실시간으로 스트리밍되어 올라오는 게 보여서 좋음. 예전 전화접속 시절 이미지가 위에서 아래로 천천히 그려지던 느낌이 남

    • 추억이 떠오름. 학교의 형편없는 전화접속은 아버지 직장의 128 ISDN에 비하면 참을 수 없을 정도로 느렸음
      그쪽에서는 FTP에서, 나중에는 Napster에서 한 번 접속할 때 노래 여러 곡도 내려받을 수 있었음
  • 제목을 보고 처음 든 생각은 “임베디드/IoT 장치 중에 저런 거 많이 하는데”였음
    10/100 Ethernet 내장 8051 예시가 있음: https://www.asix.com.tw/public/index.php/en/product/Microcon...

  • 두 가지가 재미있었음. 첫째, 여기의 www.c에는 들어 있지 않은 RFC 1055의 2025년 정오표가 있음. 그 정오표는 디코딩 알고리즘을 어떻게 바꾸는지 꽤 설득력 있게 보여주고, 이 경우 링크 반대편이 실제로 Linux임
    둘째, 다음 목적지는 아마 RFC 1144일 듯함

  • ENC28J60 + PIC18 조합은 20년 전 Microchip이 흔히 배포하던 데모에서 정확히 이런 일을 하던 구성이었음

  • 프록시가 페이지의 server: 헤더를 덮어쓰지 않은 점이 마음에 듦

  • 예전에 Arduino Mega로 비슷한 걸 만든 적이 있음. 클라이언트가 많은 일을 해주기 때문에 꽤 그럴듯하게 보일 수 있다는 게 놀라웠고, 컨트롤러는 그저 uSD 카드에서 콘텐츠를 전달할 뿐이었음