Ổ cắm chung là gì và nó liên quan đến thiết bị mạng như thế nào?


9

Tôi đang cố gắng hiểu cách trình điều khiển mạng hoạt động trong Linux. Câu hỏi và trả lời này cho thấy thiết bị mạng trong Linux không được đại diện bởi một tệp thiết bị. Nó nói rằng trình điều khiển mạng làm việc với sockets.

Ví dụ, tài liệu này tham khảo cách thiết lập các thiết bị mạng thông qua ioctlcác cuộc gọi. ioctltuy nhiên cần một bộ mô tả tệp , với điều kiện là không có tệp thiết bị nào cho trình điều khiển mạng, bộ mô tả tệp duy nhất có thể được truyền là cái từ ổ cắm.

Điều này đưa tôi đến điểm của câu hỏi. Cho đến nay, có vẻ như giao diện mạng, là đại diện phần mềm của card mạng vật lý, thực sự là một đối tượng kém hơn so với ổ cắm.

  • Nhưng một ổ cắm theo nghĩa trừu tượng này là gì, nó chỉ là một tên khác cho một tập tin thiết bị hỗ trợ thông báo đẩy? Tôi hiểu các socket TCP về các điểm kết nối được liên kết bởi ứng dụng không gian người dùng với một địa chỉ: cặp cổng trên giao diện mạng. Tôi không hiểu ổ cắm là điều kiện tiên quyết để thiết lập giao diện mạng.

  • Giao diện mạng trên Linux (như eth0được liệt kê bởi ifconfig) có thể tồn tại mà không có ổ cắm không?

  • ifconfighoặc một số trình nền quản lý mạng giữ một ổ cắm mở để cho phép chúng tôi đặt các tùy chọn giao diện mạng?


Câu trả lời:


5

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, sendrecv. Lưu ý rằng mặc dù khác với API I / O của tệp, sockettuy 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/syshệ 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.


Sockets as the network communications API were already not represented in the filesystem, so the NI didn't get one, either.Đây có phải là một lỗi đánh máy?
TheMeaningfulEngineer

Phần nào bạn nghĩ là một lỗi đánh máy? Ổ cắm đơn giản không có tên tệp hoặc inode được liên kết với chúng (mặc dù ổ cắm tên miền Unix có).
dirkt

Tôi chỉ không hiểu về ngữ nghĩa câu, xin lỗi, vì vậy muốn kiểm tra lại.
TheMeaningfulEngineer

Xin lỗi, tôi là người không nói tiếng Anh. Tôi đã cố gắng viết lại nó, bây giờ có dễ hiểu hơn không?
dirkt
Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.