3.2.2. Các thành phần của bộ chương trình mơ phỏng NS-2
Bộ mô phỏng mạng NS-2 gồm rất nhiều thành phần chức năng trong đó chương trình mơ phỏng NS-2 là thành phần chính. Với chương trình mơ phỏng NS- 2 chúng ta có thể làm rất nhiều việc từ việc tạo ra các node mạng, các đường truyền, các nguồn sinh lưu lượng theo các phân bố được định nghĩa trước, các thực thể giao thức khác nhau cho đến việc quản lý các chính sách hàng đợi cũng như các mơ hình sinh lỗi của đường truyền… NS-2 hỗ trợ rất tốt các ứng dụng phổ biến hiện nay như web, FTP, telnet cũng như các giao thức giao vận phổ biến như TCP, UDP. Với mô phỏng mạng khơng dây, chương trình NS-2 hỗ trợ một số giao thức định tuyến mạng MANET phổ biến như AODV, DSDV, DSR hay TORA.
Ngồi chương trình NS-2 thì bộ mơ phỏng NS-2 cịn có các cơng cụ hiển thị trực quan là NAM và XGRAPH. Người nghiên cứu có thể nhìn thấy hình trạng mạng gồm các node mạng, liên kết giữa các node nhờ NAM. Ngoài ra, NAM cũng có thể cho phép hiển thị sự chuyển động của các gói số liệu trong khơng gian hai chiều. Một cơng cụ khác là XGRAPH có thể vẽ đồ thị từ các dữ liệu nhận được do chương trình mơ phỏng sinh ra. Các số liệu sinh ra từ chương trình mơ phỏng có thể được xử lý nhờ các ngôn ngữ như Awk hay Perl để thu được các kết quả mong muốn.
3.2.3. Các chức năng mơ phỏng chính của NS-2
* Đối với mạng có dây:
- Hỗ trợ các đường truyền điểm
- điểm đơn công, song công, mạng cục bộ LAN.
- Hỗ trợ các nguồn sinh lưu lượng với một số phân bố khác nhau. 2
44
- Hỗ trợ một số chính sách phục vụ hàng đợi. - Hỗ trợ một số mơ hình sinh lỗi điển hình.
- Hỗ trợ nghiên cứu vấn đề định tuyến đơn hướng/đa hướng.
- Hỗ trợ các giao thức tầng giao vận: TCP, Tahoe, UDP, điều khiển lưu lượng và điều khiển tắc nghẽn.
- Hỗ trợ một số giao thức tầng ứng dụng, web caching và truyền luồng dữ liệu đa phương tiện.
* Đối với mạng không dây:
Ngồi phần lớn các chức năng mơ phỏng trên, NS-2 cịn có khả năng: - Hỗ trợ việc di chuyển của các node mạng trong không gian hai chiều. - Hỗ trợ mạng LAN không dây (WLAN) 802.11.
- Hỗ trợ Mobile IP.
- Hỗ trợ một số giao thức định tuyến trong mạng không dây đặc biệt MANET: AODV, DSDV, DSR, TORA...
- Hỗ trợ liên mạng sử dụng vệ tinh (Satellite Networking). * Trong lĩnh vực mạng hỗn hợp có dây và khơng dây:
- Hỗ trợ các trạm cơ sở đóng vai trị cổng chuyển giữa mạng có dây và mạng không dây.
- Hỗ trợ Snoop TCP.
* Yêu cầu cấu hình máy tính và mơi trường cài đặt NS2 Trong các nghiên cứu này, tôi sử dụng:
- Máy tính xách tay Dell Bộ xử lý: CPU Intel (R); Core (TM) i5-3320M @ 2.60GHz, RAM: 12,00 GB, loại hệ thống: 64-bit;
- Cài đặt cài đặt virtualbox 6.0 chạy trong môi trường Windows 10; - Máy ảo cài hệ điều hành Linux, phiên bản Ubuntu 14.04;
45
- Sử dụng công cụ Awk Error! Reference source not found., gnuplot Error! Reference source not found. để phân tích và vẽ đồ thị cho các kịch bản khác nhau;
Do khối lượng lớn tệp theo dõi trong mỗi mô phỏng, hệ thống yêu cầu bộ nhớ RAM 3 GB và một bộ lưu trữ lớn của đĩa cứng > 15G trong hệ điều linux của máy ảo.
3.2.4. Thiết lập mô phỏng mạng MANET trong NS-2 [18]
Mơ hình khơng dây chủ yếu bao gồm MobileNode (node di động) ở lõi, với các đặc điểm hỗ trợ mở rộng cho phép mô phỏng các mạng MANET, mạng không dây… Đối tượng MobileNode là một đối tượng tách biệt. Lớp MobileNode được thừa kế từ lớp cha Node trong C++. Do đó lớp MobileNode là đối tượng Node cơ bản với các chức năng thêm vào của node không dây và di động như là khả năng di chuyển trong hình trạng mạng cho trước, khả năng nhận và truyền các tín hiệu tới và từ kênh không dây. Trong mục này chúng ta sẽ mô tả các thành phần bên trong của MobileNode bao gồm các kỹ thuật định tuyến, việc tạo ngăn xếp mạng cho phép truy cập kênh trong MobileNode, mô tả ngắn gọn của mỗi thành phần ngăn xếp, hỗ trợ dò vết và tạo ra các ngữ cảnh di chuyển/lưu lượng cho mô phỏng khơng dây.
Hình 3. 3. Kiến trúc tầng của NS2
Link Layer LL: Thông thường đối với tất cả các packet đi ra từ kênh, các
46
packet xuống hàng đợi giao tiếp. Đối với các packet gửi vào (từ kênh riêng), lớp MAC đưa các packet lên LL sau đó dừng tại node_entry_ point.
Module ARP: giao thức phân giải địa chỉ (Address Resolution Protocol) thực
thi ở dạng BSD (implemented in BSD style) nhận các truy vấn từ lớp Link. Nếu ARP có địa chỉ hardware của đích đến, nó ghi địa chỉ đích đến vào header của MAC của packet. Ngược lại, nó gửi broadcasts truy vấn ARP, tạm thời giữ lại packet. Đối với mỗi đích đến khơng biết được địa chỉ hardware, có một bộ đệm đơn cho packet. Khi gửi thêm các packet đến đích mà đã gửi ARP thì packet ban đầu trong bộ đệm sẽ bị hủy (drop). Khi biết được địa chỉ hardware của packet, packet được thêm vào hàng giao tiếp (interface queue) của hop đó.
Interface Queue(IFq): Lớp PriQueue được thực thi như một hàng đợi ưu tiên
đưa ra các quyền ưu tiên để định tuyến các packet, thêm chúng vào đầu hàng đợi. Nó hỗ trợ q trình thực thi trên tất cả các packet trong hàng đợi và gỡ bỏ các packet cùng với địa chỉ đích đến.
Mac Layer IEEE 802.11: phân phối chức năng tọa độ DCF (distributed
coordination function, giao thức MAC được thực thi bởi CMU. Nó sử dụng khn dạng RTS/CTS/DATA/ACK cho tất cả các packet unicast và đơn giản là gửi ra data cho tất cả các packet broadcast. Quá trình thực thi sử dụng cả phương thức cảm nhận sóng mang dạng vật lý lẫn dạng ảo.
Tap Agents: Các agents mà phân lớp của nó có thể tự đăng ký với đối tượng
MAC bằng cách sử dụng phương thức installTap(). Nếu giao thức MAC cụ thể cho phép, Tap sẽ đưa ra các paket nhận được bởi lớp MAC một cách lộn xộn, trước khi quá trình lọc địa chỉ được thực hiện.
Network Interfaces: Lớp giao tiếp mạng đáp ứng như giao tiếp phần cứng
(hardware interface) sử dụng bởi mobilenode để truy xuất đến kênh truyền thông. Giao diện của môi trường truyền thông wireless chia sẽ được thực thi như lớp Phy/WirelessPhy. Giao diện này tùy thuộc vào các quá trình collision và mơ hình truyền bá radio nhận các packet truyền qua bởi giao diện của node khác đến kênh truyền.
47
Mơ hình truyền bá Radio: Sử dụng cơng thức tính sự suy giảm đối với các
khoảng cách gần là 1/r2 và đối với khoảng cách xa là 1/r4.
Antenna: được sử dụng với mục đích chung bởi mobilenodes.
* Node di động:
Node di động (MobileNode) là một đối tượng ns Node cơ bản với các chức năng mở rộng như sự di chuyển, khả năng truyền và nhận trên kênh mà cho phép nó có thể sử dụng để tạo sự di động trong các môi trường mô phỏng không dây. Các đặc điểm di động bao gồm việc di chuyển node, các cập nhật vị trí định kỳ, bảo đảm đường biên của hình trạng mạng được thực thi trong C++ trong khi các thành phần mạng trong bản thân MobileNode (như bộ phân loại, demux, LL, Mac, Channel…) lại được thực thi trong Otcl.
Các hàm và thủ tục được mô tả dưới đây có thể tìm thấy trong đường dẫn dưới đây: ~ns/common/mobilenode.{cc,h}, ~ns/tcl/lib/nsmobilenode.tcl và ~ns/tcl/mobility/aodv.tcl.
Các kịch bản mẫu được xây dựng sẵn có trong thư mục ~ns/tcl/ex/wireless- test.tcl và ~ns/tcl/ex/wireless.tcl.
Giao thức định tuyến mạng không dây được hỗ trợ trong NS-2 bao gồm AODV, DSDV, DSR và TORA. Việc tạo các node di động phụ thuộc vào giao thức định tuyến được sử dụng. Hiện nay NS-2 hỗ trợ API tạo node di động được mô tả như sau:
$ns_ node-config -adhocRouting $opt(adhocRouting) \ -llType $opt(ll) \ -macType $opt(mac) \ -ifqType $opt(ifq) \ -ifqLen $opt(ifqlen) \ -antType $opt(ant) \ -propType $opt(prop) \
48
-phyType $opt(netif) \ -channel [new $opt(chan)] \ -topoInstance $topo \ -agentTrace ON \ -routerTrace ON \ -macTrace ON \
API ở trên cấu hình cho node di động với tất cả các giá trị của giao thức định truyến trong MANET như ngăn xếp mạng, cấu trúc mạng, mơ hình kênh truyền. Tiếp đến chúng ta tạo các node di động như sau:
for {set i 0} {$i < $val(nnaodv)} {incr i} { set node_($i) [$ns_ node]
$node_($i) random-motion 0 ;# disable random motion }
Thủ tục trên tạo ra các đối tượng node di động, tạo agent định tuyến mạng MANET, tạo ngăn xếp mạng bao gồm lớp liên kết, hàng đợi, lớp MAC và giao diện mạng với ăng ten, sử dụng mơ hình truyền thơng được định nghĩa, kết nối các thành phần và kết nối ngăn xếp vào kênh.
* Q trình mơ phỏng mạng MANET với NS-2:
Q trình mơ phỏng mạng MANET với bộ mô phỏng NS-2 thông thường trải qua các bước như sau trong việc xây dựng kịch bản và viết Script tcl:
Bước 1: Tạo bộ lập lịch các sự kiện set ns_ [new Simulator]
Bước 2: Ghi lại vết các sự kiện tất cả các liên kết của mạng mô phỏng. Sử
dụng câu lệnh
$ns trace-all [open traceout.tr w] // xuất ra file traceout.tr
$ns namtrace-all [open traceout.nam w] // xuất ra file có định dạng
49
Bước 3: Thiết lập topo mạng mô phỏng set topo [new Topography]
Bước 4: Thiết lập không gian di chuyển cho các nút $topo load_flatgrid $val(x) $val(y)
Bước 5: Tạo đối tượng GOD (Genanal Operation Direction) sử dụng để lưu
trữ các thông tin về trạng thái môi trường mạng, node, kết nối.. Create god_ [create-god $val(nn)]
Bước 6: Cấu hình node mạng
$ns_ node-config -adhocRouting $val(rp) \ -llType $val(ll) \ -macType $val(mac) \ -ifqType $val(ifq) \ -ifqLen $val(ifqlen) \ -antType $val(ant) \ -propType $val(prop) \ -phyType $val(netif) \ -topoInstance $topo \ -agentTrace ON \ -routerTrace ON \ -macTrace ON \ -movementTrace ON \ -channel $chan_1_ Bước 7: Tạo sự di chuyển cho các node
for {set i 0} {$i < $val(nnaodv)} {incr i} { set node_($i) [$ns_ node]
50
$node_($i) random-motion 0 ;#disable random motion }
Đoạn mã trên mô tả di chuyển của node một cách ngẫu nhiên random
Bước 8: Thiết lập vị trí cho node 0 và node 1
$node_(0) set X_ 1.0 / X_ = 1.0 là tọa độ của node 0 trên OX $node_(0) set Y_ 3.0 / Y_ = 3.0 là tọa độ của node 0 trên OY $node_(0) set Z_ 0.0 / Z_ = 0.0 là tọa độ của node 0 trên OZ $node_(1) set X_ 4.0
$node_(1) set Y_ 6.0 $node_(1) set Z_ 0.0
Bước 9: Thiết lập sự di chuyển của node 0 ở thời điểm 10.0 (s) node di di
chuyển tới vị trí có tọa độ (20.0, 10.0) với tốc độ 20.0 m/s.
$ns_ at 10.0 “$node_(0) setdest 20.0 10.0 20.0” Bước 10: Thiết lập luồng traffic giữa các node 1 và node 2
set udp_(0) [new Agent/UDP]
$ns_ attach-agent $node_(1) $udp_(0) set null_(0) [new Agent/Null]
$ns_ attach-agent $node_(2) $null_(0) set cbr_(0) [new Application/Traffic/CBR] $cbr_(0) set packetSize_ 512
$cbr_(0) set interval_ 0.25 $cbr_(0) set random_ 1 $cbr_(0) set maxpkts_ 10000 $cbr_(0) attach-agent $udp_(0) $ns_ connect $udp_(0) $null_(0)
51
Việc tạo lưu lượng có thể lấy từ tệp sinh lưu lượng của cơng cụ có sẵn cbrgen trong bộ mô phỏng NS-2.
Bước 11: Thiết lập thời gian dừng q trình mơ phỏng kết thúc $ns_ at $val(stop) "finish"
$ns_ at $val(stop).0 "$ns_ trace-annotate \"Simulation has ended\"" $ns_ at $val(stop).00000001 "puts \"NS EXITING...\" ; $ns_ halt" proc finish {} {
global ns_ tracefd namtrace $ns_ flush-trace
close $tracefd close $namtrace
Bước 12: Bắt đầu thực thi chạy mô phỏng puts "Starting Simulation..." $ns_ run
3.2.5. Cài đặt, bổ sung chương trình mơ phỏng tấn công lỗ đen Error! Reference
source not found.
Trong phiên bản NS-2.35 đã hỗ trợ các giao thức định tuyến trong mạng MANET như AODV, DSDV, DSR,… Tuy nhiên, không hỗ trợ sẵn giao thức mô phỏng lỗ đen blackhole AODV. Luận văn dựa trên ý tưởng và mã nguồn của tác giả Semih Dokurer thông qua việc nghiên cứu cụ thể các mã nguồn trên cũng như tham khảo rất kỹ trong tài liệu [18] để tiến hành cài đặt các giao thức định tuyến mới.
Việc cài đặt giao thức blackholeAODV này ta cần tạo ra 1 agent mới trong NS2 có cơ chế làm việc giống giao thức AODV, như thay đổi hành vi của node trung gian đóng vai trị node độc hại (blackhole), sửa đổi gói RREP để chiếm quyền điều khiển tuyến và thực hiện việc Drop gói tin. Các file cần thay đổi gồm \tcl\lib\ns-lib.tcl, /ns-2.35/makefile.in
- Bước 1, chỉnh sửa tệp “\tcl\lib\ns-lib.tcl”, đây là nơi chứa các thủ tục khai báo các giao thức. Khi node sử dụng giao thức blackholeAODV, agent này sẽ được
52
lập lịch để bắt đầu q trình mơ phỏng và nó được gán thuộc tính của agent này cho những node sẽ sử dụng giao thức blackholeAODV. Đoạn mã như sau:
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 }
-Bước 2, tập tin được điều chỉnh là “~/makefile.in” trong thư mục gốc “ns- 2.35”. Thêm các dòng mã như sau:
blackholeaodv/blackholeaodv_logs.o \ blackholeaodv/blackholeaodv.o \
blackholeaodv/blackholeaodv_rtable.o \ blackholeaodv/blackholeaodv_rqueue.o \
Cho tới lúc này, về mặt hình thức đã tạo xong giao thức định tuyến mới blackholeAODV. Tuy nhiên về bản chất để nó thực hiện đúng cơ chế loại bỏ gói tin như mong muốn cần phải tiến hành sửa đổi cơ chế làm việc của giao thức AODV trong tệp blackholeaodv.cc. Hành vi của các node được giải thích cụ thể như sau:
Khi một gói tin được nhận bởi hàm “recv” trong tệp “~/aodv/aodv.cc”, nó xử lý gói tin tùy theo loại gói tin này. Nếu gói tin là một trong số các gói thơng tin điều khiển q trình định tuyến AODV, nó sẽ gửi gói tin tới hàm “recvAODV” được giải thích ở dưới. Cịn nếu gói tin nhận được là gói dữ liệu, thì theo thơng thường nó sẽ được chuyển tới đích, nhưng với hành vi của node lỗ đen nó sẽ loại bỏ tồn bộ gói tin
53
mà khơng cần thiết với nó. Trong đoạn mã dưới đây, điều kiện if đầu tiên xử lý quá trình nhận dữ liệu nếu đúng là địa chỉ đích, điều kiện else node độc hại sẽ loại bỏ toàn bộ dữ liệu nhận được. Đoạn mã như sau trong file ~/blackholeaodv/blackholeaodv.cc:
if ((u_int32_t)ih->saddr() == index) // nếu địa chỉ IP đích là chính lỗ đen forward((blackholeaodv_rt_entry*) 0, p, NO_DELAY);
else
// nếu địa chỉ IP đích là node khác nó thì nó s ẽ thực hiện hành vi drop gói tin drop(p, DROP_RTR_ROUTE_LOOP);
Trường hợp gói tin là một trong số các gói thơng tin điều khiển định tuyến AODV, hàm “recv” sẽ gửi chúng tới hàm “recvblackholeAODV”. Tại đây hàm này sẽ kiểm tra loại của gói tin điều khiển AODV và dựa trên loại gói tin đó sẽ gửi chúng đến các hàm tương ứng bằng câu lệnh case. Ví dụ, nếu gói tin là RREQ sẽ được gửi đến hàm “recvRequest”, nếu là gói RREP sẽ được gửi tới hàm “recvReply”. Đoạn mã như sau:
Switch (ah -> ah_type) { case AODVTYPE_RREQ: recvRequest(p); break; case AODVTYPE_RREP: recvReply(p); break; case AODVTYPE_RERR: recvError(p); break; case AODVTYPE_HELLO: recvHello(p);
54
break; default:
fprintf(stderr, "Invalid blackholeAODV type (%x)\n", ah->ah_type); exit(1);
}
Việc thay đổi hành vi của node lỗ đen thông qua hàm xử lý gói tin RREQ để trả lời gói tin giả mạo RREP. Hàm RREQ được khai báo cụ thể 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
Node độc hại cố gắng đánh lừa các node gửi bằng gói RREP của mình với giá trị của số SN được gán giá trị cao nhất 4294967295 và hop count gán bằng 1