当前位置:文档之家› 计算机网络课程设计-编程实现简单的TCP协议分析器

计算机网络课程设计-编程实现简单的TCP协议分析器

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

一、问题描述

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

二、基本要求

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

2.系统功能包括:

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

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

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

2.4 显示分析结果。

3 建议使用VC++。

三、设计思想

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

程序利用原始套接字抓取局域网中的IP包。

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

Raw Socket: 原始套接字可以用它来发送和接收 IP 层以上的原始数据包, 如 ICMP, TCP, UDP等。

四、系统结构

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

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

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

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

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

五、程序流程(或模块划分)

六、源程序

#include "pcap.h"

struct ether_header

{

u_int8_t ether_dhost[6];

/* 目的以太网地址*/

u_int8_t ether_shost[6];

/* 源以太网地址*/

u_int16_t ether_type;

/* 以太网类型*/

};

struct arp_header

{

u_int16_t arp_hardware_type;

/* 硬件类型*/

u_int16_t arp_protocol_type;

/* 协议类型*/

u_int8_t arp_hardware_length;

/* 硬件地址长度*/

u_int8_t arp_protocol_length;

/* 协议地址长度*/

u_int16_t arp_operation_code;

/* 操作码*/

u_int8_t arp_source_ethernet_address[6];

/* 源以太网地址*/

u_int8_t arp_source_ip_address[4];

/* 源IP地址*/

u_int8_t arp_destination_ethernet_address[6];

/* 目的以太网地址*/

u_int8_t arp_destination_ip_address[4];

/* 目的IP地址*/

};

struct ip_header

{

#if defined(WORDS_BIGENDIAN)

u_int8_t ip_version: 4,

/* 版本*/

ip_header_length: 4;

/* 首部长度*/

#else

u_int8_t ip_header_length: 4, ip_version: 4;

#endif

u_int8_t ip_tos;

/* 服务质量*/

u_int16_t ip_length;

/* 长度*/

u_int16_t ip_id;

/* 标识*/

u_int16_t ip_off;

/* 偏移*/

u_int8_t ip_ttl;

/* 生存时间*/

u_int8_t ip_protocol;

/* 协议类型*/

u_int16_t ip_checksum;

/* 校验和*/

struct in_addr ip_souce_address;

/* 源IP地址*/

struct in_addr ip_destination_address;

/* 目的IP地址*/

};

struct udp_header

{

u_int16_t udp_source_port;

/* 源端口号*/

u_int16_t udp_destination_port;

/* 目的端口号*/

u_int16_t udp_length;

/* 长度*/

u_int16_t udp_checksum;

/* 校验和*/

};

struct tcp_header

{

u_int16_t tcp_source_port;

/* 源端口号*/

u_int16_t tcp_destination_port;

/* 目的端口号*/

u_int32_t tcp_sequence_liuzhen;

/* 序列号*/

u_int32_t tcp_acknowledgement;

/* 确认序列号*/

#ifdef WORDS_BIGENDIAN

u_int8_t tcp_offset: 4,

/* 偏移*/

相关主题