2010-07-08 38 views
10

Tôi có một ứng dụng đọc Java đọc từ một ổ cắm đa hướng trên nền tảng Linux 64 bit (2.6.18). Kích thước ổ cắm đã được đặt thành 2 MB. Khi người đọc không thể đọc đủ nhanh ổ cắm "tràn", tức là các gói tin bị loại bỏ khỏi bộ đệm.Làm thế nào để tràn bộ đệm ổ cắm Linux?

Điều tôi muốn biết là hạt nhân Linux sẽ loại bỏ các gói dữ liệu ra khỏi bộ đệm socket như thế nào. Tôi giả định rằng bộ đệm ổ cắm chính nó là một bộ đệm FIFO. Tuy nhiên, nếu nó đầy những gì sẽ xảy ra? Gói tiếp theo có bị loại bỏ (và nội dung bộ đệm không thay đổi) không? Hay gói tin mới sẽ thay thế một gói cũ trong bộ đệm? Nếu có, gói nào (cũ nhất ?, trẻ nhất ?, một gói được chọn ngẫu nhiên?)?

Cảm ơn mọi thông tin chi tiết.

Trả lời

8

Khi bộ đệm đầy, các gói dữ liệu đến sẽ bị loại bỏ. Các gói đã có trong bộ đệm không được sửa đổi hoặc thay thế.

+0

Cảm ơn bạn. Bạn có một liên kết/nguồn mà sao lại tuyên bố này? – AtomicJake

+0

@AtomicJake: đây là một thực hành tiêu chuẩn về thiết kế mạng. Hoặc: hệ điều hành khác có thể làm gì? IIRC khi bộ đệm ổ cắm đầy đủ TCP stack đặt kích thước cửa sổ thành 0. Tất cả các gói dữ liệu đến trong tiểu bang sẽ được coi là không hợp lệ (không vừa với cửa sổ) và do đó bị loại bỏ. Đọc RFC793, tìm "cửa sổ nhận". – Dummy00001

+0

Bạn phù hợp với TCP, nhưng tôi đã yêu cầu cụ thể cho một ổ cắm đọc Multicast UDP. Theo như tôi biết mỗi gói tin gửi đến từ mạng được sao chép trong một bộ đệm ổ cắm độc lập (một bộ đệm cho mỗi đầu đọc). Các ổ cắm do đó làm trống bởi mỗi người đọc ở một tốc độ khác nhau. Trên Linux, khi một bộ đệm đầy, một gói mới đơn giản là bị loại bỏ - hoặc (như trong bộ đệm vòng) sẽ ghi đè mục nhập cũ nhất? Tôi cho rằng cả hai triển khai đều hợp pháp. – AtomicJake

2

Chỉ cần bổ sung câu trả lời của JS Bangs.

Đây không phải là nơi duy nhất trong ngăn xếp mạng nơi các gói có thể bị xóa. Bộ đệm nhận ổ cắm cao trong hệ thống phân cấp và đặc trưng cho socket của người dùng. Một nơi khác gần phần cứng hơn (ít nhất là trong Linux) là hàng đợi giữa trình điều khiển thiết bị và NET_RX softirq (xem netif_rx().) Những giọt này sẽ đóng góp vào một cột RX-DRP trong đầu ra netstat -i.

+0

Cảm ơn. Tôi đã thiết lập với 'sar' mà thực sự tôi bị mất gói trên bộ đệm ổ cắm được đọc bởi ứng dụng. Tôi có thể thấy các bộ đếm khi các gói bị xóa do ứng dụng quá chậm để đọc. – AtomicJake

Các vấn đề liên quan