ICode9

精准搜索请尝试: 精确搜索
首页 > 其他分享> 文章详细

SDN纳新题

2020-11-04 16:01:22  阅读:300  来源: 互联网

标签:文件 int16 int32 数据 纳新 报头 SDN pcap


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

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文件结构,导致时间不够,总之,学而不进则退,何况大学的知识又不简单,这次纳新题的解析过程给我带来了很大的帮助,让我知道以后学习该往何处去努力,让我明白了学东西该有的态度。

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

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

标签:文件,int16,int32,数据,纳新,报头,SDN,pcap
来源: https://www.cnblogs.com/Emuaer/p/EmuauerS.html

本站声明: 1. iCode9 技术分享网(下文简称本站)提供的所有内容,仅供技术学习、探讨和分享;
2. 关于本站的所有留言、评论、转载及引用,纯属内容发起人的个人观点,与本站观点和立场无关;
3. 关于本站的所有言论和文字,纯属内容发起人的个人观点,与本站观点和立场无关;
4. 本站文章均是网友提供,不完全保证技术分享内容的完整性、准确性、时效性、风险性和版权归属;如您发现该文章侵犯了您的权益,可联系我们第一时间进行删除;
5. 本站为非盈利性的个人网站,所有内容不会用来进行牟利,也不会利用任何形式的广告来间接获益,纯粹是为了广大技术爱好者提供技术内容和技术思想的分享性交流网站。

专注分享技术,共同学习,共同进步。侵权联系[81616952@qq.com]

Copyright (C)ICode9.com, All Rights Reserved.

ICode9版权所有