js陣列reduce解析及使用示例
------------恢復內容開始------------
------------恢復內容開始------------
SDN納新題分析及前期準備
自我介紹
我是來自福大至誠軟工二班的吳燦輝,學號為211906411。
我是一個性格隨和的人。我的大一十分的迷茫,我在B站、CSDN等網站和課堂中學習了C語言,python,java,為了確認自己以後的方向,我目前還在學習web。也正是通過一年的摸索,我確認了以全棧或者網路作為自己的研究方向。
作業連結以及Github連結
作業連結:https://www.cnblogs.com/Emuaer/p/Emuauer.html
Github連結:https://github.com/Emuaer/SDN
虛擬機器和Ubuntu安裝過程
1.首先我們下載VM(此處以VMware Workstation Pro為例)
2.點選建立虛擬機器
3.選擇典型,選擇已經下載好的iso字尾檔案
4.填寫使用者資訊後,選擇拆分磁碟空間
5.下一步可以自定義分配的記憶體,配置
6.開啟虛擬機器,安裝完成
tcpdump過程和資料清洗過程解析
首先我們需要安裝Tcpdump
在Ubuntu的環境下要注意使用sudo許可權不然非常容易失敗
抓包過程
-
進入root使用者模式
輸入sudo su 後輸入密碼進入
-
檢視網路介面卡介面
tcpdump -D//檢視網路介面
-
-
開始對介面一抓包
tcpdump -i 1 -w result2.cap//保存於result2.cap中
抓好的檔案
- 因為電腦的VMtools不知道為什麼出問題了我們這裡選擇用QQ郵箱將抓好的包發到window系統中用wireshark網路分析器進行分析
其中**Frame 1: 132 bytes on wire (1056 bits), 132 bytes captured (1056 bits) **代表物理層的資料幀概況;
Ethernet II, Src: VMware_38:2a:47 (00:0c:29:38:2a:47), Dst: VMware_e6:2f:5f (00:50:56:e6:2f:5f)
Internet Protocol Version 4, Src: 192.168.176.128, Dst: 192.168.176.2為網際網路層IP包頭部資訊;
User Datagram Protocol, Src Port: 40826, Dst Port: 53傳輸層的頭部資訊;
Domain Name System (query)為應用層的資訊;
解析pcap檔案並提取五元組
首先需要知道什麼是pcap檔案
簡單來說就是檔案頭1+資料包頭1+資料1+檔案頭2+資料包頭2+資料2等,
- 檔案頭中包含有標誌檔案開始欄位 Magic(4B),主次版本號 Major(2B),Minor(2B),當地標準事件ThisZone(4B),時間戳精度 SigFigs(4B),最大儲存長度SnapLen(4B),鏈路型別LinkType(4B)。
- 資料包頭中包括時間戳高位Timestamp(4B),時間戳低位Timestamp(4B),當前資料區的長度Caplen(4B),離線資料長度Len(4B)。
- 資料部分包括16進位制的資料幀。
因為參考博文是用Linux系統的C語言寫的,所以要在Ubuntu上執行。
這裡我們用C語言進行解析,這裡需要用到庫檔案:
#include<netinet/in.h>//是供使用者層的庫
#include<stdio.h>
#include<string.h>
#include<stdlib.h>
#include<time.h>
主流抓包軟體支援的格式:
pcap檔案頭 + { 資料報文資訊 + 資料報文 }+
通過檢視pcap.h檔案,可以知道pcap檔案頭的具體格式(24位元組 ) :
struct pcap_file_header {
bpf_u_int32 magic;
u_short version_major;
u_short version_minor;
bpf_int32 thiszone; /* 本地矯正 */
bpf_u_int32 sigfigs; /* 時間戳矯正 */
bpf_u_int32 snaplen; /* pkt的最長部分*/
bpf_u_int32 linktype; /* 資料型別連線 (LINKTYPE_*) */
};
資料報文長度和報頭可用以下結構體:
struct timeval {
long tv_sec;
suseconds_t tv_usec;
};//時間戳結構體
struct pcap_pkthdr {
struct timeval ts;
bpf_u_int32 caplen;
bpf_u_int32 len;
};//資料包頭結構體
typedef struct FramHeader_t
{ //Pcap捕獲的資料幀頭
u_int8 DstMAC[6]; //目的MAC地址
u_int8 SrcMAC[6]; //源MAC地址
u_short FrameType; //幀型別
} FramHeader_t;//資料幀頭
typedef struct IPHeader_t
{ //IP資料報頭
u_int8 Ver_HLen; //版本+報頭長度
u_int8 TOS; //服務型別
u_int16 TotalLen; //總長度
u_int16 ID; //標識
u_int16 Flag_Segment; //標誌+片偏移
u_int8 TTL; //生存週期
u_int8 Protocol; //協議型別
u_int16 Checksum; //頭部校驗和
u_int32 SrcIP; //源IP地址
u_int32 DstIP; //目的IP地址
} IPHeader_t;//IP資料報頭
typedef struct TCPHeader_t
{ //TCP資料報頭
u_int16 SrcPort; //源埠
u_int16 DstPort; //目的埠
u_int32 SeqNO; //序號
u_int32 AckNO; //確認號
u_int8 HeaderLen; //資料報頭的長度(4 bit) + 保留(4 bit)
u_int8 Flags; //標識TCP不同的控制訊息
u_int16 Window; //視窗大小
u_int16 Checksum; //校驗和
u_int16 UrgentPointer; //緊急指標
}TCPHeader_t;//TCP資料報頭
定義資訊函式
void match_http(FILE *fp, char *head_str, char *tail_str, char *buf, int total_len); //查詢 http 資訊函式
int main()
{
struct pcap_file_header *file_header;//檔案指標
struct pcap_pkthdr *ptk_header;//資料報頭指標
FramHeader_t *mac_header;//MAC頭指標
IPHeader_t *ip_header;//IP頭指標
TCPHeader_t *tcp_header;//TCP頭指標
FILE *fp, *output;//檔案指標
int pkt_offset, i = 0;
int ip_len, http_len, ip_proto;
int src_port, dst_port, tcp_flags;//源埠,目的埠,tcp標誌
char buf[BUFSIZE], my_time[STRSIZE];//緩衝區大小,
char src_ip[STRSIZE], dst_ip[STRSIZE];
char host[STRSIZE], uri[BUFSIZE];
}
思路
通過分析作者的程式碼,我瞭解了對pacp檔案解析,無非就是先要了解報文的構造。瞭解各個報文的之間的聯絡與差別,頭報文的開始標識,所佔位元組。
通過讀入pacp檔案定義檔案指標,協議指標,資料幀,對pacp檔案的資料解析利用time.h中的memset函式可以定位資料幀下一個的位置。fseek同樣可以確認。
我學習的新知識
在這段時間裡我學習了不少東西,從一開始的Git,再到後來的Github,再從B站學習Ubuntu系統的用法,命令臺介面的使用,各種命令的實現,以此安裝Tcpdump。
在終於讀取新建起cap檔案時,我久違的感到了自己努力得到回報的快感,而資料的清洗遠遠沒我想象的那麼簡單,許多網上的教程都需要不少的過度知識,所以我對大一下學期的計算機網路TCP協議部分,IP協議部分又進行了複習。之後就是Wireshark的使用,B站的視訊講得十分詳細,但是專業術語也很多,讓人看得十分吃力。
但是CSDN上的程式碼我並完全沒有看懂,有太多的知識需要學習,在時間限定內我並沒有把全部的疑惑解決。
這次學習讓我明白IT人的辛苦,什麼都要學習,但卻找不到適合自己階段的視訊自學。
參考文獻:
Ubuntu安裝 Tcpdump的安裝 Ubuntu常用的Linux命令 IP協議與程式碼的轉換
《Git學習指南》 《計算機網路》
實現效果
儘管我已經十分努力學習了有關知識,但由於生疏,有很多地方實在不能理解:
在linux系統中程式碼的編譯也是難事。
截至今日,我最終還是沒能實現這段程式碼,但我還有許多其他的學習任務,也只能止步於此了
我遇到的問題
-
太多了,首先各種命令,程式碼,函式的不熟悉先放著不說,我的VM虛擬機器的工具無法安裝,導致我許多檔案無法直接進行傳輸。
-
在進行Tcpdump的安裝過程中,有時需要高許可權命令時,需要輸入密碼,我之前一直不知道,卡了很久,而且系統並沒有提醒。通過百度解決。
-
使用wiresshark時,抓到的資料並不是本機TCP協議,而後我重新下載了其他版本,重新安裝後解決了這個問題。
-
編譯沒有通過的問題,我在資料夾下新建了程式碼所需要的檔案,但是還是沒有通過。
-
通過學習我只能瞭解前面部分,主函式還沒全部瞭解
總結
學習是個艱苦的過程,這次SDN的納新題讓我明白了許多。
大學學的東西只是鳳毛麟角,真正的技術還是要靠自己自學,實踐得來,只靠課堂的那些知識是完全不夠的。不管學什麼方向都一樣,自學和實踐時非常重要的。同時選對正確的方向也是非常重要的,我在剛開始時就選錯了方向,一個勁的在研究pcap檔案結構,導致時間不夠,總之,學而不進則退,何況大學的知識又不簡單,這次納新題的解析過程給我帶來了很大的幫助,讓我知道以後學習該往何處去努力,讓我明白了學東西該有的態度。
------------恢復內容結束------------
------------恢復內容結束------------