编程实现简单的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,
/* 偏移*/