精品资料(2021-2022年收藏)计算机网络课程设计实验报告北京科技大学arp、ftp、ip包.docx
《精品资料(2021-2022年收藏)计算机网络课程设计实验报告北京科技大学arp、ftp、ip包.docx》由会员分享,可在线阅读,更多相关《精品资料(2021-2022年收藏)计算机网络课程设计实验报告北京科技大学arp、ftp、ip包.docx(37页珍藏版)》请在淘文阁 - 分享文档赚钱的网站上搜索。
1、计算机网络课程设计实验报告任课教师: 班级: 学号: 姓名: 目录实验一 ARP封装并发送3课程设计目的:3课程设计要求:3课程设计分析:3程序设计分析:4实验结果6源程序6实验二 解析IP数据包9课程设计目的:9课程设计要求:9课程设计分析:10程序设计分析10实验结果14源代码14实验三 FTP客户机18课程设计目的:18课程设计要求:18课程设计分析:18程序设计原理:18实验结果24源代码25实验心得体会38实验一 ARP封装并发送课程设计目的: ARP协议用于完成IP地址与MAC地址之间的转换。通过封装与发送ARP数据包,加深对ARP协议的理解,掌握ARP帧结构和工作原理及其对协议栈
2、的贡献。课程设计要求: 编写程序,根据ARP帧的结构,封装ARP帧。 要求程序为命令行程序,以命令行的形式运行:SENDARP S-IP S-MAC D-IP D-MAC其中:SENDARP:可执行程序名S-IP:源IP地址S-MAC:源MAC地址D-IP:目的IP地址D-MAC:目的MAC地址课程设计分析: 使用winpcap访问网卡,手动封装 定义ARP的数据结构 填充数据包 发送数据包程序设计分析:ARP协议及工作原理 ARP协议是“Address Resolution Protocol”(地址解析协议)的缩写。在局域网中,网络中实际传输的是“帧”,帧里面是有目标主机的MAC地址的。在以
3、太网中,一个主机要和另一个主机进行直接通信,必须要知道目标主机的MAC地址。但这个目标MAC地址是如何获得的呢?它就是通过地址解析协议获得的。所谓“地址解析”就是主机在发送帧前将目标IP地址转换成目标MAC地址的过程。ARP协议的基本功能就是通过目标设备的IP地址,查询目标设备的MAC地址,以保证通信的顺利进行。ARP的基本运行过程是:1) 主机A希望发送数据分组给主机B,但不知道B的物理地址。2) A发送广播报文,要求B主机用它的物理地址来响应。3) 网站上所有主机都接收到这个分组。4) B识别出自己的IP地址,发送应答报文,告诉A自己的物理地址。 ARP的分组格式物理帧头(14B)ARP帧
4、结构(28B)填充数据(18B)CRC(4B)图一 ARP分组格式目的MAC (6B)源MAC(6B) 类型(2B) 图2 物理帧头 0 8 16 24 31(位) 硬件类型(Ethernet:0x1) 上层协议类型(IP:0x0800)硬件地址长度(0x6)IP地址长度(0x4) 操作(请求: 0x1; 应答: 0x2) 源MAC地址 源MAC地址 源IP地址 源IP地址 目的MAC地址 目的MAC地址 目的IP地址图3 ARP帧结构ARP包的填充 将命令行的参数作适当的转换后填到ARP分组结构的各字段中即可。 要注意的是,填充请求包时。因为包要在Ethernet上广播,所以,物理帧头的“目
5、的MAC”字段要填充为FFFFFFFFFFFF;而ARP帧结构中的目的MAC可填充为任意值,因为它此时不起作用。“填充数据”字段要填充为0。实验结果源程序#include #include #pragma comment(lib,ws2_32.lib)#pragma comment(lib,wpcap.lib)#include #pragma pack(1)struct arp_packet /arp包结构 unsigned char dest_mac6; /目标主机MAC地址 unsigned char source_mac6; /源端MAC地址 unsigned short eh_type
6、; /以太网类型 unsigned short hardware_type; /硬件类型:以太网接口类型为1 unsigned short protocol_type; /协议类型:IP协议类型为0X0800 unsigned char add_len; /硬件地址长度:MAC地址长度为6B unsigned char pro_len; /协议地址长度:IP地址长度为4B unsigned short option; /操作:ARP请求为1,ARP应答为2 unsigned char sour_addr6; /源MAC地址:发送方的MAC地址 unsigned long sour_ip; /源
7、IP地址:发送方的IP地址 unsigned char dest_addr6; /目的MAC地址:ARP请求中该字段没有意义;ARP响应中为接收方的MAC地址unsigned long dest_ip; /目的IP地址:ARP请求中为请求解析的IP地址;ARP响应中为接收方的IP地址 unsigned char padding18; ; #pragma pack()unsigned char* BuildArpPacket(unsigned char* source_mac, unsigned char* dest_mac,unsigned long src_ip,unsigned long
8、dest_ip);void main()pcap_if_t *alldevs, *d;/用于存储网络设备int i=0; char errbufPCAP_ERRBUF_SIZE;if(pcap_findalldevs(&alldevs,errbuf)=-1)fprintf(stderr,Error in pcap_findalldevs:%sn,errbuf);exit(1);for(d=alldevs;d;d=d-next)printf(%d. %s,+i,d-name);if(d-description) printf(%s)n,d-description);else printf( (N
9、o description available)n);if(i=0)printf(n找不到指定接口.n);printf(选择设备号 (1-%d):,i);int inum;pcap_t *adhandle;unsigned char *packet;scanf(%d, &inum);if(inum i)printf(n超出范围.n);pcap_freealldevs(alldevs);for(d=alldevs, i=0; inext, i+);char chs_src_ip16 = 1.1.1.1; char chs_dest_ip16 = 2.2.2.2; unsigned long ul
10、_src_ip = 0u; unsigned long ul_dest_ip = 0u; printf(Input the src ip(1.1.1.1):); scanf(%s,chs_src_ip); ul_src_ip = inet_addr(chs_src_ip); printf(Input the dest ip(2.2.2.2):); scanf(%s,chs_dest_ip); ul_dest_ip = inet_addr(chs_dest_ip); unsigned char uchs_src_mac10 = 0;unsigned char uchs_dest_mac10 =
11、0;printf(Input source mac address(11 11 11 11 11 11):);scanf(%x%x%x%x%x%x,&uchs_src_mac0,&uchs_src_mac1,&uchs_src_mac2,&uchs_src_mac3,&uchs_src_mac4,&uchs_src_mac5);printf(Input dest mac address(22 22 22 22 22 22):);scanf(%x%x%x%x%x%x,&uchs_dest_mac0,&uchs_dest_mac1,&uchs_dest_mac2,&uchs_dest_mac3,&
12、uchs_dest_mac4, &uchs_dest_mac5); if(adhandle= pcap_open_live(d-name,65536,1,1000,errbuf) = NULL)fprintf(stderr,n无法打开指定适配器.%s 不支持WinPcapn,d-name);pcap_freealldevs(alldevs);packet = BuildArpPacket(uchs_src_mac, uchs_dest_mac, ul_src_ip, ul_dest_ip);/发送arp包的函数:参数1:网络设备、参数2:arp包、参数3:长度 pcap_sendpacket(
13、adhandle,packet,62);unsigned char* BuildArpPacket(unsigned char* source_mac, unsigned char* dest_mac,unsigned long src_ip,unsigned long dest_ip)static struct arp_packet packet;memcpy(packet.dest_mac,dest_mac,6);memcpy(packet.source_mac,source_mac,6);packet.eh_type = htons(0x0806);packet.hardware_typ
14、e = htons(0x01);packet.protocol_type = htons(0x0800);packet.add_len = 0x06;packet.pro_len = 0x04;packet.option = htons(0x0001);memcpy(packet.sour_addr,source_mac,6);packet.sour_ip = src_ip;packet.dest_ip = dest_ip;memcpy(packet.dest_addr,dest_mac,6);memset(packet.padding,0,18); return (unsigned char
15、*)&packet;实验二 解析IP数据包课程设计目的: 设计一个解析IP数据包的程序,并根据这个程序,说明IP数据包的结构及IP协议的相关问题,从而对IP层的工作原理有更好的理解和认识。课程设计要求: 本实验的目标是捕获网络中的IP数据包,解析数据包的内容,并将结果显示,并同时写入日志文件。 程序的具体要求如下: 以命令行形式运行:Ipparse其中ipparse是程序名 在标准输出中显示捕获的IP包的版本、头长度、服务类型、数据包总长度、数据包标识、分段标志、分段偏移值、生存时间、上层协议类型、头校验和、源IP地址和目的IP地址等内容。课程设计分析: 使用原始套接字或者winpcap,捕获
16、IP数据包 定义IP头部的数据结构 解析并显示数据包程序设计分析网卡设置 为了获取网络中的IP数据包,必须对网卡进行编程,在这里使用套接字(socket)进行编程。但是,在通常情况下,网络通信的套接字程序只能响应与自己硬件地址相匹配的数据包或是以广播形式发出的数据包。对于其他形式的数据包,如已到达网络接口,但却不是发送到此地址的数据包,网络接口在骓投递地址并非自身地址之后将不引起响应,也就是说应用程序无法收取与自己无关的数据包。我们要想获取网络设备的所有数据包,就是需要将网卡设置为混杂模式。使用套接字 套接字分为三种,即流套接字(Stream socket)、数据报套接字(Datagram S
17、ocket)和原始套接字(Raw Socket)。要进行IP层数据包的接收和发送,应使用原始套接字。创建原始套接字的代码如下: Socket sock: Sock=wsasocket(af_inet,sock_raw,ipproto-ip,null,0,wsa-flag-overlapped): 本设计不用考虑超时情况。 创建套接后,IP头就会包含在接收数据包中。然后,我可以设置IP头操作选项,调用setsockopt函数。其中flag设置为true,并设定IP-HDRINCL选项,表明用户可以亲自对IP头进行处理。最后使用bind()函数将socket绑定到本地网卡上。绑定网卡后,需用WSA
- 配套讲稿:
如PPT文件的首页显示word图标,表示该PPT已包含配套word讲稿。双击word图标可打开word文档。
- 特殊限制:
部分文档作品中含有的国旗、国徽等图片,仅作为作品整体效果示例展示,禁止商用。设计者仅对作品中独创性部分享有著作权。
- 关 键 词:
- 精品 资料 2021 2022 收藏 计算机网络 课程设计 实验 报告 北京科技大学 arp ftp ip
链接地址:https://www.taowenge.com/p-72350391.html
限制150内