Hãy nhanh chóng xem xét các tệp thiết bị: Trong Linux, các chương trình ứng dụng giao tiếp rad và ghi các hoạt động vào kernel thông qua các mô tả tệp . Điều đó rất tốt cho các tệp và hóa ra API tương tự có thể được sử dụng cho các thiết bị ký tự tạo và tiêu thụ luồng ký tự và chặn các thiết bị đọc và ghi các khối có kích thước cố định tại một địa chỉ truy cập ngẫu nhiên, chỉ bằng cách giả vờ rằng cũng là tập tin.
Nhưng một cách cần thiết để định cấu hình các thiết bị đó (đặt tốc độ baud, v.v.) và vì thế, cuộc gọi ioctl đã được phát minh. Nó chỉ truyền một cấu trúc dữ liệu dành riêng cho thiết bị và loại điều khiển I / O được sử dụng cho kernel và lấy lại kết quả trong cùng cấu trúc dữ liệu, do đó, nó là một API có thể mở rộng rất chung chung và có thể được sử dụng cho nhiều thứ .
Bây giờ, làm thế nào để hoạt động mạng phù hợp? Một ứng dụng máy chủ mạng thông thường muốn liên kết với một số địa chỉ mạng, lắng nghe trên một cổng nhất định (ví dụ 80 cho HTTP hoặc 22 cho ssh) và nếu máy khách kết nối , nó muốn gửi dữ liệu đến và nhận dữ liệu từ máy khách này. Và các hoạt động kép cho khách hàng.
Không rõ ràng làm thế nào để phù hợp với điều này với các thao tác tệp (mặc dù có thể thực hiện được, xem Kế hoạch 9 ), đó là lý do tại sao các nhà thiết kế UNIX đã phát minh ra một API mới: socket . Bạn có thể tìm thấy chi tiết trong phần 2 trang người đàn ông cho socket
, bind
, listen
, connect
, send
và recv
. Lưu ý rằng mặc dù khác với API I / O của tệp, socket
tuy nhiên cuộc gọi cũng trả về một bộ mô tả tệp. Có rất nhiều hướng dẫn về cách sử dụng socket trên web, google một chút.
Cho đến nay, đây hoàn toàn là UNIX thuần túy, không ai nói về giao diện mạng tại các ổ cắm thời gian được phát minh. Và bởi vì API này thực sự cũ, nó được xác định cho nhiều giao thức mạng ngoài giao thức Internet (nhìn vào các AF_*
hằng số), mặc dù chỉ có một vài trong số chúng được hỗ trợ trong Linux.
Nhưng khi máy tính bắt đầu nhận được nhiều card mạng, một số trừu tượng cho việc này là cần thiết. Trong Linux, đó là giao diện mạng (NI). Nó không chỉ được sử dụng cho một phần cứng, mà còn cho các đường hầm khác nhau, các điểm cuối ứng dụng người dùng làm máy chủ như các đường hầm như OpenVPN, v.v. Như đã giải thích, API socket không dựa trên các tệp (đặc biệt) và độc lập với hệ thống tệp. Theo cùng một cách, giao diện mạng cũng không hiển thị trong hệ thống tệp. Tuy nhiên, các NI được cung cấp trong /proc
và /sys
hệ thống tập tin (cũng như các bộ điều chỉnh mạng khác).
Một NI đơn giản là một sự trừu tượng hóa kernel của một điểm cuối nơi các gói mạng nhập và rời khỏi kernel. Ổ cắm, mặt khác, được sử dụng để giao tiếp các gói với các ứng dụng. Không có ổ cắm cần phải được tham gia vào việc xử lý một gói. Ví dụ: khi chuyển tiếp được bật, một gói có thể nhập vào một NI và để lại trên một NI khác. Theo nghĩa đó, ổ cắm và giao diện mạng là hoàn toàn độc lập.
Nhưng phải có một cách để cấu hình NI, giống như bạn cần một cách để cấu hình các thiết bị khối và ký tự. Và vì các socket đã trả về một bộ mô tả tập tin, nên việc cho phép một bộ mô tả tập tin đó là hơi hợp lý ioctl
. Đó là giao diện netdevice mà bạn đã liên kết.
Có khá nhiều sự lạm dụng khác của các cuộc gọi hệ thống theo cách tương tự, ví dụ như lọc gói, chụp gói, v.v.
Tất cả điều này đã phát triển từng mảnh, và không đặc biệt hợp lý ở nhiều nơi. Nếu nó được thiết kế cùng một lúc, một người có thể đã tạo ra một API trực giao hơn.