• 沒有找到結果。

第五章 模擬環境的修改:NS2 的實作

5.1. NS2 網路模擬程式介紹

5.2.1 節點架構的修改

NS-2 的節點架構圖如圖 5-1 所示,綠色部分是修改並加入了實作聚集的方 法,當封包由 entry point 進入節點後,該節點會取出進入封包的來源端位址及 目的地端位址,並藉由 classifier 進行封包的傳送,如果目前節點的位址與該封 包的目的地端位址相同,則該封包會在取出使用哪一個埠號,並進而將該封包 送至對應的應用程式,完成封包的傳遞,若是 agent 產生的封包進入節點後則 通過 routing agent 再送往 MAC 層再送出封包,而我們要實作聚集的話,則必須 新增修改 agent 和 queue 的部分。

圖 5-1:Extended and modified node model

5.2.2 適應性聚集封包機制

為使 NS-2 能夠聚集封包的功能,因此我們必須對 NS-2 中的相關模組進行 新增或修改,我們在 queue 的部分主要新增了一個可以聚集的 queue,agent 的 部分則是新增了一個解聚集的 agent 和一個發送 ping 封包的 agent 用來測量 RTT,

並利用測量到的 RTT 動態調整聚集的封包數目,以下分別說明實作聚集得主要 function。

enque():判斷進入 queue 的封包,若是需要聚集的封包則加上 timestamp,這是 為了方便之後能計算此封包在 queue 裡的時間。

deque():此 function 則包含了以下的子 function,在這裡面完成聚集的部分。

aggablesize():計算 queue 裡的封包數目和 size。如圖 5-2 所示,一開始會傳入

*num 的指標可存放此 function 計算後的封包數目,第 3~4 行是取得節點得 id

003: Node* currentnode = Node::get_node_by_address((nsaddr_t) nodeid_);

004: int currentaddr = currentnode->address();

005: Packet *p_top = q_->lookup(0);

006: struct hdr_cmn *hdr_cmn_packet = HDR_CMN(p_top);

007: hdr_ip *hdr_ip_packet = hdr_ip::access(p_top);

008: int maxsize = getMaxSize();

009: for (int i = 0; i < q_->length(); i++) {

010: Packet *ptmp = q_->lookup(i);

011: struct hdr_cmn *hdr_cmn_tmp = HDR_CMN(ptmp);

012: hdr_ip *hdr_ip_tmp = hdr_ip::access(ptmp);

013: if (hdr_cmn_tmp->next_hop() == hdr_cmn_packet->next_hop()) { 014: totalsize += hdr_cmn_tmp->size();

015: if (numpackets<=maxsize&&numpackets< MAX_PACKET_NUM

&& totalsize < mtusize_) {

add_by_Maxdelay():我們藉由可自訂 QueueingMaxDelay 封包在 queue 裡的最大 等待時間來讓此 function 計算 queue 裡的封包有無超過 QueueingMaxDelay,只 要有封包超過 QueueingMaxDelay,就聚集 n 個封包。如圖 5-3 所示,第 3 行是 開始去搜尋 queue,第 7~17 行是先判斷封包有無同一個 next hop 並判斷此封包 的 時 間 有 無 超 過 QueueingMaxDelay , 若 有 則 將 此 封 包 丟 入 準 備 要 聚 集 得 packetbuffer 裡,最後再回傳要聚集得 packetbuffer。

001: int AggregatorAdaptive::add_gt_maxdelay(Packet **packetbuffer, int *size) { 002: ...

003: for (int i = 0; i < q_->length(); i++) { 004: Packet *ptmp = q_->lookup(i);

圖 5-2:函數 aggablesize( )

005: struct hdr_cmn *hdr_cmn_tmp = HDR_CMN(ptmp);

006: hdr_ip *hdr_ip_tmp = hdr_ip::access(ptmp);

007: if (hdr_cmn_tmp->next_hop() == hdr_cmn_packet->next_hop() &&

008: ((currenttime - hdr_cmn_tmp->timestamp())*1000) >

getMaxDelay(ptmp , Node::get_node_by_address((nsaddr_t) nodeid_))) { 009: totalsize += hdr_cmn_tmp->size();

010: if (numpackets <= maxsize && totalsize < mtusize_ &&

numpackets < MAX_PACKET_NUM) {

011: packetbuffer[numpackets] = ptmp;

012: q_->remove(ptmp);

013: i--;

014: numpackets++;

015: } else

016: totalsize -= hdr_cmn_tmp->size();

017: }

018: }

019: *size = totalsize;

020: return numpackets;

021: }

圖 5-3:函數 add_by_Maxdelay()

圖 5-4:聚集演算法的流程圖

如圖 5-4 所示,紫色部分為實作聚集的地方,在 deque()裡完成聚集,首先 先判斷 queue 是否為空,若不為空在判斷是否為要聚集的封包,如果是要聚集 的封包,則先取得 queue 裡的封包數目,之後判斷是否大於等於要聚集的封包 數目,如果等於就將 queue 裡的封包聚集送出聚集封包送往目的端。如果不等 於要聚集的封包數目,則根據 QueueingMaxDelay 查看目前 queue 裡的封包有沒 有超過 QueueingMaxDelay,若有一個超過就將 queue 裡的封包全部聚集送出封

包型態為 Agg_pkt 的聚集封包。

相關文件