网络通信协议分析课程设计源代码和实验报告+帧封装、IP数据包解析和发送TCP数据包
南京邮电大学软件设计TCPIP网络通信程序设计实验报告
![南京邮电大学软件设计TCPIP网络通信程序设计实验报告](https://img.taocdn.com/s3/m/53866da3fd0a79563c1e725b.png)
201 /201 学年第二学期课程设计实验报告模块名称TCP/IP网络通信程序设计专业学生班级学生学号学生姓名指导教师QT5.6环境下的源代码目录题目1获取计算机的名称和IP地址 (1)1、设计内容 (1)2、设计分析论述及程序实现流程框图 (1)3、关键实现代码及注解 (2)4、程序运行测试与结果 (4)5、程序设计中遇到的问题及改进思路 (4)题目2基本C/S模式的通信实验 (4)1、设计内容 (4)2、设计分析论述及程序实现流程框图 (5)3、关键实现代码及注解 (8)4、程序运行测试与结果 (21)5、程序设计中遇到的问题及改进思路 (22)题目3简单的浏览器的实现 (23)1、设计内容 (23)2、设计分析论述及程序实现流程框图 (24)3、关键实现代码及注解 (25)4、程序运行测试与结果 (26)5、程序设计中遇到的问题及改进思路 (28)题目4利用smtp协议发送邮件 (28)1、设计内容 (28)2、设计分析论述及程序实现流程框图 (28)3、关键实现代码及注解 (29)4、程序运行测试与结果 (36)5、程序设计中遇到的问题及改进思路 (36)课程设计小节 (37)附录 (37)题目1获取计算机的名称和IP地址1、设计内容获取计算机的名称和IP地址实验编写程序实现下述功能:获取计算机的名称和IP地址2、设计分析论述及程序实现流程框图Qt Creator是一个用于Qt开发的轻量级跨平台集成开发环境。
Qt Creator可带来两大关键益处:提供首个专为支持跨平台开发而设计的集成开发环境(IDE),并确保首次接触Qt框架的开发人员能迅速上手和操作。
即使不开发Qt应用程序,Qt Creator也是一个简单易用且功能强大的IDE。
Qt数据库中提供QtNetwork Module中的QHostInfo、QHostAddress、QNetworkInterface和QNetAddressEntry等类来查询网络参数。
主要协议分析实验报告(3篇)
![主要协议分析实验报告(3篇)](https://img.taocdn.com/s3/m/11a981884bfe04a1b0717fd5360cba1aa9118c1b.png)
第1篇一、实验背景随着计算机网络技术的飞速发展,网络协议作为计算机网络通信的基础,扮演着至关重要的角色。
为了更好地理解网络协议的工作原理和功能,我们开展了主要协议分析实验。
本实验旨在通过分析常用网络协议的报文格式和工作机制,加深对网络协议的理解。
二、实验目的1. 熟悉常用网络协议的报文格式和工作机制。
2. 掌握网络协议分析工具的使用方法。
3. 培养网络故障排查和问题解决能力。
三、实验环境1. 实验设备:PC机、网线、Wireshark软件。
2. 实验网络:局域网环境,包括路由器、交换机、PC等设备。
四、实验内容本实验主要分析以下协议:1. IP协议2. TCP协议3. UDP协议4. HTTP协议5. FTP协议五、实验步骤1. IP协议分析(1)启动Wireshark软件,选择合适的抓包接口。
(2)观察并分析IP数据报的报文格式,包括版本、头部长度、服务类型、总长度、标识、标志、片偏移、生存时间、协议、头部校验和、源IP地址、目的IP地址等字段。
(3)分析IP分片和重组过程,观察TTL值的变化。
2. TCP协议分析(1)观察TCP数据报的报文格式,包括源端口号、目的端口号、序号、确认号、数据偏移、标志、窗口、校验和、紧急指针等字段。
(2)分析TCP连接建立、数据传输、连接终止的过程。
(3)观察TCP的重传机制和流量控制机制。
3. UDP协议分析(1)观察UDP数据报的报文格式,包括源端口号、目的端口号、长度、校验和等字段。
(2)分析UDP的无连接特性,观察UDP报文的传输过程。
4. HTTP协议分析(1)观察HTTP请求报文和响应报文的格式,包括请求行、头部字段、实体等。
(2)分析HTTP协议的请求方法、状态码、缓存控制等特性。
(3)观察HTTPS协议的加密传输过程。
5. FTP协议分析(1)观察FTP数据报的报文格式,包括命令、响应等。
(2)分析FTP的文件传输过程,包括数据传输模式和端口映射。
网络通信协议分析课程设计源代码和实验报告+帧封装、IP数据包解析和发送TCP数据包
![网络通信协议分析课程设计源代码和实验报告+帧封装、IP数据包解析和发送TCP数据包](https://img.taocdn.com/s3/m/4227dac484254b35eefd343b.png)
网络协议分析课程设计之协议编程实验一帧封装实验目的:•编写程序,根据给出的原始数据,组装一个IEEE 802.3格式的帧(题目)默认的输入文件为二进制原始数据(文件名分别为input1和input2))。
•要求程序为命令行程序。
比如,可执行文件名为framer.exe,则命令行形式如下:framer inputfile outputfile,其中,inputfile为原始数据文件,outputfile为输出结果。
•输出:对应input1和input2得结果分别为output1和output2。
试验要求:•编写程序,根据给出的原始数据,组装一个IEEE 802.3格式的帧(题目)默认的输入文件为二进制原始数据(文件名分别为input1和input2))。
•要求程序为命令行程序。
比如,可执行文件名为framer.exe,则命令行形式如下:framer inputfile outputfile,其中,inputfile为原始数据文件,outputfile为输出结果。
输出:对应input1和input2得结果分别为output1和output2验设计相关知识:帧:来源于串行线路上的通信。
其中,发送者在发送数据的前后各添加特殊的字符,使它们成为一个帧。
Ethernet从某种程度上可以被看作是机器之间的数据链路层连接。
按802.3标准的帧结构如下表所示(802.3标准的Ethernet帧结构由7部分组成)802.3标准的帧结构其中,帧数据字段的最小长度为46B 。
如果帧的LLC 数据少于46B ,则应将数据字段填充至46B 。
填充字符是任意的,不计入长度字段值中。
在校验字段中,使用的是CRC 校验。
校验的范围包括目的地址字段、源地址字段、长度字段、LLC 数据字段。
循环冗余编码(CRC)是一种重要的线性分组码、编码和解码方法,具有简单、检错和纠错能力强等特点,在通信领域广泛地用于实现差错控制。
CRC 校验码的检错能力很强,不仅能检查出离散错误,还能检查出突发错误。
TCP/ IP网络协议分析网络协议分析实验报告(简洁)
![TCP/ IP网络协议分析网络协议分析实验报告(简洁)](https://img.taocdn.com/s3/m/1edfedffaef8941ea76e05da.png)
广东警官学院《计算机网络》
实验报告
课程名称计算机网络原理
实验学期 2011 至 2012 学年第二学期
学生所在系部计算机系
年级 2010 专业班级计算机科学与技术3班
学生姓名陆长鹏学号 201007140315 任课教师
实验成绩
计算机系制
实验报告须知
1、学生上交实验报告时,必须为打印稿(A4纸)。
页面空间不够,可以顺延。
2、学生应该填写的内容包括:封面相关栏目、实验地点、时间、目的、设备环境、
内容、结果及分析等。
3、教师应该填写的内容包括:实验成绩、教师评价等。
4、教师根据本课程的《实验指导》中实验内容的要求,评定学生的综合性实验成
绩;要求在该课程期末考试前将实验报告交给任课教师。
综合性实验中,所涉及的程序,文档等在交实验报告前,拷贝给任课教师。
任课教师统一刻录成光盘,与该课程的期末考试成绩一同上交到系里存档。
5、未尽事宜,请参考该课程的实验大纲和教学大纲。
《计算机网络原理》课程综合性实验报告
开课实验室:网络工程实验室2012 年月日。
TCPIP协议分析课程设计报告书要点
![TCPIP协议分析课程设计报告书要点](https://img.taocdn.com/s3/m/c1adaf8b68dc5022aaea998fcc22bcd126ff42c3.png)
《TCP/IP协议分析》课程设计题目:用协议分析工具分析 DNS以及以下各层协议的工作机制院系:计算机学院班级: 2023级网络工程班姓名: ****学号: *********组别:第四组组长:*****组员:****** **** **** *** **** ***2023年1月8日书目一、课程设计目的 (3)二、课程设计的要求 (3)三、试验环境 (3)四、试验内容及过程 (3)五、总结 (17)一、课程设计目的1、用协议分析工具分析 DNS以及以下各层协议的工作机制;2、驾驭DNS协议的恳求与应答过程二、课程设计的要求1、分析网络拓扑图的结构与组成,视察网络设备在拓扑图中的表示方法,学习依据拓扑图进行网络构建的基本步骤,了解网络组建的过程。
分析网络中可能用到的网络协议,说明其应用目的和实现机理。
2、驾驭协议分析工具的安装、配置和基本操作。
利用协议分析工具分析现实中某种网络应用的协议工作过程,通过分析工具捕获网络数据的详细传输,分析该应用在协议栈个层次中数据包的详细内容,从而理解各层协议的作用与协同工作的过程,达到能更加深化驾驭网络协议原理的目的。
三、试验环境1、网络环境机房环境、Packet Tracer虚拟环境2、操作系统Windows 7 (服务器端安装DNS服务器及web服务器)3、协议分析工具Wireshark、Packet Tracer四、试验内容及过程1、DNS基本学问及原理DNS(Domain Name System)及域名服务系统,它的作用就是域名到IP地址的转换过程。
IP地址是网络上标识web站点的数字地址,为了简洁好记,采纳域名代替IP地址来标识站点地址。
而实现域名到IP地址的转换就必需具有DNS服务器。
2、DNS解析过程第一步:客户端提出域名解析恳求,并将该恳求发送给本地的域名服务器其次步:当本地的DNS服务器收到恳求后,就先查询本地的缓存,假如有该项记录,则本地的DNS服务器就干脆把查询结果返回;第三步:假如本地的缓存记录中没有该记录就干脆把该恳求发给根服务器,然后根域名服务器再返回本地域名服务器一个所查询域的主域名服务器地址;第四步:本地服务器再向上一步返回的域名服务器发出恳求,然后接收恳求的服务器查询自己的缓存记录,假如有该条记录则将结果返回;第五步:若没有则重复该过程,直到找到正确记录;第六步:本地域名服务器把返回的结果保存到本地缓存以备下次运用,同时将结果返回给发出恳求的客户机;3、网络拓扑结构设计图4.3.1中①pc1---pc4为客户机,由客户机向服务器发出DNS—192.168.8.4 子网掩码均为255.255.255.0,DNS服务器地址为192.168.8.6;②pc5 即图中的Server-pt server 作为web服务器,IP地址配置为192.168.8.5,子网掩码为255.255.255.0,DNS服务器地址为192.168.8.6;③pc6 即图中的Server-pt DNS serve就是负责域名解析的本地DNS服务器、IP地址配置为192.168.8.6。
《TCPIP协议分析》课程设计
![《TCPIP协议分析》课程设计](https://img.taocdn.com/s3/m/3e7c515a1711cc7931b71688.png)
5.2.2udpclient.c程序内容:16
6结术语18
参考ቤተ መጻሕፍቲ ባይዱ献19
1
1.1协议的简介
UDP是UserDatagramProtocol的简称,中文名是用户数据报协议,是OSI参考模型中一种无连接的传输层协议,提供面向事务的简单不可靠信息传送服务。在网络中它与TCP协议一样用于处理UDP数据包。在OSI模型中,在第四层——传输层,处于IP协议的上一层。UDP有不提供数据包分组、组装和不能对数据包进行排序的缺点,也就是说,当报文发送之后,是无法得知其是否安全完整到达的。与所熟知的TCP(传输控制协议)协议一样,UDP协议直接位于IP(网际协议)协议的顶层。根据OSI(开放系统互连)参考模型,UDP和TCP都属于传输层协议。
UDP在IP数据报的头部仅仅加入了复用和数据校验(字段)。UDP使用底层的互联网协议来传送报文,同IP一样提供不可靠的无连接数据报传输服务。它不提供报文到达确认、排序、及流量控制等功能。因此,UDP报文可能会出现丢失、延迟或乱序到达的现象。而且,报文到达的速率可能会大于接收进程能够处理的速率。
使用UDP的应用程序可根据自己的需求设计相应的可靠性机制。例如,作为文件传输协议之一的简单文件传输协议就在应用层做这方面的工作。
图1-1UDP
1.2协议的作用
为了在给定的主机上能识别多个目的地址,同时允许多个应用程序在同一台主机上工作并能独立地进行数据报的发送和接收,设计用户数据报协议UDP。
UDP提供了应用程序之间传输数据的基本机制。它能够基于端口号区分在一台机器上运行的多个程序。在传递每个UDP报文时,该报文除了携带用户数据外,还携带目的端口号和源端口号,这使得目的机器上的UDP软件能够将报文交给正确的接收进程,而接受进程也能正确地返回应答报文。
计算机网络课程设计报告--帧封装
![计算机网络课程设计报告--帧封装](https://img.taocdn.com/s3/m/3f0d7e3330b765ce0508763231126edb6f1a7637.png)
计算机网络课程设计报告题目:帧封装一、问题描述帧是在数据链路层数据进行传输与交换的基本单位。
构造帧对于理解网络协议的概念、协议执行过程以及网络问题处理的一般方法具有重要的意义。
本次课程设计的目的是应用数据链路层与介质访问控制层的知识,根据数据链路层的基本原理,通过构造一个具体的Ethernet帧,从而深入理解网络协议的基本概念与网络问题处理的一般方法。
二、概要设计(抽象数据类型定义)编写程序,根据给出的原始数据,组装一个IEEE802.3格式的帧(题目默认的输入文件为二进制原始数据(文件名为input1)。
D要求程序为命令行程序。
比如,可执行文件名为framer,exe,则命令行形式如下:framerinputfi1eoutputfi1e其中,inputfi1e为原始数据文件,OUtPUtfi1e为输出结果。
2)输出:对应input1的结果分别为OUtPUt1。
三、详细设计1.填充帧头部字段在这一部分需要向输出文件写入前导码、帧前定界符、目的地址、源地址和长度字段。
写入前四个部分十分简单,而写入长度字段时需要计算输入文件的长度。
所以计算输入文件长度的方法如下所示:intIength=O;infi1e.seekgOiOS::end);〃将读指针移到文件末尾。
Iength=infi1e.te11g();〃计算指针偏移量,即为输入文件的长度。
unsignedchar*data=newunsignedChar[1ength];〃创建字符指针并根据文件长度初始化。
infi1e.seekg(07ios::beg);〃将读指针移到文件开始。
infi1e.read(datajength);〃将文件数据读入到字符指针data中。
fi1e.put(char(1ength>>8));fi1e.put(char(1ength&Oxff));〃将文件长度值按照逆序写入到输出文件的长度字段中Ofi1e.write(data,1ength);〃将data内容写入到输出文件中。
网络协议分析实验报告
![网络协议分析实验报告](https://img.taocdn.com/s3/m/4521190dbf1e650e52ea551810a6f524ccbfcb21.png)
网络协议分析实验报告一、实验目的本次实验旨在通过网络协议分析,深入了解常见的网络协议的工作原理和通信过程,加深对于网络通信的理解。
二、实验环境本次实验使用了Wireshark网络协议分析工具,实验环境为Windows 系统。
三、实验步骤1. 安装Wireshark2.抓包启动Wireshark,选择需要抓包的网络接口,开始进行抓包。
在抓包过程中,可以选择过滤器,只捕获特定协议或特定IP地址的数据包。
3.分析数据包通过Wireshark显示的数据包列表,可以查看抓取的所有数据包,每个数据包都包含了详细的协议信息。
可以通过点击数据包,查看每个数据包的详细信息,包括源IP地址、目标IP地址、协议类型等。
四、实验结果通过抓包和分析数据包,我们发现了一些有趣的结果。
1.ARP协议ARP(Address Resolution Protocol)是用于将IP地址解析为MAC地址的协议。
在数据包中,可以看到ARP请求(ARP Request)和ARP响应(ARP Reply)的过程。
当发送方需要向目标发送数据包时,会发送ARP请求来获取目标的MAC地址,然后通过ARP响应获取到目标的MAC地址,从而进行通信。
2.HTTP协议HTTP(Hypertext Transfer Protocol)是Web开发中常用的协议。
在数据包中,可以看到HTTP请求(HTTP Request)和HTTP响应(HTTP Response)的过程。
通过分析HTTP的请求和响应,我们可以看到客户端发送了HTTP请求报文,包括请求的URL、请求的方法(GET、POST等)、请求头部和请求体等信息。
服务器收到请求后,发送HTTP响应,包括响应的状态码、响应头部和响应体等信息。
3.DNS协议DNS(Domain Name System)是用于将域名解析为IP地址的协议。
在数据包中,可以看到DNS请求(DNS Query)和DNS响应(DNS Response)的过程。
《网络编程与协议分析》课程设计报告
![《网络编程与协议分析》课程设计报告](https://img.taocdn.com/s3/m/fba47e92050876323112126a.png)
武汉科技大学计算机科学与技术学院制表说明:本合同资料适用于约定双方经过谈判、协商而共同承认、共同遵守的责任与义务,同时阐述确定的时间内达成约定的承诺结果。
文档可直接下载或修改,使用时请详细阅读内容。
课程名称:网络编程与协议分析)叔1善科技尤•学Wuhan University of Science & Technology计算机科学与技术学院课程设计报告课程名称:网络编程与协议分析专业:_____________________班级:_____________________学号:_____________________姓名:_____________________指导老师:_____________________《网络编程与协议分析》课程设计报告、课设题目:网络数据包抓取与分析软件、课设要求:1)能抓取本地主机所在局域网子网内的所有数据包2)分析并显示所抓取数据包的IP头部各字段的信息3)分析并显示所抓取数据包的封装在IP数据包内的协议头部字段信息(TCP、UDP、ICMP 等)4)生成日志信息,以文本文档形式保存5)分析并显示所抓取数据包应用层协议头部字段信息(HTTP、FTP、DNS、Telnet、SMTP、POP等各种应用层协议中至少取三种)三、用到的基本概念及原理(1)UDP协议介绍UDP协议的全称是用户数据报协议,在网络中它与TCP协议一样用于姓理数据包;在OSI模型中.在第四层——传辕层,处于IP协议的上一层’ UDP有不提供数据报分组、组装和不能对数据包的排序的缺点,也就是说,当报文发送之后,是无法得知其是否安全完整到达的’UDP用来支持那些需要在计算机之间传蜿数据的网络应用;包括阿络视频会议系统在内的众多的客户.眼务器模式的网络应用都需要使用UDP协议=UDP协议从问世至今已经被使用了很寥年,虽然其最初的光彩已经被一些类似协议所掩盖,但是即使是在今天,LT>P仍然不失为一项非常实用和可行的网络传输层协议:(2)TCP协议基本知识TCP是一种面向连凄(连接导向)的、可翥的、基于字节流的运输层通信协议’在OSIRM模型中,它完成第四层传输层所指定的功能,UDP 是同一层内另一个重要的传输协议・首先,TCP建立连接之后,通信祖方都同时可以进行数据的传输.其次,他是全祖工的*在保证可靠性上,采用超时重传和稍待确认机制,在流量控制上,采用滑动窗口协议,协议中规定.对于窗口内未经确认的分组需要重传=在拥塞控制上,采用慢启动算法.(3) Winpcap的组成和结构WinPcap由一个数据包监听设备驱动程序(NPF)、一个底层的动态连接库(packet, dll)和一个高层的不依赖于操作系统的静态库(■口can d匚)共三个部分构成,如图2・5所示=这里,XPF在操作系统的内核级,packet. dlL叩cap. dll 在用户级.(4) Winpcap基本原理数据包过滤器•数据包过滤器决定是否接收进来的数据包并把数据包拷贝给骁听程序:■数据包过波器是一个有布尔输出的函数=循环缱冲区』循环援冲区以队列插入的方式来保存数据包,提高数据的存睹致率■:WinPcap 引用:到 http: winpcap, org devel. htm下载V.'inPcap 4, 0. 2. zip- 后群压,锌压缠就可以看见Include 和lib;在“ProjnctfSettingm*标签栏中选择 "C 在 ^Preprocessor definitions'"的输入框里添加"WPCAP”;再选舞"Link"?在"Object library modules^的输入框里添加lib " ° 然后再设置TO+环境变量:选择Tools->optians->Directories的include里面和入下载的winpcap开发包修压以后的include文件夹@ 选择Tocls->opt ions-) Direct ones的lib里面加入下载的winpcap开发包程玉以后的lib 件夹:■在 stdafs 中加入+tinclLide <pcap. h>(5) NPF在windows系统中的位置、FF是一个协议驱动:从性能方面来看,这不是最好的选择,但是它合理地独立于MAC层并且有权使用原始通信- traffic).可以看出,XPF在NDIS之上,它与TCP IP协议栈的实现在同一层次,因此,应用程序不通过Winsock也可以实现数据的发送和接受。
设计一个解析IP数据包的程序网络协议课程设计报告
![设计一个解析IP数据包的程序网络协议课程设计报告](https://img.taocdn.com/s3/m/a545efebeefdc8d377ee323b.png)
目录1.课程设计目的----------------------------------------------------------------------- 22.课程设计要求----------------------------------------------------------------------- 23.课程设计题目分析----------------------------------------------------------------- 3网卡设置 ------------------------------------------------------------------------- 3程序设计------------------------------------------------------- 33.2.1利用原始套接字---------------------------------------- 33.2.2接收数据包 -------------------------------------------- 43.2.3概念IP头部的数据结构-------------------------------- 4 3.2.4析IP数据包设计相关知识----------------------------------- 45.程序流程图------------------------------------------------------- 56.程序设计--------------------------------------------------------- 6协议的概念 ---------------------------------------------------- 6捕捉处置------------------------------------------------------- 7运行界面------------------------------------------------------- 77.实验结果--------------------------------------------------------- 88.自我评析和总结 -------------------------------------------------- 9实训心得------------------------------------------------------- 9实训日记------------------------------------------------------- 9 9.主要参考资料 -------------------------------------------------- 10[2]《网络协议分析》寇晓蕤罗俊勇编著机械工业出版社--------- 10[3]《C语言程序设计》张建伟李秀琴主编科学出版社--------- 10[4]《C++程序设计教程——面向对象分册》郑秋生主编 --------- 10电子工业出版社 -------------------------------------------------- 10 10.附录 ---------------------------------------------------------- 1011.课程设计目的本次实训的目的就是设计一个解析IP数据包的程序,并按照这个程序,说明IP数据包的结构及IP协议的相关问题,从而对IP层的工作原理有更好的理解和熟悉。
基于TCPIP协议的网络通信应用程序课程设计报告
![基于TCPIP协议的网络通信应用程序课程设计报告](https://img.taocdn.com/s3/m/ace247303186bceb18e8bb0b.png)
基于TCPIP协议的网络通信应用程序课程设计报告华南农业大学理学院( 计算机网络)课程设计实验时间:2010学年第二学期专业年级:2008级应数2班实验题目:基于TCP/IP协议的网络通信应用程序学生姓名:王晓珊学号_18_自评成绩_95教师评成绩___学生姓名:黄如萍_学号06_自评成绩_95_教师评成绩___学生姓名______学号____自评成绩____教师评成绩___学生姓名______学号____自评成绩____教师评成绩___指导老师:黄小虎基于TCP/IP协议的网络通信小应用程序1.课程设计的题目及要求1.1 课程设计题目掌握基于TCP/IP协议实现网络通信,理解TCP与UDP的不同特性以及实现方式。
课程设计要求建立一个基于TCP/IP协议的网络通信小应用程序,实验可采用UDP或TCP,建议基于WINDOWS平台。
1.1.1 功能要求建立一个基于中心服务器方式即时数据通信平台(IM)。
要求如下(*为选做内容):1. 能进行用户管理,所有用户必须登录到服务器,由服务器维护在线信息。
2. IM(Instant Message)功能:用户登录后能进行实时多方点到点短信息通信,如聊天;3. 能选择要求服务器进行转发服务;4. 能保存通信记录到数据库(SQL Server或其他桌面型数据库);5. 能进行双方文件传输,能显示进度;6. 支持断点重传。
(检查时需有功能随时中断传送,并在下次启动能显示重传状态);*7. 数据包加密;8.实时语音双向传送功能;*9.多方通话功能;10.界面设计要求布局合理,信息清晰。
1.1.2 对于所有功能的要求1)要求清晰描述所设计的应答机制,数据包格式,所用数据结构及其相应算法,机密机制等;2)对于功能实现要求描绘实现方法,流程。
2.开发工具、软硬件环境简介2.1 开发工具开发工具:Microsoft Visual Studio 20082.2 软硬件环境2.2.1 软件环境●操作系统:Windows XP/Windows 7●开发软件:Microsoft Visual Studio 2008●开发语言:C#语言●平台: Framework v2.02.2.2 硬件环境●分辨率:1000×750●服务器:PentiumIII 500以上或更高;内存:128M以上;硬盘:至少40G以上;●工作站: PentiumII 266以上微机;内存:64MB硬盘:至少5G以上;3.程序实现的基本思想3.1 程序设计分析本设计实现的基于TCP/IP协议的网络通信小应用程序,实际上是一个基于Socket的聊天室。
网络课程设计任务书(完整)
![网络课程设计任务书(完整)](https://img.taocdn.com/s3/m/41d30af24693daef5ef73d7e.png)
课程设计说明书
发送TCP数据包
起止日期:2010年06月28日至2010年07月02日
学生姓名
班级
学号
成绩
指导教师(签字)
计算机与通信学院
2010年7月02日
湖南工业大学
课程设计任务书
2009—2010学年第二学期
计算机与通信学院(系、部)通信工程专业071班级
课程名称:计算机网络原理
具体任务
1.初始化原始套接字
2.发送TCP数据包
时间安排与完成情况
6月28号,查找好相关资料、理解原理、并分配好任务
6月29号,熟悉了解初始化原始套接字的过程
6月30号,熟悉并且了解发送数据包的过程
7月01号,把两者结合起来,实现程序的功能
7月02号,编写调试,并且撰写课程设计报告
一、设计目的:
设计一个发送TCP数据包的程序,并根据本设计说明TCP数据包的结构以及TCP协议与IP协议的关系,使大家对TCP协议的工作原理有更深入的认识。
size -=sizeof(USHORT);
}
if(size)
{
cksum += *(UCHAR*)buffer;
}
cksum = (cksum >> 16) + (cksum & 0xffff);
cksum += (cksum >>16);
return (USHORT)(~cksum);
}
int main(int argc, char* argv[])
{
printf("setsockopt SO_SNDTIMEO error!\n");
计算机网络课程设计(第七章)解析IP数据包(完整程序代码)
![计算机网络课程设计(第七章)解析IP数据包(完整程序代码)](https://img.taocdn.com/s3/m/8227c248312b3169a551a40c.png)
计算机网络课程设计——机械工业出版社第7章:解析IP数据包课程设计目的:本课程设计的目的就是设计一个解析IP数据包的程序,并根据这个程序,说明IP 数据包的结构及IP协议的相关问题,从而对IP层的工作原理有更好的理解和认识。
完整程序代码:#include<stdio.h>#include<winsock2.h>#include<ws2tcpip.h>#pragma comment(lib,"ws2_32.lib")typedef struct _IP_HEADER{union{BYTE Version;BYTE HdrLen;};BYTE ServiceType;WORD TotalLen;WORD ID;union{WORD Flags;WORD FragOff;};BYTE TimeToLive;BYTE Protocol;WORD HdrChksum;DWORD SrcAddr;DWORD DstAddr;BYTE Options;} IP_HEADER;#define IO_RCVALL _WSAIOW(IOC_VENDOR,1)#define BUFFER_SIZE 65535void getVersion(BYTE b,BYTE &version){version=b>>4;}void getIHL(BYTE b,BYTE &length){length=(b&0x0f)*4;}char* parseServiceType_getProcedence(BYTE b) {switch(b>>5){case 7:return "Network Control";break;case 6:return "internet work Control";break;case 5:return "CRITIC/ECP";break;case 4:return "Flash Override";break;case 3:return "Flash";break;case 2:return "Immediate";break;case 1:return "Priority";break;case 0:return "Routine";break;default:return "Unknown";}}char* parseServiceType_getTOS(BYTE b) {b=(b>>1)&0x0f;switch(b){case 0:return "Normal Service";break;case 1:return "Minimize monetary cost";break;case 2:return "Maximize reliability";break;case 4:return "Maximize throughput";break;case 8:return "Minimize delay";break;case 15:return "Maximize security";break;default:return "Unknown";}}void getFlags(WORD w,BYTE &DF,BYTE &MF) {DF=(w>>14)&0x01;MF=(w>>13)&0x01;}void getFragOff(WORD w,WORD &fragOff) {fragOff=w&0x1fff;}char* getProtocol(BYTE Protocol){switch (Protocol){case 1:return "ICMP";case 2:return "IGMP";case 4:return "IP in IP";case 6:return "TCP";case 8:return "EGP";case 17:return "UDP";case 41:return "IPv6";case 46:return "RSVP";case 89:return "OSPF";default:return "UNKNOWN";}}void ipparse(FILE* file,char* buffer){IP_HEADER ip=*(IP_HEADER*)buffer;fseek(file,0,SEEK_END);fprintf(file,"----------------------------------\n");BYTE version;getVersion(ip.Version,version);fprintf(file,"Version:%d\n",version);BYTE headerLen;getIHL(ip.HdrLen,headerLen);fprintf(file,"HdrLen:%d(Bytes)\n",headerLen);fprintf(file,"ServiceType: %s,%s\n",parseServiceType_getProcedence(ip.ServiceType),parseServiceType_getTOS(ip.ServiceType));fprintf(file,"TotalLen: %d(Bytes)\n",ip.TotalLen);fprintf(file,"ID: %d\n",ip.ID);BYTE DF,MF;getFlags(ip.Flags,DF,MF);fprintf(file,"Flags:DF=%d,MF=%d\n",DF,MF);WORD fragOff;getFragOff(ip.FragOff,fragOff);fprintf(file,"FragOff: %d\n",fragOff);fprintf(file,"FragOff: %d\n",fragOff);fprintf(file,"TimeToLive: %d(Hops)\n",ip.TimeToLive);fprintf(file,"Protocol: %s\n",getProtocol(ip.Protocol));fprintf(file,"HdrChksum: 0x%0x\n",ip.HdrChksum);fprintf(file,"SrcAddr: %s\n",inet_ntoa(*(in_addr*)&ip.SrcAddr));fprintf(file,"DstAddr: %s\n",inet_ntoa(*(in_addr*)&ip.DstAddr)); }void main(int argc,char*argv[]){if(argc!=2){printf("Please input command: ParseArp output_file");return;}FILE* file;if((file=fopen(argv[1],"wb+"))==NULL){printf("Fail to open file %s",argv[1]);return;}WSADATA wsData;if(WSAStartup(MAKEWORD(2,2),&wsData)!=0){printf("WSAStartup failed!");return;}SOCKET sock;if((sock=socket(AF_INET,SOCK_RAW,IPPROTO_IP))==INVALID_SOCK ET){printf("Creat socket failed");return;}BOOL flag=true;if(setsockopt(sock,IPPROTO_IP,IP_HDRINCL,(char*)&flag,sizeof(flag)) ==SOCKET_ERROR){printf("Setsockopt failed!");return;}char hostName[128];if(gethostname(hostName,100)==SOCKET_ERROR){printf("Gethostname failed!");return;}hostent* pHostIP;if((pHostIP=gethostbyname(hostName))==NULL){printf("Gethostbyname failed!");return;}sockaddr_in addr_in;addr_in.sin_addr=*(in_addr*)pHostIP->h_addr_list[0];addr_in.sin_family=AF_INET;addr_in.sin_port=htons(6000);if(bind(sock,(PSOCKADDR)&addr_in,sizeof(addr_in))==SOCKET_ERRO R){printf("Bind failed!");return;}DWORD dwValue=1;DWORD dwBufferLen[10];DWORD dwBufferInLen=1;DWORD dwBytesReturned=0;if(WSAIoctl(sock,IO_RCVALL,&dwBufferInLen,sizeof(dwBufferInLen),& dwBufferLen,sizeof(dwBufferLen),&dwBytesReturned,NULL,NULL)==SOCKET_ ERROR){printf("Ioctlsocket failed!");return;}char buffer[BUFFER_SIZE];printf("Listening on local host...\n");while(true){int size=recv(sock,buffer,BUFFER_SIZE,0);if(size>0){ipparse(stdout,buffer);ipparse(file,buffer);}}fclose(file);return;}结果截图。
TCPIP协议分析与编程实验报告
![TCPIP协议分析与编程实验报告](https://img.taocdn.com/s3/m/4f87945e852458fb770b5666.png)
至诚学院实验报告课程名称:TCP/IP协议编程实践姓名:XXX学号:211xxxxxx系别:计算机工程系专业:软件工程年级:2012级年月日实验一系统时间同步程序【设计目的】设计简单的客户/服务器程序实现客户系统时间和服务器系统时间同步【设计要求】TCP :客户:(1)客户创建流套接字,向服务器发起TCP连接。
(2)连接创建成功后,接收服务器返回的时间,更新客户系统时间。
(3)断开与服务器的连接。
服务器:(1)服务器创建监听套接字,监听客户TCP连接请求。
(2)当收到一个客户TCP连接请求,创建连接套接字同意与其创建连接。
(3)获取系统时间,通过连接套接字返回给客户。
UDP :客户:(1)客户创建数据报套接字,通过该套接字向服务器发出”time”命令获取服务器系统时间。
(2)接收服务器返回的时间,更新客户系统时间。
(3)断开与服务器的连接。
服务器:(1)服务器创建数据报套接字,等待接收客户数据。
(2)接收客户发来的“time”命令,获取系统时间,通过套接字返回给客户。
【开发环境】1、操作系统: Windows 7 操作系统2、Winpcap开放代码函数库3、语言:C++4、整个程序的核心就是利用Windows Socket 进行网络设计实现,使用C/S结构【背景知识】时间协议(TIME protocol)是一个在RFC 868内定义的网络协议。
它用作提供机器可读的日期时间资讯。
时间协议可以在TCP或UDP上使用。
在TCP上,主机会连接支援时间协议的服务器的TCP埠 37。
服务器会传送32位二进制数字然后断开连接,数字表示由格林威治时间1900年1月1日午夜0时0分0秒至当时的总秒数。
主机在接收到时间后断开连接。
在UDP上,客户端会每送一个(通常为空的)数据包到UDP埠 37。
服务器会把包含时间的数据包传回。
在过程中没有进行连线。
TCP 协议为终端设备提供了面向连接的、可靠的网络服务,UDP 协议为终端设备提供了无连接的、不可靠的数据报服务。
计算机网络课程设计-编程实现简单的TCP协议分析器
![计算机网络课程设计-编程实现简单的TCP协议分析器](https://img.taocdn.com/s3/m/4998fc76f46527d3240ce07d.png)
编程实现简单的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;/* 首部长度*/#elseu_int8_t ip_header_length: 4, ip_version: 4;#endifu_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_BIGENDIANu_int8_t tcp_offset: 4,/* 偏移*/tcp_reserved: 4;/* 未用*/#elseu_int8_t tcp_reserved: 4,/* 未用*/tcp_offset: 4;/* 偏移*/#endifu_int8_t tcp_flags;/* 标记*/u_int16_t tcp_windows;/* 窗口大小*/u_int16_t tcp_checksum;/* 校验和*/u_int16_t tcp_urgent_pointer;/* 紧急指针*/};struct icmp_header{u_int8_t icmp_type;/* ICMP类型*/u_int8_t icmp_code;/* ICMP代码*/u_int16_t icmp_checksum;/* 校验和*/u_int16_t icmp_id;/* 标识符*/u_int16_t icmp_sequence;/* 序列码*/};void tcp_protocol_packet_callback(u_char *argument, const struct pcap_pkthdr *packet_header, const u_char *packet_content){struct tcp_header *tcp_protocol;/* TCP协议变量*/u_char flags;/* 标记*/int header_length;/* 长度*/u_short source_port;/* 源端口*/u_short destination_port;/* 目的端口*/u_short windows;/* 窗口大小*/u_short urgent_pointer;/* 紧急指针*/u_int sequence;/* 序列号*/u_int acknowledgement;/* 确认号*/u_int16_t checksum;/* 校验和*/tcp_protocol = (struct tcp_header*)(packet_content + 14+20);/* 获得TCP协议内容*/source_port = ntohs(tcp_protocol->tcp_source_port);/* 获得源端口*/destination_port = ntohs(tcp_protocol->tcp_destination_port);/* 获得目的端口*/header_length = tcp_protocol->tcp_offset *4;/* 长度*/sequence = ntohl(tcp_protocol->tcp_sequence_liuzhen);/* 序列码*/acknowledgement = ntohl(tcp_protocol->tcp_acknowledgement);/* 确认序列码*/windows = ntohs(tcp_protocol->tcp_windows);/* 窗口大小*/urgent_pointer = ntohs(tcp_protocol->tcp_urgent_pointer);/* 紧急指针*/flags = tcp_protocol->tcp_flags;/* 标识*/checksum = ntohs(tcp_protocol->tcp_checksum);/* 校验和*/printf("------- TCP协议-------\n");printf("源端口号:%d\n", source_port);printf("目的端口号:%d\n", destination_port);switch (destination_port){case 80:printf("上层协议为HTTP协议\n");break;case 21:printf("上层协议为FTP协议\n");break;case 23:printf("上层协议为TELNET协议\n");break;case 25:printf("上层协议为SMTP协议\n");break;case 110:printf("上层协议POP3协议\n");break;default:break;}printf("序列码:%u\n", sequence);printf("确认号:%u\n", acknowledgement);printf("首部长度:%d\n", header_length);printf("保留:%d\n", tcp_protocol->tcp_reserved);printf("标记:");if (flags &0x08)printf("PSH ");if (flags &0x10)printf("ACK ");if (flags &0x02)printf("SYN ");if (flags &0x20)printf("URG ");if (flags &0x01)printf("FIN ");if (flags &0x04)printf("RST ");printf("\n");printf("窗口大小:%d\n", windows);printf("校验和:%d\n", checksum);printf("紧急指针:%d\n", urgent_pointer);}void ip_protocol_packet_callback(u_char *argument, const struct pcap_pkthdr *packet_header, const u_char *packet_content){struct ip_header *ip_protocol;/* IP协议变量*/u_int header_length;/* 长度*/u_int offset;/* 偏移*/u_char tos;/* 服务质量*/u_int16_t checksum;/* 校验和*/ip_protocol = (struct ip_header*)(packet_content + 14);/* 获得IP协议内容*/checksum = ntohs(ip_protocol->ip_checksum);/* 获得校验和*/header_length = ip_protocol->ip_header_length *4;/* 获得长度*/tos = ip_protocol->ip_tos;/* 获得服务质量*/offset = ntohs(ip_protocol->ip_off);/* 获得偏移*/if (ip_protocol->ip_protocol==6){printf("----------- IP协议-----------\n");printf("版本号:%d\n", ip_protocol->ip_version);printf("首部长度:%d\n", header_length);printf("服务质量:%d\n", tos);printf("总长度:%d\n", ntohs(ip_protocol->ip_length));printf("标识:%d\n", ntohs(ip_protocol->ip_id));printf("偏移:%d\n", (offset &0x1fff) *8);printf("生存时间:%d\n", ip_protocol->ip_ttl);printf("协议类型:%d\n", ip_protocol->ip_protocol);printf("上层协议为TCP协议\n");printf("校验和:%d\n", checksum);printf("源IP地址:%s\n", inet_ntoa(ip_protocol->ip_souce_address));/* 获得源IP地址*/printf("目的IP地址:%s\n", inet_ntoa(ip_protocol->ip_destination_address));/* 获得目的IP地址*/}}void ethernet_protocol_packet_callback(u_char *argument, const struct pcap_pkthdr *packet_header, const u_char *packet_content){static int packet_number = 1;/* 数据包个数,静态变量*/u_short ethernet_type;/* 以太网类型*/struct ether_header *ethernet_protocol;struct ip_header *ip_protocol;/* IP协议变量*/u_int header_length;/* 长度*/u_int offset;/* 偏移*/u_char tos;/* 服务质量*/u_int16_t checksum;/* 校验和*/ip_protocol = (struct ip_header*)(packet_content + 14);/* 获得IP协议内容*/checksum = ntohs(ip_protocol->ip_checksum);/* 获得校验和*/header_length = ip_protocol->ip_header_length *4;/* 获得长度*/tos = ip_protocol->ip_tos;/* 获得服务质量*/offset = ntohs(ip_protocol->ip_off);/* 获得偏移*//* 以太网协议变量*/ethernet_protocol = (struct ether_header*)packet_content;ethernet_type = ntohs(ethernet_protocol->ether_type);/* 获得以太网类型*/if(ethernet_type==0x0800 && ip_protocol->ip_protocol==6){u_char *mac_string;/* 以太网地址*/printf("**************************************************\n");printf("捕获第%d个TCP网络数据包\n", packet_number);printf("捕获时间:\n");printf("%s", ctime((const time_t*) &packet_header->_sec));/* 获得捕获数据包的时间*/printf("数据包长度:\n");printf("%d\n", packet_header->len);printf("-------- 以太网协议--------\n");/* 获得以太网协议内容*/printf("类型:\n");printf("%04x\n", ethernet_type);printf("源以太网地址: \n");mac_string = ethernet_protocol->ether_shost;printf("%02x:%02x:%02x:%02x:%02x:%02x\n", *mac_string, *(mac_string + 1), *(mac_string + 2), *(mac_string + 3), *(mac_string + 4), *(mac_string + 5));/* 获得源以太网地址*/printf("目的以太网地址: \n");mac_string = ethernet_protocol->ether_dhost;printf("%02x:%02x:%02x:%02x:%02x:%02x\n", *mac_string, *(mac_string + 1), *(mac_string + 2), *(mac_string + 3), *(mac_string + 4), *(mac_string + 5));/* 获得目的以太网地址*/ip_protocol_packet_callback(argument, packet_header, packet_content);packet_number++;printf("**************************************************\n");}}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操作*/}七、测试数据本地局域网IP数据包八、测试情况程序运行结果图:结论通过两周的课程设计,增强了我的实际动手能力,通过实际的编程整合串联了我所学到的知识。
发送TCP数据包实验报告
![发送TCP数据包实验报告](https://img.taocdn.com/s3/m/e5a03ce84afe04a1b071def4.png)
包以下字段: 端口号:端口号字段包括源端口号和目的端口号。每个端口号的长度是16位,分别表示发送
TCP包的应用进程的端口号和接收该TCP包的应用进程的端口号。 序号:长度为32位。由于TCP协议时面向数据流的,它所传送的报文字段可以视为连续的数
据流,因此需要给每个字节编号。序号字段的“序号”指本报文段数据的第一个字节 的序列号。 确认号:该字段的长度为32位,它表示接收希望接收的下一个TCP包的第一个字节的序号。 报头的长度:4位长度。TCP报头长度以4B为一个单元计算的,实际上报头长度在20B~60B之 间,因此该字段值在5~15之间。 保留:长度为6位,留做今后使用,目前置0。 控制:该字段有6种不同标志,每个标志占一位,在同一时间可设置一位或多位。URG为1时 表明有要紧急处理的数据;ACK为1时表明确认号字段有效;PSH为1时表明要强制切断 连接。SYN为1时表明有确立连接请求,把序号字段的初始值作为序号字段值以便开始 通信;FIN为1时表明发送方已经没有数据可发。 窗口大小:16位长度 紧急指针; 选项; 校验和。
1)客户端的连接函数Onconnet()代码和分析如下:
void CTcpclientDlg::Onconnet() {
GetDlgItemText(IDC_EDIT5,clientname); if(clientname==" ") {
MessageBox("请输入用户名"); } else {
if(clconect) clconect.Close();
CString ipstr,portstr; int port; GetDlgItemText(IDC_EDIT1,ipstr); GetDlgItemText(IDC_EDIT2,portstr); GetDlgItemText(IDC_EDIT5,clientname); portstr.TrimLeft(); portstr.TrimRight(); port=atoi(portstr);
网络协议分析课程设计
![网络协议分析课程设计](https://img.taocdn.com/s3/m/9dd4f8da5022aaea998f0f6f.png)
《计算机网络》课程设计报告书设计题目:协议分析专业:计算机科学与技术班级:10 级1 班姓名:齐特(组长) 宁文倩谢晗指导教师:苏宪利完成日期:2012年1月3日目录1 概述 (1)1.1目的 (1)1.2选题 (1)2 课程作业过程及结果 (1)2.1编程环境及工具 (1)2.2实现原理分析 (1)2.3综合设计 (1)2.3.1 协议分析器总体结构的设计与实现 (1)2.3.2 数据捕获模块的设计与实现 (2)2.3.3 协议解析模块的设计与实现 (3)3 课程大作业总结 (4)3.1小结 (4)3.2改进设想 (6)附录关键代码 (6)1概述1.1目的(1)编写一个简化的协议分析器,了解数据通过网络传输时的封装与解析过程,加深理解TCP/IP协议栈的工作原理和网络应用软件开发能力(2)掌握Winpcap编程与抓包方法;使用Winpcap库的流量统计和向网络中发包等特性。
1.2选题协议分析器程序2课程作业过程及结果2.1编程环境及工具(1)操作系统:Windows 7(2)开发语言:C语言(3)编译环境:MS Visual C++6.0;(4)第3方函数库:Winpcap3.1;2.2实现原理分析协议分析器工作在网络环境中的底层,拦截所有正在网络上传送的数据,并且通过相应的解析处理,可以实时分析这些数据的内容,进而分析所处的网络状态和整体拓扑布局。
当应用程序通过IP网络传送数据时,数据就被送入TCP/IP协议栈中,然后由上至下逐一通过每一层,直到最后被当做一串比特流送入网络。
其中每一层对收到的数据都要增加一些首部信息这个过程被称作封装。
通过以太网传输的比特流被称作帧。
在传输的另一端,当目的主机收到一个以太网数据帧时,数据就开始从协议栈有底向上逐层解析,去掉各层协议所加上的报文头部。
每层协议均要检查报头中的协议标识字段,以确定要接收数据的上层协议,最终从报文中解析出应用层数据后交给应用程序处理。
- 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
- 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
- 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
网络协议分析课程设计之协议编程实验一帧封装实验目的:•编写程序,根据给出的原始数据,组装一个IEEE 802.3格式的帧(题目)默认的输入文件为二进制原始数据(文件名分别为input1和input2))。
•要求程序为命令行程序。
比如,可执行文件名为framer.exe,则命令行形式如下:framer inputfile outputfile,其中,inputfile为原始数据文件,outputfile为输出结果。
•输出:对应input1和input2得结果分别为output1和output2。
试验要求:•编写程序,根据给出的原始数据,组装一个IEEE 802.3格式的帧(题目)默认的输入文件为二进制原始数据(文件名分别为input1和input2))。
•要求程序为命令行程序。
比如,可执行文件名为framer.exe,则命令行形式如下:framer inputfile outputfile,其中,inputfile为原始数据文件,outputfile为输出结果。
输出:对应input1和input2得结果分别为output1和output2验设计相关知识:帧:来源于串行线路上的通信。
其中,发送者在发送数据的前后各添加特殊的字符,使它们成为一个帧。
Ethernet从某种程度上可以被看作是机器之间的数据链路层连接。
按802.3标准的帧结构如下表所示(802.3标准的Ethernet帧结构由7部分组成)802.3标准的帧结构其中,帧数据字段的最小长度为46B 。
如果帧的LLC 数据少于46B ,则应将数据字段填充至46B 。
填充字符是任意的,不计入长度字段值中。
在校验字段中,使用的是CRC 校验。
校验的范围包括目的地址字段、源地址字段、长度字段、LLC 数据字段。
循环冗余编码(CRC)是一种重要的线性分组码、编码和解码方法,具有简单、检错和纠错能力强等特点,在通信领域广泛地用于实现差错控制。
CRC 校验码的检错能力很强,不仅能检查出离散错误,还能检查出突发错误。
利用CRC 进行检错的过程可简单描述如下:在发送端根据要传送的k 位二进制码序列,以一定的规则产生一个校验用的r 位监督码(CRC 码),附在原始信息的后边,构成一个新的二进制码序列(共k+r 位),然后发送出去。
在接收端,根据信息码和CRC 码之间所遵循的规则进行检验,以确定传送中是否出错。
这个规则在差错控制理论中称为“生成多项式”。
循环冗余校验码的特点:(1)CRC 校验码可检测出所有单个错误。
(2)CRC 校验码可检测出所有奇数位错误。
(3)CRC 校验码可检测出所有双位的错误(4)CRC 校验码可检测出所有小于、等于校验位长度的突发错误。
(5)CRC 校验码可以](1/2)-[11-k 的概率检测出长度为(K+1)位的突发错误实验分析:• 填充帧头部字段要完成一次帧封装的过程,首先要完成的就是帧头部的装入,这一过程只要将签到吗、定界符、目的地址、源地址、长度字段的相应数值按顺序写入就可以了。
其中,长度字段的值即为要发送的数据的实际长度。
• 填充数据字段在填充数据字段的过程中要注意的主要问题是数据字段的长度。
802.3标准中规定了帧数据字段的最小长度为46B,最大长度为1500B。
如果数据不足46B,则需要通过填充0来补足;若数据长度超过1500B,则的大奖超过部分封装入下一个帧进行发送。
•CRC校验帧封装的最后一步就是对数据进行校验,并将校验结果记入帧校验字段。
程序流程图:CRC计算流程图:序源代码:#include<iostream.h>#include<fstream.h>#include<stdlib.h>void main(int argc,char*argv[]){//如果输入命令行不正确,则输出提示后退出。
if(argc!=3){cout<<endl<<"请按以下格式输入:framer inputfile outputfile"<<endl;exit(0);}//打开指定的输出文件,以二进制方式打开并可读可写,如文件存在,则清除其内容。
fstream file(argv[2],ios::out|ios::in|ios::binary|ios::trunc,0);for(int i=0;i<7;i++)file.put((char)0xaa);file.put((char)0xab);//写入B的前导码和B的帧前定界符。
chardes_add[]={char(0x00),char(0x00),char(0xE4),char(0x86),char(0x3A),char(0xDC)}; file.write(des_add,6);//写入B的目的地址。
charsor_add[]={char(0x00),char(0x00),char(0x80),char(0x1A),char(0xE6),char(0x65)}; file.write(sor_add,6);//写入B的源地址。
//创建输入文件流并打开指定的输入文件,以二进制方式打开并可读。
ifstream infile(argv[1],ios::in|ios::binary,0);int length=0;infile.seekg(0,ios::end);//将读指针移到文件末尾。
length=infile.tellg();//计算指针偏移量,即为输入文件的长度。
unsigned char* data=new unsigned char[length];//创建字符指针并根据文件长度初始化。
infile.seekg(0,ios::beg);//将读指针移到文件开始。
infile.read(data,length);//将文件数据读入到字符指针data中。
file.put(char(length>>8));file.put(char(length&0xff));//将文件长度值按照逆序写入到输出文件的长度字段中。
file.write(data,length);//将data内容写入到输出文件中。
//如果输入文件长度不足B,则用补足B。
if(length<46){for(int j=length;j<46;j++)file.put(char(0x00));}file.put(char(0x00));//将数据字段后添加个file.seekg(8,ios::beg);//将读指针指向目的地址字段,从此处开始CRC计算unsigned char ch;//ch用来保存读入的字符。
unsigned char crc=char(0x00);//余数初始值为。
while(1)//进行CRC计算{file.get(ch);if(ch==0xff)//判断是否到了文件结尾,如果是,则退出循环。
break;for(i=0;i<8;i++)//对入读入的字符的位分别处理。
{if(0x80==(crc&(0x80)))//当前余数最高位为,需要进行除法运算。
{crc=(crc<<1)&(0xff);//crc左移位,最低位补。
crc=crc|((ch&0x80)>>7);//将输入数据相应的值递补到余数末位。
crc=crc^(0x07);//进行除法运算,即与除数的低位相异或。
}else//当前余数的最高位为,不需要进行除法运算。
{crc=(crc<<1)&(0xff);//crc左移位,最低位补。
crc=crc|((ch&0x80)>>7);//将输入数据相应位的值递补到余数末位。
}ch=ch<<1;//读到的字符左移位,使数据下一位作为输入位。
}}file.clear();file.seekp(-1,ios::end);//将写指针移到输出文件的最后。
file.put(crc);//写入crc码。
file.close();infile.close();//关闭输入文件和输出文件。
cout<<endl<<"数据帧文件"<<argv[2]<<" 封装完成"<<endl; }运行结果:运行结果如下所示:执行framer.exe文件的结果如下所示:实验小结:实现帧的封装,主要是将帧的七个部分---前导码、帧前定界符、目的地址、源地址、长度字段、数据字段和校验字段,一个一个按顺序封装的,最后使得一个帧的封装得以完成。
同时,在编写程序的过程中,用到了很多的函数,这些函数的运用使得程序简便而且正确的运行出来。
实验二解析IP数据包实验目的:•设计一个解析IP数据包的程序,并根据这个程序,说明IP数据包的结构及IP协议的相关问题,从而对IP层的工作原理有更好的理解和认识。
实验要求:本实验的目标是捕获网络中的IP数据包,解析数据包的内容,见个结果显示在标准输出上,并同时写入日志文件。
程序的具体要求如下:•以命令行形式运行:ipparse logfile,其中ipparse是程序名,而logfile则代表记录结果的日志文件。
•在标准输出、和日志文件中写入捕获的IP包的版本、头长度、服务类型、数据包总长度、数据包标识、分段标志、分段偏移值、生存时间、上层协议类型、头校验和、源IP地址和目的IP地址等内容。
•当程序接收到键盘输入Ctrl+C时退出。
设计相关知识:IP数据报的格式说明IP协议都具有什么功能。
其首部,版本目前广泛使用的版本号为4;首部长度站4bit;服务类型占8bit,其中服务类型TOS子域占4位,优先级子域占3位,另一位为保留位;总长度字段为2B,IP数据包的最大长度是65535B;标识占16bit,它是一个计数器,用来产生数据报的标识;标志占3bit,其中最低为为MF,MF=1时为后面“还有分片”,MF=0表示这是数据报片中的最后一个,DF=0时,表示允许分片;片偏移以8个字节为偏移单位;生存时间字段记为TTL,单位为秒;协议段占8bit,用于指出次数据是使用何种协议,典型的协议号有6:TCP,17:UDP,1:ICMP。
本程序使用套接字socket编程,将网卡设为能够接受流经网卡的所有类型的数据包。
首先,初始化套接字,然后监听数据包,解析数据包。
SOCKET sock=socket(AF_INET,SOCK_RAW,IPPROTO_IP)用来创建套接字,其参数为通信发生的区字段和套接字的类型。
WSAIoctl(sock , IO_RCVALL ,&dwBufferInLen , sizeof(dwBufferInLen)函数用来把网卡设置为混杂模式。