Linux에서 네트워크 드라이버가 작동하는 방식을 이해하려고 합니다.이 Q&ALinux의 네트워크 장치가 장치 파일로 표시되지 않음을 나타냅니다. 네트워크 드라이버가 sockets
.
예를 들어,이것ioctl
전화를 통해 네트워크 장치를 설정하는 방법을 참조하세요 . ioctl
하지만파일 설명자가 필요합니다, 네트워크 드라이버에 대한 장치 파일이 없는 경우 전달할 수 있는 유일한 파일 설명자는 소켓의 파일 설명자입니다.
이것이 문제의 핵심으로 다가옵니다. 현재로서는 네트워크 인터페이스(물리적 네트워크 카드의 소프트웨어 표현)는 실제로 소켓보다 하위 수준 개체입니다.
하지만 추상적인 의미에서 소켓이란 무엇일까요? 푸시 알림을 지원하는 장치 파일의 또 다른 이름입니까? 나는 사용자 공간 응용 프로그램이 네트워크 인터페이스의 주소:포트 쌍에 바인딩되는 연결 지점의 관점에서 TCP 소켓을 이해합니다. 소켓이 네트워크 인터페이스를 설정하기 위한 전제 조건이라는 것을 이해하지 못합니다.
Linux의 네트워크 인터페이스(
eth0
나열된 대로)가ifconfig
소켓 없이 존재할 수 있습니까?일부 네트워크 관리자 데몬은
ifconfig
네트워크 인터페이스 옵션을 설정할 수 있도록 소켓을 열어두나요?
답변1
장치 파일을 빠르게 검토해 보겠습니다. Linux에서 애플리케이션은 다음과 같은 방법으로 읽기 및 쓰기 작업을 커널에 전달합니다.파일 설명자. 이는 파일에 효과적이며 동일한 API가 파일에도 작동하는 것으로 나타났습니다.캐릭터 장치문자 스트림을 생성하고 소비합니다.블록 장치임의 액세스 주소에서 고정 크기 블록을 읽고 쓰세요. 파일인 것처럼 가장하세요.
하지만 이러한 장치를 구성하는 방법(전송 속도 설정 등)이 필요합니다.I/W 제어전화기가 발명되었습니다. 커널에 대한 장치별 데이터 구조와 I/O 제어 유형을 전달하고 동일한 데이터 구조로 결과를 반환하므로 많은 용도로 사용할 수 있는 매우 일반적이고 확장 가능한 API입니다.
이제 네트워크 운영은 어떻게 적응합니까? 일반적인 웹 서버 애플리케이션은 다음과 같습니다.제본특정 네트워크 주소로,듣다특정 포트(예: HTTP의 경우 80, SSH의 경우 22)에서 클라이언트가연결하다, 그것은 원한다보내다평화를 위한 데이터받다이 클라이언트의 데이터입니다. 그리고 고객을 위해 이중 의무를 수행하십시오.
이것을 파일 작업에 적용하는 방법은 명확하지 않습니다. (할 수는 있지만,계획 9) 이것이 UNIX 디자이너가 새로운 API를 발명한 이유입니다.소켓. socket
, bind
, 및 listen
의 2부 매뉴얼 페이지에서 자세한 내용을 확인할 수 있습니다 . 파일 I/O API와 다르지만 이 호출은 여전히 파일 설명자를 반환합니다. 온라인으로 소켓을 사용하는 방법에 대한 많은 튜토리얼이 있습니다. Google에서 찾아보세요.connect
send
recv
socket
이것은 지금까지 모두 순수한 UNIX였으며 소켓이 발명되었을 때 아무도 네트워크 인터페이스에 대해 이야기하지 않았습니다. 그리고 이 API는 매우 오래되었기 때문에 인터넷 프로토콜 외부의 다양한 네트워크 프로토콜(상수 참조)에 대해 정의되어 있지만 AF_*
Linux에서는 그 중 일부만 지원됩니다.
그러나 컴퓨터에 여러 네트워크 카드가 제공되기 시작하면서 일부 추상화가 필요했습니다. 리눅스에서는 말이다.네트워크 인터페이스(너). 하드웨어뿐만 아니라 다양한 터널에서도 사용되며, OpenVPN과 같은 터널에 대한 사용자 애플리케이션 엔드포인트 역할도 합니다. 설명했듯이 소켓 API는 (특수) 파일 기반이 아니며 파일 시스템 독립적입니다. 마찬가지로 네트워크 인터페이스는 파일 시스템에 나타나지 않습니다. 그러나 NI는 파일 /proc
시스템 /sys
(및 기타 네트워크 튜너블)에서 사용할 수 있습니다.
NI는 네트워크 패킷이 커널에 들어오고 나가는 엔드포인트의 간단한 커널 추상화입니다. 반면에 소켓은 애플리케이션과의 패킷 통신에 사용됩니다. 패킷 처리에 참여하는 데 소켓이 필요하지 않습니다. 예를 들어, 전달이 활성화되면 패킷이 하나의 NI로 들어가고 다른 NI로 나갈 수 있습니다. 이러한 의미에서 소켓과 네트워크 인터페이스는 완전히 독립적입니다.
그러나 블록 및 문자 디바이스를 구성하는 방법이 필요한 것처럼 NI를 구성하는 방법도 있어야 합니다. 소켓은 이미 파일 설명자를 반환하므로 ioctl
해당 파일 설명자에 하나만 허용하는 것이 다소 논리적입니다. 이것은인터넷 장비연결한 인터페이스입니다.
패킷 필터링, 패킷 캡처 등과 같은 비슷한 방식으로 시스템 호출을 남용하는 경우가 많이 있습니다.
이 모든 것은 조금씩 발전하며, 많은 곳에서는 특별히 논리적이지 않습니다. 한 번 설계하면 보다 직교적인 API를 만들 수 있습니다.