네트워크 인터페이스가 다른 장치와 같이 / dev에없는 이유는 무엇입니까?


70

나는 주로 궁금하지만 / dev에 네트워크 인터페이스가없는 이유는 무엇입니까? / dev 아래에 노드로 표시되지 않는 다른 종류의 장치가 있습니까?


2
필자는 만트라에도 불구하고 유닉스의 모든 것이 파일 이 아닌 방법에 관한 기사를 적어도 하나 보았습니다 .이 문제를 인용합니다. 지금은 찾을 수 없지만 아마도 Plan 9 또는 GNU Hurd에 관한 기사 일 것입니다.
Shawn J. Goff

3
적어도 Solaris에서는 / dev (/ devices actual) 아래에 네트워크 인터페이스 장치가 있습니다.
jlliagre

2
유닉스에서 파일이된다고해서 반드시 전체 사용자 영역에서 그렇게 행동하는 것은 아니며, 기본 API가 파일 디스크립터에서 산뜻하고 균일하게 작동한다는 것입니다. 당신은 소켓을 열 때, 예를 들어, 당신은 사용할 수 있습니다 read()write()같은 방식으로 파일에서와,하지만 유틸리티 기능 recv()send()당신을 위해 더 많은 마술을한다.
jgoldschrafe

1
그것은 내가 몇 년 동안 나 자신에게 묻던 질문이었습니다. 문의 해 주셔서 감사합니다.
Dolanor

답변:


43

많은 장치에서 주요 작업은 컴퓨터에서 주변 장치로 바이트를 보내거나 컴퓨터의 주변 장치에서 바이트를받는 것입니다. 이러한 장치는 파이프와 유사하며 문자 장치 로 잘 작동 합니다 . 읽기 및 쓰기가 아닌 작업 (예 : 직렬 회선의 흐름 제어)의 경우 장치는 ioctl 이라는 임시 명령을 제공합니다 .

일부 장치는 일반 파일과 매우 유사합니다. 한정된 바이트 수로 구성되어 있으며 주어진 위치에서 쓴 내용을 나중에 같은 위치에서 읽을 수 있습니다. 이러한 장치를 블록 장치 라고 합니다 .

네트워크 인터페이스는 더 복잡합니다. 읽고 쓰는 것은 바이트가 아니라 패킷입니다. readand 와 함께 일반적인 인터페이스를 사용하는 것이 여전히 가능하지만 write어색 할 것입니다. 아마도 각 호출 write은 패킷을 보내고, 각 호출 read은 패킷을받을 것입니다 (그리고 버퍼가 너무 작아서 패킷을 맞추기에 적합하지 않은 경우, 패킷이 손실됩니다).

네트워크 인터페이스는 장치 만 제공 할 수 있습니다 ioctl. 실제로 이것은 일부 유닉스 변형이 수행하지만 Linux는 아닙니다. 이 접근법에는 몇 가지 장점이 있습니다. 예를 들어 Linux에서 네트워크 인터페이스는 udev를 활용할 수 있습니다. 그러나 장점은 제한적이므로 아직 완료되지 않았습니다.

대부분의 네트워크 관련 응용 프로그램은 개별 네트워크 인터페이스에 신경 쓰지 않고 더 높은 수준에서 작동합니다. 예를 들어 웹 브라우저는 TCP 연결을 만들고 웹 서버는 TCP 연결을 수신하려고합니다. 이를 위해 유용한 것은 네트워크 프로토콜과 같은 고급 네트워크 장치를위한 장치입니다.

{ echo $'GET http://www.google.com/ HTTP/1.0\r';
  echo $'Host: www.google.com\r';
  echo $'\r' >&0; cat; } <>/dev/tcp/www.google.com/80

실제로 ksh 및 bash는 TCP 및 UDP 클라이언트에 이러한 인터페이스를 제공합니다. 그러나 일반적으로 네트워크 응용 프로그램은 파일 액세스 응용 프로그램보다 더 복잡합니다. 대부분의 데이터 교환이 유사한 호출하여 수행하는 동안 readwrite의 연결을 설정하는 것은 단지 파일 이름보다 더 많은 정보가 필요합니다. 예를 들어, TCP 연결 수신은 서버 수신 대기시 수행되는 단계와 클라이언트가 접속할 때마다 수행되는 단계의 두 단계로 이루어집니다. 이러한 추가 단계는 파일 API에 적합하지 않으므로 네트워킹에 자체 API가있는 주된 이유입니다.

일반적으로 /devLinux 에는 항목이 없지만 다른 유닉스 변형 에는없는 다른 종류의 장치 가 비디오 어댑터입니다. 원칙적으로, 간단한 비디오 어댑터는 프레임 버퍼 장치 로서 노출 될 수 있으며 , 이는 각 픽셀의 색상을 나타내는 블록으로 이루어진 블록 장치 일 수있다. 가속 비디오 어댑터는 응용 프로그램이 명령을 보내는 문자 장치로 표현 될 수 있습니다. 여기서 장치 인터페이스의 단점은 느리다는 것입니다. 표시 응용 프로그램 (실제로 X 서버)은 무엇이든 표시 할 때마다 커널 호출을해야합니다. 대신 X 서버는 비디오 어댑터의 메모리에 직접 쓰기가 더 빠르기 때문에 대부분 발생합니다.


2
실제로 가속 비디오 어댑터 Linux에서 DRI를 통해 chardev 내보내집니다. 파일 I / O 작업입니다하지 neccessarily read/ write하나; mmap매핑 된 파일 및 장치 메모리에 직접 액세스하는 데 사용할 수 있습니다 .
minmaxavg

11

/sys/class/net디렉토리 에서 찾을 수 있습니다 . 그것은 /sys/device/../../내 다른 가상 머신 (리눅스 커널 3.10) 출력의 다른 파일에 대한 심볼릭 링크 입니다. 그리고 당신은 명령 udevadm info <filename>을 사용 하여 속성을 살펴볼 수 있습니다

lrwxrwxrwx. 1 root root 0 Apr  3 13:38 ens33 -> ../../devices/pci0000:00/0000:00:11.0/0000:02:01.0/net/ens33

U & L에 오신 것을 환영합니다. 인라인 코드 주위에는 항상 역 따옴표를 사용하십시오. 특히 <>다른 방법으로 사용 하는 경우 마크 업으로 해석됩니다. (단순한 키보드를 사용하는 사용자는 사용자의 의견에 대한 응답으로 이름의 첫 문자를 입력하는 데 어려움이 있으므로 ASCII 문자로 시작하도록 이름을 변경할 수도 있습니다)
Anthon

9

TCP / IP 네트워킹을 수행하는 AT & T / Solaris "Transport Level Interface"(TLI) 방식에는 "/ dev / tcp"또는 "/ dev / udp"와 같은 특수 파일이 있습니다. 프로그래머는 해당 프로토콜 파일의 소켓을 얻기 위해 해당 특수 파일을 엽니 다. 그래서 솔라리스에서 소켓을 사용하는 프로그램을 컴파일 할 때 "-lnsl"이 있어야한다고 생각합니다. 그 아래에는 TLI가 있습니다.


4
리눅스는 또한 가지고 /dev/tcp/dev/udp대부분의 커널은이 비활성화 불구하고.
bahamat

3

전통적으로 Linux는 완전히 호환되지는 않았지만 LSB 이외의 모든 Open Group 표준을 따르지 않아도됩니다. 더 많은 UNIX 기능을 Linux로 이식하려는 시도가있었습니다.

Glendix는 Plan9의 / net 가상 파일 시스템 포트를 제공하는 프로젝트 중 하나로서 설명과 마찬가지로 할 수 있습니다.

리눅스에 Plan9 포트 / net 파일 시스템

당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.