计算机网络实验(Wireshark 抓包工具使用、WinPcap 编程、协议分析流量统计程序的编写)
實驗一:Wireshark 抓包工具使用
一、實驗?zāi)康?/h3>
二、實驗內(nèi)容
使用 Wireshark,并學習使用它進行網(wǎng)絡(luò)包分析。
三、實驗原理
Wireshark 是網(wǎng)絡(luò)包分析工具;網(wǎng)絡(luò)包分析工具的主要作用是嘗試捕獲網(wǎng)絡(luò)包,并嘗試顯示包的盡可能詳細的情況。Wireshark 常見的應(yīng)用如下:
- 網(wǎng)絡(luò)管理員用來解決網(wǎng)絡(luò)問題
- 網(wǎng)絡(luò)安全工程師用來檢測安全隱患
- 開發(fā)人員用來測試協(xié)議執(zhí)行情況
這里,我們通過 Wireshark 來學習常見的網(wǎng)絡(luò)協(xié)議。
四、實驗過程
包含了從安裝 Wireshark 開始到使用 Wireshark 觀察一些現(xiàn)象的過程:
4.1 下載 Wireshark
Wireshark 的官方網(wǎng)站是:https://www.wireshark.org/,下載地址是 https://2.na.dl.wireshark.org/win64/Wireshark-win64-3.4.6.exe
4.2 準備工作
再 Powershell 中輸入 ipconfig 查詢本機的 IP 信息:
在同局域網(wǎng)下打開另一臺設(shè)備,啟動一個服務(wù)器:
查看局域網(wǎng)內(nèi)的這臺設(shè)備的 IP 地址:
可以得到的信息匯總?cè)缦?#xff1a;
| 主機 | 192.168.3.2 | 255.255.255.0 | 192.168.3.1 |
| 服務(wù)器 | 192.168.3.71 | 255.255.255.0 | 192.168.3.1 |
因為只需要這些信息,所以直接在 Powershell 中獲取;需要更詳細的信息也可以通過網(wǎng)絡(luò)適配器選項中來獲得。接下來使用 Wireshark 捕獲兩者之間的通訊數(shù)據(jù)包,并且進行分析。
4.3 啟動 Wireshark
首先需要先選擇監(jiān)聽的網(wǎng)絡(luò)設(shè)備:
然后,就可以開始捕獲以太網(wǎng)的通信數(shù)據(jù)包:
接下來,可以進行捕獲通過它的特定報文,并且分析內(nèi)容。
4.4 TCP 握手
瀏覽器訪問上面查詢到的服務(wù)器的地址 http://192.168.3.71,并且在 Wireshark 中設(shè)定限制條件(過濾器) ip.src == 192.168.3.71 or ip.dst == 192.168.3.71 來只捕獲來自這兩個 IP 地址之間的通信。
高亮的部分就是 TCP 的三次握手。
4.5 TCP 報文分析示例
這是上述三次握手過程中的第二次握手的報文的詳細信息:
| 源端口 | 80 | 服務(wù)器的 HTTP 默認端口,服務(wù)確實開在 80 端口上 |
| 目的端口 | 61577 | 用戶瀏覽器當前開啟的用于和服務(wù)器通信的端口 |
| TCP 段長度 | 0 | 該報文不攜帶數(shù)據(jù) |
| Sequence 數(shù)字 | 0 | Seq=0 |
| Acknowledge 數(shù)字 | 1 | 期望收到的下一個報文滿足 Seq=1 |
| 首部長度 | 32 bytes (8) | 8 * 4B = 32 bytes |
| 標志 | 0x012 | SYN 和 ACK 位為 1 |
| 校驗和 | 0x5426 | 校驗和為 0x5426,未驗證 |
http://www.biyezuopin.vip
4.6 HTTP 報文分析
在 TCP 握手完成之后,服務(wù)器將使用 HTTP 協(xié)議傳輸數(shù)據(jù)到瀏覽器;我們在緊接著握手完成后面的位置找到了使用 HTTP 協(xié)議傳輸?shù)臄?shù)據(jù)包;可以打開查看其詳細信息:
| GET / HTTP/1.1 | 操作類型:GET;遵循了 HTTP 1.1 版本的協(xié)議 |
| Host: 192.168.3.71 | 主機名:192.168.3.71;當綁定域名的場合下會是主機的域名 |
| Connection: keep-alive | 連接類型是保持持久連接 |
| User-Agent: ... | 用戶的客戶端信息;這里有個 Mozilla/5.0 (Windows NT 10.0 ...) 說明是運行在 Windows 10 上的火狐瀏覽器 |
| …… | …… |
HTTP 頭能塞的東西還挺多的,這里就不全部說明了;當然,這里所包含的項目也未必完整。
五、思考題
網(wǎng)絡(luò)工程師能通過 Wireshark 做哪些工作?
- 檢查網(wǎng)絡(luò)協(xié)議的執(zhí)行情況
- 排查網(wǎng)絡(luò)故障,解決網(wǎng)絡(luò)問題
- 網(wǎng)絡(luò)攻防,檢測網(wǎng)絡(luò)安全隱患
實驗二:WinPcap 編程
| Windows 10 Pro 21H1 | CLion 2021.1; CMake 3.19; tdm-gcc 9.3; NpCap SDK 1.07 |
http://www.biyezuopin.vip
一、實驗?zāi)康?/h3>
- 了解 NpCap 架構(gòu)和運行邏輯
- 學習使用 NpCap SDK 進行編程
二、實驗內(nèi)容
通過學習 NpCap SDK,編寫一個網(wǎng)絡(luò)抓包程序
三、實驗原理
本實驗主要基于 NpCap 完成,所以這里主要是關(guān)于 NpCap 的介紹:
3.1 NpCap 概述
WinPcap 是一個基于 Win32 平臺的,用于捕獲網(wǎng)絡(luò)數(shù)據(jù)包并進行分析的開源庫;在 Linux 上也有對應(yīng)的 LibPcap;目前 WinPcap 已經(jīng)處于無人維護的狀態(tài),對于 Windows 10 有更新的且目前有人維護的開源項目 NpCap。
大多數(shù)網(wǎng)絡(luò)應(yīng)用程序通過被廣泛使用的操作系統(tǒng)元件來訪問網(wǎng)絡(luò),比如 sockets——這是一種簡單的實現(xiàn)方式,因為操作系統(tǒng)已經(jīng)妥善處理了底層具體實現(xiàn)細節(jié)(比如協(xié)議處理,封裝數(shù)據(jù)包等等工作),并且提供了一個與讀寫文件類似的,令人熟悉的接口;但是有些時候,這種“簡單的實現(xiàn)方式”并不能滿足需求,因為有些應(yīng)用程序需要直接訪問網(wǎng)絡(luò)中的數(shù)據(jù)包:也就是說原始數(shù)據(jù)包——即沒有被操作系統(tǒng)利用網(wǎng)絡(luò)協(xié)議處理過的數(shù)據(jù)包。而 WinPcap/NpCap 則為 Win32 應(yīng)用程序提供了這樣的接口:
- 捕獲原始數(shù)據(jù)包;無論它是發(fā)往某臺機器的,還是在其他設(shè)備(共享媒介)上進行交換的
- 在數(shù)據(jù)包發(fā)送給某應(yīng)用程序前,根據(jù)指定的規(guī)則過濾數(shù)據(jù)包
- 將原始數(shù)據(jù)包通過網(wǎng)絡(luò)發(fā)送出去
- 收集并統(tǒng)計網(wǎng)絡(luò)流量信息
SDK 提供的這些功能需要借助運行在 Win32 內(nèi)核中的網(wǎng)絡(luò)設(shè)備驅(qū)動程序來實現(xiàn);在安裝完成驅(qū)動之后,SDK 將這些功能作為一個接口表現(xiàn)出來以供使用。
3.2 要使用的接口
以下介紹了實現(xiàn)后文提到的 demo 所需要使用的 NpCap API 的簡單介紹:
3.2.1 pcap_findalldevs
NpCap 提供了 pcap_findalldevs_ex 和 pcap_findalldevs 函數(shù)來獲取計算機上的網(wǎng)絡(luò)接口設(shè)備的列表;此函數(shù)會為傳入的 pcap_if_t 賦值——該類型是一個表示了設(shè)備列表的鏈表頭;每一個這樣的節(jié)點都包含了 name 和 description 域來描述設(shè)備。
除此之外,pcap_if_t 結(jié)構(gòu)體還包含了一個 pcap_addr 結(jié)構(gòu)體;后者包含了一個地址列表、一個掩碼列表、一個廣播地址列表和一個目的地址的列表;此外,pcap_findalldevs_ex 還能返回遠程適配器信息和一個位于所給的本地文件夾的 pcap 文件列表。
3.2.2 pcap_open
用來打開一個適配器,實際調(diào)用的是 pcap_open_live;它接受五個參數(shù):
- name:適配器的名稱(GUID)
- snaplen:制定要捕獲數(shù)據(jù)包中的哪些部分。在一些操作系統(tǒng)中 (比如 xBSD 和 Win32),驅(qū)動可以被配置成只捕獲數(shù)據(jù)包的初始化部分:這樣可以減少應(yīng)用程序間復制數(shù)據(jù)的量,從而提高捕獲效率;本次實驗中,將值定為 65535,比能遇到的最大的 MTU 還要大,因此總能收到完整的數(shù)據(jù)包。
- flags:主要的意義是其中包含的混雜模式開關(guān);一般情況下,適配器只接收發(fā)給它自己的數(shù)據(jù)包, 而那些在其他機器之間通訊的數(shù)據(jù)包,將會被丟棄。但混雜模式將會捕獲所有的數(shù)據(jù)包——因為我們需要捕獲其他適配器的數(shù)據(jù)包,所以需要打開這個開關(guān)。
- to_ms:指定讀取數(shù)據(jù)的超時時間,以毫秒計;在適配器上使用其他 API 進行讀取操作的時候,這些函數(shù)會在這里設(shè)定的時間內(nèi)響應(yīng)——即使沒有數(shù)據(jù)包或者捕獲失敗了;在統(tǒng)計模式下,to_ms 還可以用來定義統(tǒng)計的時間間隔:設(shè)置為 0 說明沒有超時——如果沒有數(shù)據(jù)包到達,則永遠不返回;對應(yīng)的還有 -1:讀操作立刻返回。
- errbuf:用于存儲錯誤信息字符串的緩沖區(qū)
該函數(shù)返回一個 pcap_t 類型的 handle。
3.2.3 pcap_loop
API 函數(shù) pcap_loop 和 pcap_dispatch 都用來在打開的適配器中捕獲數(shù)據(jù)包;但是前者會已知捕獲直到捕獲到的數(shù)據(jù)包數(shù)量達到要求數(shù)量,而后者在到達了前面 API 設(shè)定的超時時間之后就會返回(盡管這得不到保證);前者會在一小段時間內(nèi)阻塞網(wǎng)絡(luò)的應(yīng)用,故一般項目都會使用后者作為讀取數(shù)據(jù)包的函數(shù);雖然在本次實驗中,使用前者就夠了。
這兩個函數(shù)都有一個回調(diào)函數(shù);這個回調(diào)函數(shù)會在這兩個函數(shù)捕獲到數(shù)據(jù)包的時候被調(diào)用,用來處理捕獲到的數(shù)據(jù)包;這個回調(diào)函數(shù)需要遵頊特定的格式。但是需要注意的是我們無法發(fā)現(xiàn) CRC 冗余校驗碼——因為幀到達適配器之后,會經(jīng)過校驗確認的過程;這個過程成功,則適配器會刪除 CRC;否則,大多數(shù)適配器會刪除整個包,因此無法被 NpCap 確認到。
3.2.4 pcap_datalink
用于對 MAC 層進行了檢測,以確保在處理一個以太網(wǎng)絡(luò),確保 MAC 首部是 14 位的。IP 數(shù)據(jù)包的首部就位于 MAC 首部的后面,將從 IP 數(shù)據(jù)包的首部解析到源 IP 地址和目的 IP 地址。
3.2.5 pcap_compile & pcap_setfilter
用來設(shè)置過濾器,以避免處理一些無用的包,提高包處理的效率。在本次實驗中我們需要將過濾器字符串設(shè)置成 ip and udp,使得我們傳入的回調(diào)只處理基于 IPv4 的 UDP 數(shù)據(jù)包;大大簡化了解析過程和回調(diào)函數(shù)的調(diào)用次數(shù)。
3.3 其他的補充
處理 UDP 數(shù)據(jù)包的首部時存在一些困難:因為 IP 數(shù)據(jù)包的首部的長度并不是固定的,但是可以通過 IP 數(shù)據(jù)包的 length 域來得到它的長度;一旦知道了 UDP 首部的位置,就能解析到源端口和目的端口。
四、實驗過程
從安裝 NpCap 到運行 NpCap 示例程序的全部過程;
4.1 安裝 NpCap
NpCap 是 WinPcap for Windows 10;它的官方下載頁面是 Npcap: Windows Packet Capture Library & Driver (nmap.org);在這里我們需要下載:
- NpCap 內(nèi)核驅(qū)動:Npcap 1.31 installer
- NpCap SDK 文件:Npcap SDK 1.07
安裝完成驅(qū)動后,再在 IDE 中為項目配置導入 NpCap SDK 文件。NpCap SDK 文件包中包括了使用 NpCap 實現(xiàn)的基本功能的 demo。
4.2 使用 NpCap 的功能
項目的文件結(jié)構(gòu)如下:
CMake target: if_list udp_dump basic_dump_ex (root) ├ module │ └ (NpCap Library files) NpCap SDK 庫文件 ├ src │ ├ basic_dump_ex.c 目標 basic_dump_ex 的源文件 │ ├ if_list.c 目標 if_list 的源文件 │ └ udp_dump.c 目標 udp_dump 的源文件 └ CMakeList.txt CMake 項目定義文件這些使用 NpCap 功能的 demo 的實現(xiàn)代碼都位于:https://github.com/ma-hunter/cn_exp
五、實驗結(jié)果
上述代碼包括的,使用 NpCap 實現(xiàn)的幾項基本功能的運行結(jié)果(非截圖)。
5.1 讀取網(wǎng)絡(luò)設(shè)備列表
使用 CMake,構(gòu)建并運行上述項目中的目標 if_list:
"D:\Program Files\JetBrains\Toolbox\apps\CLion\ch-0\211.6693.114\bin\cmake\win\bin\cmake.exe" --build D:\Workspaces\CLion\cn_exp\cmake-build-debug --target if_list -- -j 4 Scanning dependencies of target if_list [ 50%] Building C object CMakeFiles/if_list.dir/src/if_list.c.obj [100%] Linking C executable if_list.exe [100%] Built target if_list http://www.biyezuopin.vip 構(gòu)建已完成運行結(jié)果如下:
D:\Workspaces\CLion\cn_exp\cmake-build-debug\if_list.exe \Device\NPF_{5C8B26D4-9439-4304-B8FB-48A81CB33CF9}Description: WAN Miniport (Network Monitor)Loopback: no\Device\NPF_{C21F9683-BA8A-4AFE-827A-166030BB1466}Description: WAN Miniport (IPv6)Loopback: no\Device\NPF_{1C99E263-4855-4786-97ED-ECAC30A11761}Description: WAN Miniport (IP)Loopback: no\Device\NPF_{1A386F2B-3A3E-49A7-B899-2629C46C4FB3}Description: Hyper-V Virtual Ethernet Adapter #2Loopback: noAddress Family: #23Address Family Name: AF_INET6Address Family: #2Address Family Name: AF_INETAddress: 172.26.112.1Netmask: 0.240.255.255Broadcast Address: 255.31.112.1\Device\NPF_{A30B9DA2-E755-4DF6-8BD4-010B6590B072}Description: Hyper-V Virtual Ethernet AdapterLoopback: noAddress Family: #23Address Family Name: AF_INET6Address Family: #2Address Family Name: AF_INETAddress: 172.26.0.1Netmask: 0.240.255.255Broadcast Address: 255.31.0.1\Device\NPF_{21EAB23F-F3E5-48E0-B370-35B69F40B833}Description: Bluetooth Device (Personal Area Network) #3Loopback: noAddress Family: #23Address Family Name: AF_INET6Address Family: #2Address Family Name: AF_INETAddress: 169.254.62.143Netmask: 0.0.255.255Broadcast Address: 255.255.62.143\Device\NPF_{5CCBE082-6FB3-4754-B27A-3659F98979BE}Description: Realtek RTL8188EU Wireless LAN 802.11n USB 2.0 Network AdapterLoopback: noAddress Family: #23Address Family Name: AF_INET6Address Family: #2Address Family Name: AF_INETAddress: 169.254.125.212Netmask: 0.0.255.255Broadcast Address: 255.255.125.212\Device\NPF_{E919BE86-5601-4998-B187-2C629DE1F9B9}Description: Microsoft Wi-Fi Direct Virtual Adapter #2Loopback: noAddress Family: #23Address Family Name: AF_INET6Address Family: #2Address Family Name: AF_INETAddress: 169.254.194.126Netmask: 0.0.255.255Broadcast Address: 255.255.194.126\Device\NPF_{FF7337C5-5DA3-4AF4-8C55-5A066C578D65}Description: Microsoft Wi-Fi Direct Virtual AdapterLoopback: noAddress Family: #23Address Family Name: AF_INET6Address Family: #2Address Family Name: AF_INETAddress: 169.254.180.74Netmask: 0.0.255.255Broadcast Address: 255.255.180.74\Device\NPF_{43524049-AA60-4F6E-A89E-8AE5BA1EAA93}Description: Realtek PCIe GbE Family ControllerLoopback: noAddress Family: #23Address Family Name: AF_INET6Address Family: #2Address Family Name: AF_INETAddress: 192.168.3.2Netmask: 0.255.255.255Broadcast Address: 255.168.3.2\Device\NPF_LoopbackDescription: Adapter for loopback traffic captureLoopback: yes進程已結(jié)束,退出代碼為 0于此同時可以看到控制面板下的網(wǎng)絡(luò)適配器頁面;可以看到基本的適配器信息是一致的:
我們的 demo 輸出的更多是因為包含了一些被操作系統(tǒng)用戶級別隱藏的接口。
5.2 打開設(shè)別并抓包監(jiān)聽
使用 CMake,構(gòu)建并運行上述項目中的目標 basic_dump_ex:
"D:\Program Files\JetBrains\Toolbox\apps\CLion\ch-0\211.6693.114\bin\cmake\win\bin\cmake.exe" --build D:\Workspaces\CLion\cn_exp\cmake-build-debug --target basic_dump_ex -- -j 4 Scanning dependencies of target basic_dump_ex [ 50%] Building C object CMakeFiles/basic_dump_ex.dir/src/basic_dump_ex.c.obj [100%] Linking C executable basic_dump_ex.exe [100%] Built target basic_dump_ex構(gòu)建已完成運行結(jié)果如下:
D:\Workspaces\CLion\cn_exp\cmake-build-debug\basic_dump_ex.exe 1. \Device\NPF_{5C8B26D4-9439-4304-B8FB-48A81CB33CF9} (WAN Miniport (Network Monitor)) 2. \Device\NPF_{C21F9683-BA8A-4AFE-827A-166030BB1466} (WAN Miniport (IPv6)) 3. \Device\NPF_{1C99E263-4855-4786-97ED-ECAC30A11761} (WAN Miniport (IP)) 4. \Device\NPF_{1A386F2B-3A3E-49A7-B899-2629C46C4FB3} (Hyper-V Virtual Ethernet Adapter #2) 5. \Device\NPF_{A30B9DA2-E755-4DF6-8BD4-010B6590B072} (Hyper-V Virtual Ethernet Adapter) 6. \Device\NPF_{21EAB23F-F3E5-48E0-B370-35B69F40B833} (Bluetooth Device (Personal Area Network) #3) 7. \Device\NPF_{5CCBE082-6FB3-4754-B27A-3659F98979BE} (Realtek RTL8188EU Wireless LAN 802.11n USB 2.0 Network Adapter) 8. \Device\NPF_{E919BE86-5601-4998-B187-2C629DE1F9B9} (Microsoft Wi-Fi Direct Virtual Adapter #2) 9. \Device\NPF_{FF7337C5-5DA3-4AF4-8C55-5A066C578D65} (Microsoft Wi-Fi Direct Virtual Adapter) 10. \Device\NPF_{43524049-AA60-4F6E-A89E-8AE5BA1EAA93} (Realtek PCIe GbE Family Controller) 11. \Device\NPF_Loopback (Adapter for loopback traffic capture) Enter the interface number (1-11):10listening on Realtek PCIe GbE Family Controller... 13:36:31,027242 len:208 13:36:31,068904 len:1071 13:36:31,122063 len:54 13:36:31,423026 len:60 13:36:31,423094 len:54 13:36:31,750427 len:336 13:36:31,750466 len:320 13:36:31,782177 len:66程序?qū)\行到被外部中斷阻止后才會停止運行。
5.3 捕獲 UDP 包并分析
使用 CMake,構(gòu)建并運行上述項目中的目標 basic_dump_ex:
"D:\Program Files\JetBrains\Toolbox\apps\CLion\ch-0\211.6693.114\bin\cmake\win\bin\cmake.exe" --build D:\Workspaces\CLion\cn_exp\cmake-build-debug --target udp_dump -- -j 4 [100%] Built target udp_dump構(gòu)建已完成運行結(jié)果如下:
D:\Workspaces\CLion\cn_exp\cmake-build-debug\udp_dump.exe 1. \Device\NPF_{5C8B26D4-9439-4304-B8FB-48A81CB33CF9} (WAN Miniport (Network Monitor)) 2. \Device\NPF_{C21F9683-BA8A-4AFE-827A-166030BB1466} (WAN Miniport (IPv6)) 3. \Device\NPF_{1C99E263-4855-4786-97ED-ECAC30A11761} (WAN Miniport (IP)) 4. \Device\NPF_{1A386F2B-3A3E-49A7-B899-2629C46C4FB3} (Hyper-V Virtual Ethernet Adapter #2) 5. \Device\NPF_{A30B9DA2-E755-4DF6-8BD4-010B6590B072} (Hyper-V Virtual Ethernet Adapter) 6. \Device\NPF_{21EAB23F-F3E5-48E0-B370-35B69F40B833} (Bluetooth Device (Personal Area Network) #3) 7. \Device\NPF_{5CCBE082-6FB3-4754-B27A-3659F98979BE} (Realtek RTL8188EU Wireless LAN 802.11n USB 2.0 Network Adapter) 8. \Device\NPF_{E919BE86-5601-4998-B187-2C629DE1F9B9} (Microsoft Wi-Fi Direct Virtual Adapter #2) 9. \Device\NPF_{FF7337C5-5DA3-4AF4-8C55-5A066C578D65} (Microsoft Wi-Fi Direct Virtual Adapter) 10. \Device\NPF_{43524049-AA60-4F6E-A89E-8AE5BA1EAA93} (Realtek PCIe GbE Family Controller) 11. \Device\NPF_Loopback (Adapter for loopback traffic capture) Enter the interface number (1-11):10listening on Realtek PCIe GbE Family Controller... 13:38:26.314222 len:181 192.168.3.2.7726 -> 180.97.33.12.8829 13:38:26.339699 len:163 180.97.33.12.8829 -> 192.168.3.2.7726 13:38:28.517235 len:361 223.166.151.86.8000 -> 192.168.3.2.4017 13:38:28.517526 len:97 192.168.3.2.4017 -> 223.166.151.86.8000 13:38:29.100916 len:82 192.168.3.2.60173 -> 192.168.3.1.53 13:38:29.151404 len:149 192.168.3.1.53 -> 192.168.3.2.60173 13:38:30.577642 len:129 223.166.151.86.8000 -> 192.168.3.2.4017程序?qū)\行到被外部中斷阻止后才會停止運行。
六、思考題
WINPCAP 是否能實現(xiàn)服務(wù)質(zhì)量的控制?
不能。WinPcap 可以獨立地通過主機協(xié)議發(fā)送和接受數(shù)據(jù),如同 TCP/IP;這就意味著 WinPcap 不能阻止、過濾或操縱同一機器上的其他應(yīng)用程序的通訊:它僅僅能簡單地“監(jiān)視”在網(wǎng)絡(luò)上傳輸?shù)臄?shù)據(jù)包。所以,它不能提供類似網(wǎng)絡(luò)流量控制、服務(wù)質(zhì)量調(diào)度和個人防火墻之類的支持,因而不能實現(xiàn)服務(wù)質(zhì)量的控制。
實驗三:協(xié)議分析&流量統(tǒng)計程序的編寫
| Windows 10 Pro 21H1 | CLion 2021.1; CMake 3.19; tdm-gcc 9.3; NpCap SDK 1.07 |
一、實驗?zāi)康?/h3>
- 理解協(xié)議在通信中的作用,掌握常見 IP 協(xié)議;
- 掌握基于 NpCap 的抓包軟件的開發(fā);
- 掌握協(xié)議解析和流量統(tǒng)計的編程方法;
二、實驗內(nèi)容
利用 NpCap 編寫協(xié)議分析工具;輸出抓取的包和協(xié)議分析結(jié)構(gòu),并統(tǒng)計 IP 的流量(即包的數(shù)量)。
功能要求:
運行程序后將捕獲的信息輸出到標準輸出流中。
三、實驗原理
實驗的設(shè)計依據(jù)的原理,包括協(xié)議的概念和 NpCap 的接口使用邏輯。
3.1 協(xié)議說明
下面的內(nèi)容包含了本次實驗所涉及到的協(xié)議類型的說明。
3.1.1 協(xié)議棧分析
因為 TCP/IP 協(xié)議采用分層的結(jié)構(gòu),所以網(wǎng)絡(luò)通信時,要傳輸?shù)臄?shù)據(jù)在發(fā)送端是一個逐層封裝的過程;而相應(yīng)地在接收端則是一個逐層分解的過程;如下圖所示:
在接收端的逐層分解,就是上述封裝的逆過程;
3.1.2 以太網(wǎng)協(xié)議
以太網(wǎng) II 格式時一種幀格式,應(yīng)用最為廣泛,幾乎成為了當前以太網(wǎng)的現(xiàn)行標準;它由 RFC894 定義,如下圖所示:
3.1.3 IP 協(xié)議
IP 協(xié)議是 Internet 的核心協(xié)議,它工作在網(wǎng)絡(luò)層,提供了不可靠無連接的數(shù)據(jù)傳送服務(wù);協(xié)議格式如圖所示:
3.1.4 ICMP 協(xié)議
ICMP 的全稱是 Internet 控制信息協(xié)議 (Internet Control Message Protocol)。它提供了很多 Internet 的信息描述服務(wù):例如能夠檢測網(wǎng)絡(luò)的運行狀況,通知協(xié)議有用的網(wǎng)絡(luò)狀態(tài)信息;ICMP 是基于 IP 協(xié)議的,ICMP 協(xié)議格式如圖所示:
3.1.5 TCP 協(xié)議
TCP 協(xié)議是基于連接的可靠的協(xié)議:它負責發(fā)收端的協(xié)定,然后保持正確可靠的數(shù)據(jù)傳輸服務(wù);它在 IP 協(xié)議上運行,而 IP 無連接的協(xié)議,所以 TCP 豐富了 IP 協(xié)議的功能,使它具有可靠的傳輸服務(wù);TCP 協(xié)議格式如圖所示:
可以看到 TCP 報文段結(jié)構(gòu)由以下的部分組成:
- 源端口:指定了發(fā)送端的端口
- 目的端口:指定了接受端的端口號
- 序號:指明了段在即將傳輸?shù)亩涡蛄兄械奈恢?/li>
- 確認號:規(guī)定成功收到段的序列號,確認序號包含發(fā)送確認的一端所期望收到的下一個序號
- TCP 偏移量:指定了段頭的長度。段頭的長度取決與段頭選項字段中設(shè)置的選項
- 保留:指定了一個保留字段,以備將來使用
- 標志:SYN、ACK、PSH、RST、URG、FIN
- SYN: 表示同步
- ACK: 表示確認
- PSH: 表示盡快的將數(shù)據(jù)送往接收進程
- RST: 表示復位連接
- URG: 表示緊急指針
- FIN: 表示發(fā)送方完成數(shù)據(jù)發(fā)送
- 窗口:指定關(guān)于發(fā)送端能傳輸?shù)南乱欢蔚拇笮〉闹噶?/li>
- 校驗和:校驗和包含 TCP 段頭和數(shù)據(jù)部分,用來校驗段頭和數(shù)據(jù)部分的可靠性
- 緊急指針:指明段中包含緊急信息,只有當 U R G 標志置 1 時緊急指針才有效
- 選項:指定了公認的段大小,時間戳,選項字段的末端,以及指定了選項字段的邊界選項
TCP 連接的建立和釋放采用了三步握手法,如下圖所示:
其過程可以描述如下步驟:
至此,整個連接建立過程正常結(jié)束,數(shù)據(jù)傳輸已經(jīng)正式開始。
3.1.6 UDP 協(xié)議
用戶數(shù)據(jù)報協(xié)議 UDP 是在 IP 協(xié)議上的傳輸層協(xié)議,它提供了無連接的協(xié)議服務(wù);它在 IP 協(xié)議基礎(chǔ)上提供了端口的功能,因此既可讓應(yīng)用程序之間進行通信了。UDP 協(xié)議格式如圖 3.7 所示:
3.2 協(xié)議處理
NpCap 按照一定的規(guī)則提供了 API,和本次實驗相關(guān)的邏輯如下:
3.2.1 NpCap 處理流程
NpCap 的工作周期可以被描述為如下序列:
- pcap_findalldevs & pcap_findalldevs_ex:獲得網(wǎng)絡(luò)接口設(shè)備的列表
- pcap_open & pcap_dump_open & pcap_open_live:打開設(shè)備/打開設(shè)備數(shù)據(jù)包
- pcap_freealldevs:釋放獲得的設(shè)備列表結(jié)構(gòu)所占用的內(nèi)存
- pcap_compile & pcap_setfilter:編譯并設(shè)置過濾器
- pcap_loop:根據(jù)設(shè)定的數(shù)量來循環(huán)捕獲數(shù)據(jù)包,并調(diào)用指定的回調(diào)處理數(shù)據(jù)包
- packet_handler:傳入 loop 的回調(diào)函數(shù),用來處理被捕獲的數(shù)據(jù)包
- pcap_close:關(guān)閉 NpCap 句柄(即打開的網(wǎng)絡(luò)設(shè)備)
簡單地說,使用 NpCap 獲得網(wǎng)絡(luò)接口列表后,我們打開一個設(shè)備,并設(shè)定循環(huán)次數(shù),傳入指定類型的回調(diào)函數(shù)來處理被捕獲的數(shù)據(jù)包,并在程序退出之前關(guān)閉設(shè)備。
3.2.2 回調(diào)函數(shù)設(shè)計
因為上述協(xié)議棧分析中提到了,接收端分析包的內(nèi)容就是一個逆封裝的過程,所以我們可以采用逐層遞歸的方法來設(shè)計我們的回調(diào)函數(shù);基本設(shè)計如下:
- (pkt):用來傳入 NpCap 循環(huán)的,幀處理函數(shù)
- (ethernet):用來處理以太網(wǎng)協(xié)議的部分
- (ipv4) & (ipv6) & (arp):處理 IPv4、IPv6、ARP 協(xié)議的報頭
- (icmp) & (tcp) & (udp):處理 ICMP、TCP、UDP 的報文
根據(jù)設(shè)計需求,在判斷上一層的協(xié)議類型后,將待處理的報文遞歸給下一層的處理函數(shù)即可。
四、實驗設(shè)計
關(guān)于代碼實現(xiàn)方面的設(shè)計:
4.1 項目組成
項目可以分為 handlers、helpers 和 utils 三個部分組成;
- utils 包含了可復用的無后效邏輯的實現(xiàn),盡量避免重復代碼片段
- handlers 包含了傳給 NpCap 的回調(diào)函數(shù)以及遞歸下降法實現(xiàn)的逆封裝函數(shù)
- helpers 包含了要實現(xiàn)的額外功能,比如本次實驗中的流量統(tǒng)計
這三個部分分別使用獨立的頭文件和源文件組成,被 main 模塊引用。
4.2 預定義
項目所需要的類型定義都包含在 definitions.h 中;包含了根據(jù)協(xié)議的組成而設(shè)計的報文和報頭的類型定義;因為最后捕獲的數(shù)據(jù)包是指向一片連續(xù)內(nèi)存塊的指針,這里的定義必須保證指定的內(nèi)存塊可以完全轉(zhuǎn)化為對應(yīng)的包類型才行;因此,需要保證順序和使用的基本數(shù)據(jù)類型完全和定義符合。
4.3 項目結(jié)構(gòu)
最后,整個項目的文件結(jié)構(gòu)如下:
CMake target: cn_exp (root) ├ module │ └ (NpCap Library files) NpCap SDK 庫文件 ├ include │ ├ definitions.h 預定義的類型聲明 │ ├ handlers.h 遞歸下降法的包處理回調(diào)函數(shù)的聲明 │ ├ helpers.h 流量統(tǒng)計相關(guān)方法的聲明 │ └ utils.h 可復用模塊的函數(shù)聲明 ├ src │ ├ utils.cpp 可復用模塊的函數(shù)實現(xiàn) │ ├ helpers.cpp 流量統(tǒng)計相關(guān)方法的實現(xiàn) │ └ handlers.cpp 遞歸下降法的包處理回調(diào)函數(shù)的實現(xiàn) ├ CMakeList.txt CMake 項目定義文件 └ main.cpp 主進程文件使用 CMake 加載項目,并構(gòu)建運行 cn_exp 即可生成目標。
五、實現(xiàn)代碼
GitHub 鏈接:https://github.com/ma-hunter/cn_exp
六、實驗結(jié)果
完成實現(xiàn)上文所述的程序后,運行程序,可以得到下面的結(jié)果:
6.1 運行結(jié)果
因為上傳截圖非常的麻煩,這里僅粘貼標準輸出的文本。
6.1.1 選擇網(wǎng)絡(luò)設(shè)備
Hello, World! Hello NpCap! 1.\Device\NPF_{5C8B26D4-9439-4304-B8FB-48A81CB33CF9}WAN Miniport (Network Monitor) 2.\Device\NPF_{C21F9683-BA8A-4AFE-827A-166030BB1466}WAN Miniport (IPv6) 3.\Device\NPF_{1C99E263-4855-4786-97ED-ECAC30A11761}WAN Miniport (IP) 4.\Device\NPF_{1A386F2B-3A3E-49A7-B899-2629C46C4FB3}Hyper-V Virtual Ethernet Adapter #2 5.\Device\NPF_{A30B9DA2-E755-4DF6-8BD4-010B6590B072}Hyper-V Virtual Ethernet Adapter 6.\Device\NPF_{21EAB23F-F3E5-48E0-B370-35B69F40B833}Bluetooth Device (Personal Area Network) #3 7.\Device\NPF_{5CCBE082-6FB3-4754-B27A-3659F98979BE}Realtek RTL8188EU Wireless LAN 802.11n USB 2.0 Network Adapter 8.\Device\NPF_{E919BE86-5601-4998-B187-2C629DE1F9B9}Microsoft Wi-Fi Direct Virtual Adapter #2 9.\Device\NPF_{FF7337C5-5DA3-4AF4-8C55-5A066C578D65}Microsoft Wi-Fi Direct Virtual Adapter 10.\Device\NPF_{43524049-AA60-4F6E-A89E-8AE5BA1EAA93}Realtek PCIe GbE Family Controller 11.\Device\NPF_LoopbackAdapter for loopback traffic capture Enter the interface number (1-11):6.1.2 設(shè)置監(jiān)聽循環(huán)的次數(shù)
Enter the interface number (1-11):10listening on Realtek PCIe GbE Family Controller.... Please input the num of packets you want to catch(0 for keeping catching):6.1.3 TCP 協(xié)議解析示例
Time: 12:54:00, 129446 Length: 60 Type: 0x800 (IPv4) Destination address: c:c:b:6:c:e Source address: 8:a:0:c:6:c Version: 5 Header length: 5 (20B) Type of service: 96 Total length: 40 Identification: 22603 Flags: 0 Fragment offset: 64 (512 B) Protocol: TCP Checksum: 32469 Source IP address: 39.96.132.69 Destination IP address: 192.168.3.2 Source port: 443 Destination port: 55308 Sequence: 744910189 Acknowledgement: 846425137 Data offset: 0 (0 B) Flags: ACK Window: 28927 Checksum: 54318 Urgent pointer: 06.1.4 UDP 協(xié)議解析示例
Time: 12:54:00, 148551 Length: 106 Type: 0x800 (IPv4) Destination address: 8:a:0:c:6:c Source address: c:c:b:6:c:e Version: 5 Header length: 5 (20B) Type of service: 0 Total length: 92 Identification: 21792 Flags: 0 Fragment offset: 0 (0 B) Protocol: UDP Checksum: 0 Source IP address: 192.168.3.2 Destination IP address: 112.32.50.208 Source port: 7726 Destination port: 28078 Length: 72 Checksum: 263566.1.5 流量統(tǒng)計示例
Flow counts: IP Flow 111.206.210.75 3 112.32.50.208 2 13.107.136.9 53 192.168.3.2 34 39.96.132.69 86.2 構(gòu)建記錄
"D:\Program Files\JetBrains\Toolbox\apps\CLion\ch-0\211.6693.114\bin\cmake\win\bin\cmake.exe" -DCMAKE_BUILD_TYPE=Debug -G "CodeBlocks - MinGW Makefiles" D:\Workspaces\CLion\cn_exp -- Configuring done -- Generating done -- Build files have been written to: D:/Workspaces/CLion/cn_exp/cmake-build-debug"D:\Program Files\JetBrains\Toolbox\apps\CLion\ch-0\211.6693.114\bin\cmake\win\bin\cmake.exe" --build D:\Workspaces\CLion\cn_exp\cmake-build-debug --target cn_exp -- -j 4 Scanning dependencies of target cn_exp [ 20%] Building CXX object CMakeFiles/cn_exp.dir/src/handlers.cpp.obj [ 40%] Linking CXX executable cn_exp.exe [100%] Built target cn_exp構(gòu)建已完成七、思考題
應(yīng)用 WINPCAP 能實現(xiàn)哪些網(wǎng)絡(luò)應(yīng)用?
- 捕獲原始數(shù)據(jù)包。不管這個包是發(fā)往本地機,還是其他機器之間的交換包
- 在數(shù)據(jù)包被發(fā)送到應(yīng)用程序之前,通過用戶定義的規(guī)則過濾
- 向網(wǎng)絡(luò)發(fā)送原始數(shù)據(jù)包
- 對網(wǎng)絡(luò)通信量做出統(tǒng)計
總結(jié)
以上是生活随笔為你收集整理的计算机网络实验(Wireshark 抓包工具使用、WinPcap 编程、协议分析流量统计程序的编写)的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 推荐!机器学习、深度学习绘图模板.ppt
- 下一篇: 我的贝尔宾团队角色。