计算校验和程序
13
核心程序设计思路及实现(续)
3. 输出完整数据报
• 创建输出流,使用 进制的方式打开输出文件 创建输出流,使用2进制的方式打开输出文件
fstream fOutfile; // 创建输出文件流 // 以2进制方式打开输出文件 fOutfile.open(argv[2],ios::in|ios::out|ios::binary|ios::trunc);
•
通过write()函数将存储在缓冲区的数据报一次性 函数将存储在缓冲区的数据报一次性 通过 写入到输出文件
// 将pBuf中的数据报写入输出文件 fOutfile.write((char *)pBuf, 4+wLen);
14
提纲
• • • • •
编程训练目的 编程训练要求 相关知识介绍 程序设计分析 扩展与提高
3
编程训练目的
• 掌握在给定的数据报格式条件下构造数据 报并计算数据报的校验和的方法, 报并计算数据报的校验和的方法,加深对 网络差错校验技术的理解 • 掌握网际校验和算法原理与软件实现方法 • 熟悉计算网际校验和的增量式计算法
4
提纲
• • • • •
编程训练目的 编程训练要求 相关知识介绍 程序设计分析 扩展与提高
9
网际校验和算法特性
交换律和结合律 字节顺序独立 并行计算 可以提高校验和计算速度的技术 延迟进位 循环展开 数据读入与校验合二为一 增量式更新
10
提纲
• • • • •
编程训练目的 编程训练要求 相关知识介绍 程序设计分析 扩展与提高
11ห้องสมุดไป่ตู้
核心程序设计思路及实现
1. 读入数据文件并构造数据报
• 创建输入流,直接使用2进制的方式打开输入文件 创建输入流,直接使用 进制的方式打开输入文件
15
扩展与提高
增量式算法的补码实现
HC C HC' C' m m' —— 修改前的头部校验和 —— 修改前的反码和 —— 修改后的头部校验和 —— 修改后的反码和 —— 修改前的 位数值 修改前的16位数值 —— 修改后的 位数值 修改后的16位数值
增量式更新法
C' = C + (-m) + m' = C + (m' - m)
增量式算法的补码实现
HC' = ~(C + (-m) + m') = HC + (m - m') = HC + m + ~m'
16
扩展与提高 对增量式算法的改进
HC' = ~(C + (-m) + m') = ~(~HC + ~m + m')
17
ifstream fInfile; // 创建输入文件流 fInfile.open(argv[1], ios::in|ios::binary); //打开指定的输入文件
•
构造数据报缓冲区, 构造数据报缓冲区,给数据报赋值
/*定义数据报缓冲区,缓冲区大小为4+wLen ,其中4为数据报类型字段、长度字段 及校验和字段的长度和,wLen为数据字段长度*/ unsigned char * pBuf = new unsigned char[4+wLen]; pBuf[0] = unsigned char(0xab); // 给数据报类型字段赋值 pBuf[1] = unsigned char(wLen); // 给数据报长度字段赋值 *(unsigned short *)(pBuf+2) = 0;// 计算校验和之前,校验和字段先置为0 fInfile.read(pBuf+4, wLen); // 根据输入文件填充数据报的数据字段 fInfile.open(argv[1], ios::in|ios::binary); //打开指定的输入文件 // 计算校验和并把结果填入到数据报的校验和字段 *(unsigned short *)(pBuf+2) = checksum_calculating((unsigned short *)pBuf, 4+wLen);
第4章 计算校验和程序
1
概述
为保证网络上数据传输的可靠性, 为保证网络上数据传输的可靠性,在IP、 、 ICMP、IGMP、UDP和TCP等协议中都设 、 、 和 等协议中都设 置了校验和项, 置了校验和项,实际中使用的校验和算法 是网际校验和算法
2
提纲
• • • • •
编程训练目的 编程训练要求 相关知识介绍 程序设计分析 扩展与提高
6
程序运行的参考界面
7
提纲
• • • • •
编程训练目的 编程训练要求 相关知识介绍 程序设计分析 扩展与提高
8
网际校验和算法 • 把检验和字段置 ,把所有需要被校验的数 把检验和字段置0, 据划分为16 位一组的比特序列, 据划分为 位一组的比特序列,然后对每 16位的反码求和,结果取反,便得到校验 位的反码求和, 位的反码求和 结果取反, 和 • 为了验证校验和的正确性,对所有的数据 为了验证校验和的正确性, 求反码和,如果结果全1, 求反码和,如果结果全 ,则表示校验结果 正确
12
核心程序设计思路及实现(续)
2. 计算校验和 延迟进位法 • 算法思想是:将进位累加的过程延迟到整个 算法思想是: 累加循环结束之后进行, 累加循环结束之后进行,从而提高计算速度 • 实现:在32位的计算机上,把需要校验的数 实现: 位的计算机上, 位的计算机上 据按16位一组进行累加 结果存放在32位的 位一组进行累加, 据按 位一组进行累加,结果存放在 位的 累加器中,这样溢出位就保存在高16位上。 累加器中,这样溢出位就保存在高 位上。 位上 全部累加结束后再把32位累加器中高 位累加器中高16位累 全部累加结束后再把 位累加器中高 位累 加到低16位上 那么低16位值的反码即为最 位上, 加到低 位上,那么低 位值的反码即为最 终的校验和
5
编程训练要求
编写程序,计算自定义格式数据报的网际校验和: 编写程序,计算自定义格式数据报的网际校验和: • 自定义的格式如下: 自定义的格式如下:
报文类型(8位, 指定为0xab) 长度 (8位) 数据字段 …… 校验和(16位)
• 程序要求以命令行方式运行: 程序要求以命令行方式运行: Checksum inputfile outputfile 其中, 是程序名; 是输入文件, 其中,Checksum是程序名;inputfile是输入文件, 是程序名 是输入文件 该文件包含数据字段的内容; 为输出文件, 该文件包含数据字段的内容;outputfile为输出文件, 为输出文件 该文件保存封装完毕后的数据报