資源描述:
《OpenFlow協(xié)議抓包分析.doc》由會員上傳分享,免費在線閱讀,更多相關(guān)內(nèi)容在行業(yè)資料-天天文庫。
1、OpenFlow協(xié)議抓包分析1什么是openflow協(xié)議OpenFlow起源于斯坦福大學(xué)的CleanSlate項目組,使用類似于API進程配置網(wǎng)絡(luò)交換機的協(xié)議。OpenFlow的思路很簡單,網(wǎng)絡(luò)設(shè)備維護一個FlowTable,并且只通過FlowTable對報文進行處理,F(xiàn)lowTable本身的生成、維護、下發(fā)完全由外置的Controller來實現(xiàn)。OpenFlow交換機將原來完全由交換機/路由器控制的報文轉(zhuǎn)發(fā)過程轉(zhuǎn)化為由OpenFlow交換機(OpenFlowSwitch)和控制服務(wù)器(Controller)來共同完成,從而實現(xiàn)了數(shù)據(jù)轉(zhuǎn)發(fā)和路由控制的分離。控制器可以通過事先
2、規(guī)定好的接口操作來控制OpenFlow交換機中的流表,從而達到控制數(shù)據(jù)轉(zhuǎn)發(fā)的目的。OpenFlow交換機包含安全通道,多級流表和組表。通過安全通道,OpenFlow交換機可以和控制器建立OpenFlow連接;流表用來匹配OpenFlow交換機收到的報文;組表用來定義流表需要執(zhí)行的動作。2報文分析OpenFlow協(xié)議支持三種消息類型:controller-to-switch,asynchronous(異步)和symmetric(對稱)。OpenFlow通過這三種消息,來保持controller和OpenFlow交換機之間的通信。常用的消息主要是Hello消息、Feature消
3、息,Echo消息,以及Packet_in、Packet_out和Flow_mod等。其中Hello、Feature、Echo消息分別包含REQUEST與REPLY消息,每一個消息REQUEST與REPLY的TransactionID相同。2.1Hello控制器與交換機建立連接時由其中某一方發(fā)起OFPT_HELLO消息給對方,該消息攜帶支持的最高協(xié)議版本號,接受方將采用雙方都支持的最低協(xié)議版本進行通信。一旦發(fā)現(xiàn)共同支持的協(xié)議版本,則連接建立,否則發(fā)送OFPT_ERROR消息,描述失敗原因,并中斷連接。/*HeaderonallOpenFlowpackets.*/structo
4、fp_header{uint8_tversion;/*OFP_VERSION.*/uint8_ttype;/*OneoftheOFPT_constants.*/uint16_tlength;/*Lengthincludingthisofp_header.*/uint32_txid;/*Transactionidassociatedwiththispacket.Repliesusethesameidaswasintherequesttofacilitatepairing.*/};OFP_ASSERT(sizeof(structofp_header)==8);Hello消息如下
5、:1.Version:OpenFlow版本,低位為版本號,如上所示。2.Type:OpenFlow消息類型。2.2Feature消息TLS會話一建立,控制器就會向交換機發(fā)送一個ofpt_feature_request消息,該消息只有of包頭,如下所示。交換機會回復(fù)一條ofpt_feature_reply消息。ofpt_feature_request如圖:(有時候會發(fā)現(xiàn)一個數(shù)據(jù)包中有多個request,并且后面會有一一對應(yīng)的reply包。)ofpt_feature_reply如圖:2.3Packet_in消息當(dāng)交換機碰到新數(shù)據(jù)包不知道如何處理,或者action要求發(fā)送給控制器
6、,那么交換機就會用packet_in消息發(fā)送給控制器。一般將數(shù)據(jù)包緩存在交換機中,將有效的數(shù)據(jù)包信息(默認(rèn)的128字節(jié),如果原因是“sendtocontroller”action,那么長度由action_out的max_len決定;如果是原因tablemiss,那么長度由set_config消息中的miss_send_len決定。)和緩存id發(fā)送給控制器,不過,如果交換機不支持緩存或者內(nèi)存用光了,那么就把整個數(shù)據(jù)包放在數(shù)據(jù)部分發(fā)給控制器,并且緩存id為-1。Packet_in消息如下:Packet_in消息結(jié)構(gòu)如下:/*Packetreceivedonport(datapa
7、th->controller).*/structofp_packet_in{structofp_headerheader;uint32_tbuffer_id;/*IDassignedbydatapath.*/uint16_ttotal_len;/*Fulllengthofframe.*/uint16_tin_port;/*Portonwhichframewasreceived.*/uint8_treason;/*Reasonpacketisbeingsent(oneofOFPR_*)*/uint8_tpad;uin