Một tập các chỉ thị hệ thống cho việc bắt gói và phân tích mạng phải có tính mạnh mẽ để có hiệu suất thực thi tốt nhất, hạn chế độ phức tạp c a giao tiếp giữa ứng dụng ng ời dùng và nhân,và tại mức thấp có thể gửi hoặc nhận dữ liệu trực tiếp từ card mạng mà không cần có th m sự t ơng tác nào v i l p phần mềm khác.
Kiến trúc BSD có thể nhìn nhận tóm tắt gồm có ba thành phần chính. Khối thứ nhất đó chính là Berkeley Packet Filter (BPF) là thành phần ở mức nhân cho việc bắt gói. BPF có thể biết rộng rãi có tính thực thi tốt nhất so v i những thành phần t ơng tự khác sẳn sàng trong nhân Unix và nó có thể xem nh là một trình điều khiển thiết bị (device driver), cái mà có thể t ơng tác v i card mạng thông qua trình điều khiển c a card mạng.
Hình 1.7 Các thành phần c a BSD
Các thành phần chi tiết nh là Network Tap, Filter, Buffer, Th viện Libcap sẽ đ ợc trình bày chi tiết hơn ở d i.
1.6.1.a. Network Tap.
Network tap là một hàm callback, đó là một phần c a mã BPF nh ng nó không chạy trực tiếp bởi BPF. Nó đ ợc gọi bởi trình điều khiển thiết bị c a card mạng khi mà một gói tin m i đến. Trình điều khiển c a card mạng phải gọi network tap cho mỗi gói tin, mặt khác, BPF sẽ không làm việc trên bộ chuyển đổi mạng.
Network tap sẽ thu thập những bản sao c a gói tin từ thiết bị mạng và phân phối chúng t i ứng dụng đang lắng nghe. Những gói tin đến, nếu đ ợc chấp nhận bởi bộ lọc sẽ đ ợc bỏ trong một bộ đệm và đ ợc chuyển đến ứng dụng khi mà bộ đệm đầy.
Khi một gói tin đến tại một card mạng, trình điều khiển thiết bị mức liên kết bình th ờng sẽ gửi gói tin lên chồng giao thức hệ thống. Nh ng khi BPF đang lắng nghe trên interface này, điều khiển đầu ti n đ ợc gọi là hàm khai thác mạng c a BPF( network tap).
1.6.1.b. Filter.
Việc lọc sẽ quyết định gói tin đ ợc chấp nhận hay không và sao chép chúng đến ứng dụng đang lắng nghe. Hầu hết các ứng dụng sử dụng BPF từ chối gói tin nhiều hơn so v i chấp nhận nó. Do đó, hiệu suất c a bộ lọc gói tin là rất quan trọng cho toàn bộ việc thực hiện tốt. Lọc gói tin là một chức năng cung cấp v i ngõ ra là
logic đ ợc áp dụng đến gói tin. Nếu dữ liệu c a hàm chức năng này là đúng (true) thì hạt nhân sẽ sao ch p gói tin đến ứng dụng; nếu nó trả ra là sai thì gói tin đ ợc bỏ qua. Bộ lọc gói BPF hầu nh là phức tạp hơn, bởi vì nó quyết định không chỉ những gói tin đã đ ợc giữ lại mà còn số byte đ ợc giữ . Chính đặc điểm này rất hữu dụng nếu ứng dụng bắt gói không cần đến toàn bộ gói tin. Cho ví dụ chẳng hạn, một ứng dụng bắt gói th ờng chỉ quan tâm t i ti u đề (headers) và không quan tâm đến dữ liệu bên trong gói. Nh vậy ứng dụng có thể thiết lập một bộ lọc chấp nhận chỉ những byte đầu tiên c a gói, cái mà phần ti u đề sẽ đ ợc sao ch p. Hành động này sẽ tăng tốc độ xử lý bắt gói và giảm xác xuất gói tin bị mất bởi vì nó giảm số l ợng byte đ ợc sao chép từ trình điều khiển đến ứng dụng và giảm không gian cần l u trữ gói tin trong bộ đệm.
Trong lịch sử có hai cách tạo ra sự trừu t ợng lọc: một cây biểu thức logic và một đồ thị điều khiển dòng không có chu kỳ hay CFG.Thông tin chi tiết hơn về chúng có thể tìm thấy trong các tài liệu kèm theo. Hai mô hình này c a bộ lọc c tính t ơng đ ơng, chẳng hạn, vài bộ lọc có thể thực hiện trong lúc này hoặc có thể thực hiện vào lúc khác. Tuy nhiên, việc thực thi là khác nhau: mô hình cây có thể dễ ánh xạ mã đến chồng máy (stack machine) trong khi mô hình CFG có thể ánh xạ đến một thanh ghi mã máy( register machine code).Ng ời tạo ra BPF chọn CFG bởi vì nó có thể triển khai hiệu quả hơn tr n nhiều máy tính hiện nay mà dựa vào thanh ghi. Mã giả máy BPF là một bộ xử lý ảo, và sự trừu t ợng c a nó bao gồm một bộ nh , một thanh ghi chỉ số (x), một bộ l u trữ nh hỗn tạp, và một bộ đếm ch ơng trình ngầm. Nó có thể chạy để tải và l u chỉ thị, rẽ nhánh, chỉ thị số học và vv.. Do đó, một ứng dụng UNIX muốn thiết lập một bộ lọc tr n gói tin đến thì phải xây dựng ch ơng trình cho máy mã giả và gửi nó đến BPF thông qua một lời gọi IOCTL. BPF chạy ch ơng trình lọc trên mỗi gói tin và h y chúng nếu không đáp ứng bộ lọc đ a ra. Máy mã giả BPF có một vài tính năng hay nh :
- Nó là một giao thức độc lập. điều này nghĩa là nhân không có chỉnh sửa để thêm hổ trợ giao thức m i.
- Nó là chung đ để xử lý các khả năng không l ờng tr c đ ợc - Nó đ ợc tối u hóa cho tốc độ, có thể thực hiện tốt hơn.
Việc khai thác gói tin cho phép bộ lọc ứng dụng tham gia vào. Bộ lọc đ ợc định nghĩa bởi ng ời dùng quyết định liệu một gói tin là đ ợc chấp nhận hay không, hay có bao nhiêu byte c a mỗi gói tin sẽ đ ợc l u lại. Chú ý rằng bộ lọc đ ợc áp dụng đến gói tin trong khi nó v n đang nằm trong bộ nh trình điều khiển mức liên kết (link-level driver), mà không phải sao chép nó. Điều này tối u rất nhiều về hiệu suất sử dụng và bộ nh sử dụng, vì trong tr ờng hợp này gói tin không đ ợc chấp nhận sẽ đ ợc loại bỏ tr c khi sao chép nó. Nếu bộ lọc chấp nhận gói tin, việc khai thác để sao chép số l ợng byte chỉ rõ bởi bộ lọc từ bộ nh c a trình điều khiển mức
khiển c a interface sẽ chiếm điều khiển lại và thu thập xử lý giao thức bình th ờng.
1.6.1.c. Kernel Buffer.
BPF kết hợp một bộ lọc và hai bộ đệm để xử lý bắt gói mà đ ợc yêu cầu bởi dịch vụ. Bộ lọc đ ợc tạo ra bởi ứng dụng và chuyển t i BPF thông qua 1 lời gọi IOCTL.
Bộ đệm hạt nhân đ ợc chia thành hai bộ đệm nhỏ, và sẽ đ ợc sử dụng để giữ gói tin trong suốt quá trình bắt gói thực hiện. Những khối bộ nh này v i kích th c c a nó trong nhân BSD gần đây th ờng là 32 Kbyte Bộ đệm đầu tiên trong hai bộ đệm ( đ ợc gọi là bộ đệm store: l u trữ) th ờng đ ợc sử dụng để nhận dữ liệu từ adapter. Bộ đệm thứ hai( đ ợc gọi là bộ đệm hold : giữ) đ ợc sử dụng để sao chép các gói tin đến ứng dụng. Khi mà bộ đệm store đầy và bộ đệm hold rỗng, BPF sẽ hoán đổi chúng. V i cách này, ứng dụng mức ng ời dùng sẽ không gây trở ngại đến trình điều khiển thiết bị card mạng bởi vì những dữ liệu tr c sẽ đ ợc xóa ra trong khi những gói sau đang lấp đầy trong bộ đệm.
Một gói tin đ ợc bỏ đi nếu bộ đệm store đầy, và bộ đệm hold không có khả năng sẳn sàng. ( ví dụ , xử lý v n đang đọc dữ liệu từ nó).
Quá trình xử lý thực hiện một lời gọi hệ thống đọc để nhận gói tin từ BPF. Khi mà bộ đệm hold đầy( hoặc hết thời gian chờ), BPF sẽ sao ch p nó đến bộ nh xử lý và đánh thức trình xử lý. Một ứng dụng có thể nhận nhiều hơn một gói tin tại một thời điểm. Để duy trì ranh gi i c a gói tin, BPF bọc dữ liệu bắt đ ợc từ một gói tin v i một ti u đề bao gồm nhãn thời gian( time stamp), chiều dài và sắp xếp độ dời cho dữ liệu .
1.6.1.d. Thƣ viện Libcap.
Libpcap là một thành phần chính từ góc độ lập trình bởi vì nó dấu đi tính t ơng tác giữa nhân hệ điều hành và ứng dụng. Lipcap đ a ra một tập các chức năng mà có thể liên kết v i ứng dụng ng ời dùng, và cung cấp một giao tiếp mạnh mẽ cho quá trình bắt gói. Nó bao gồm việc sinh ra bộ lọc, quản lý bộ đệm mức ng ời dùng( cái mà v n còn ẩn trong ứng dụng), t ơng tác giữa chế độ nhân và chế độ ng ời dùng. Bộ đệm mức ng ời dùng đ ợc sử dụng để l u trữ gói tin đến từ nhân và nằm ở mức ng ời dùng, nó chặn ứng dụng truy xuất t i bộ đệm đ ợc quản lý bởi nhân. Những hàm này cung cấp bởi libpcap có khả năng chỉ v i mục đích bắt gói: th viện này không cho phép gửi những gói tinvà giám sát mạng.
Libcap làm việc trong không gian ng ời dùng, ít phụ thuộc vào hệ điều hành, nó có thể chuyển thành công sang vài hệ điều hành Unix. Mặt khác, BPF chỉ có thể thực hiện trong vài hệ điều hành. Sự thiếu một bộ lọc BPF trong nhân (ví dụ Solaris) nghĩa là tất cả gói tin đ ợc chuyển đến libcap tại mức ng ời dùng và th viện này làm cho giống các hàm trong BPF ( lọc và đệm). Tuy nhiên, việc lọc gói tin ở nhân hiệu quả hơn vì hệ thống tránh việc sao chép những gói tin không quan tâm từ card
mạng đến mức ng ời dùng. Hơn nữa, lọc ở nhân sẽ giảm số lời gọi hệ thống và số l ợng chuyển đổi ngữ cảnh giữa mức ng ời dùng và nhân bởi vì chỉ những gói tin có ích m i đ ợc sao ch p đến mức ng ời dùng.