分享
2023年计算机网络+课程设计源代码和实验报告+帧封装IP数据包解析和发送TCP数据包.docx
下载文档
温馨提示:
1. 部分包含数学公式或PPT动画的文件,查看预览时可能会显示错乱或异常,文件下载后无此问题,请放心下载。
2. 本文档由用户上传,版权归属用户,汇文网负责整理代发布。如果您对本文档版权有争议请及时联系客服。
3. 下载前请仔细阅读文档内容,确认文档内容符合您的需求后进行下载,若出现内容与标题不符可向本站投诉处理。
4. 下载文档时可能由于网络波动等原因无法下载或下载错误,付费完成后未能成功下载的用户请联系客服处理。
网站客服:3074922707
2023 计算机网络 课程设计 源代码 实验 报告 封装 IP 数据包 解析 发送 TCP
计算机网络课程设计报告 院〔系〕: 计算机学院 专 业: 计算机科学与技术 姓 名: 班 级: 学 号: 指导教师: 2023 年 7 月 4 日 计算机网络课程设计之协议编程 实验一 帧封装 实验目的: • 编写程序,根据给出的原始数据,组装一个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标准的帧结构 前导码 帧前定界符 目的地址 源地址 长度字段 数据字段 校验字段 7B 1B (2/6B) (2/6B) (2B) (长度可变) (4B) 其中,帧数据字段的最小长度为46B。如果帧的LLC数据少于46B,那么应将数据字段填充至46B。填充字符是任意的,不计入长度字段值中。 在校验字段中,使用的是CRC校验。校验的范围包括目的地址字段、源地址字段、长度字段、LLC数据字段。 循环冗余编码(CRC)是一种重要的线性分组码、编码和解码方法,具有简单、检错和纠错能力强等特点,在通信领域广泛地用于实现过失控制。CRC校验码的检错能力很强,不仅能检查出离散错误,还能检查出突发错误。 利用CRC进行检错的过程可简单描述如下:在发送端根据要传送的k位二进制码序列,以一定的规那么产生一个校验用的r位监督码(CRC码),附在原始信息的后边,构成一个新的二进制码序列(共k+r位),然后发送出去。在接收端,根据信息码和CRC码之间所遵循的规那么进行检验,以确定传送中是否出错。这个规那么在过失控制理论中称为“生成多项式〞。 CRC的根本实现 前导码 帧前定界符 目的地址 源地址 长度字段 数据字段 校验字段 7B 1B (2/6B) (2/6B) (2B) (长度可变) (4B) 循环冗余校验码的特点:〔1〕CRC校验码可检测出所有单个错误。〔2〕CRC校验码可检测出所有奇数位错误。〔3〕CRC校验码可检测出所有双位的错误〔4〕CRC校验码可检测出所有小于、等于校验位长度的突发错误。〔5〕CRC校验码可以的概率检测出长度为(K+1)位的突发错误 实验分析: • 填充帧头部字段 要完成一次帧封装的过程,首先要完成的就是帧头部的装入,这一过程只要将签到吗、定界符、目的地址、源地址、长度字段的相应数值按顺序写入就可以了。其中,长度字段的值即为要发送的数据的实际长度。 • 填充数据字段 在填充数据字段的过程中要注意的主要问题是数据字段的长度。802.3标准中规定了帧数据字段的最小长度为46B,最大长度为1500B。如果数据缺乏46B,那么需要通过填充0来补足;假设数据长度超过1500B,那么的大奖超过局部封装入下一个帧进行发送。 • CRC校验 帧封装的最后一步就是对数据进行校验,并将校验结果记入帧校验字段。 程序流程图: CRC计算流程图: 序源代码: #include<iostream.h> #include<fstream.h> #include<stdlib.h> void main(int argc,charxargv[]) { //如果输入命令行不正确,那么输出提示后退出。 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的帧前定界符。 char des_add[]={char(0x00),char(0x00),char(0xE4),char(0x86),char(0x3A),char(0xDC)}; file.write(des_add,6);//写入B的目的地址。 char sor_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 charx 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

此文档下载收益归作者所有

下载文档
你可能关注的文档
收起
展开