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