2012-02-19 32 views
7

Khi sử dụng pcap_open_live để sniff từ một giao diện, tôi đã thấy rất nhiều ví dụ về sử dụng số khác nhau như giá trị SNAPLEN, từ BUFSIZ (<stdio.h>) để "con số ma thuật".Optimal snaplen cho pcap sống chụp

Sẽ không có ý nghĩa hơn khi đặt làm SNAPLEN MTU của giao diện chúng ta đang chụp? Theo cách này, chúng tôi có thể phù hợp với nhiều gói hơn cùng một lúc trong bộ đệm PCAP. Có an toàn để giả định rằng MRU bằng MTU không?

Nếu không, có cách nào khác lạ để đặt giá trị SNAPLEN không?

Cảm ơn

Trả lời

6

MTU là lớn nhất tải trọng kích thước có thể được giao cho lớp liên kết; nó không bao gồm bất kỳ tiêu đề lớp liên kết nào, ví dụ, trên Ethernet, nó sẽ là 1500, không phải là 1514 hoặc 1518 và sẽ không đủ lớn để nắm bắt gói Ethernet đầy đủ kích cỡ.

Ngoài ra, nó không bao gồm bất kỳ tiêu đề siêu dữ liệu nào như tiêu đề radiotap cho thông tin vô tuyến 802.11. Nếu các bộ chuyển đổi đang làm bất kỳ hình thức phân mảnh/phân đoạn/reassembly offloading, các gói giao cho adapter hoặc nhận từ adapter có thể chưa được phân mảnh hoặc phân đoạn, hoặc có thể đã được lắp ráp lại, và, như vậy, có thể là nhiều hơn lớn hơn MTU.

Để lắp thêm các gói trong bộ đệm PCAP, nó chỉ áp dụng cho các cơ chế chụp TPACKET_V1 và TPACKET_V2 được ghi vào bộ nhớ trong Linux, có các khe gói kích thước cố định; các cơ chế chụp khác không dự trữ một khe có kích thước tối đa cho mỗi gói, do đó chiều dài ảnh chụp ngắn hơn sẽ không quan trọng. Đối với TPACKET_V1 và TPACKET_V2, chiều dài ảnh chụp nhỏ hơn có thể tạo ra sự khác biệt, mặc dù, ít nhất là đối với các nỗ lực Ethernet, libpcap 1.2.1, tốt nhất có thể, để chọn kích thước vùng đệm thích hợp cho Ethernet. (TPACKET_V3 dường như không có các khe có kích thước cố định cho mỗi gói, trong trường hợp nó sẽ không có vấn đề này, nhưng nó chỉ xuất hiện trong các hạt nhân đã được chính thức phát hành gần đây, và không hỗ trợ cho nó tồn tại trong libpcap.)

+0

được rồi, vì vậy tôi phải "đoán" kích thước tối đa có thể xảy ra cho lưu lượng truy cập mà tôi sẽ theo dõi. – ziu

+2

* Nếu * bạn đang sử dụng Linux với phiên bản libpcap hiện đại và phiên bản không phải là 1.2.1 hoặc mới hơn hoặc bạn không chụp trên Ethernet (hoặc đang capture trên Ethernet với việc phân mảnh/phân đoạn/gỡ lại tải) , * và * bạn không muốn phân bổ bộ đệm chia sẻ bộ nhớ (sử dụng 'pcap_create()'/'pcap_set_buffer_size()'/'pcap_activate()') và muốn tránh các gói tin bị mất, bạn sẽ phải đoán kích thước tối đa có thể xảy ra đối với các gói được gửi tới libpcap. –

+0

Ok, vấn đề của tôi là gấp đôi vì tôi không phân tích từng gói trước khi nhận gói mới, do đó tôi cũng phải đệm trên cấp ứng dụng của người dùng. Đó là lý do tại sao tôi đang cố gắng cắt giảm sử dụng bộ nhớ. – ziu