Nguồn gốc và tính năng thiết kế là khác nhau. Nói chung, đó là một ý tưởng tốt hơn để thiết kế một giao thức từ đầu bởi vì sau đó bạn có thể làm cho nó đặc biệt phù hợp với những gì bạn cần, mà không gặp vấn đề với các giao thức cũ.
Tôi tin rằng sự lựa chọn này là do việc triển khai trong kernel của các socket miền UNIX quá khác nhau để cho phép chuyển sane sang giao tiếp kernel-kernel. Danh sách các giao thức cho AF_NETLINK được thiết kế đặc biệt để cung cấp điều khiển giống như ioctl. AF_UNIX thậm chí không sử dụng đối số "giao thức" cho socket
hàm. Và nếu họ bằng cách nào đó mở rộng định nghĩa để cho phép các giao thức bổ sung, nó có thể sẽ phá vỡ các ứng dụng hiện có và sẽ rất khó xử khi chuyển hướng các giao thức mới sang mã điều khiển kernel. Nó cũng có thể là một rủi ro bảo mật khi chồng chéo hai chức năng này (đặc biệt là vì AF_UNIX ban đầu không được thiết kế với mục đích này).
Và cuối cùng ... các socket miền UNIX sử dụng hệ thống tập tin như một không gian tên (mặc dù có một hack cho phép các socket "nặc danh"). Như vậy, chúng có sẵn ngay lập tức cho tất cả người dùng có quyền đối với ổ cắm này - để liên lạc với kernel, cần phải có một "tệp" luôn mở ở đâu đó trong hệ thống tệp (có thể là sys?) Mà người dùng sẽ sử dụng để kết nối với kernel.
Nói tóm lại, chúng chỉ đơn giản là được sử dụng cho những thứ khác nhau. Ngay cả khi bạn có thể sử dụng lại AF_NETLINK cho hai quy trình không gian người dùng (nó được thực hiện khác với trong AF_UNIX) thì điều ngược lại sẽ không thực sự hiệu quả.
convey the information about the PID of the calling process
-> SO_PEERCRED, SCM_CREDENTIALS?