当前位置:文档之家› 编程实现简单的TCP协议分析器

编程实现简单的TCP协议分析器

《网络系统》课程设计报告

学院专业

班级学号

学生姓名指导教师

课程成绩完成日期2013年6月28日

课程设计成绩评定

学院专业

班级学号

学生姓名指导教师

完成日期2013年6月28日

指导教师对学生在课程设计中的评价

指导教师对课程设计的评定意见

课程设计任务书

学院专业

编程实现简单的TCP协议分析器

学生姓名:指导老师:

摘要编程实现简单的TCP协议分析器。TCP协议分析器是一种用于监督和跟踪网络活动的诊断工具。它从局域网中抓取IP数据包,并对它进行分析得到相对应的头部信息,过滤TCP包进行分析,得到TCP包的相应信息。运行程序平台为windows7/XP,程序通过调试运行,初步实现了设计目标,并且再经过适当完善后,将可以应用在商业中解决实际问题。TCP协议的数据传送程序是由二个子程序组成的。也可以看成是服务器端程序和客户端程序,其中:服务器端程序的功能是侦听端口号,接收远程主要的TCP连接申请,并接收远程主机传送来的文字数据。

关键词程序设计;TCP;局域网;指令;服务器

目录

1 引言.......................................................................................... 错误!未定义书签。

1.1问题描述........................................................................... 错误!未定义书签。

1.2基本要求........................................................................... 错误!未定义书签。2系统设计 (1)

2.1 设计思想 (1)

2.2系统结构 (2)

3程序流程 (2)

3.1 程序流程图 (2)

4 模块设计介绍 (4)

4.1 主模块 (4)

5 判断 (5)

5.1判断IP协议类型字段 (5)

5.2判断以太网字协议段类型 (12)

6 系统调试 (13)

6.1测试情况 (13)

7 结束语........................................................................................ 错误!未定义书签。附录:源程序代码 (16)

1 引言

TCP协议的数据传送程序是由二个子程序组成的。也可以看成是服务器端程序和客户端程序,其中:服务器端程序的功能是侦听端口号,接收远程主要的TCP连接申请,并接收远程主机传送来的文字数据。另外一个子程序,也就是所谓的客户端程序,主要实现向网络的远程主机提出TCP连接申请。

1.1问题描述

编程实现简单的TCP协议分析器,TCP协议分析器是一种用于监督和跟踪网络活动的诊断工具,它从局域网中抓取IP数据包,并对它进行分析得到相应的头部信息,过滤TCP包进行分析,得到TCP包的相应信息。

1.2基本要求

1.利用原始套接字实现简单的TCP协议分析器。

2.系统功能包括:

2.1 原始套接字与网卡绑定,并接收流经网卡的所有数据包;

2.2 对数据包进行分析以获得源IP地址和目的IP地址;

2.3 对TCP Segment进行分析以获得其首部详细信息;

2.4 显示分析结果。

3 使用VC++。

2 系统设计

2.1设计思想

TCP协议的数据传送程序是由二个子程序组成的,也可以看成是服务器端程序和客户端程序。其中,服务器端程序的功能是侦听端口号,接收远程主要的TCP连接申请,并接收远程主机传送来的文字数据。另外一个子程序,也就是所谓的客户端程序,主要实现向网络的远程主机提出TCP连接申请。

程序利用原始套接字抓取局域网中的IP包。Raw Socket: 原始套接字可以用它来发送和接收IP 层以上的原始数据包, 如ICMP,TCP, UDP等。

TCP协议分析器实现了sniffer的一部分功能。而sniffer的工作原理是:1. 把网卡置于混杂模式;2. 捕获数据包;3. 分析数据包。

2.2系统结构

(1)Pcap_addr描述网络接口地址;

(2)pcap_pkthdr用来描述每个捕获到的数据包的基本信息;

(3)int_pcaplookupnet获取网络地址和网络掩码;

(4)int_pcaploop循环捕获网络数据包,直到遇到错误或满足退出条件;

(5)pcap_t* pcap_open_dead构造一个libpcap句柄。

3程序流程

3.1程序流程如图1

图1数据包的分析流程

4 模块设计介绍

4.1主模块

void main()

{

pcap_t *pcap_handle;

/* Winpcap句柄*/

char error_content[PCAP_ERRBUF_SIZE];

/* 存储错误信息*/

char *net_interface;

/* 网络接口*/

struct bpf_program bpf_filter;

/* BPF过滤规则*/

char bpf_filter_string[] = "";

/* 过滤规则字符串*/

bpf_u_int32 net_mask;

/* 掩码*/

bpf_u_int32 net_ip;

/* 网路地址*/

net_interface = pcap_lookupdev(error_content);

/* 获得可用的网络接口*/

pcap_lookupnet(net_interface, &net_ip, &net_mask, error_content);

/* 获得网络地址和掩码地址*/

pcap_handle = pcap_open_live(net_interface, BUFSIZ, 1, 1, error_content);

/* 打开网路接口*/

pcap_compile(pcap_handle, &bpf_filter, bpf_filter_string, 0, net_ip);

/* 编译BPF过滤规则*/

pcap_setfilter(pcap_handle, &bpf_filter);

/* 设置过滤规则*/

if (pcap_datalink(pcap_handle) != DLT_EN10MB)

return ;

pcap_loop(pcap_handle, - 1, ethernet_protocol_packet_callback, NULL);

/* 注册回调函数,循环捕获网络数据包,利用回调函数来处理每个数据包*/

pcap_close(pcap_handle);

/* 关闭Winpcap操作*/

}

相关主题