2012-04-29 23 views
6

Tôi đang viết chương trình giám sát cho mạng lưu lượng rất cao (video HD được truyền qua mạng). Hầu hết các gói tin đều rất lớn và tôi chỉ muốn xem các tiêu đề (chỉ IP và UDP/TCP). Tất nhiên tôi muốn tránh việc sao chép toàn bộ dữ liệu. Có libpcap nhất thiết phải cung cấp cho tôi một bản sao toàn bộ gói? Nếu có, có thư viện nào phù hợp với nhu cầu của tôi không?libpcap có luôn tạo bản sao của gói không?

Trả lời

6

Có vẻ như là hai câu hỏi ở đây:

  • một trong các tiêu đề, mà âm thanh như thể nó hỏi xem bản libpcap gói;
  • hình ảnh trong cơ thể, hỏi xem nó có luôn sao chép toàn bộ gói toàn bộ gói hay không.

Đối với câu hỏi đầu tiên:

Có lẽ ít nhất một bản sao được thực hiện bởi bất kỳ mã sử dụng các cơ chế trên đỉnh mà libpcap chạy trong hệ điều hành khác nhau - một bản sao từ mbufs/skbuff/suối buffers/bất cứ điều gì đến bộ đệm của cơ chế. Đối với Linux, khi cơ chế tpacket là không được sử dụng, skbuff thể chỉ được xếp hàng vào hàng đợi nhận cho libpcap PF_PACKET ổ cắm đang sử dụng.

Có thể có một bản sao khác - bản sao từ bộ đệm đó tới vùng người dùng; nếu libpcap đang sử dụng cơ chế "không sao chép", chẳng hạn như cơ chế tpacket của Linux (trong đó libpcap 1.0 và sau đó được sử dụng theo mặc định), bản sao thứ hai không xảy ra. Nó sẽ xảy ra nếu cơ chế không sao chép không được sử dụng.

Tuy nhiên, nếu bạn đang sử dụng pcap_next() hoặc pcap_next_ex() trên hệ thống Linux và cơ chế tpacket đang được sử dụng, một bản sao riêng biệt, từ bộ nhớ đệm ánh xạ tới bộ đệm riêng; điều đó không xảy ra nếu bạn sử dụng pcap_dispatch() hoặc pcap_loop().

Đối với câu hỏi thứ hai:

Đó là những gì các "snaplen" lập luận để pcap_open_live()pcap_set_snaplen() là cho - nó cho phép bạn xác định rằng không quá "snaplen" byte dữ liệu gói nên được chụp, và điều đó có nghĩa là không quá nhiều byte được sao chép. Lưu ý rằng độ dài này bao gồm các tiêu đề lớp liên kết và các tiêu đề đó có thể bao gồm các tiêu đề "siêu dữ liệu" chẳng hạn như radiotap tiêu đề mà bạn có thể nhận được trên các bộ điều hợp 802. 11. Tiêu đề này có thể có độ dài thay đổi (ví dụ, trên 802.11, tiêu đề 802.11 có độ dài thay đổi, và nếu bạn nhận được tiêu đề radiotap, chúng cũng có độ dài thay đổi). Ngoài ra, cả hai tiêu đề IPv4 và TCP đều có thể có các tùy chọn, và các gói IPv6 có thể có các phần mở rộng, do đó độ dài của các tiêu đề IP và TCP cũng có thể thay đổi.

Điều này có nghĩa là bạn có thể phải xác định thời lượng chụp nhanh "trường hợp xấu nhất" để sử dụng; không có cách nào để nói một cách rõ ràng "đừng cho tôi bất cứ điều gì vượt qua tiêu đề TCP/UDP", bạn chỉ có thể nói "cho tôi không quá N byte".

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