1. 程式人生 > 實用技巧 >js陣列reduce解析及使用示例

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解析 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協議與程式碼的轉換

Markdown基礎教程 Github的使用

《Git學習指南》 《計算機網路》

實現效果

儘管我已經十分努力學習了有關知識,但由於生疏,有很多地方實在不能理解:

在linux系統中程式碼的編譯也是難事。

截至今日,我最終還是沒能實現這段程式碼,但我還有許多其他的學習任務,也只能止步於此了

我遇到的問題

  • 太多了,首先各種命令,程式碼,函式的不熟悉先放著不說,我的VM虛擬機器的工具無法安裝,導致我許多檔案無法直接進行傳輸。

  • 在進行Tcpdump的安裝過程中,有時需要高許可權命令時,需要輸入密碼,我之前一直不知道,卡了很久,而且系統並沒有提醒。通過百度解決。

  • 使用wiresshark時,抓到的資料並不是本機TCP協議,而後我重新下載了其他版本,重新安裝後解決了這個問題。

  • 編譯沒有通過的問題,我在資料夾下新建了程式碼所需要的檔案,但是還是沒有通過。

  • 通過學習我只能瞭解前面部分,主函式還沒全部瞭解

總結

學習是個艱苦的過程,這次SDN的納新題讓我明白了許多。

大學學的東西只是鳳毛麟角,真正的技術還是要靠自己自學,實踐得來,只靠課堂的那些知識是完全不夠的。不管學什麼方向都一樣,自學和實踐時非常重要的。同時選對正確的方向也是非常重要的,我在剛開始時就選錯了方向,一個勁的在研究pcap檔案結構,導致時間不夠,總之,學而不進則退,何況大學的知識又不簡單,這次納新題的解析過程給我帶來了很大的幫助,讓我知道以後學習該往何處去努力,讓我明白了學東西該有的態度。

------------恢復內容結束------------

------------恢復內容結束------------