GN⁺: 이더넷 패킷 전송 사건
(github.com/francisrstokes)-
이더넷 패킷 전송
- 저자는 "Networking from scratch"라는 시리즈를 만들고자 했으며, 마이크로컨트롤러에서 TCP/IP 스택을 구축하는 프로젝트를 시작했음.
- 이 블로그 글은 첫 이더넷 패킷을 성공적으로 전송한 이야기와 프로젝트에서의 버그 및 디버깅에 대한 경험을 공유함.
-
마이크로컨트롤러
- 사용된 마이크로컨트롤러는 STM32F401이며, ARM Cortex-M4 기반으로 최대 84MHz로 동작함.
- 96KiB의 RAM을 가지고 있어 여러 패킷을 처리할 수 있는 충분한 용량을 제공함.
-
이더넷
- 이더넷은 다양한 기술과 표준을 포함하는 개념으로, 물리적 수준의 하드웨어, 신호 형식, 버스 충돌 처리 전략, 프레임 레이아웃 등을 포함함.
- 이 프로젝트에서는 Wiznet의 W5100 칩을 사용하며, 이 칩은 하드웨어 TCP/IP 스택을 내장하고 있음.
-
문제 1: 공허 속에서 외치기
- W5100 칩과의 통신을 위한 드라이버를 작성했으나, SPI 신호가 잘못 연결되어 통신이 이루어지지 않았음.
- Arduino 쉴드의 ICSP 헤더가 SPI 신호를 잘못 연결하여 문제가 발생했으며, 이를 수정하기 위해 보드를 재작업함.
-
문제 2: 코미디의 본질
- SPI 신호가 올바르게 연결된 후에도, 이더넷 패킷 전송이 제대로 이루어지지 않았음.
- 논리 분석기를 사용하여 디지털 신호를 분석하고, 칩 선택 신호의 타이밍 문제를 해결하여 통신을 성공적으로 수행함.
-
문제 3: 알 수 없는 패킷
- Wireshark에서 전송한 패킷이 아닌 잘못된 패킷이 나타났음.
- Arduino 라이브러리를 참고하여 문제를 분석하고, 잘못된 메모리 주소에 데이터를 기록하는 버그를 수정하여 문제를 해결함.
-
이야기의 교훈
- 이더넷 패킷 전송은 작은 성과일 수 있지만, 프로젝트에서의 버그와 디버깅 경험은 가치가 있음.
- 디버깅과 도구 작성은 개발 과정에서 중요한 부분이며, 탐구와 실험을 통해 시스템을 이해하는 것이 중요함.
- 프로젝트는 더 높은 추상화 수준의 문제와 버그를 다루며 진행 중임.
Hacker News 의견
-
도구를 작성하고 디버깅을 탐색하는 것은 항상 가치가 있음. 그러나 많은 사람들이 이를 이해하지 못하고, 특히 JIRA와 같은 개발 프로세스에서 탐색의 가치를 보지 못하는 경우가 많음.
-
작은 도구를 만드는 능력은 10배 생산성을 가진 프로그래머의 핵심이며, 이는 종종 그림자 속에서 실천되는 예술임.
-
TCP/IP와 Ethernet 프레임 스택을 마이크로컨트롤러에서 처음부터 구축하는 시리즈의 시작임. W5100 칩을 사용하여 TCP/IP를 처리하고, 사전 구축된 Ethernet 프레임을 지원함.
-
FPGA 엔지니어링으로 경력을 전환하여 Ethernet에 집중하고 있으며, 네트워킹의 추상화를 이해하는 것이 매우 가치가 있었음.
-
STM32F401과 W5100 Ethernet 쉴드를 사용하는 대신 STM32F407 보드와 저렴한 Ethernet PHY 보드를 사용하는 것이 더 나을 것이라는 의견이 있음.
-
Ethernet 기능은 일반적으로 마이크로컨트롤러 내에 내장된 주변 장치로 포함되어 있음.
-
MOSI/MISO의 새로운 명칭인 main out/subordinate in을 처음 봤으며, COPI/CIPO 대안은 잘 이해되지 않음.
-
Linux에서 네트워크 스택을 작성하려면
socket(AF_PACKET, SOCK_RAW, htons(ETH_P_ALL))
를 사용할 수 있음. -
STM32 Nucleo 보드에는 100Mbps Ethernet이 내장되어 있으며, STM32Cube 소프트웨어는 혼합된 평가를 받지만 작동하는 예제를 제공함.
-
Ethernet은 프레임을 다루며, 패킷은 IP 개념임.
-
ENC28J60 'Stand-Alone Ethernet Controller with SPI Interface'를 고려할 수 있으며, 하드웨어 TCP/IP 스택이 없어 소프트웨어 구현이 필요함.