114培訓(xùn)網(wǎng)歡迎您來到全國(guó)python學(xué)習(xí)中心!

13289378727

全國(guó)統(tǒng)一學(xué)習(xí)專線 9:00-21:00

Python網(wǎng)絡(luò)編程6-使用Pysnmp實(shí)現(xiàn)簡(jiǎn)單網(wǎng)管

??簡(jiǎn)單網(wǎng)絡(luò)管理協(xié)議SNMP(Simple Network Protocol)用于網(wǎng)絡(luò)設(shè)備的管理。SNMP作為廣泛應(yīng)用于TCP/IP網(wǎng)絡(luò)的網(wǎng)絡(luò)管理標(biāo)準(zhǔn)協(xié)議,提供了統(tǒng)一的接口,從而實(shí)現(xiàn)了不同種類和廠商的網(wǎng)絡(luò)設(shè)備之間的統(tǒng)一管理。
??SNMP協(xié)議分為三個(gè)版本:SNMPv1、SNMPv2c和SNMPv3。

??SNMP系統(tǒng)由網(wǎng)絡(luò)管理系統(tǒng)NMS(Network System)、SNMP Agent、被管對(duì)象 object和管理信息庫(kù)MIB( Base)四部分組成。

??SNMP查詢是指NMS主動(dòng)向SNMP Agent發(fā)送查詢請(qǐng)求,如圖1-3所示。SNMP Agent接收到查詢請(qǐng)求后,通過MIB表完成相應(yīng)指令,并將結(jié)果反饋給NMS。SNMP查詢操作有三種:Get、GetNext和GetBulk。SNMPv1版本不支持GetBulk操作。

??不同版本的SNMP查詢操作的工作原理基本一致,*的區(qū)別是SNMPv3版本增加了身份驗(yàn)證和加密處理。下面以SNMPv2c版本的Get操作為例介紹SNMP查詢操作的工作原理。假定NMS想要獲取被管理設(shè)備MIB節(jié)點(diǎn)的值,使用可讀團(tuán)體名為public,過程如下所示:
??SNMP設(shè)置是指NMS主動(dòng)向SNMP Agent發(fā)送對(duì)設(shè)備進(jìn)行Set操作的請(qǐng)求,如下圖示。SNMP Agent接收到Set請(qǐng)求后,通過MIB表完成相應(yīng)指令,并將結(jié)果反饋給NMS。

??不同版本的SNMP Set操作的工作原理基本一致,*的區(qū)別是SNMPv3版本增加了身份驗(yàn)證和加密處理。下面以SNMPv3版本的Set操作為例介紹SNMP Set操作的工作原理。
假定NMS想要設(shè)置被管理設(shè)備MIB節(jié)點(diǎn)sysName的值為HUAWEI,過程如下所示:

??SNMPv1和SNMPv2c的Set操作報(bào)文格式如下圖所示。一般情況下,SNMPv3的Set操作信息是經(jīng)過加密封裝在SNMP PDU中,其格式與SNMPv2c的Set操作報(bào)文格式一致。
??SNMP Traps是指SNMP Agent主動(dòng)將設(shè)備產(chǎn)生的告警或事件上報(bào)給NMS,以便網(wǎng)絡(luò)管理員及時(shí)了解設(shè)備當(dāng)前運(yùn)行的狀態(tài)。
??SNMP Agent上報(bào)SNMP Traps有兩種方式:Trap和Inform。SNMPv1版本不支持Inform。Trap和Inform的區(qū)別在于,SNMP Agent通過Inform向NMS發(fā)送告警或事件后,NMS需要回復(fù)進(jìn)行確認(rèn)。
??在Ensp中搭建網(wǎng)絡(luò)環(huán)境,在R2上啟用SNMP作為SNMP agent,Linux主機(jī)作為NMS;為方便觀察SNMP報(bào)文格式,在R2使用SNMP的版本為v2c。
通過下面的Python腳本獲取R2的系統(tǒng)信息與當(dāng)前的主機(jī)名

運(yùn)行結(jié)果如下

??在R2接口上抓包結(jié)果如下,Linux主機(jī)向R2的161端口發(fā)送SNMP get-request報(bào)文,可以看到SNMP使用的版本為v2c,設(shè)置的團(tuán)體名為public,隨機(jī)生成了一個(gè)request-id,變量綁定列表(Variable bindings),即要查詢的OID,但Value為空;值得注意的是這些信息都是明文傳輸?shù)?,為了安全在?shí)際環(huán)境中應(yīng)使用SNMPv3。

通過下面的Python腳本獲取R2的接口信息。

運(yùn)行結(jié)果如下:

在R2接口抓包結(jié)果如下,相比get-request設(shè)置了一個(gè)max-字段,表明最多執(zhí)行g(shù)et操作的次數(shù)。Variable bindings中請(qǐng)求的OID條目只有一條。

下面Python腳本用于設(shè)置R2的主機(jī)名為SNMPv2R2。

運(yùn)行結(jié)果如下

在路由器上可以看到主機(jī)名有R2變?yōu)榱薙NMPv2R2。

get-response數(shù)據(jù)包內(nèi)容與set-request中無異。

下面Python腳本用于接收,R2發(fā)送的Trap,并做簡(jiǎn)單解析。

先運(yùn)行該腳本,之后再R2上手動(dòng)將一個(gè)接口shutdown,結(jié)果如下:

接口上抓包結(jié)果如下,此時(shí)團(tuán)體名用的是public,data部分表明是trap。

由于Ensp中的通用路由器認(rèn)證算法只支持des56,而pysnmp不支持該算法,因此使用AR路由器配置SNMPv3。
使用下面Python腳本發(fā)送snmpv3 get報(bào)文獲取設(shè)備系統(tǒng)信息。

抓包結(jié)果如下,首先發(fā)送get-resques進(jìn)行SNMPv3認(rèn)證請(qǐng)求,隨機(jī)生成一個(gè)msgID,認(rèn)證模式為USM,msgflgs中置1要求對(duì)方發(fā)送report,其他為置0,表示不進(jìn)行加密與鑒權(quán);另外安全參數(shù),認(rèn)證參數(shù)、加密參數(shù)都為空,此時(shí)不攜帶get請(qǐng)求數(shù)據(jù)。

路由器給NMS回復(fù)report,msgID與resquest一致,Msgflgs中各位都置0,同時(shí)回復(fù)使用的安全引擎,認(rèn)證與加密參數(shù)為空,不進(jìn)行認(rèn)證與加密,因此能看到data中的數(shù)據(jù)。

AR1收到請(qǐng)求后進(jìn)行回復(fù),數(shù)據(jù)包中msgflags標(biāo)志位中除外其他位都置1,表示不需要回復(fù),同時(shí)進(jìn)行加密與鑒權(quán)。同樣也可以看到認(rèn)證用戶為testuser,認(rèn)證參數(shù)與加密參數(shù)都有填充,data部分也是同樣加密。

參考:
什么是SNMP - 華為 (huawei.com)
AR100-S V300R003 MIB參考 - 華為 (huawei.com)
SNMP library for Python — SNMP library for Python 4.4 (pysnmp..io)

*生想學(xué)編程,Python 怎么樣呢?

挺好的,學(xué)習(xí)下面內(nèi)容就很好!
*階段:python開發(fā)入門
第二階段:函數(shù)編程+常用標(biāo)準(zhǔn)庫(kù)
第三階段:面向?qū)ο?網(wǎng)絡(luò)編程
第四階段:核心網(wǎng)絡(luò)編程+數(shù)據(jù)庫(kù)
第五階段:前端開發(fā)
第六階段:web框架開發(fā)
第七階段:web框架開發(fā)進(jìn)階
第八階段:爬蟲實(shí)戰(zhàn)
第九階段:企業(yè)項(xiàng)目實(shí)戰(zhàn)
第十階段:算法設(shè)計(jì)模式
第十一階段:高并發(fā)業(yè)務(wù)解決方案

python要學(xué)些什么

階段一:Python開發(fā)基礎(chǔ)
Python基礎(chǔ)語(yǔ)法、數(shù)據(jù)類型、字符編碼、文件操作、函數(shù)、裝飾器、迭代器、內(nèi)置方法、常用模塊等。
階段二:Python高級(jí)編程和數(shù)據(jù)庫(kù)開發(fā)
面向?qū)ο箝_發(fā)、Socket網(wǎng)絡(luò)編程、線程、進(jìn)程、隊(duì)列、IO多路模型、Mysql數(shù)據(jù)庫(kù)開發(fā)等。
階段三:前端開發(fā)
Html、CSS、開發(fā)、Jquery&bootstrap開發(fā)、前端框架VUE開發(fā)等。
階段四:WEB框架開發(fā)
Django框架基礎(chǔ)、Django框架進(jìn)階、BBS+Blog實(shí)戰(zhàn)項(xiàng)目開發(fā)、緩存和隊(duì)列中間件、Flask框架學(xué)習(xí)、Tornado框架學(xué)習(xí)、Restful
API等。
階段五:爬蟲開發(fā)
爬蟲開發(fā)實(shí)戰(zhàn)。
階段六:全棧項(xiàng)目實(shí)戰(zhàn)
企業(yè)應(yīng)用工具學(xué)習(xí)、CRM客戶關(guān)系管理系統(tǒng)開發(fā)、在線教育平臺(tái)開發(fā)等。
階段七:數(shù)據(jù)分析
金融量化分析。
階段八:人工智能
機(jī)器學(xué)習(xí)、圖形識(shí)別、無人機(jī)開發(fā)、無人駕駛等。
階段九:自動(dòng)化運(yùn)維&開發(fā)
CMDB資產(chǎn)管理系統(tǒng)開發(fā)、IT審計(jì)+主機(jī)管理系統(tǒng)開發(fā)、分布式主機(jī)監(jiān)控系統(tǒng)開發(fā)等。
階段十:高并發(fā)語(yǔ)言GO開發(fā)
GO語(yǔ)言基礎(chǔ)、數(shù)據(jù)類型與文件IO操作、函數(shù)和面向?qū)ο蟆⒉l(fā)編程等。

Python網(wǎng)絡(luò)編程 -- TCP/IP

首先放出一個(gè) TCP/IP 的程序,這里是單線程服務(wù)器與客戶端,在多線程一節(jié)會(huì)放上多線程的TCP/IP服務(wù)程序。

這里將服務(wù)端和客戶端放到同一個(gè)程序當(dāng)中,方便對(duì)比服務(wù)端與客戶端的不同。

TCP/IP是因特網(wǎng)的通信協(xié)議,其參考OSI模型,也采用了分層的方式,對(duì)每一層制定了相應(yīng)的標(biāo)準(zhǔn)。

網(wǎng)際協(xié)議(IP)是為全世界通過互聯(lián)網(wǎng)連接的計(jì)算機(jī)賦予統(tǒng)一地址系統(tǒng)的機(jī)制,它使得數(shù)據(jù)包能夠從互聯(lián)網(wǎng)的一端發(fā)送至另一端,如 130.207.244.244,為了便于記憶,常用主機(jī)名代替IP地址,例如 baidu.com。

UDP (User Datagram Protocol,用戶數(shù)據(jù)報(bào)協(xié)議) 解決了上述*個(gè)問題,通過端口號(hào)來實(shí)現(xiàn)了多路復(fù)用(用不同的端口區(qū)分不同的應(yīng)用程序)但是使用UDP協(xié)議的網(wǎng)絡(luò)程序需要自己處理丟包、重包和包的亂序問題。

TCP ( Control Protocol,傳輸控制協(xié)議) 解決了上述兩個(gè)問題,同樣使用端口號(hào)實(shí)現(xiàn)了復(fù)用。

TCP 實(shí)現(xiàn)可靠連接的方法:

socket通信模型及 TCP 通信過程如下兩張圖。

[圖片上傳失敗...(image-6d947d-)]

[圖片上傳失敗...(image-30b472-)]

socket.(host, port, family, socktype, proto, flags)
返回: [(family, socktype, proto, , sockaddr), ] 由元組組成的列表。
family:表示socket使用的協(xié)議簇, AF_UNIX : 1, AF_INET: 2, AF_INET6 : 10。 0 表示不指定。
socktype: socket 的類型, SOCK_STREAM : 1, SOCK_DGRAM : 2, SOCK_RAW : 3
proto: 協(xié)議, 套接字所用的協(xié)議,如果不指定, 則為 0。 IPPROTO_TCP : 6, IPPRTOTO_UDP : 17
flags:標(biāo)記,限制返回內(nèi)容。 AI_ 把計(jì)算機(jī)無法連接的所有地址都過濾掉(如果一個(gè)機(jī)構(gòu)既有IPv4,又有IPv6,而主機(jī)只有IPv4,則會(huì)把 IPv6過濾掉)
AI _V4MAPPED, 如果本機(jī)只有IPv6,服務(wù)卻只有IPv4,這個(gè)標(biāo)記會(huì)將 IPv4地址重新編碼為可實(shí)際使用的IPv6地址。
AI_CANONNAME,返回規(guī)范主機(jī)名:。
(None, 'smtp', 0, socket.SOCK_STREAM, 0, socket.AP_PASSIVE)
('ftp.kernel.org', 'ftp', 0, 'socket.SOCK_STREAM, 0, socket.AI_ | socket.AI_V4MAPPED)
利用已經(jīng)通信的套接字名提供給
mysock = server_sock.accept()
addr, port = mysock.()
(addr, port, mysock.family, mysock.type, mysock.proto, socket.AI_CANONNAME)

TCP 數(shù)據(jù)發(fā)送模式:

由于 TCP 是發(fā)送流式數(shù)據(jù),并且會(huì)自動(dòng)分割發(fā)送的數(shù)據(jù)包,而且在 recv 的時(shí)候會(huì)阻塞進(jìn)程,直到接收到數(shù)據(jù)為止,因此會(huì)出現(xiàn)死鎖現(xiàn)象,及通信雙方都在等待接收數(shù)據(jù)導(dǎo)致無法響應(yīng),或者都在發(fā)送數(shù)據(jù)導(dǎo)致緩存區(qū)溢出。所以就有了封幀(framing)的問題,即如何分割消息,使得接收方能夠識(shí)別消息的開始與結(jié)束。

關(guān)于封幀,需要考慮的問題是, 接收方何時(shí)最終停止調(diào)用recv才是安全的?整個(gè)消息或數(shù)據(jù)何時(shí)才能完整無缺的傳達(dá)?何時(shí)才能將接收到的消息作為一個(gè)整體來解析或處理。

適用UDP的場(chǎng)景:

由于TCP每次連接與斷開都需要有三次握手,若有大量連接,則會(huì)產(chǎn)生大量的開銷,在客戶端與服務(wù)器之間不存在長(zhǎng)時(shí)間連接的情況下,適用UDP更為合適,尤其是客戶端太多的時(shí)候。

第二種情況: 當(dāng)丟包現(xiàn)象發(fā)生時(shí),如果應(yīng)用程序有比簡(jiǎn)單地重傳數(shù)據(jù)聰明得多的方法的話,那么就不適用TCP了。例如,如果正在進(jìn)行音頻通話,如果有1s的數(shù)據(jù)由于丟包而丟失了,那么只是簡(jiǎn)單地不斷重新發(fā)送這1s的數(shù)據(jù)直至其成功傳達(dá)是無濟(jì)于事的。反之,客戶端應(yīng)該從傳達(dá)的數(shù)據(jù)包中任意選擇一些組合成一段音頻(為了解決這一問題,一個(gè)智能的音頻協(xié)議會(huì)用前一段音頻的高度壓縮版本作為數(shù)據(jù)包的開始部分,同樣將其后繼音頻壓縮,作為數(shù)據(jù)包的結(jié)束部分),然后繼續(xù)進(jìn)行后續(xù)操作,就好像沒有發(fā)生丟包一樣。如果使用TCP,那么這是不可能的,因?yàn)門CP會(huì)固執(zhí)地重傳丟失的信息,即使這些信息早已過時(shí)無用也不例外。UDP數(shù)據(jù)報(bào)通常是互聯(lián)網(wǎng)實(shí)時(shí)多媒體流的基礎(chǔ)。

參考資料:

溫馨提示:為不影響您的學(xué)業(yè),來校區(qū)前請(qǐng)先電話咨詢,方便我校安排相關(guān)的專業(yè)老師為您解答
相關(guān)資料
  • 作者最新文章
  • 在線報(bào)名
申請(qǐng)?jiān)嚶犝n程

只要一個(gè)電話
我們免費(fèi)為您回電

姓名不能為空
手機(jī)號(hào)格式錯(cuò)誤