Lý do tại sao giao thức TCP / IP socket descriptor sử dụng tập tin là, khi giao diện ổ cắm được thiết kế và thực hiện (lần đầu tiên trong BSD Unix, vào năm 1983 ), nhà thiết kế của nó cảm thấy rằng một kết nối mạng là tương tự như một file - bạn có thể read
, write
và close
cả hai và nó sẽ phù hợp với ý tưởng của Unix về "mọi thứ là một tập tin".
Các triển khai ngăn xếp mạng TCP / IP khác không nhất thiết phải tích hợp với hệ thống con tệp I / O của hệ điều hành của họ, một ví dụ là MacTCP . Nhưng vì giao diện ổ cắm BSD rất phổ biến, ngay cả những triển khai khác này đã chọn sao chép API socket bằng các chức năng giống Unix của nó, do đó bạn có "mô tả tệp", chỉ được sử dụng cho giao tiếp TCP / IP, trên các hệ thống không có có mô tả tập tin.
Phần khác của câu hỏi của bạn là tại sao có giới hạn? Đó là bởi vì cách nhanh nhất để thực hiện bảng tra cứu mô tả tệp là với một mảng. Trong lịch sử, giới hạn được mã hóa cứng vào kernel.
Đây là mã trong phiên bản Unix 7 (1979) với giới hạn 20 mã mô tả tệp được mã hóa cứng cho mỗi quy trình:
Khi so sánh, Linux tự động phân bổ không gian cho bảng mô tả tệp của quy trình. Giới hạn tuyệt đối mặc định là 8192, nhưng bạn có thể đặt giá trị này thành bất cứ thứ gì bạn thích. Hệ thống của tôi liệt kê 191072 trong /proc/sys/fs/file-max
.
Mặc dù không còn giới hạn tuyệt đối trong Linux nữa, tuy nhiên chúng tôi không muốn để các chương trình phát điên, vì vậy, quản trị viên (hoặc nhà đóng gói phân phối) thường đặt giới hạn tài nguyên. Hãy nhìn vào /etc/security/limits.conf
, hoặc chạy ulimit -n
.