Tài liệu hạn chế xem trước, để xem đầy đủ mời bạn chọn Tải xuống
1
/ 158 trang
THÔNG TIN TÀI LIỆU
Thông tin cơ bản
Định dạng
Số trang
158
Dung lượng
3,18 MB
Nội dung
i LỜI CAM ĐOAN Tôi xin cam đoan Luận án Tiến sĩ với tiêu đề "Nâng cao hiệu thông lượng độ công mạng không dây AD HOC chuẩn IEEE 802.11 EDCA" cơng trình nghiên cứu riêng hướng dẫn PGS.TS Thái Quang Vinh PGS.TS Phạm Thanh Giang Các kết quả, số liệu trình bày luận án trung thực, phần công bố Tạp chí Kỷ yếu Hội thảo khoa học chuyên ngành Luận án có tham khảo sử dụng số thơng tin từ nguồn sách, tạp chí luận án liệt kê danh mục tài liệu tham khảo Hà Nội, ngày tháng 10 năm 2020 Lương Duy Hiếu ii LỜI CẢM ƠN Nội dung luận án thực Học viện Khoa học Công nghệ, Viện Công nghệ thông tin, Viện Hàn lâm Khoa học Công nghệ Việt Nam Nghiên cứu sinh xin tỏ lòng biết ơn sâu sắc đến PGS.TS Thái Quang Vinh PGS.TS Phạm Thanh Giang, người tận tình hướng dẫn, định hướng cho trình nghiên cứu thực luận án Nghiên cứu sinh xin chân thành cảm ơn ý kiến đóng góp quý báu qua buổi seminar định kỳ hàng tháng quý Thầy Cơ, chun gia, NCS nhóm nghiên cứu Công nghệ mạng Truyền thông Viện Công nghệ thông tin Nghiên cứu sinh xin chân thành cảm ơn Lãnh đạo Học viện Khoa học Công nghệ, Viện Cơng nghệ thơng tin, Phịng Tin học Viễn thơng tạo điều kiện thuận lợi cho việc nghiên cứu thực luận án Nghiên cứu sinh xin chân thành cảm ơn lãnh đạo Cục ứng dụng Phát triển công nghệ, Bộ Khoa học Công nghệ đồng nghiệp tạo điều kiện giúp đỡ tơi hồn thành đề tài nghiên cứu Cuối biết ơn sâu sắc tới gia đình ln chia sẻ, cảm thơng, khích lệ tinh thần để tơi hồn thành luận án NCS Lương Duy Hiếu iii MỤC LỤC LỜI CAM ĐOAN i LỜI CẢM ƠN ii MỤC LỤC iii DANH MỤC CÁC KÝ HIỆU, CÁC CHỮ VIẾT TẮT vii DANH MỤC CÁC HÌNH VẼ x DANH MỤC CÁC BẢNG BIỂU xii MỞ ĐẦU CHƯƠNG NGHIÊN CỨU TỔNG QUAN VỀ MẠNG KHÔNG DÂY ADHOC 1.1 1.2 1.3 Giới thiệu mạng adhoc 1.1.1 Định nghĩa mạng adhoc 1.1.2 Kiến trúc mạng adhoc 10 1.1.3 Công nghệ truyền thông 12 1.1.4 Một số đặc tính mạng adhoc 14 1.1.5 Ứng dụng mạng adhoc 15 Nhân tố ảnh hưởng đến hiệu mạng adhoc 18 1.2.1 Hiện tượng multipath fading đường truyền 18 1.2.2 Sự suy giảm tín hiệu dung lượng kênh 19 1.2.3 Biến động định tuyến 20 1.2.4 Tương tranh luồng liệu tầng LLC 21 1.2.5 Tương tranh luồng liệu tầng MAC 24 Phương pháp đánh giá hiệu mạng adhoc 25 1.3.1 Sử dụng mơ hình giải tích 25 1.3.2 Phương pháp thực mô 26 iv 1.3.3 1.4 Phương pháp thực nghiệm 26 Hướng tiếp cận giải toán hiệu mạng adhoc 27 1.4.1 Hướng tiếp cận giao thức định tuyến 27 1.4.2 Hướng tiếp cận chế xử lý hàng đợi 29 1.4.3 Hướng tiếp cận phương thức truy nhập môi trường truyền 30 1.4.4 Một số đánh giá, nhận xét 32 1.5 Hướng tiếp cận định hướng nghiên cứu luận án 32 1.6 Kết luận chương 38 CHƯƠNG PHÂN TÍCH, ĐÁNH GIÁ BỘ THAM SỐ TRUY XUẤT KÊNH TRUYỀN PHÂN TÁN NÂNG CAO IEEE 802.11 EDCA 2.1 39 Phương thức truy nhập kênh truyền phân tán nâng cao IEEE 802.11 EDCA 39 2.1.1 Tổng quan IEEE 802.11 EDCA (Enhanced Distributed Channel Access) 39 2.1.2 Định dạng cấu trúc trường thông tin IEEE 802.11 EDCA 41 2.1.3 Cơ chế truy nhập kênh truyền IEEE 802.11 EDCA 42 2.1.4 Phân tích, đánh giá thơng lượng luồng liệu IEEE 802.11 EDCA 44 2.2 Xây dựng mô đánh giá ảnh hưởng tham số IEEE 802.11 EDCA 45 2.3 2.2.1 Thiết lập mơ hình mạng môi trường mô 45 2.2.2 Các số đo lường mạng 46 2.2.3 Kịch đánh giá tham số TXOP 47 2.2.4 Phân tích kết mơ đánh giá tham số TXOP 47 2.2.5 Kịch đánh giá tham số CW 49 2.2.6 Phân tích kết mơ đánh giá tham số CW 49 Một số kết luận 51 v 2.4 Kết luận chương 51 CHƯƠNG ĐỀ XUẤT PHƯƠNG PHÁP CẢI THIỆN CHẤT LƯỢNG LUỒNG DỮ LIỆU THEO MỨC ĐỘ ƯU TIÊN KHÁC NHAU DỰA TRÊN CƠ CHẾ ĐIỀU CHỈNH THAM SỐ TXOP ĐỘNG 53 3.1 Đặt vấn đề 53 3.2 Giải pháp đề xuất 54 3.2.1 Ý tưởng phương pháp 54 3.2.2 Mơ hình đề xuất 54 3.2.3 Thuật toán điều chỉnh tham số TXOP 60 3.3 Hàm mục tiêu số đo lường đề xuất 63 3.4 Thực mô 65 3.5 3.6 3.7 3.4.1 Mơ hình đơn chặng với tham số TXOP động 66 3.4.2 Mơ hình đa chặng với tham số TXOP động 66 Phân tích, đánh giá mơ 67 3.5.1 Phân tích kết mơ 68 3.5.2 Đánh giá thông lượng 73 3.5.3 Đánh giá số công 75 3.5.4 Đánh giá số độ trễ 76 3.5.5 Đánh giá tải 78 3.5.6 Đánh giá tính khả thi ứng dụng 78 So sánh với số kết công bố 79 3.6.1 So sánh phương pháp thực 79 3.6.2 So sánh kết công bố: 83 Kết luận chương 85 vi CHƯƠNG ĐỀ XUẤT PHƯƠNG PHÁP SỬ DỤNG FUZZY LOGIC ĐỂ ĐIỀU KHIỂN THÔNG MINH MỘT SỐ THAM SỐ TRONG IEEE 802.11 EDCA NHẰM NÂNG CAO TÍNH CƠNG BẰNG CHO CÁC LUỒNG DỮ LIỆU 86 4.1 Đặt vấn đề 86 4.2 Cơ sở lý thuyết liên quan 87 4.3 4.2.1 Fuzzy logic 87 4.2.2 Điều khiển thông minh qua Fuzzy logic 90 4.2.3 Các nghiên cứu liên quan Fuzzy logic 91 Giải pháp sử dụng Fuzzy logic để điều khiển thông minh tham số TXOP, CW 92 4.4 4.3.1 Ý tưởng đề xuất 92 4.3.2 Mơ hình Fuzzy logic điều khiển tham số TXOP 92 4.3.3 Mơ hình Fuzzy logic điều khiển tham số CW 97 4.3.4 Case-study: Fuzzy logic điều khiển tham số TXOP 99 4.3.5 Case-study: Fuzzy logic điều khiển tham số CW 101 Phân tích đánh giá mơ 102 4.4.1 Các số đo lường 102 4.4.2 Thực mô 103 4.5 So sánh kết hai mơ hình 106 4.6 So sánh số kết công bố 106 4.7 So sánh kết với đề xuất 110 4.8 Kết luận chương 111 KẾT LUẬN 113 CÁC CÔNG TRÌNH KHOA HỌC ĐÃ CƠNG BỐ 115 TÀI LIỆU THAM KHẢO 117 vii DANH MỤC CÁC KÝ HIỆU, CÁC CHỮ VIẾT TẮT Viết tắt Nghĩa tiếng Anh AODV Adhoc On-demand Dis- Giao thức định tuyến vector tance Vector routing AIFS Nghĩa tiếng Việt khoảng cách theo yêu cầu Interframe Khoảng thời gian truyền Arbitration Space frame Adhoc Adhoc Network Mạng Adhoc BER Bit Error Rate Tỷ lệ lỗi bit BF Backoff Factor Hệ số trì hỗn BSS Basic Service Set Tập trạm dịch vụ sở CBR Constant Bit Rate Tôc đô bit không đổi CSMA.CA Carrier Sense Multiple Giao thức đa truy nhập cảm Access with Collision nhận sóng mang có dị tìm xung Avoidance đột CP Contention Period Khoảng xung đột CTS Clear To Send Gói tin thơng báo sẵn sàng để truyền chuẩn IEEE 802.11 CW Contention Window Cửa sổ tranh chấp DCF Distributed Coordination Chức điều phối phân tán Function DSSS Direct Sequence Spread Trải phổ trực tiếp Spectrum EDCA Enhanced Distributed Điều khiển truy nhập kênh Channel Access truyền phân tán nâng cao viii EDCAF Enhanced Distributed Chức điều khiển truy nhập Channel Access Function kênh truyền phân tán nâng cao EP Estimation Period Giai đoạn ước lượng FHSS Frequency Hopping Trải phổ theo phương thức nhảy Spread Spectrum tần FIFO First In First Out Vào trước trước FCFS First Come First Serve Vào trước phục vụ trước HCCA HCF Controlled Channel Truy nhập kênh truyền Access HCF Hybrid điều khiển HCF Coordination Chức cộng tác lai Function IEEE Institute of Electrical and Học viện Điện Điện tử Electronics Engineers IFS Inter Frame Space Khoảng cách khung tin LCFS Last Come First Serve Vào sau phục vụ trước MAC Media Access Control Điều khiển truy nhập môi trường NS-2 Network Simulator OFDM Orthogonal Bộ mô mạng NS2 Frequency Phân chia kênh theo tần số trực Division Multiplexing giao PC Point Coordinator Điểm điều phối PCF Point Coordination Func- Chức điều phối điểm tion QoS Quality of Service Chất lượng dịch vụ RTS Request To Send Gói tin gửi yêu cầu để truyền chuẩn IEEE 802.11 RT Real-Time Thời gian thực RR Round Robin Thuật tốn xoay vịng UDP User Datagram Protocol Giao thức tin người dùng ix SIFS Short Interframe Space Khoảng cách ngắn (thời gian khung tin chuẩn IEEE 802.11) TXOP Transmission Opportunity TCP Transmission Control Proto- Giao thức điều khiển việc col WLAN Cơ hội truyền truyền Wireless Local Area Net- Mạng cục khơng dây work x DANH MỤC CÁC HÌNH VẼ Hình 1.1 Mạng adhoc di động Hình 1.2 Mơ hình đơn chặng Hình 1.3 Mơ hình đa chặng 10 Hình 1.4 Mơ hình tham chiếu OSI IEEE 802.11 10 Hình 1.5 Kiến trúc logic IBSS [18] 11 Hình 1.6 Phương thức truy nhập kênh mạng adhoc 12 Hình 1.7 Mạng VANET [1] 16 Hình 1.8 Mạng FANET [2] 17 Hình 1.9 Mạng BAN [4] 17 Hình 1.10 Mơ hình hàng đợi có người phục vụ 20 Hình 1.11 Mơ hình đa chặng 22 Hình 1.12 Tương tranh băng thơng IEEE 802.11 [30] 24 Hình 1.13 Các loại ACs hàng đợi IEEE 802.11 EDCA [30] 33 Hình 1.14 Cơ chế truy nhập kênh có xung đột bên 802.11 EDCA 35 Hình 1.15 Cơ chế truy nhập kênh có xung đột bên ngồi 802.11 EDCA 36 Hình 1.16 Phương pháp điều khiển truy nhập IEEE 802.11 [19] 36 Hình 2.1 Cấu trúc trường thông tin EDCA [18] 41 Hình 2.2 Cấu trúc trường thơng tin cho AC [18] 42 Hình 2.3 Thủ tục truy nhập kênh truyền IEEE 802.11 EDCA 42 Hình 2.4 Tham số TXOP limit IEEE 802.11 EDCA [30] 43 Hình 2.5 Mơ hình đơn chặng với luồng liệu 44 Hình 2.6 Throughput theo tham số chuẩn IEEE 802.11 EDCA 45 Hình 2.7 Throughput luồng BE cho kịch Bảng 2.5 48 Hình 2.8 Throughput luồng BE cho kịch Bảng 2.7 50 130 $ns run } global argv arg0 default_options RunMultihops $argv File thiết lập kịch mô Tên file: pattern.tcl.tcl Chức năng: Thiết lập tô-pô mô proc initScenario {} { global ns val node # Define node initial position puts "Init model " if { $val(sce) == "chain" } { puts "Init $val(sce) $val(nn) nodes model " for {set i 0} {$i < $val(nn) } {incr i} { set node($i) [$ns node] $node($i) random-motion ;# disable random motion $node($i) set X_ [expr $val(distance)*($i+1)] #$node($i) set Y_ [expr 50.0+50.0*(($i+1)%2)] $node($i) set Y_ 50 $node($i) set Z_ 0.0 } } if { $val(sce) == "3node" } { puts "Init $val(sce) $val(nn) nodes model " for {set i 0} {$i < $val(nn) } {incr i} { set node($i) [$ns node] $node($i) random-motion ;# disable random motion $node($i) set Z_ 0.0 } # - - $node(0) set X_ 50 $node(0) set Y_ 250 $node(1) set X_ 250 $node(1) set Y_ 250 $node(2) set X_ 450 $node(2) set Y_ 250 } if { $val(sce) == "5node" } { puts "Init $val(sce) $val(nn) nodes model " for {set i 0} {$i < $val(nn) } {incr i} { set node($i) [$ns node] $node($i) random-motion ;# disable random motion $node($i) set Z_ 0.0 } 131 # - - - - - $node(0) set X_ 50 $node(0) set Y_ 200 $node(1) set X_ 250 $node(1) set Y_ 200 $node(2) set X_ 450 $node(2) set Y_ 200 $node(3) set X_ 650 $node(3) set Y_ 200 $node(4) set X_ 850 $node(4) set Y_ 200 } } File thiết lập kiểu dịch vụ Tên file: ser_arri.tcl Chức năng: Thiết lập kiểu dịch vụ #Multi-flow UDP connection if {$val(tra) == "mfudp"} { SetMFUDPConnection ActiveMFUDPConnection } } # #Set Multi-flows UDP connection with same offered load # proc SetMFUDPConnection {} { #$self instvar ns global ns val node udp cbr null puts "SetMSUDPConnection $val(nn) nodes " # UDP connections between node_(i) and node_(0) for {set i 1} {$i < $val(nn)} { incr i } { for {set j 0} {$j < $val(MAX_P)} { incr j } { set k [expr ($i-1)*$val(MAX_P)+$j] set udp($k) [new Agent/UDP] set null($k) [new Agent/Null] $udp($k) set fid_ $i $udp($k) set prio_ $j #$udp($k) set prio_ $ns attach-agent $node($i) $udp($k) $ns attach-agent $node(0) $null($k) 132 $ns connect $udp($k) $null($k) set cbr($k) [new Application/Traffic/CBR] $cbr($k) attach-agent $udp($k) $cbr($k) set packetSize_ 1024 $cbr($k) set interval_ [expr 1.0/(($val(MAX_P)-$j)*$val(lambda))] } } } proc ActiveMFUDPConnection {} { #$self instvar ns global ns val node udp cbr puts "ActiveMSUDPConnection $val(nn) nodes " for {set i 1} {$i < $val(nn)} { incr i } { for {set j 0} {$j < $val(MAX_P)} { incr j } { set k [expr ($i-1)*$val(MAX_P)+$j] set startsend [expr $val(init)+0.1*($val(nn)*$val(MAX_P)$k)/($val(nn)*$val(MAX_P))] #set startsend [expr $val(init)] #$ns at $val(init) "$cbr($i) start" ;#arrange for cbr to start $ns at $startsend "$cbr($k) start" ;#arrange for cbr to start $ns at $val(stop) "$cbr($k) stop" ;#arrange for cbr to start } } } Thiết lập định nghĩa cấu trúc liệu cho 802.11 EDCA Tên file: mac-802_11e.h Chức năng: Thiết lập cấu trúc liệu cho 802.11 EDCA class EDCA_PHY_MIB { friend class Mac802_11e; public: EDCA_PHY_MIB(Mac802_11e *parent); inline u_int32_t getCWMin() { return(CWMin); } inline u_int32_t getCWMax() { return(CWMax); } inline double getSlotTime() { return(SlotTime); } inline double getSIFS() { return(SIFSTime); } inline double getPIFS() { return(SIFSTime + SlotTime); } inline double getDIFS() { return(SIFSTime + * SlotTime); } inline double getEIFS() { return(getDIFS()); } inline u_int32_t getPreambleLength() { return(PreambleLength); } inline double getPLCPDataRate() { return(PLCPDataRate); } inline u_int32_t getPLCPhdrLen() { return((PreambleLength + PLCPHeaderLength) >> 3); } inline u_int32_t getHdrLen11() { 133 return(getPLCPhdrLen() + sizeof(struct hdr_mac802_11e) + ETHER_FCS_LEN); } inline u_int32_t getRTSlen() { return(getPLCPhdrLen() + sizeof(struct rts_frame)); } inline u_int32_t getCTSlen() { return(getPLCPhdrLen() + sizeof(struct cts_frame)); } inline u_int32_t getACKlen() { return(getPLCPhdrLen() + sizeof(struct ack_frame)); } private: u_int32_t CWMin; u_int32_t CWMax; double SlotTime; double SIFSTime; u_int32_t PreambleLength; u_int32_t PLCPHeaderLength; double PLCPDataRate; }; /* ====================================================================== The actual 802.11e MAC class ====================================================================== */ class Mac802_11e : public Mac { friend class DeferTimer_802_11e; friend class SIFSTimer_802_11e; friend class BackoffTimer_802_11e; friend class IFTimer_802_11e; friend class NavTimer_802_11e; friend class RxTimer_802_11e; friend class TxTimer_802_11e; friend class AkaroaTimer; public: Mac802_11e(); void recv(Packet *p, Handler *h); inline int hdr_dst(char* hdr, int dst = -2); inline int hdr_src(char* hdr, int src = -2); inline int hdr_type(char* hdr, u_int16_t type = 0); void setQ(PriQ* priqueue); PriQ* queue_; // for pointer to Queues in priq.cc //PCR2Queue* queue_; double getAIFS(int pri); void defer_stop(int pri); void calc_throughput(); 134 double idle_time; protected: inline void transmit(Packet *p, double t); inline void set_rx_state(MacState x); inline void set_tx_state(int pri, MacState x); void backoffHandler(int pri); void deferHandler(int pri); void navHandler(void); void recvHandler(void); void sendHandler(void); void txHandler(void); // methods for priority-parameters int getCW(int level); double interval_; private: int command(int argc, const char*const* argv); void check_backoff_timer(); bool AIFSset; bool CWset; int cw_[MAX_PRI]; int cwmin_[MAX_PRI]; int cwmax_[MAX_PRI]; int k_[MAX_PRI]; // 20140620 double txop_limit_[MAX_PRI]; Handler* callback_[MAX_PRI]; /* * Called by the timers */ void recv_timer(void); void send_timer(void); int check_pktCTRL(int pri); int check_pktRTS(int pri); int check_pktTx(int pri); int levels; int slotnum; double aifs_[MAX_PRI]; Packet* packets_[MAX_PRI]; /* * Packet Transmission Functions */ void send(Packet *p, Handler *h); void sendRTS(int pri, int dst); void sendCTS(int pri, int dst, double duration); void sendACK(int pri, int dst); void sendDATA(int pri, Packet *p); void RetransmitRTS(int pri); void RetransmitDATA(int pri); 135 /* * Packet Reception Functions */ void recvRTS(Packet *p); void recvCTS(Packet *p); void recvACK(Packet *p); void recvDATA(Packet *p); void void void void void capture(Packet *p); collision(Packet *p); discard(Packet *p, const char* why); rx_resume(void); tx_resume(void); inline int is_idle(void); /* * Debugging Functions */ void trace_pkt(Packet *p); void dump(char* fname); inline int initialized() { return (cache_ && logtarget_ && Mac::initialized()); } void mac_log(Packet *p) { logtarget_->recv(p, (Handler*) 0); } double txtime(Packet *p); double txtime(double psz, double drt); double txtime(int bytes) { /* clobber inherited txtime() */ abort(); } inline void inc_cw(int level) { //get persistence factor pf = queue_->pri_[level].getPF(); cw_old = cw_[level]; //calculate new cw_[pri] cw_[level] = ((cw_old + 1) * pf) - 1; if(cw_[level] > cwmax_[level]) cw_[level] = cwmax_[level]; } inline void rst_cw(int level) { cw_[level] = cwmin_[level]; } inline double sec(double t) { return(t *= 1.0e-6); } inline u_int16_t usec(double t) { u_int16_t us = (u_int16_t)floor((t *= 1e6) + 0.5); /* u_int16_t us = (u_int16_t)rint(t *= 1e6); */ return us; 136 } inline void set_nav(u_int16_t us) { double now = Scheduler::instance().clock(); double t = us * 1e-6; if((now + t) > nav_) { nav_ = now + t; if(mhNav_.busy()){ mhNav_.stop(); } mhNav_.start(t); } } inline void reset_eifs_nav(); bool inc_retryCounter(int pri); protected: EDCA_PHY_MIB phymib_; EDCA_MAC_MIB macmib_; private: double eifs_nav_; double basicRate_; double dataRate_; int numbytes_[MAX_PRI]; // for Akaroa Observation double start_handle_[MAX_PRI]; // for delay investigation double throughput; double jitter; int rtx_[MAX_PRI]; int pf; int cw_old; /* * Contention Free Burst */ int cfb_; int cfb_broadcast; double cfb_dur; int cfb_active; void cfb(int pri); /* * Mac Timers */ IFTimer_802_11e NavTimer_802_11e RxTimer_802_11e TxTimer_802_11e mhIF_; mhNav_; mhRecv_; mhSend_; // interface timer // NAV timer // incoming packets // outgoing packets 137 DeferTimer_802_11e mhDefer_; // defer timer SIFSTimer_802_11e mhSifs_; // defer timer for sifs, not stoppable! BackoffTimer_802_11e mhBackoff_; // backoff timer AkaroaTimer AK; /* ============================================================ Internal MAC State ============================================================ */ double nav_; // Network Allocation Vector MacState MacState int int Packet Packet Packet //u_int32_t u_int32_t u_int32_t double double double double //double //double //double rx_state_; // incoming state (MAC_RECV or MAC_IDLE) tx_state_[MAX_PRI]; // outgoint state tx_active_; // transmitter is ACTIVE sending; // transmitter is ACTIVE *pktRTS_[MAX_PRI]; // outgoing RTS packet *pktCTRL_[MAX_PRI]; // outgoing non-RTS packet *pktTx_[MAX_PRI]; cw_; // Contention Window ssrc_[MAX_PRI]; // STA Short Retry Count slrc_[MAX_PRI]; // STA Long Retry Count sifs_; // Short Interface Space pifs_; // PCF Interframe Space difs_; // DCF Interframe Space eifs_; // Extended Interframe Space tx_sifs_; tx_pifs_; tx_difs_; //int min_frame_len_; NsObject* logtarget_; /* ============================================================ Duplicate Detection state ============================================================ */ u_int16_t sta_seqno_; // next seqno that I'll use int cache_node_count_; Host *cache_; private: Packet* ppkt; RRTQueue *rr_rev_; RRTQueue *rr_snd_; int flow_rev_[MAX_PRI], flow_snd_[MAX_PRI]; // > array type bool delayed_; double para_delay_; void update_rev_flow (int prio, Packet* p); // Add prion prameter void update_snd_flow (int prio, Packet* p); // Add prion prameter 138 //void updateIdleTime(bool ended); //void updateCollisionTime(double ended = -1); void updateGlobalTime(); void estimation(Packet* p, bool detected = true); void debug (RRTQueue* cl); void TxopAdjust(int prio); // them bien bool isCtrPacket (Packet* p); public: void setdelay(bool d); double CurRevc[MAX_PRI], CurSend[MAX_PRI];//edit from double -> double[] double boa_[MAX_PRI]; double avePacket[MAX_PRI]; int nPacket[MAX_PRI]; double GlobalRevc[MAX_PRI], GlobalSend[MAX_PRI]; // > array double GlobalTime[MAX_PRI], EP_; // > array type //end ptg }; #endif /* mac_80211e_h */ Tên file: mac-802_11e.cc Chức năng: Thiết lập cấu trúc liệu cho 802.11 EDCA // Tinh prio cua tung Packet p void Mac802_11e::update_rev_flow (int prio, Packet* p) { //Update number of flow receive in CS Range and TX Range RRTQueue* cl = rr_rev_; //RRTQueue* next = 0; RRTQueue* tail = rr_rev_; bool find = false; u_int32_t src; nsaddr_t saddr; int32_t sport; u_int32_t dst; nsaddr_t daddr; int32_t dport; if (p == NULL){ //return; //Cerrier Sensing packet src = 255; dst = 255; saddr = 255; sport = 255; daddr = 0; dport = 255; } else { 139 hdr_mac802_11 *mh = HDR_MAC802_11(p); dst = ETHER_ADDR(mh->dh_ra); src = ETHER_ADDR(mh->dh_ta); struct hdr_ip *ih = HDR_IP(p); daddr = ih->daddr(); dport = ih->dport(); saddr = ih->saddr(); sport = ih->sport(); } //struct hdr_ip *ih1 = HDR_IP(pkt); //printf("packet: src->dst %d:%d:%d -> %d:%d:%d\n", src, ih->saddr(), ih->sport(), dst, ih->daddr(), ih->dport()); if (cl == 0) { cl = new RRTQueue(); cl->daddr = daddr; cl->dport = dport; cl->saddr = saddr; cl->sport = sport; cl->src = src; cl->dst = dst; cl->prio = prio; cl->setnext(cl); if ((cl->daddr != (int32_t) IP_BROADCAST) && (cl->daddr != cl->saddr)){ /*increase number of flow*/ flow_rev_[prio] ++; // them gia tri prio } rr_rev_ = cl; //printf("src->dst %d:%d -> %d:%d\n", ih->saddr(), ih->sport(), ih->daddr(), ih->dport() ); return; } { if((cl->daddr == daddr) && (cl->saddr == saddr) && (cl->dst == dst) && (cl->src == src) && (cl->prio == prio) && (!find)) { //found the flow of packet rr_rev_ = cl; return; } tail=cl; cl = cl->next(); } while (cl != rr_rev_); if(find == false) { //not found, create a new queue cl = new RRTQueue(); cl->daddr = daddr; cl->dport = dport; 140 cl->saddr = saddr; cl->sport = sport; cl->src = src; cl->dst = dst; cl->prio = prio; cl->setnext(rr_rev_); tail->setnext(cl);//insert next in tail rr_rev_ = cl; if ((cl->daddr != (int32_t) IP_BROADCAST) && (cl->daddr != cl->saddr)){ /*increase number of flow*/ flow_rev_[prio] ++; //printf("Tai %d: Gia tri flow_rev_[%d] = %d, packet: src->dst %d:%d:%d -> %d:%d:%d\n", index_, prio, flow_rev_[prio], src, cl->saddr, cl>sport, dst, cl->daddr, cl->dport); } } //debug(rr_rev_); } // Add prio forPacket p void Mac802_11e::update_snd_flow (int prio, Packet* p) { if (isCtrPacket(p)) return; RRTQueue* cl = rr_snd_; // RRTQueue* next = 0; RRTQueue* tail = rr_snd_; bool find = false; struct hdr_ip *ih = HDR_IP(p); hdr_mac802_11 *mh = HDR_MAC802_11(p); struct hdr_cmn *ch = HDR_CMN(p); //struct hdr_ip *ih1 = HDR_IP(pkt); //printf("packet: src->dst %d:%d -> %d:%d copy: src->dst %d:%d -> %d:%d \n", ih->saddr(), ih->sport(), ih->daddr(), ih->dport(), ih1->saddr(), ih1>sport(), ih1->daddr(), ih1->dport() ); if (cl == 0) { cl = new RRTQueue(); cl->src = ETHER_ADDR(mh->dh_ta); cl->dst = ETHER_ADDR(mh->dh_ra); cl->daddr = ih->daddr(); cl->dport = ih->dport(); cl->saddr = ih->saddr(); cl->sport = ih->sport(); cl->prio = prio; cl->setnext(cl); // 0301: moi chi kiem tra flow theo IP > chia flow theo port // port khac > tang if ((cl->daddr != (int32_t) IP_BROADCAST) && (cl->daddr != cl->saddr)){ /*increase number of flow*/ 141 //printf("src->dst %d::%d:%d -> %d::%d:%d\n", ih->saddr(), ih->sport(), ih>daddr(), ih->dport() ); flow_snd_[prio] ++; // Them gia tri prio //printf("Gia tri flow_snd_[%d] (trong if) = %d\n", prio, flow_snd_[prio]); } rr_snd_ = cl; //printf("src->dst %d:%d -> %d:%d\n", ih->saddr(), ih->sport(), ih->daddr(), ih->dport() ); return; } { if((cl->daddr == ih->daddr() && cl->saddr == ih->saddr() && cl->prio == prio) && (!find)) { //found the flow of packet rr_snd_ = cl; return; } tail=cl; cl = cl->next(); } while (cl != rr_snd_); if(find == false) { //not found, create a new queue // 0301: xem lai doan cl = new RRTQueue(); cl->src = ETHER_ADDR(mh->dh_ta); cl->dst = ETHER_ADDR(mh->dh_ra); cl->daddr = ih->daddr(); cl->dport = ih->dport(); cl->saddr = ih->saddr(); cl->sport = ih->sport(); cl->prio = prio; cl->setnext(rr_snd_); tail->setnext(cl);//insert next in tail rr_snd_ = cl; if ((cl->daddr != (int32_t) IP_BROADCAST) && (cl->daddr != cl->saddr)){ /*increase number of flow*/ flow_snd_[prio] ++; //printf("Tai %d: Gia tri flow_snd_[%d] = %d\n", index_, prio, flow_snd_[prio]); } } //if (ch->ptype() == PT_ACK) printf("src->dst %d::%d:%d -> %d::%d:%d\n", ETHER_ADDR(mh->dh_ta), ih->saddr(), ih->sport(), ETHER_ADDR(mh->dh_ra), ih>daddr(), ih->dport()); } void Mac802_11e::setdelay (bool d) { delayed_ = d; 142 double now = Scheduler::instance().clock(); //printf("%f Delayed index: %d \n", now, index_); } void Mac802_11e::debug (RRTQueue* rr) { double now = Scheduler::instance().clock(); printf("%f MAC %d\n", now, index_); RRTQueue* cl = rr; if(cl != 0) { { printf("queue: %d, src->dest: %d:%d:%d->%d:%d:%d\n", cl, cl->src, cl->saddr,cl->sport, cl->dst, cl->daddr,cl->dport); cl = cl->next(); }while (cl != rr); } } // Dua tham so prio vao ham void Mac802_11e::updateGlobalTime(){ double now = Scheduler::instance().clock(); int wTFlow_ = 0; for (int i=0; i < MAX_PRI; i++) { wTFlow_ = wTFlow_ + k_[i]*(flow_snd_[i]+flow_rev_[i]); //boa_[i]=1; } //return; for (int i=0; i < MAX_PRI; i++) { if ((GlobalTime[i] + EP_ < now) && (flow_snd_[i]>0)){ GlobalRevc[i] = (4*GlobalRevc[i] + CurRevc[i])/5; GlobalSend[i] = (4*GlobalSend[i] + CurSend[i])/5; // Time send tung flow GlobalTime[i] = now; if (nPacket[i] >= 1) { avePacket[i] = (4*avePacket[i]+ CurSend[i]/nPacket[i])/5 ; } //else avePacket[i] = 0; //30.8.2018 //boa_[i] = 1.0*GlobalSend[i]*wTFlow_/(k_[i]*flow_snd_[i]*EP_); if (GlobalSend[i]*wTFlow_>0) { boa_[i] = (k_[i]*flow_snd_[i]*EP_)/(GlobalSend[i]*wTFlow_);//edit date 24/8/2018 } //else boa_[i]=1; TxopAdjust(i); TxopAdjust(i); //printf("Now: %f, Index: %d, Prio: %d, GRevc: %f, GSend: %f, sndFlow: %d, revFlow: %d, avePacket: %f, nPacket : %d, txop_limit: %f, boa_[i] : %f \n", now, index_, i, GlobalRevc[i], GlobalSend[i], flow_snd_[i], flow_rev_[i], avePacket[i], nPacket[i], txop_limit_[i], boa_[i]); CurRevc[i] = CurSend[i] = 0; nPacket[i] = 0; //30.8.2018 //printf("avePacket[i]: %f \n", avePacket[i]); 143 //if (index_ ==1 ) printf("%f %d (GlobalSend %f / EP_ %f) * (flow_snd_[%d] %d / wTFlow_ %d = %f) = %f cw2 %d/cw %d\n",now, index_, GlobalSend[i], EP_, i, k_[i]*flow_snd_[i], wTFlow_, boa_[i]); } } } void Mac802_11e::estimation(Packet* p, bool detected) { double now = Scheduler::instance().clock(); //int prio = LEVEL(pktRx_); // Rx: Packet; Tx: array //printf("Truoc loi now = %f \n", now); int prio=0; if (p != NULL) { prio = LEVEL(p); } //printf("Sau loi now = %f prio = %d \n", now, prio); updateGlobalTime(); if (!detected) { //The packet out of Transmission range but in Carrier sensing range update_rev_flow(0,NULL); //20130705: update cho cac flow return; } hdr_cmn *ch = HDR_CMN(p); //struct hdr_cmn *sd = HDR_CMN(p); hdr_mac802_11 *mh = HDR_MAC802_11(p); u_int32_t dst = ETHER_ADDR(mh->dh_ra); u_int32_t src = ETHER_ADDR(mh->dh_ta); u_int8_t u_int8_t type = mh->dh_fc.fc_type; subtype = mh->dh_fc.fc_subtype; switch(type) { case MAC_Type_Control: switch(subtype) { case MAC_Subtype_RTS: break; case MAC_Subtype_CTS: if(dst == (u_int32_t)index_){ double t = txtime(phymib_.getRTSlen(), basicRate_) + phymib_.getSIFS() + txtime(phymib_.getCTSlen(), basicRate_) + phymib_.getSIFS(); CurSend[prio] += t; } break; case MAC_Subtype_ACK: if(dst == (u_int32_t)index_) { if (!isCtrPacket(pktTx_[prio])) { 144 double t = 0.5*cw_[prio]*phymib_.getSlotTime() + txtime(phymib_.getDIFS(), basicRate_) + txtime(pktTx_[prio]) + phymib_.getSIFS() + txtime(phymib_.getACKlen(), basicRate_)+phymib_.getSIFS(); CurSend[prio] += t; nPacket[prio] +=1; //Counter the sender flow } } //ptg //printf("%f, MAC ACK %d, src->dest: %d->%d seqno: %d\n", now, index_, ETHER_ADDR(mh->dh_ta),ETHER_ADDR(mh->dh_ra), mh->dh_scontrol, MAC_BROADCAST); break; default: printf("recvTimer1:Invalid MAC Control Subtype %x\n", subtype); } break; case MAC_Type_Data: switch(subtype) { case MAC_Subtype_Data: //printf("%f, MAC Data %d, src->dest: %d->%d seqno: %d\n", now, index_, ETHER_ADDR(mh->dh_ta),dst, mh->dh_scontrol, MAC_BROADCAST); update_rev_flow(prio, p); break; default: printf("recv_timer2:Invalid MAC Data Subtype %x\n",subtype); } break; default: printf("recv_timer3:Invalid MAC Type %x\n", type); } } // Add parameter prio void Mac802_11e::TxopAdjust(int prio) { double now = Scheduler::instance().clock(); if (txop_limit_[prio]>avePacket[prio]) { txop_limit_[prio] = boa_[prio]*txop_limit_[prio]; } if (txop_limit_[prio]>MAX_TXOP) { txop_limit_[prio]=MAX_TXOP; } //printf("txop_limit_[prio]: %f, boa_[prio]: %f , prio : %d \n", txop_limit_[prio], boa_[prio], prio); }