huong dan trace
TRANSCRIPT
1. Đọc code và xây dựng topology mạng cùng các tham số cấu hình
2. Tính toán khoảng cách truyền dữ liệu giữa trạm gốc và MS
3. Chạy mô phỏng đối với định tuyến aodv và dsdv đối với topology trên
4. Lưu lại các file kết quả mô phỏng để phân tích
5. Tính băng thông :
Sử dụng đoạn code trong chương trình và lưu kết quả ra các file bandwidthBS*.tr
6. Năng lượng :
Sử dụng các câu lệnh grep “energy” wired-cum-wireless.tr > ENERGY.tr để lọc ra các
dữ liệu liên quan đến năng lượng của tất cả các node và lưu vào file ENERGY.tr
Sau khi có file ENERGY.tr ta lần lượt lấy ra các dữ liệu về năng lượng của từng node
và lưu lại các file có dạng node*.tr.
Câu lệnh sử dụng grep “_*_” ENERGY.tr > node*.tr
Ví dụ lấy các thông tin về năng lượng node3 ta viết
Grep “_3_” ENERY.tr > node3.tr
Sau khi có các file node*.tr * có giá trị từ 3 đến 14, ta tiếp tục lọc để lấy ra chỉ 2 thông
số là thời gian và năng lượng còn lại của từng node để thực hiện việc hiển thị. Để làm
được việc đó, ta viết một đoạn code sau và lưu lại dưới file Column.awk :
BEGIN { FS = " "} { nl++ } { print $2 " " $14} END {}
Sau đó chạy câu lệnh sau để thực hiện lọc dữ liệu :
$ awk –f Column.awk node3.tr > node3energy
Câu lệnh này sẽ chỉ lấy các thông tin ở cột 2 và cột 14 đọc từ file node3.tr và ghi lại
vào file node3energy. Sau khi thực hiện đối với tất cả các node thì sẽ thu được
node3energy đến node14energy cho việc hiển thị
7. Tính routing overhead :
Đối với định tuyến AODV, ta viết đoạn code awk sau và lưu dưới file AODV-
CBR.awk
BEGIN {aodvpktno = 0; aodvbyte = 0; cbrpktno = 0; cbrbyte = 0;cbrlostMAC =
0;totalDrop = 0;totalSND = 0}
$1~/s/ && /AODV/ && /MAC/ { aodvpktno ++ ; aodvbyte+=$8 ;}
$1~/s/ && /cbr/ && /MAC/ { cbrpktno ++ ; cbrbyte+=$8; }
$1~/D/ && /cbr/ && /MAC/ { cbrlostMAC ++ }
$1~/D/ { totalDrop ++ }
$1~/s/ { totalSND ++ }
END { print ( aodvpktno, aodvbyte , cbrpktno, cbrbyte, cbrlostMAC, totalDrop,
totalSND) }
Ta chạy lệnh $ awk –f AODV-CBR.awk wired-cum-wireless.tr >
routingOVERHEAD sẽ thu được file routingOVERHEAD lưu lại các thông số lấy từ
file wired-cum-wireless.tr về số lượng gói tin định tuyến AODV, số bytes AODV, số
gói tin dữ liệu cbr , số bytes dữ liệu cbr đã được gửi đi ở lớp MAC để tính toán.
Còn đối với định tuyến DSDV, câu lệnh để tìm số gói định tuyến ở trên ko dùng được,
nếu dùng sẽ gây sai mà ta tìm trực tiếp ở trong file wired-cum-wireless.tr, các bản tin
định tuyến là message đi kèm với số thứ tự của nó. Ta tìm được số các gói tin định
tuyến này ở cuối cùng của file. Phần còn lại về tìm các gói tin cbr vẫn được giữ
nguyên.
8. Tính packet delivery ratio:
Viết đoạn code sau và lưu dưới file SEND-RCVagent.awk:
BEGIN {counter1 = 0; counter2 = 0;}
$1~/s/ && /AGT/ { counter1 ++ }
$1~/r/ && /AGT/ { counter2 ++ }
END { print ( counter1, counter2) }
Các lệnh này thực hiện đếm tổng số gói tin đã truyền đi và nhận được ở cấp độ
AGENT ( không phải ở cấp độ MAC )
Thực hiện lệnh sau :
$ awk –f SEND-RCVagent.awk wired-cum-wireless.tr > totalSEND-RCV
Để ghi dữ liệu vào file totalSEND-RCV
9. Tính average hopcount thì dựa vào 2 thông số tìm được trong tính toán tìm packet
delivery ratio và tìm routing overhead là số packet truyền ở lớp MAC và truyền ở
AGENT. Tỉ số số gói tin phát ở lớp MAC chia cho số gói tin phát ở AGENT cho ta
kết quả
10. Tìm throughput
Throughput chỉ tính lưu lượng gói tin có ích trong đơn vị thời gian xác định nên ta viết
câu lệnh sau và lưu dưới file throughput.awk
BEGIN {counter0 = 0; counter1 = 0; counter2 = 0;}
$1~/r/ && /_0_/ && /AGT/ { counter0 += $8 }
$1~/r/ && /_1_/ && /AGT/ { counter1 += $8 }
$1~/r/ && /_2_/ && /AGT/ { counter2 += $8 }
END { print ( counter0*8/170, counter1*8/170, counter2*8/170,
(counter0+counter1+counter2)*8/170 ) >> "wu.dat"}
Thông tin sẽ được lưu lại trong file wu.dat
Chạy lệnh $ awk –f throughput.awk wired-cum-wireless.tr
11. Tính delay:
Trước hết ta phải lọc được ra các thông tin liên quan đến việc phát và nhận từ một
node này đến một node khác. Viết câu lệnh sau và lưu lại file delay.awk:
$2>1 && $2 < 180 && (/_0_/ || /_3_/) && /AGT/ { print $1, $2, $6 >
"node3DL.tr" }
$2>1 && $2 < 180 && (/_0_/ || /_4_/) && /AGT/ { print $1, $2, $6 >
"node4DL.tr" }
$2>1 && $2 < 180 && (/_0_/ || /_5_/) && /AGT/ { print $1, $2, $6 >
"node5DL.tr" }
$2>1 && $2 < 180 && (/_0_/ || /_6_/) && /AGT/ { print $1, $2, $6 >
"node6DL.tr" }
$2>1 && $2 < 180 && (/_1_/ || /_7_/) && /AGT/ { print $1, $2, $6 >
"node7DL.tr" }
$2>1 && $2 < 180 && (/_1_/ || /_8_/) && /AGT/ { print $1, $2, $6 >
"node8DL.tr" }
$2>1 && $2 < 180 && (/_1_/ || /_9_/) && /AGT/ { print $1, $2, $6 >
"node9DL.tr" }
$2>1 && $2 < 180 && (/_1_/ || /_10_/) && /AGT/ { print $1, $2, $6 >
"node10DL.tr" }
$2>1 && $2 < 180 && (/_2_/ || /_11_/) && /AGT/ { print $1, $2, $6 >
"node11DL.tr" }
$2>1 && $2 < 180 && (/_2_/ || /_12_/) && /AGT/ { print $1, $2, $6 >
"node12DL.tr" }
$2>1 && $2 < 180 && (/_2_/ || /_13_/) && /AGT/ { print $1, $2, $6 >
"node13DL.tr" }
$2>1 && $2 < 180 && (/_2_/ || /_14_/) && /AGT/ { print $1, $2, $6 >
"node14DL.tr" }
Ta chạy lệnh $ awk –f delay.awk wired-cum-wireless.tr
Ta sẽ thu được các file node*DL.tr , * nhận các giá trị tử 3 đến 14, mỗi file có 3 thông
tin là gửi hay nhận ( s hay r ) , thời gian s hay r , số thứ tự của gói tin để xác định cùng
một gói tin.
Viết một đoạn code C sau và lưu lại dưới file delay.c :
#include <stdio.h>
#include <stdlib.h>
int main(int argc, char *argv[])
{
FILE *fin, *fout, *fout2;
int pkt_index[5000];
double pkt_send_time[5000];
int head;
//int tail;
/* make sure it is large enough to hold all temprary data! */
int i,j,num;
double tm, tm_delay, total_delay, avg_delay, var_delay;
int idx;
char type;
int flag;
int num_sent;
head = 0;
for ( i=0; i<5000; i++)
{
pkt_index[i] = -1;
pkt_send_time[i] = 0.0f;
}
fin = fopen(argv[1], "r");
fout = fopen (argv[2], "w");
fout2 = fopen ( argv[3],"a");
if(fin==NULL) {
printf("Error: can't open file.\n");
return 1;
}
else {
printf("File opened successfully.\n");
i = 0 ;
num = 0;
num_sent = 0;
while(!feof(fin))
{
/* loop through and store the numbers into the array */
fscanf(fin, "%c %lf %d \n", &type,&tm, &idx);
//printf( "%f\n", tm);
if ( type == 's' )
{
//addentry(idx, tm);
pkt_index[head] = idx;
pkt_send_time[head] = tm;
head++;
if ( head == 1000 ) head = 0;
num_sent++;
}
else if ( type == 'r' )
{
flag = 0;
for ( j=0; j< 1000; j++)
{
if ( pkt_index[j] == idx )
{
//printf("match,%f, %f\n!" ,tm, pkt_send_time[j]);
tm_delay = tm - pkt_send_time[j];
flag = 1;
break;
}
}
//addentry to output
if ( flag == 1)
{
fprintf( fout,"%d %lf \n", idx, tm_delay );
total_delay += tm_delay;
num++;
}
}
i++;
}
avg_delay = total_delay / num ;
fprintf(fout2,"Number of entries read: %d\n", i);
fprintf(fout2,"Number of entries sent: %d\n", num_sent);
fprintf(fout2,"Number of entries received: %d\n", num);
fprintf(fout2,"average delay of entries : %lf\n", avg_delay);
fclose(fin);
fclose(fout);
//finally, calcualte variance
fout = fopen ( argv[2], "r") ;
if ( fout == NULL ) return -1;
var_delay = 0;
while (!feof(fout))
{
fscanf(fout, "%d %lf\n", &idx ,&tm);
var_delay += ( tm - avg_delay ) * (tm - avg_delay);
}
var_delay /= num;
fprintf(fout2, "variance of delay is : %lf\n", var_delay);
fclose (fout);
fclose (fout2);
return 0;
}
}
Dịch file delay.c này thành file delaycal.exe bằng lệnh $ gcc delay.c -o delaycal
Sau đó sẽ dùng file delaycal.exe này để tính các thời gian trễ trung bình, độ lệch và
tính toán độ trễ của từng packet được gửi đi để phục vụ cho vẽ đồ thị
Chạy câu lệnh $ ./delaycal node3DL.tr DL31.dat DL32.dat để ghi thông tin về trễ của
từng gói vào file DL31.dat và ghi độ trễ trung bình và độ lệch vào file DL32.dat
Thực hiện hiển thị cho tất cả các bước trên dùng câu lệnh graph.