作業二說明: (dealine:10/10) make之前,先將aodv目錄下,附檔是.o的全部刪除,才執行編譯,以免產生錯誤。 經過作業一之後,各位已經有拓撲環境及節點的劇本。 作業二題目是要各位作latency的數據。 latency:client送出data request的時間到收到data reply的時間。 環境: 1000mx1000m,50個節點。 模擬時間改為200秒 <--- 修改my_scenario.tcl的時間為200結束。 請設定100秒之後再開始傳送data request。 (提示: 在query_model的第一行,加上) If (CURRENT_TIME > 100) { ..................... } 各位同學該怎麼著手? 以下可供參考 step 1: 將課程網頁提供的aodv code覆蓋原來aodv目錄裡的檔案。 step 2: compile(在ns-allinone-2.30/ns-2.30的目錄下面打make按enter) 以後修改aodv.cc裡的code時,儲存後,要compile才算完成。 step 3: 打開aodv.cc,搜尋query_model()函數,由於預設所有的節點每一秒 模擬時間都會執行query_model(),為了簡易,在此作業,我們只讓 節點6模擬client發query到server,其他節點則do nothing。 step 4: 完整的query_model函數程式碼可修改成如下: (先將原來的query_model函數裡的程式碼全部刪除) float next_query_time=0; //global variable,用來記錄該節點下次query的時間 void AODV::query_model() { if ((index==6)&&(CURRENT_TIME>=next_query_time)) //如果是節點6及現在模擬時間大於下一次的query時間 { int server_id = rand() % 49 + 1; //亂數選擇一個節點當server aodv_rt_entry *rt = rtable.rt_lookup(server_id); //與server建立routing的entry if(rt==0) {rt=rtable.rt_add(server_id);} sendRequest(server_id); //使用aodv routing protocol來和server建立routing path next_query_time+=10; //下一次的query時間加上十秒 } } step 5: 接著修改data_discovery_process函數(原來的程式碼可刪除) void AODV::data_discovery_process(int source, int destination) { original_send_data_request(source, destination, 1); } step 6: 接著再修改original_send_data_request函數(原來的程式碼請刪除) void AODV::original_send_data_request(int source, int destination, int data_id) { printf("\nOriginal=%d,send request for destination=%d,data_id=%d,time=%.5f", index,destination,data_id,CURRENT_TIME); aodv_rt_entry *rt0 = rtable.rt_lookup(destination); //Exist a routing path to destination if ((rt0)&&(rt0->rt_flags == RTF_UP)) //如果與server之間的routing path存在的話 { Packet *p = Packet::alloc(); //產生封包 struct hdr_cmn *ch = HDR_CMN(p); struct hdr_ip *ih = HDR_IP(p); struct hdr_aodv_reply *rh = HDR_AODV_REPLY(p); //這幾行開始就是各位同學要自行記錄節點的行為及模擬時間,(設計TRACE檔) //由於需要記錄時間,所以這個函數在產生data request封包的時候,請 //將現在的時間記錄在檔案。提示:請用fopen的函數開檔+fprintf寫檔。 rh->rp_type = AODVTYPE_HELLO; rh->rp_hop_count = 1; rh->rp_dst = index; rh->rp_dst_seqno = seqno; rh->rp_lifetime = (1 + ALLOWED_HELLO_LOSS) * HELLO_INTERVAL; //Field for data discovery process rh->rp_flag = 1; //Flag of original send data_request rh->rp_original_source = source; //Source field rh->rp_data_source = destination; //Destination field rh->rp_data_id = data_id; //Data id ch->ptype() = PT_AODV; ch->size() = IP_HDR_LEN + rh->size(); ch->iface() = -2; ch->error() = 0; ch->addr_type() = NS_AF_NONE; ch->prev_hop_ = index; //AODV hack ch->next_hop_ = rt0->rt_nexthop; ih->saddr() = index; ih->daddr() = rt0->rt_nexthop; //下一個節點的id ih->sport() = RT_PORT; ih->dport() = RT_PORT; ih->ttl_ = 250; Scheduler::instance().schedule(target_, p, 0); //由ns2模擬送出封包給下一個節點 } } step 7: 接著修改original_source_recv_data函數(原來的程式碼請刪除) 當data reply給client時,original_source_recv_data(Packet *p)函數會被叫起 因此在這個函數時CURRENT_TIME變數就等於收到REPLY的時間。各位在step 6已經將 送出的時間記錄下來,因此二個時間相減,就是latency的時間。 本次作業請上傳trace檔,檔名: 學號_hw2.tr trace檔"至少"要包含以下資訊。 那個節點在第幾秒送data request給那個節點 那個節點在第幾秒收到data request 那個節點在第幾秒收到data reply <--- 各位用fprintf寫的資訊,是英文,這邊中文只是為了說明。