RNDIS

IT 위키

RNDIS(Remote Network Driver Interface Specification, 원격 네트워크 드라이버 인터페이스 명세)는 마이크로소프트가 개발한 독자(proprietary) 프로토콜로, USB와 같은 버스 위에서 이더넷 호환 네트워크 인터페이스를 구현하기 위한 규격이다. 윈도우의 네트워크 드라이버 구조인 NDIS를 USB 등의 매체 위로 확장한 것으로, 흔히 이더넷 오버 USB(Ethernet-over-USB)를 구현하는 데 쓰인다. 안드로이드 기기의 USB 테더링 기능이 대표적인 사용 사례다.

RNDIS는 호스트(예: PC)가 USB로 연결된 장치를 마치 일반 이더넷 네트워크 어댑터처럼 인식하게 해 준다. 장치는 USB 링크 위에서 IP 패킷을 주고받고, 호스트는 그 인터페이스에 대해 DHCP로 IP를 할당받아 인터넷에 접속한다.

RNDIS의 가장 큰 특징은 표준이 아니라 특정 벤더의 독자 규격이라는 점이다. 이 때문에 운영체제별 지원 여부가 갈린다.

  • 윈도우 — RNDIS를 기본 지원한다. 마이크로소프트가 만든 규격이므로 자연스러운 결과다.
  • 리눅스 — 호환 드라이버(rndis_host 커널 모듈)를 통해 오랫동안 지원해 왔다.
  • macOS — RNDIS를 기본 지원하지 않는다. macOS는 USB 표준 규격인 CDC 계열만 기본 지원한다.

기술적 배경

[편집 | 원본 편집]

NDIS와의 관계

[편집 | 원본 편집]

RNDIS의 "NDIS"는 윈도우의 네트워크 드라이버 인터페이스 명세를 가리킨다. RNDIS는 이 NDIS 인터페이스를 USB·이더넷 등 원격 버스 위로 "원격화(Remote)"한 것으로, 윈도우 입장에서는 USB로 연결된 장치도 내부적으로는 익숙한 NDIS 어댑터처럼 다룰 수 있게 된다.

CDC 계열과의 비교

[편집 | 원본 편집]

RNDIS와 자주 비교되는 것이 USB-IF의 공식 표준인 CDC(Communications Device Class) 계열이다. 둘은 "구형 대 신형"의 관계가 아니라 출신이 다른 표준에 가깝다.

구분 RNDIS CDC 계열 (ECM / NCM / EEM)
제정 주체 마이크로소프트 (독자 규격) USB-IF (USB 공식 표준)
윈도우 지원 기본 지원 부분적/제한적
macOS 지원 미지원 기본 지원 (특히 NCM)
리눅스 지원 호환 드라이버로 지원 기본 지원

CDC 안에는 다시 여러 하위 방식이 있다.

  • EEM (Ethernet Emulation Model) — 구현이 가장 단순해 저사양 기기에 적합하나 성능은 상대적으로 낮을 수 있다.
  • ECM (Ethernet Control Model) — 구현이 더 복잡하지만 EEM보다 나은 성능을 지향한다.
  • NCM (Network Control Model) — ECM의 후속으로 더 높은 처리량을 목표로 한다. macOS에서는 com.apple.driver.usb.cdc.ncm 드라이버가 이를 처리하며, 처리 부담을 장치 쪽으로 오프로드해 호스트 CPU 부하를 줄인다.

많은 장치는 이들 표준 중 둘 이상을 동시에 구현해 두고, 호스트 운영체제가 자신이 선호하는 방식을 골라 통신하도록 맡기는 설계가 가능하다. 즉 한 기기가 RNDIS와 CDC를 모두 광고하면, 윈도우는 RNDIS를, macOS는 CDC를 선택해 쓸 수 있다.

안드로이드와 USB 테더링

[편집 | 원본 편집]

안드로이드 기기는 초기부터 USB 테더링에 RNDIS를 기본 프로토콜로 채택해 왔다. 사용자 대부분이 윈도우 PC를 사용한다는 환경적 배경에서 비롯된 선택으로, 이후 관성적으로 유지되고 있다.

기기 자체는 커널에서 CDC NCM 기능(CONFIG_USB_NET_CDC_NCM=y)이 활성화되어 하드웨어적으로 CDC를 지원할 수 있는 경우에도, 소프트웨어 설정이 RNDIS를 우선하도록 묶여 있어 실제로는 CDC 인터페이스가 노출되지 않는 사례가 보고된다. 이 문제의 근원으로는 안드로이드 코드의 이더넷 인터페이스 인식 정규식 패턴(config_ethernet_iface_regex)이 10년 넘게 방치된 점이 지적된다.

리눅스에서 안드로이드 기기를 USB 테더링하면 커널 로그(dmesg)에 다음과 유사한 항목이 나타난다.

rndis_host 1-9:1.0 eth0: register 'rndis_host' at usb-..., RNDIS device, ...

이때 생성되는 네트워크 인터페이스는 보통 rndis0 또는 usb0로 표시된다.

macOS 호환성 문제

[편집 | 원본 편집]

macOS는 RNDIS를 기본 지원하지 않으므로, RNDIS만 내보내는 안드로이드 기기는 macOS에서 USB 테더링 인터페이스가 잡히지 않는다. 이를 우회하기 위한 방법은 다음과 같다.

HoRNDIS("horrendous"로 발음)는 조슈아 와이즈(Joshua Wise)가 개발한 비공식 macOS용 커널 확장(kext)으로, macOS에 RNDIS 지원을 추가해 준다. 그러나 커널 확장 방식이라 최신 macOS와의 호환성이 떨어진다. 보고에 따르면 HoRNDIS는 macOS Mojave 이후 버전(특히 Ventura 이후)에서는 정상 설치·동작이 어렵다. 따라서 Apple 실리콘 기반 최신 macOS에서는 사실상 사용할 수 없다.

이더넷 테더링 우회

[편집 | 원본 편집]

일부 안드로이드 기기는 USB 테더링과 별개로 이더넷 테더링 옵션을 제공한다. 이 경우 폰에 USB-이더넷 어댑터를 연결하면 표준 CDC 방식으로 동작하므로, macOS가 별도 드라이버 없이 인터페이스를 인식할 수 있다. macOS 기본 NCM 드라이버로 동작하는 칩셋(예: Realtek RTL8153/RTL8156, ASIX AX88179A 등)을 사용하는 어댑터가 권장된다.

다만 삼성 One UI 8 펌웨어에서 일부 구형 이더넷 어댑터 드라이버가 제거되면서, 특정 기기·어댑터 조합에서 이더넷 테더링이 동작하지 않는 사례가 보고되고 있어 주의가 필요하다.

보안 및 기타 고려사항

[편집 | 원본 편집]

RNDIS 인터페이스는 환경에 따라 MAC 주소가 모두 0으로 할당되거나 무작위로 설정되는 경우가 있어, 일부 네트워크 관리 소프트웨어가 인터페이스를 올리지 못하는 문제가 발생할 수 있다. 또한 리눅스 커널에서는 RNDIS 모뎀을 이더넷 장치가 아닌 WWAN(이동통신 모뎀) 장치로 분류하도록 변경하는 등 취급 방식이 바뀌어 왔다.

같이 보기

[편집 | 원본 편집]