Giao thức này sử dụng các nút có biểu hiện hành vi lỗ đen trong mạng không dây sử dụng giao thức AODV. Khi các nút hoạt động như một lỗ đen, chúng sẽ sử dụng một giao thức định tuyến mới có thể tham gia vào thông báo AODV. Trong bộ mô phỏng NS-2.34, giao thức mới blackholeAODV được cài đặt như sau:
- Copy thư mục chứa giao thức AODV và đổi tên thành blackholeaodv.
- Điểm lưu ý là cả giao thức AODV và giao thức blackholeAODV đều gửi các gói tin AODV đến lẫn nhau. Do đó file “aodv_packet.h” sẽ không được sao chép sang thư mục blackholeaodv.
- Đổi tên tất cả các file có tên là aodv trong thư mục thành “blackholeaodv”:
blackholeaodv.cc, blackholeaodv.h, blackholeaodv.tcl, blackholeaodv_rqueue.cc, blackholeaodv_rqueue.h (ngoại trừ file “aodv_packet.h”).
- Thay đổi một số nội dung (lớp, hàm, cấu trúc, biến, hằng,…) trong các file trong thư mục này ngoại trừ tên cấu trúc mã AODV packet.h. Hai giao thức AODV và blackhole AODV được thiết kế để có thể gửi các gói dữ liệu cho nhau, do đó cũng gần tương tự như nhau.
Để các hành vi lỗ đen thực hiện được trong giao thức mới. Ta thêm hành vi lỗ đen vào giao thức blackholeAODV với một số thay đổi trong file
blackholeaodv/blackholeaodv.cc. Quá trình thay đổi được mô tả như sau:
- Khi một gói tin nhận được bởi hàm “recv” của “aodv/aodv.cc”, nó xử lý các gói tin dựa vào dạng của nó. Nếu dạng gói tin là một trong nhiều gói tin quản lý (điều khiển) tuyến đường, nó gửi gói tin đến hàm “recvAODV”.
- Nếu gói tin nhận được là gói dữ liệu, thông thường giao thức AODV sẽ gửi nó đến địa chỉ đích, nhưng nếu là hoạt động lỗ đen, nó sẽ bỏ gói tin dữ liệu miễn là gói tin không
truyền đến chính nó. Câu lệnh dưới đây mô tả: nếu nút đích là chính nó thì nó sẽ nhận gói tin, ngược lại, nó loại bỏ tất cả các gói tin còn lại.
if ( (u_int32_t)ih->saddr() == index)
forward((blackholeaodv_rt_entry*) 0, p, NO_DELAY); else
drop(p, DROP_RTR_ROUTE_LOOP);
- Nếu gói tin là một gói tin điều khiển AODV, hàm “recv” gửi nó đến hàm
“recvblackholeAODV”. Hàm “recvblackholeAODV” kiểm tra loại của gói tin điều khiển và dựa vào mỗi loại gói tin nó sẽ gửi chúng đến các hàm thích hợp với câu lệnh
“case”. Ví dụ, các gói tin RREQ sẽ được gửi đến hàm “recvRequest”, các gói tin RREP sẽ được gửi đến hàm “recvReply”. Câu lệnh “case” như sau:
case AODVTYPE_RREQ: recvRequest(p); break; case AODVTYPE_RREP: recvReply(p); break; case AODVTYPE_RERR: recvError(p); break; case AODVTYPE_HELLO: recvHello(p); break; default:
fprintf(stderr, "Invalid blackholeAODV type (%x)\n", ah>ah_type);
exit(1);
- Trong trường hợp này ta xét đến hàm recvRequest RREQ vì hành động lỗ đen được thực hiện khi các nút độc hại nhận được gói tin RREQ. Khi nút độc hại nhận được một gói tin RREQ, ngay lập từ nó gửi thông báo RREP như là nó đã có đường đến đích. Nút độc hại cố gắng đánh lừa nút gửi bằng gói RREP. Số tuần tự lớn nhất của giao thức AODV là 4294967295 với giá trị số nguyên 32 bít. Số tuần tự được đặt là 4294967295 và số đếm hop được đặt là 1. Thông báo RREP giả trong tấn công lỗ đen được thể hiện như sau:
sendReply(rq->rq_src, // IP Destination 1, // Hop Count
index, // Dest IP Address
4294967295, // Highest Dest Sequence Num MY_ROUTE_TIMEOUT, // Lifetime
rq->rq_timestamp); // timestamp
Sau một số thay đổi như trên, ta tiến hành tích hợp giao thức blackholeAODV vào bộ mô phỏng và biên dịch lại chương trình NS-2 để tạo ra các file đối tượng. Ở một số hướng dẫn tích hợp một giao thức mới vào bộ mô phỏng NS-2 cần phải thay đổi nhiều file để sử dụng được các gói tin của nó. Nhưng trong giao thức blackholeAODV này không cần thiết phải thêm giao thức mới, do đó chỉ cần thay đổi 2 file (Makefile và ns-lib.tcl) của
NS-2. Quá trình thay đổi như sau:
- Đầu tiên ta thay đổi file “\tcl\lib\ ns-lib.tcl”, nơi mà các thực thể (agent) được mã hoá thành các thủ tục. Khi một nút sử dụng giao thức blackholeAODV, agent được ghi ở phần đầu mô phỏng và được gán cho các nút sử dụng giao thức backholeAODV. Những dòng sau sẽ được thêm vào:
blackholeAODV {
set ragent [$self create-blackholeaodv-agent $node] }
…
Simulator instproc create-blackholeaodv-agent { node } { set ragent [new Agent/blackholeAODV [$node node-addr]] $self at 0.0 "$ragent start" # start
BEACON/HELLO Messages
$node set ragent_ $ragent return $ragent
}
- Tiếp theo, ta thay đổi file “\Makefile” trong thư mục gốc “ns-2.34”. Thêm những dòng sau: blackholeaodv/blackholeaodv_logs.o blackholeaodv/blackholeaodv.o \
blackholeaodv/blackholeaodv_rtable.o blackholeaodv/blackholeaodv_rqueue.o \ - Sau khi thực hiện các thay đổi trên, ta dùng các lệnh make clean, make để biên dịch
lại NS2.