计算机网络课程设计_报告-(23795)
- 格式:doc
- 大小:531.22 KB
- 文档页数:37
实验报告
实验名称:计算机网络课程设计
学生姓名: xxxxxxxxxxxxxxx
专业: xxxxxxxxxxxxxxx
班级: xxxxxxxxxxxxxxx
学号: xxxxxxxxxxxxxxx
指导教师:xxxxxxxxxxxxxxx
实验成绩:
实验地点:
实验时间:2016 年 5月 6 日
一、实验目的与实验要求
1、实验目的
将书本上抽象的概念与具体实现技术结合,通过网络软件编程的实践,深入
理解理论课上学习到的ARP、IP、TCP 等重要网络协议的原理,通过自己动手
编程封装与发送这些数据包,加深对网络协议的理解,掌握协议帧的结构和工作原理及其对协议栈的贡献。
2、实验要求
网络课程设计包含两个部分的内容:
题目一是数据包的封装发送和解析(ARP/IP/TCP),要求使用 Winpcap 技术和Socket 技术,根据 ARP/IP/TCP 帧的结构,封装数据包发送到局域网中。另外要捕获网络中的TCP/IP/ARP 数据包,解析数据包的内容,并将结果显示,并同时写入日志文件。
题目二是从可选题目中选择一个,可选题目均是网络应用小程序,要求小组
使用网络编程技术设计并实现一个网络应用程序,加深对网络协议协的理解,并锻炼网络编程能力。
二、实验设备(环境)及要求
1、实验硬件设备:
计算机型号:联想ThinkPad T430u
处理器型号: Intel i5 主频: 1.8Hz
网卡型号: (1)Realtek PCIe GBE (2)Broadcom 802.11n
2、实验软件要求:
操作系统: Windows10
应用软件: Visual Studio 2015 Pro
3、小组成员及分工:
三、实验内容与步骤
1、实验 1:数据包的封装发送和解析(ARP/IP/TCP)
(1)实验内容
1)程序目标:
根据 IP 帧的结构,封装 IP 数据包发送到局域网中。并捕获网络中的IP 数据包,解析数据包的内容,并将结果显示,并同时写入日志文件。
2)程序功能:以
命令行形式运行
在标准输出中显示捕获的 IP 报文的首部字段的内容。
使用 winpcap 访问网卡,手动封装
定义 IP 首部的数据结构
填充数据包,发送数据包,捕获数据包
使用 winpcap,捕获 IP 数据包
(2)主要步骤
1)总体设计:
a.获取设备列表并打印,打开所选择的适配器;
b.准备工作:定义 ip 相关的结构体、打开要存放结果的文件,设置过滤器,手写
ip 数据报(内容有无效的 MAC 源和目的地址,和均为本机地址的 ip 源地址和目的地址,即发给自己一个 ip 报文),设置抓到数据报的解析和输出到文件的操作函数(解析 ip 报,打印并写入文件:报文的版本、协议、源和目
的地址等)。
c.发包、抓包。
d.分析获取的数据。
获取设备列表
打开选择适配器
过滤数据包
解析数据包2)具体实现:
#define HAVE_REMOTE
#include "pcap.h"
#include "remote-ext.h"
#include "stdio.h"
#include "stdlib.h"
/*4 字节的 IP 地址 */
typedef struct ip_address{
u_char byte1;
u_char byte2;
u_char byte3;
u_char byte4;
}ip_address;
/*IPv4 首部 */
typedef struct ip_header{
u_char ver_ihl;//版本(4bits) +首部长度(4bits)
u_char tos;//服务类型
u_short tlen;// 总长类型
u_short identification;// 标识
u_short flags_fo;//标志位+段偏移量
u_char ttl;// 存活时间
u_char proto;//协议
u_short crc;//首部校验和
ip_address daddr;//目的地址
ip_address saddr;//源地址
u_int op_pad;// 选项与填充
}ip_header;
void packet_handler(u_char *param, const struct pcap_pkthdr *header, const u_char *pkt_data);
/* packet handler函数原型*/
void packet_handler(u_char *param, const struct pcap_pkthdr *header, const u_char *pkt_data);
int main()
{
pcap_if_t *alldevs;
pcap_if_t *d;
int inum;
int i=0;
pcap_t *adhandle;
char errbuf[PCAP_ERRBUF_SIZE];
u_int netmask;
char packet_filter[] = "ip";// 抓包类型