Xử lý gói tin thô bằng mảng 2 chiều hay đẩy vào DB dùng query?
Chào mọi người,
Mình đang phát triển một chương trình Sniffer.
Hiện tại đã có thể bắt các gói tin DNS và có chức năng DNS lookup.
Vấn đề gặp phải khi mình bắt và phân tích gói tin TCP do có tính chất phân mảnh.
Khi sniff packets, chương trinh sẽ bắt tất cả các gói tin và không có thứ tự như ý muốn, vì cùng 1 lúc card mạng tạo nhiều sock mở các port khác nhau để transfer dữ liệu giữa máy và nhiều server. Do đó mình cần lọc các gói tin nhận được, các gói tin nào của cùng 1 cặp client-server(ip và port) để riêng. Sau đó cần ghép lại các TCP segments để thành gói tin TCP hoàn chỉnh. Khi đó mới đọc được phần data dump và mới có thể xuất ra http requests, responses, etc. Giống như chức năng follow TCP stream trong writeshark ấy.
Dữ liệu gồm header và data hiện tại mình lưu dưới dạng txt và bin, dưới đây là 1 ví dụ về cấu trúc của dữ liệu mình đang xử lý (file log của chương trình):
https://drive.google.com/file/d/0B742cptW9kulWWdCUVVLQ0VGVTQ/view?usp=sharing
Do mình tạm thời bỏ phần gói tin DNS đi nên log sẽ chỉ gồm các gói tin TCP qua port 80 thôi nhé
Mình định làm như sau nhưng có vể hơi rườm rà và khó kiểm soát.
B1: Đầu tiên lọc các gói tin cho vào mảng 2 chiều Array_packets[i,j]:
i: Các cặp client-server khác nhau (ip, port)
j: các gói tin cùng 1 cặp client - server (ip, port)
B2: Xóa dumplicate ở cùng 1 hàng (thuộc các gói cùng 1 cặp client-server). Vì TCP gửi và nhận gói tin thông qua ack và seq nên các gói tin đã có sự sắp xếp sẵn trong cùng 1 stream.
B3: Xóa header và ghép phần data dump của các hàng với nhau =, lưu ra mảng data mới => xuất dữ liệu ra log
Flow: Nhận packet => lưu vào mảng => xử lý => lưu ra mảng mới.
Tuy hướng làm như vậy nhưng liệu nó đã tôi ưu? và việc ghép data dump có dễ dàng?
Hướng suy nghĩ khác của mình là:
Bắt tất cả các gói tin và lưu vào database, sau đó dùng query để lọc các gói tin cùng tcp stream rồi ghép data sau.
Tuy nhiên cách này mình nghĩ sẽ giảm hiệu năng đi rất nhiều, vì tốn rất thời gian dùng để tương tác và xử lý với server, gồm nhạn gói tin => Lưu lên DB => tạo, gửi query => xử lý => gửi về => Xử lý
Mong nhận được nhiều ý kiến đóng góp từ các đàn anh chị đi trước và toàn thể mn trong cộng đồng Daynhauhoc!!!
Thân!
Đây là lần thứ 2 post bài hỏi về lập trình socket bằng C và những thứ liên quan đến mạng máy tính mà ít người tương tác quá… Buồn :’(
…
Không có ng làm về lĩnh vực này à…