導航:首頁 > 編程語言 > Python實現乙太網

Python實現乙太網

發布時間:2022-08-10 21:16:18

❶ 如何用python對目標地址的PLC的地址裡面讀寫值

下來,之後再進行整理。
Dataset 建立在 SQLAlchemy 之上,所以如果需要對它進行擴展,你會感到非常熟悉。使用 Django 內建的 inspectdb 管理命令可以很容易地把底層資料庫模型導入 Django 中,這使得和現有資料庫一同工作不會出現任何障礙。
從網頁抓取數據:Beautiful Soup
Beautiful Soup(一般寫作 BS4)庫使得從 HTML 網頁中提取信息變得非常簡單。當我們需要把非結構化或弱結構化的 HTML 轉換為結構化數據的時候,就需要使用 Beautiful Soup 。用它來處理 XML 數據也是一個很好的選擇,否則 XML 的下來,之後再進行整理。
Dataset 建立在 SQLAlchemy 之上,所以如果需要對它進行擴展,你會感到非常熟悉。使用 Django 內建的 inspectdb 管理命令可以很容易地把底層資料庫模型導入 Django 中,這使得和現有資料庫一同工作不會出現任何障礙。
從網頁抓取數據:Beautiful Soup
Beautiful Soup(一般寫作 BS4)庫使得從 HTML 網頁中提取信息變得非常簡單。當我們需要把非結構化或弱結構化的 HTML 轉換為結構化數據的時候,就需要使用 Beautiful Soup 。用它來處理 XML 數據也是一個很好的選擇,否則 XML 的

❷ 乙太網MAC和PHY是什麼意思,各有什麼作用

mac是數字鏈路層,phy晶元是物理層,有一個介質獨立的概念,介質就是實際側傳輸介質,比如光纜,電纜,這時模擬層的東西,需要phy來實現模數轉換(還有其他數字電路,比如自協商,時鍾恢復,serdes/desredes,scramble/descramble),mac是純數字的,雖然mac晶元和phy晶元可以做成同一層晶元,但是由於phy有模擬的東西,常把和模擬介質相關的分離開來。記住傳輸介質是多種多樣的,但是處理的數字電路卻可以是同一樣,而且需要實現乙太網的csma/cd功能。

❸ 畢設題目是基於fpga的乙太網實現,大家有什麼最基本的思路么不會做啊不會做~~

難,只能說難。

FPGA處理時序的東西,挺復雜的。

乙太網,你可以弄一個乙太網模塊,主要是要控制這個模塊工作。
如果用單片機還簡單點,用FPGA控制,代碼麻煩。

❹ Python滲透測試工具都有哪些

網路

Scapy, Scapy3k: 發送,嗅探,分析和偽造網路數據包。可用作互動式包處理程序或單獨作為一個庫

pypcap, Pcapy, pylibpcap: 幾個不同 libpcap 捆綁的python庫

libdnet: 低級網路路由,包括埠查看和乙太網幀的轉發

dpkt: 快速,輕量數據包創建和分析,面向基本的 TCP/IP 協議

Impacket: 偽造和解碼網路數據包,支持高級協議如 NMB 和 SMB

pynids: libnids 封裝提供網路嗅探,IP 包碎片重組,TCP 流重組和埠掃描偵查

Dirtbags py-pcap: 無需 libpcap 庫支持讀取 pcap 文件

flowgrep: 通過正則表達式查找數據包中的 Payloads

Knock Subdomain Scan: 通過字典枚舉目標子域名

SubBrute: 快速的子域名枚舉工具

Mallory: 可擴展的 TCP/UDP 中間人代理工具,可以實時修改非標准協議

Pytbull: 靈活的 IDS/IPS 測試框架(附帶超過300個測試樣例)

調試和逆向工程

Paimei: 逆向工程框架,包含PyDBG, PIDA , pGRAPH

Immunity Debugger: 腳本 GUI 和命令行調試器

mona.py: Immunity Debugger 中的擴展,用於代替 pvefindaddr

IDAPython: IDA pro 中的插件,集成 Python 編程語言,允許腳本在 IDA Pro 中執行

PyEMU: 全腳本實現的英特爾32位模擬器,用於惡意軟體分析

pefile: 讀取並處理 PE 文件

pydasm: Python 封裝的libdasm

PyDbgEng: Python 封裝的微軟 Windows 調試引擎

uhooker: 截獲 DLL 或內存中任意地址可執行文件的 API 調用

diStorm: AMD64 下的反匯編庫

python-ptrace: Python 寫的使用 ptrace 的調試器

vdb/vtrace: vtrace 是用 Python 實現的跨平台調試 API, vdb 是使用它的調試器

Androguard: 安卓應用程序的逆向分析工具

Capstone: 一個輕量級的多平台多架構支持的反匯編框架。支持包括ARM,ARM64,MIPS和x86/x64平台

PyBFD: GNU 二進制文件描述(BFD)庫的 Python 介面

Fuzzing

Sulley: 一個模糊器開發和模糊測試的框架,由多個可擴展的構件組成的

Peach Fuzzing Platform: 可擴展的模糊測試框架(v2版本 是用 Python 語言編寫的)

antiparser: 模糊測試和故障注入的 API

TAOF: (The Art of Fuzzing, 模糊的藝術)包含 ProxyFuzz, 一個中間人網路模糊測試工具

untidy: 針對 XML 模糊測試工具

Powerfuzzer: 高度自動化和可完全定製的 Web 模糊測試工具

SMUDGE: 純 Python 實現的網路協議模糊測試

Mistress: 基於預設模式,偵測實時文件格式和偵測畸形數據中的協議

Fuzzbox: 媒體多編碼器的模糊測試

Forensic Fuzzing Tools: 通過生成模糊測試用的文件,文件系統和包含模糊測試文件的文件系統,來測試取證工具的魯棒性

Windows IPC Fuzzing Tools: 使用 Windows 進程間通信機制進行模糊測試的工具

WSBang: 基於 Web 服務自動化測試 SOAP 安全性

Construct: 用於解析和構建數據格式(二進制或文本)的庫

fuzzer.py(feliam): 由 Felipe Andres Manzano 編寫的簡單模糊測試工具

Fusil: 用於編寫模糊測試程序的 Python 庫

Web

Requests: 優雅,簡單,人性化的 HTTP 庫

HTTPie: 人性化的類似 cURL 命令行的 HTTP 客戶端

ProxMon: 處理代理日誌和報告發現的問題

WSMap: 尋找 Web 伺服器和發現文件

Twill: 從命令行界面瀏覽網頁。支持自動化網路測試

Ghost.py: Python 寫的 WebKit Web 客戶端

Windmill: Web 測試工具幫助你輕松實現自動化調試 Web 應用

FunkLoad: Web 功能和負載測試

spynner: Python 寫的 Web瀏覽模塊支持 Javascript/AJAX

python-spidermonkey: 是 Mozilla JS 引擎在 Python 上的移植,允許調用 Javascript 腳本和函數

mitmproxy: 支持 SSL 的 HTTP 代理。可以在控制台介面實時檢查和編輯網路流量

pathod/pathoc: 變態的 HTTP/S 守護進程,用於測試和折磨 HTTP 客戶端

❺ 用python怎麼能解析輸出ifconfig里具體IP地址

importsocket
hostname=socket.gethostname()
ip=socket.gethostbyname(hostname)
printip

這就是本機的IP地址

❻ 在linux下,python怎麼才能抓到網卡上的所有TCP數據包

Ethereal 自帶許多協議的 decoder,簡單,易用,基於winpcap的一個開源的軟體.但是它的架構並不靈活,如何你要加入一個自己定義的的解碼器,得去修改 Ethereal的代碼,再重新編譯,很煩瑣.對於一般的明文 協議,沒有什麼問題,但是對於加密協議,比如網路游戲,客戶端程序一般會在剛連接上的時候,發送一個隨機密鑰,而後的報文都會用這個密鑰進行加密,如此. 要想破解,得要有一個可編程的抓包器.
libpcap是一個不錯的選擇,但是對於抓包這樣需要反復進行」試 驗->修改」這個過程的操作,c 語言顯然不是明智的選擇.
Python提供了幾個libpcapbind。在windows平台上,你需要先安裝winpcap,如果你已經安裝了Ethereal非常好用
一個規范的抓包過程
import pcap
import dpkt
pc=pcap.pcap() #注,參數可為網卡名,如eth0
pc.setfilter('tcp port 80') #設置監聽過濾器
for ptime,pdata in pc: #ptime為收到時間,pdata為收到數據
print ptime,pdata #...
對抓到的乙太網V2數據包(raw packet)進行解包
p=dpkt.ethernet.Ethernet(pdata)
if p.data.__class__.__name__=='IP':
ip='%d.%d.%d.%d'%tuple(map(ord,list(p.data.dst)))
if p.data.data.__class__.__name__=='TCP':
if data.dport==80:
print p.data.data.data # by gashero
一些顯示參數
nrecv,ndrop,nifdrop=pc.stats()
返回的元組中,第一個參數為接收到的數據包,(by gashero)第二個參數為被核心丟棄的數據包。

❼ python可以通過什麼命令更改ip地址

#!/usr/bin/env python
#-*- encoding:gb2312 -*-
Filename: IP.py
import sitecustomize
import _winreg
import ConfigParser
from ctypes import *
print '正在進行網路適配器檢測,請稍候…'
print
netCfgInstanceID = None
hkey = _winreg.OpenKey(_winreg.HKEY_LOCAL_MACHINE, \
r'System\CurrentControlSet\Control\Class{4d36e972-e325-11ce-bfc1-08002be10318}')
keyInfo = _winreg.QueryInfoKey(hkey)
尋找網卡對應的適配器名稱 netCfgInstanceID
for index in range(keyInfo[0]):
hSubKeyName = _winreg.EnumKey(hkey, index)
hSubKey = _winreg.OpenKey(hkey, hSubKeyName)
try:
hNdiInfKey = _winreg.OpenKey(hSubKey, r'Ndi\Interfaces')
lowerRange = _winreg.QueryValueEx(hNdiInfKey, 'LowerRange')
檢查是否是乙太網
if lowerRange[0] == 'ethernet':
driverDesc = _winreg.QueryValueEx(hSubKey, 'DriverDesc')[0]
print '檢測到網路適配器名:', driverDesc
netCfgInstanceID = _winreg.QueryValueEx(hSubKey, 'NetCfgInstanceID')[0]
print '檢測到網路適配器ID:', netCfgInstanceID
if netCfgInstanceID == None:
print '沒有找到網路適配器,程序退出'
exit()
break
_winreg.CloseKey(hNdiInfKey)
except WindowsError:
print r'Message: No Ndi\Interfaces Key'
循環結束,目前只提供修改一個網卡IP的功能
_winreg.CloseKey(hSubKey)
_winreg.CloseKey(hkey)
通過修改注冊表設置IP
strKeyName = 'System\CurrentControlSet\Services\Tcpip\Parameters\Interfaces\' + netCfgInstanceID
print '網路適配器的注冊表地址是:\n', strKeyName
hkey = _winreg.OpenKey(_winreg.HKEY_LOCAL_MACHINE, \
strKeyName, \
0, \
_winreg.KEY_WRITE)
config = ConfigParser.ConfigParser()
print
print '正在打開IP.ini配置文件…'
config.readfp(open('IP.ini'))
IPAddress = config.get("school","IPAddress")
SubnetMask = config.get("school","SubnetMask")
GateWay = config.get("school","GateWay")
DNSServer1 = config.get("school","DNSServer1")
DNSServer2 = config.get("school","DNSServer2")
DNSServer = [DNSServer1,DNSServer2]
print '配置文件內設定的信息如下,請核對:'
print
print 'IP地址:', IPAddress
print '子關掩碼:', SubnetMask
print '默認網關:', GateWay
print '主DNS伺服器:', DNSServer1
print '次DNS伺服器:', DNSServer2
print
res = raw_input('現在,請您決定:輸入1,則將配置文件寫入系統;輸入2,則將現有的系統設定還原為全部自動獲取;否則程序退出:')
if str(res) == '1':
try:
_winreg.SetValueEx(hkey, 'EnableDHCP', None, _winreg.REG_DWORD, 0x00000000)
_winreg.SetValueEx(hkey, 'IPAddress', None, _winreg.REG_MULTI_SZ, [IPAddress])
_winreg.SetValueEx(hkey, 'SubnetMask', None, _winreg.REG_MULTI_SZ, [SubnetMask])
_winreg.SetValueEx(hkey, 'DefaultGateway', None, _winreg.REG_MULTI_SZ, [GateWay])
_winreg.SetValueEx(hkey, 'NameServer', None, _winreg.REG_SZ, ','.join(DNSServer))
except WindowsError:
print 'Set IP Error'
exit()
_winreg.CloseKey(hkey)
print '切換成功!重置網路後即可生效'
elif str(res) == '2':
try:
_winreg.SetValueEx(hkey, 'EnableDHCP', None, _winreg.REG_DWORD, 0x00000001)
_winreg.SetValueEx(hkey, 'T1', None, _winreg.REG_DWORD, 0x00000000)
_winreg.SetValueEx(hkey, 'T2', None, _winreg.REG_DWORD, 0x00000000)
_winreg.SetValueEx(hkey, 'NameServer', None, _winreg.REG_SZ, None)
_winreg.SetValueEx(hkey, 'DhcpConnForceBroadcastFlag', None, _winreg.REG_DWORD, 0x00000000)
_winreg.SetValueEx(hkey, 'Lease', None, _winreg.REG_DWORD, 0x00000000)
_winreg.SetValueEx(hkey, 'LeaseObtainedTime', None, _winreg.REG_DWORD, 0x00000000)
_winreg.SetValueEx(hkey, 'LeaseTerminatesTime', None, _winreg.REG_DWORD, 0x00000000)
except WindowsError:
print 'Set IP Error'
exit()
_winreg.CloseKey(hkey)
print '切換成功!重置網路後即可生效'
else:
print '用戶手動取消,程序退出'
exit('')

❽ 如何學習 Python GUI 編程

我始終認為,對一個初學者來說,IT界的技術風潮是不可以追趕的,而且也沒有能力去追趕。我時常看見自己的DDMM們把課本扔了,去賣些價格不菲的諸如C#, VB.Net 這樣的大部頭,這讓我感到非常痛心。而許多搞不清指針是咋回事的BBS站友眉飛色舞的討論C#裡面可以不用指針等等則讓我覺得好笑。C#就象當年的ASP一樣,「忽如一夜春風來,千樹萬樹梨花開」,結果許多學校的信息學院成了「Web 學院」。96,97級的不少大學生都去做Web 了。當然我沒有任何歧視某一行業的意識。我只是覺得如果他們把追趕這些時髦技術的時間多花一點在基礎的課程上應該是可以走得更遠的。 幾個誤區 初學者對C#風潮的追趕其實也只是學習過程中經常遇到的幾個誤區之一。我將用一些實際的例子來說明這些現象,你可以按部就班的看看自己是不是屬於其中的一種或者幾種: 認為計算機技術等於編程技術: 有些人即使沒有這個想法,在潛意識中也有這樣的沖動。讓我奇怪的是,許多信息學院的學生也有這樣的念頭。認為計算機專業就是編程專業,與編程無關的,或者不太相關的課程他統統都不管,極端的學生只要書上沒帶「編程」兩個字他就不看。 其實編程只是計算機技術應用過程中一種復雜性最低的勞動,這就是為什麼IT業最底層的人是程序員(CODER)。計算機技術包括了多媒體,計算機網路,人工智慧,模式識別,管理信息系統等等這些方面。編程工作只是在這些具體技術在理論研究或者工程實踐的過程中表達演算法的過程。編程的人不一定對計算機技術的了解就一定很高。而一個有趣的現象是,不少大師級的計算機技術研究者是不懂編程的。網上的炒作和現實中良好的工作待遇把編程這種勞動神秘化了。其實每一個程序員心裡都明白,自己這些東西,學的時候並不比其它專業難,所以自然也不會高檔到哪裡去。 咬文嚼字的孔已己作風: 我見過一本女生的《計算機網路原理》教材,這個女生象小學生一樣在書上劃滿了橫杠杠,筆記做得滿滿的,列印出來一定比教材還厚。我不明白的是,象計算機網路原理這樣的課程有必要做筆記?我們的應試教育的確害了不少學生,在上《原理》這一類課程的時候許多學生象學《馬列原理》一樣逐字背誦記憶。這乃是我見過的最愚蠢的行為。所謂《原理》,即是需要掌握它為什麼這樣做,學習why,而不是how(怎樣做)。極端認真的學生背下乙太網的網線最大長度,數據幀的長度,每個欄位的意義,IP報頭的格式等等,但是忘了路由的原則,忘了TCP/IP協議設計的宗旨。總之許多人花了大量的時間把書背得滾瓜爛熟卻等於什麼也沒學。 在學習編程的時候這些學生也是這樣,他們確切的記得C++語法的各個細節。看完了C++教程後看《Thinking in C++》(確實是好書),《Inside C++》,《C++ reference》,this C++, that C++……,然後是網上各種各樣的關於C++語法的奇聞逸事,然後發現自己又忘了C++的一些語法,最後回頭繼續惡補…。有個師弟就跟我說:「C++ 太難了,學了這里忘了那裡,學了繼承忘了模板。」我的回答道:「你不去學就容易了」。我並沒有教壞他,只是告訴他,死摳C++的語法就和孔已己炫耀茴香豆的茴字有幾種寫法一樣毫無意義。你根本不需要對的C++語法太關心,動手編程就是了,有不記得的地方一查MSDN就立馬搞定。我有個結論就是,實際的開發過程中對程序語法的了解是最微不足道的知識。這是為什麼我在為同學用Basic(我以前從沒有學過它)寫一個小程序的時候,只花了半個小時看了看語法,然後再用半個小時完成了程序,而一個小時後我又完全忘記了Basic 的所有關鍵字。 不顧基礎,盲目追趕時髦技術: ; 終於點到題目上來了。大多數的人都希望自己的東西能夠馬上跑起來,變成錢。這種想法對一個已經進入職業領域的程序員或者項目經理來說是合理的,而且IT技術進步是如此的快,不跟進就是失業。但是對於初學者來說(尤其是時間充裕的大中專在校生),這種想法是另人費解的。一個並未進入到行業競爭中來的初學者最大的資本便是他有足夠的時間沉下心來學習基礎性的東西,學習why 而不是how。時髦的技術往往容易掌握,而且越來越容易掌握,這是商業利益的驅使,為了最大化的降低軟體開發的成本。但在IT領域內的現實就是這樣,越容易掌握的東西,學習的人越多,而且淘汰得越快。每一次新的技術出來,都有許多初學者跟進,這些初學者由於缺乏必要的基礎而使得自己在跟進的過程中花費大量的時間,而等他學會了,這種技術也快淘汰了。基礎的課程,比方數據結構,*作系統原理等等雖然不能讓你立馬就實現一個linux(這是許多人嘲笑理論課程無用的原因),但它們能夠顯著的減少你在學習新技術時學習曲線的坡度。而且對於許多關鍵的技術(比方Win32 SDK 程序的設計,DDK的編程)來說甚至是不可或缺的。 一個活生生的例子是我和我的一個同學,在大一時我還找不到開機按紐,他已經會寫些簡單的匯編程序了。我把大二的所有時間花在了匯編,計算機體系結構,數據結構,*作系統原理等等這些課程的學習上,而他則開始學習HTML和VB,並追趕ASP的潮流。大三的時候我開始學習Windows *作系統原理,學習SDK編程,時間是漫長的,這時我才能夠用VC開發出象模象樣的應用程序。我曾一度因為同學的程序已經能夠運行而自己還在學習如何創建對話框而懊惱不已,但臨到畢業才發現自己的選擇是何等的正確。和我談判的公司開出的薪水是他的兩倍還多。下面有一個不很恰當的比方:假設學習VB編程需要4個月,學習基礎課程和VC的程序設計需要1年。那麼如果你先學VB,再來學習後者,時間不會減少,還是1年,而反過來,如果先學習後者,再來學VB,也許你只需要1個星期就能學得非常熟練。 幾個重要的基礎課程 如果你是學生,或者如果你有充足的時間。我建議你仔細的掌握下面的知識。我的建議是針對那些希望在IT技術上有所成就的初學者。同時我還列出了一些書目,這些書應該都還可以在書店買到。說實在的,我在讀其他人的文章時最大的心願就是希望作者列出一個書單。 大學英語-不要覺得好笑。我極力推薦這門課程是因為沒有專業文檔的閱讀能力是不可想像的。中文的翻譯往往在猴年馬月才會出來,而現在的許多出版社乾脆就直接把E文印刷上去。學習的方法是強迫自己看原版的教材,開始會看不懂,用多了自然熟練。吃得苦下得狠心絕對是任何行業都需要的品質。 計算機體系結構和匯編語言-關於體系結構的書遍地都是,而且也大同小異,倒是匯編有一本非常好的書。《80x86匯編語言程序設計教程》(清華大學出版社,黑色封面,楊季文著)。你需要著重學習386後保護模式的程序設計。否則你在學習現代*作系統底層的一些東西的時候會覺得是在看天書。 計算機*作系統原理-我們的開發總是在特定的*作系統上進行,如果不是,只有一種可能:你在自己實現一個*作系統。無論如何,*作系統原理是必讀的。這就象我們為一個晶元製作外圍設備時,晶元基本的工作時序是必需了解的。這一類書也很多,我沒有發現哪一本書非常出眾。只是覺得在看完了這些書後如果有空就應該看看《Inside Windows 2000》(微軟出版社,我看的是E文版的,中文的書名想必是Windows 2000 技術內幕之類吧)。關於學習它的必要性,ZDNET上的另一篇文章已經有過論述。 數據結構和演算法-這門課程能夠決定一個人程序設計水平的高低,是一門核心課程。我首選的是清華版的(朱戰立,劉天時)。很多人喜歡買C++版的,但我覺得沒有必要。C++的語法讓演算法實現過程變得復雜多了,而且許多老師喜歡用模塊這一東西讓演算法變得更復雜。倒是在學完了C版的書以後再來瀏覽一下C++的版的書是最好的。 軟體工程-這門課程是越到後來就越發現它的重要,雖然剛開始看時就象看馬哲一樣不知所雲。我的建議是看《實用軟體工程》(黃色,清華)。不要花太多的時間去記條條框框,看不懂就跳過去。在每次自己完成了一個軟體設計任務(不管是練習還是工作)以後再來回顧回顧,每次都會有收獲。 Windows 程序設計-《北京大學出版社,Petzold著》我建議任何企圖設計Windows 程序的人在學習VC以前仔細的學完它。而且前面的那本《Inside Windows 2000》也最好放到這本書的後面讀。在這本書中,沒有C++,沒有GUI,沒有控制項。有的就是如何用原始的C語言來完成Windows 程序設計。在學完了它以後,你才會發現VC其實是很容易學的。千萬不要在沒有看完這本書以前提前學習VC,你最好碰都不要碰。我知道的許多名校甚至都已經用它作為教材進行授課。可見其重要。 上面的幾門課程我認為是必學的重要課程(如果你想做Windows 程序員)。 對於其它的課程有這樣簡單的選擇方法:如果你是計算機系的,請學好你所有的專業基礎課。如果不是,請參照計算機系的課程表。如果你發現自己看一本書時無法看下去了,請翻到書的最後,看看它的參考文獻,找到它們並學習它們,再回頭看這本書。如果一本書的書名中帶有「原理」兩個字,你一定不要去記憶它其中的細節,你應該以一天至少50頁的速度掌握其要領。盡可能多的在計算機上實踐一種理論或者演算法。 你還可以在CSDN上閱讀到許多書評。這些書評能夠幫助你決定讀什麼樣的書。 日三省乎己 每天讀的書太多,容易讓人迷失方向。一定要在每天晚上想想自己學了些什麼,還有些什麼相關的東西需要掌握,自己對什麼最感興趣,在一本書上花的時間太長還是不夠等等。同時也應該多想想未來最有可能出現的應用,這樣能夠讓你不是追趕技術潮流而是引領技術潮流。同時,努力使用現在已經掌握的技術和理論去製作具有一定新意的東西。堅持這樣做能夠讓你真正成為一個軟體「研發者」而不僅僅是一個CODER。 把最多的時間花在學習上 這是對初學者最後的忠告。把每個星期玩SC或者CS的時間壓縮到最少,不玩它們是最好的。同時,如果你的ASP技術已經能夠來錢,甚至有公司請你兼職的話,這就證明你的天份能夠保證你在努力的學習之後取得更好的收益,你應該去做更復雜的東西。眼光放長遠一些,這無論是對誰都是適用的。 相信你已經能夠決定是否學習C#或者什麼時候去學它了。

❾ 如何利用Python嗅探數據包

一提到Python獲取數據包的方式,相信很多Python愛好者會利用Linux的libpcap軟體包或利用Windows下的WinPcap可移植版的方式進行抓取數據包,然後再利用dpkt軟體包進行協議分析,我們這里想換一個角度去思考:1.Python版本的pcap存儲內存數據過小,也就是說緩存不夠,在高並發下容易發生丟包現象,其實C版本的也同樣存在這樣的問題,只不過Python版本的緩存實在是過低,讓人很郁悶。2.dpkt協議分析並非必須,如果你對RFC791和RFC793等協議熟悉的話,完全可以使用struct.unpack的方式進行分析。如果你平常習慣使用tcpmp抓取數據包的話,完全可以使用它來代替pcap軟體包,只不過我們需要利用tcpmp將抓取的數據以pcap格式進行保存,說道這里大家一定會想到Wireshark工具,具體命令如下:tcpmpdst10.13.202.116andtcpdstport80-s0-ieth1-w../pcap/tcpmp.pcap-C1k-W5我們首先需要對pcap文件格式有所了解,具體信息大家可以參考其他資料文檔,我這里只說其重要的結構體組成,如下:sturctpcap_file_header{DWORDmagic;WORDversion_major;WORDversion_minor;DWORDthiszone;DWORDsigfigs;DWORDsnaplen;DWORDlinktype;}structpcap_pkthdr{structtimevalts;DWORDcaplen;DWORDlen;}structtimeval{DWORDGMTtime;DWORDmicroTime;}這里需要說明的一點是,因為在Python的世界裡一切都是對象,所以往往Python在處理數據包的時候感覺讓人比較麻煩。Python提供了幾個libpcapbind,這里有一個最簡單的。在windows平台上,你需要先安裝winpcap,如果你已經安裝了Ethereal非常好用。一個規范的抓包過程:importpcapimportdpktpc=pcap.pcap()#注,參數可為網卡名,如eth0pc.setfilter('tcpport80')#設置監聽過濾器forptime,pdatainpc:#ptime為收到時間,pdata為收到數據printptime,pdata#對抓到的乙太網V2數據包(rawpacket)進行解包:p=dpkt.ethernet.Ethernet(pdata)ifp.data.__class__.__name__=='IP':ip='%d.%d.%d.%d'%tuple(map(ord,list(p.data.dst)))ifp.data.data.__class__.__name__=='TCP':ifdata.dport==80:printp.data.data.data一些顯示參數nrecv,ndrop,nifdrop=pc.stats()返回的元組中,第一個參數為接收到的數據包,第二個參數為被核心丟棄的數據包。至於對於如何監控tcpmp生成的pcap文件數據,大家可以通過pyinotify軟體包來實現,如下:classPacker(pyinotify.ProcessEvent):def__init__(self,proct):self.proct=proctself.process=Nonedefprocess_IN_CREATE(self,event):logger.debug("createfile:%sinqueue"%self.process_IF_START_THREAD(event))defprocess_IN_MODIFY(self,event):self.process_IF_START_THREAD(event)logger.debug("modifyfile:%sinqueue"%self.process_IF_START_THREAD(event))defprocess_IN_DELETE(self,event):filename=os.path.join(event.path,event.name)logger.debug("deletefile:%s"%filename)defprocess_IF_START_THREAD(self,event):filename=os.path.join(event.path,event.name)iffilename!=self.process:self.process=filenameself.proct.put(filename)ifself.proct.qsize()>1:try:logger.debug("createconsumerproct.qsize:%s"%self.proct.qsize())consumer=Consumer(self.proct)consumer.start()exceptException,errmsg:logger.error("createconsumerfailed:%s"%errmsg)returnfilenameclassFactory(object):def__init__(self,proct):self.proct=proctself.manager=pyinotify.WatchManager()self.mask=pyinotify.IN_CREATE|pyinotify.IN_DELETE|pyinotify.IN_MODIFYdefwork(self):try:try:notifier=pyinotify.ThreadedNotifier(self.manager,Packer(self.proct))notifier.start()self.manager.add_watch("../pcap",self.mask,rec=True)notifier.join()exceptException,errmsg:logger.error("createnotifierfailed:%s"%errmsg)exceptKeyboardInterrupt,errmsg:logger.error("factoryhasbeenterminated:%s"%errmsg)在獲得要分析的pcap文件數據之後,就要對其分析了,只要你足夠了解pcap文件格式就可以了,對於我們來講只需要獲得TCP數據段的數據即可,如下:classWriter(threading.Thread):def__init__(self,proct,stack):threading.Thread.__init__(self)self.proct=proctself.stack=stackself.pcap_pkthdr={}defrun(self):whileTrue:filename=self.proct.get()try:f=open(filename,"rb")readlines=f.read()f.close()offset=24whilelen(readlines)>offset:self.pcap_pkthdr["len"]=readlines[offset+12:offset+16]try:length=struct.unpack("I",self.pcap_pkthdr["len"])[0]self.stack.put(readlines[offset+16:offset+16+length])offset+=length+16exceptException,errmsg:logger.error("unpackpcap_pkthdrfailed:%s"%errmsg)exceptIOError,errmsg:logger.error("openfilefailed:%s"%errmsg)在獲得TCP數據段的數據包之後,問題就簡單多了,根據大家的具體需求就可以進行相應的分析了,我這里是想分析其HTTP協議數據,同樣也藉助了dpkt軟體包進行分析,如下:defworker(memcache,packet,local_address,remote_address):try:p=dpkt.ethernet.Ethernet(packet)ifp.data.__class__.__name__=="IP":srcip="%d.%d.%d.%d"%tuple(map(ord,list(p.data.src)))dstip="%d.%d.%d.%d"%tuple(map(ord,list(p.data.dst)))ifp.data.data.__class__.__name__=="TCP":tcpacket=p.data.dataiftcpacket.dport==80anddstip==local_address:srcport=tcpacket.sportkey=srcip+":"+str(srcport)iftcpacket.data:ifnotmemcache.has_key(key):memcache[key]={}ifnotmemcache[key].has_key("response"):memcache[key]["response"]=Noneifmemcache[key].has_key("data"):memcache[key]["data"]+=tcpacket.dataelse:memcache[key]["data"]=tcpacket.dataelse:ifmemcache.has_key(key):memcache[key]["response"]=dpkt.http.Request(memcache[key]["data"])try:stackless.tasklet(connection)(memcache[key]["response"],local_address,remote_address)stackless.run()exceptException,errmsg:logger.error("connectremoteremote_addressfailed:%s",errmsg)logger.debug("oldheaders(nonecontent-length):%s",memcache[key]["response"])memcache.pop(key)exceptException,errmsg:logger.error("dpkt.ethernet.Ethernetfailedinworker:%s",errmsg)如果大家只是想單純的獲取IP地址、埠、流量信息,那麼問題就更簡單了,這里只是拋磚引玉。另外再提供一段代碼供參考:importpcap,dpkt,structimportbinasciidefmain():a=pcap.pcap()a.setfilter('udpportrange4000-4050')try:fori,pdataina:p=dpkt.ethernet.Ethernet(pdata)src='%d.%d.%d.%d'%tuple(map(ord,list(p.data.src)))dst='%d.%d.%d.%d'%tuple(map(ord,list(p.data.dst)))sport=p.data.data.sportdport=p.data.data.dport =int(binascii.hexlify(p.data.data.data[7:11]),16)print' :%d,From:%s:%d,To:%s:%d'%( ,src,sport,dst,dport)exceptException,e:print'%s'%en=raw_input()if__name__=='__main__':main()

❿ 如何實現雙乙太網的自動切換

可以實現,如果是Intel的網卡,可以將兩個網卡綁定成一個Channel,和交換機一起配置就可以實現冗餘和負載分擔,記得還有幾個大廠的網卡有這個功能,不過都挺貴的。

(不用擔心STP的問題)

閱讀全文

與Python實現乙太網相關的資料

熱點內容
崑山ug數控編程培訓 瀏覽:519
integer類源碼 瀏覽:819
java排序的時間復雜度 瀏覽:859
伺服器陣列卡壞了怎麼維修 瀏覽:537
shm演算法 瀏覽:520
可愛的程序員陸漓離開 瀏覽:608
如何把掃描文件做成pdf格式 瀏覽:625
php個性qq源碼 瀏覽:821
初學c語言顯示源未編譯 瀏覽:247
資產概況源碼 瀏覽:472
dos命令建文件夾命令 瀏覽:380
解壓的密碼htm被屏蔽 瀏覽:503
冬天太冷冰箱壓縮機不啟動怎麼辦 瀏覽:84
手機打開vcf需要什麼編譯器 瀏覽:911
加密磁碟後開機很慢 瀏覽:272
長沙智能雲控系統源碼 瀏覽:259
阿里雲伺服器如何設置操作系統 瀏覽:1001
超級命令的英文 瀏覽:784
做賬為什麼要用加密狗 瀏覽:586
考研群體怎麼解壓 瀏覽:159