AF_NETLINK가 있는 이유는 무엇입니까? AF_UNIX로는 충분하지 않나요?

AF_NETLINK가 있는 이유는 무엇입니까? AF_UNIX로는 충분하지 않나요?

내가 아는 한, AF_NETLINK 소켓 프로토콜은 커널과 사용자 공간 간의 통신에 사용되고 AF_UNIX는 두 사용자 공간 프로세스 간의 통신에 사용됩니다.

Linux에 별도의 AF_NETLINK가 필요한 이유는 무엇입니까? 커널과 사용자 간의 통신에 UNIX 소켓을 사용할 수 없는 이유는 무엇입니까?

답변1

원산지와 디자인 특징이 다릅니다. 프로토콜을 처음부터 설계하는 것이 더 나은 아이디어인 경우가 많습니다. 그러면 레거시 프로토콜의 문제를 겪지 않고 필요에 맞게 특별히 맞춤화할 수 있기 때문입니다.

나는 이러한 선택이 UNIX 도메인 소켓의 커널 구현이 사용자 커널 통신에 적절하게 포팅하기에는 너무 다르기 때문이라고 생각합니다. AF_NETLINK의 프로토콜 목록은 ioctl과 유사한 제어를 제공하도록 특별히 설계되었습니다. AF_UNIX는 socket함수의 "프로토콜" 매개변수 도 사용하지 않습니다 . 다른 프로토콜을 허용하도록 정의를 확장했다면 기존 애플리케이션이 중단될 수 있으며 커널의 새 프로토콜을 커널 제어 코드로 리디렉션하는 것은 매우 어색할 것입니다. 이 두 기능을 겹치는 것도 보안 위험이 될 수 있습니다(특히 AF_UNIX는 원래 이를 염두에 두고 설계되지 않았기 때문에).

마지막으로... UNIX 도메인 소켓은 파일 시스템을 네임스페이스로 사용합니다("익명" 소켓을 허용하는 해킹이 있지만). 따라서 해당 소켓에 대한 권한이 있는 모든 사용자는 이를 즉시 사용할 수 있습니다. 커널과 통신하려면 사용자가 사용할 수 있는 파일 시스템(아마도 sys?) 어딘가에 항상 열려 있는 "파일"이 있어야 합니다. 커널에 연결합니다.

간단히 말해서, 그들은 단지 다른 목적으로 사용됩니다. 두 개의 사용자 공간 프로세스에 대해 AF_NETLINK를 재사용할 수 있더라도(AF_UNIX와 다르게 수행) 그 반대는 실제로 작동하지 않습니다.

관련 정보