SDN纳新题

------------恢复内容开始------------
------------恢复内容开始------------

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.点击创建虚拟机

SDN纳新题

3.选择典型,选择已经下载好的iso后缀文件
SDN纳新题

SDN纳新题

4.填写用户信息后,选择拆分磁盘空间

SDN纳新题

5.下一步可以自定义分配的内存,配置
SDN纳新题

6.开启虚拟机,安装完成

tcpdump过程和数据清洗过程解析

首先我们需要安装Tcpdump

在Ubuntu的环境下要注意使用sudo权限不然非常容易失败

抓包过程

  • 进入root用户模式

    ​ 输入sudo su 后输入密码进入

    • 查看网络适配器接口

      tcpdump -D//查看网络接口
      
  • 开始对接口一抓包

    tcpdump -i 1 -w result2.cap//保存于result2.cap中
    

SDN纳新题

​ 抓好的文件

  • 因为电脑的VMtools不知道为什么出问题了我们这里选择用QQ邮箱将抓好的包发到window系统中用wireshark网络分析器进行分析

SDN纳新题

其中**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文件
SDN纳新题

简单来说就是文件头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学习指南》 《计算机网络》

实现效果

尽管我已经十分努力学习了有关知识,但由于生疏,有很多地方实在不能理解:
SDN纳新题

在linux系统中代码的编译也是难事。

截至今日,我最终还是没能实现这段代码,但我还有许多其他的学习任务,也只能止步于此了

我遇到的问题

  • 太多了,首先各种命令,代码,函数的不熟悉先放着不说,我的VM虚拟机的工具无法安装,导致我许多文件无法直接进行传输。

  • 在进行Tcpdump的安装过程中,有时需要高权限命令时,需要输入密码,我之前一直不知道,卡了很久,而且系统并没有提醒。通过百度解决。

  • 使用wiresshark时,抓到的数据并不是本机TCP协议,而后我重新下载了其他版本,重新安装后解决了这个问题。

  • 编译没有通过的问题,我在文件夹下新建了代码所需要的文件,但是还是没有通过。

  • 通过学习我只能了解前面部分,主函数还没全部了解

总结

学习是个艰苦的过程,这次SDN的纳新题让我明白了许多。

大学学的东西只是凤毛麟角,真正的技术还是要靠自己自学,实践得来,只靠课堂的那些知识是完全不够的。不管学什么方向都一样,自学和实践时非常重要的。同时选对正确的方向也是非常重要的,我在刚开始时就选错了方向,一个劲的在研究pcap文件结构,导致时间不够,总之,学而不进则退,何况大学的知识又不简单,这次纳新题的解析过程给我带来了很大的帮助,让我知道以后学习该往何处去努力,让我明白了学东西该有的态度。

------------恢复内容结束------------

------------恢复内容结束------------

上一篇:ros中开发rnnoise语音增强算法的开发示例


下一篇:Jmeter如何把响应数据的结果,保存到本地文件