장치 파일을 신속하게 검토합시다. Linux에서 응용 프로그램은 파일 디스크립터를 통해 rad와 통신하고 커널에 쓰기 작업을합니다 . 그것은 파일에 효과적이며, 문자 스트림을 생성하고 소비하는 문자 장치에 동일한 API를 사용할 수 있으며 무작위 액세스 주소에서 고정 크기의 블록을 읽고 쓰는 장치 는 파일이기도합니다.
그러나 이러한 장치를 구성하는 방법 (보레이트 설정 등)이 필요했으며이를 위해 ioctl 호출이 발명되었습니다. 장치에 특정한 데이터 구조와 커널에 사용되는 I / O 제어의 종류를 전달하고 동일한 데이터 구조로 결과를 다시 가져 오므로 매우 일반적인 확장 가능한 API이며 많은 것들에 사용될 수 있습니다 .
이제, 네트워크 운영은 어떻게 맞습니까? 일반적인 네트워크 서버 응용 프로그램이 원하는 결합 일부 네트워크 주소로 듣기 (HTTP에 대한 예를 들어, 80, 또는 22 SSH) 특정 포트 및 클라이언트의 경우 커넥트 , 그것은 싶어 보낼 데이터 및 수신 이 클라이언트에서 데이터를. 그리고 클라이언트를위한 이중 작업.
파일 작업에이를 어떻게 적용 할 것인지는 확실하지 않습니다 ( 계획 9 참조 ). UNIX 디자이너가 새로운 API를 개발 한 이유는 sockets 입니다. 당신의 섹션 2 맨 페이지에서 자세한 내용을 찾을 수 있습니다 socket
, bind
, listen
, connect
, send
와 recv
. 파일 I / O API와는 socket
다르지만 이 호출은 파일 디스크립터도 리턴합니다. 웹에서 소켓을 사용하는 방법에 대한 많은 자습서가 있습니다 (Google 조금).
지금까지 이것은 모든 순수한 UNIX이며, 소켓이 발명 될 당시 아무도 네트워크 인터페이스에 대해 이야기하지 않았습니다. 이 API는 실제로 오래 되었기 때문에 AF_*
Linux 에서는 인터넷 프로토콜 이외의 다양한 네트워크 프로토콜에 대해 정의되어 있습니다 ( 상수 참조).
그러나 컴퓨터가 여러 개의 네트워크 카드를 얻기 시작하면서 이에 대한 추상화가 필요했습니다. Linux에서 이는 네트워크 인터페이스 (NI)입니다. OpenVPN 등의 터널로 서버로 사용되는 다양한 터널, 사용자 응용 프로그램 끝점에도 사용됩니다. 설명 된 것처럼 소켓 API는 파일을 기반으로하지 않으며 파일 시스템과 독립적입니다. 같은 방식으로 네트워크 인터페이스도 파일 시스템에 나타나지 않습니다. 그러나 NI는 파일 시스템 ( /proc
및 /sys
기타 네트워킹 튜너 블) 에서 사용할 수 있습니다 .
NI는 네트워크 패킷이 커널로 들어오고 나가는 엔드 포인트의 커널 추상화입니다. 반면에 소켓은 패킷을 응용 프로그램과 통신하는 데 사용됩니다. 패킷 처리에 소켓이 필요하지 않습니다. 예를 들어, 포워딩이 활성화되면 패킷이 한 NI에 입력되고 다른 NI에 남겨질 수 있습니다. 그런 의미에서 소켓과 네트워크 인터페이스는 완전히 독립적입니다.
그러나 블록 및 문자 장치를 구성하는 방법이 필요한 것처럼 NI를 구성하는 방법이 있어야했습니다. 소켓은 이미 파일 설명자를 반환했기 때문에 ioctl
해당 파일 설명자를 허용하는 것이 다소 논리적이었습니다 . 그것이 당신이 연결 한 netdevice 인터페이스입니다.
패킷 필터링, 패킷 캡처 등과 같은 유사한 방식으로 시스템 호출에 대한 다른 몇 가지 남용이 있습니다.
이 모든 것이 한 조각 씩 성장해 왔으며 많은 곳에서 특히 논리적이지 않습니다. 한 번에 모두 디자인했다면 아마도 더 직교 API를 만들었을 것입니다.