温馨提示:
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