好文档就是一把金锄头!
欢迎来到金锄头文库![会员中心]
电子文档交易市场
安卓APP | ios版本
电子文档交易市场
安卓APP | ios版本

ip首部校验和算法.doc

16页
  • 卖家[上传人]:woxinch****an2018
  • 文档编号:39328608
  • 上传时间:2018-05-14
  • 文档格式:DOC
  • 文档大小:282.50KB
  • / 16 举报 版权申诉 马上下载
  • 文本预览
  • 下载提示
  • 常见问题
    • 实验报告(实验报告(3 3))————首部检验和的编程实现首部检验和的编程实现一、一、实验人员实验人员二、实验内容和要求二、实验内容和要求(一)实验内容(一)实验内容编写一个计算 IP 报文中首部校验和的程序,并且通过抓包随机选择一个数据报,提取出 IP 报文首部部分,根据程序计算出校验和的计算值,与报文中检验和对比,检验程序的正确性,计算结果为 0 保留数据报,否则丢弃二)实验要求(二)实验要求1.掌握 IP 数据报的结构,通过 wireshark 抓包随机选择一个 TCP 数据报,提取IP 报部分,并找到首部2.学习理解并运用 IP 首部校验和的计算算法,通过程序实现三、实验环境三、实验环境Wireshark 抓包工具Microsoft visual studio 2010 C#四、实验过程与结果分析四、实验过程与结果分析(一)实验过程1.利用 wireshark 抓包分析包格式并提取 IP 首部(1)IP 数据报格式如图 1,IP 数据报的首部为前 20 字节因为首部校验和的计算只需要 IP 数据报的首部 20 个字节即可,数据部分不参加运算所以只需要把 IP 数据包中的前 20 个 16 进制数提取出来作为运算的数据即可。

      图 1 IP 数据包格式(2)抓包得到的数据报图 2 TCP 数据报如图 2,通过 wireshark 抓包,随机选择一个 TCP 数据报,根据 TCP 数据报的 格式,我们分析数据报内容可以知道:首先开始 6 个字节为目的 mac 地址,后 面 6 个字节为目的 mac 地址,后面 2 个字节为协议类型为 0800,是 IP 协议包 所以再后面的 20 个字节就是 IP 数据报的首部部分也就是实验所需要的数据IP首部为:450000280000400034060ab73baf84710a687191 并且,通过包的计算的校验和结果,此包被留下,校验和的值为0也是座位后 面对设计程序计算得到结果的一个验证2.设计计算首部校验和的的算法(1)程序设计的函数模块关系输入 IP 首部 string IP0转化为二进制字符串并划分为 10 个字 段 IP1~IP10,函数 Getziduan()求字段反码,函数 FanMa()反码求和函数 FanSum() ; FanSum0() ;求出由上一布得到的结果的反码,输 出结果(2)算法流程首先将 IP 首部即 40 位 16 进制的字符串转化为二进制字符串,然后以每 16 位为一个字段,分为 10 个二进制字段。

      存放在 IP1~IP10 字符串中;然后求出每个字段的反码,根据 IP 数据报格式,可以知道 IP6 存放的就是校验和,将校验和 IP6 置位全 0;利用求反码和方法 FanMa() ,求出 10 个字段反码相加后的值 string sum,然后对字符串 sum 取反,得到发送时所用的校验码假设接收端的 IP 首部与发送的是相同的,那么其 10 个字段的利用反码和算法求出的值应为 0算法的流程与在发送端求出发送的校验码过程相同3)几个主要的方法将 16 进制转化为二进制的字符串操作:public static string Change(char a){switch (a){case '0': return “0000“;case '1': return “0001“;case '2': return “0010“;case '3': return “0011“;case '4': return “0100“;case '5': return “0101“;case '6': return “0110“;case '7': return “0111“;case '8': return “1000“;case '9': return “1001“;case 'a': return “1010“;case 'b': return “1011“;case 'c': return “1100“;case 'd': return “1101“;case 'e': return “1110“;case 'f': return “1111“;default: break;}return “xxxx“;} 求各字段的反码:public static string FanMa(string zd){string buff0 = ““;char a;for (int i = 0; i =0; i--){a = ip1[i];b = ip2[i];if (a == '0' k = 0;continue;}if (a == '1' k = 0;continue;}if (a == '1' k = 1;continue;}if (a == '1' k = 1;continue;}if (a == '1' k = 1;continue;}if (a == '0' k = 1;continue;}if (a == '0' k = 0;continue;}if (a == '0' k = 0;continue;}} for (int j = len-1; j >= 0; j--){buff1 = buff1 + buff[j];}if (k == 1)sum = FanSum0(buff1, “0000000000000001“, 16);else sum = buff1;return sum;}3.显示结果并与已知值对比结果显示最后的校验和为 0,这个数据包被留下,与实际情况相同,但此时还不能说明算法一定正确,因为我们还没有考虑数据包被丢弃的情况。

      在数据包被丢弃的情况下,肯定是最终算的校验和不为0,也就是接受到的IP首 部与发送的不同,因此我们只要将接收端用来计算校验和的字段IP1~IP10任意 更改一位,使其与原来不同即可我所做的更改为由原来IP1的反码: 1011101011111111,在计算接收端的校验和时更改为:1011101011111110 所得到的结果为:所以算法是正确的二)结果分析(二)结果分析通过数据包正确接收和被丢弃两种情况对设计的校验和计算算法的比较,计算的结果与实际情况校验和的值是一致的,因此在数据报在实际通信时,利用校验和的方式可以判定所接收的数据报是否发生了变化,保证了可靠性同时校验和的方法又是比较简便快速的,减少了时间上的开销,因此是在实际情况下比较适用的方法五、小结五、小结(一)实验中曾经出现的犯过的错误、遇到的问题及相应的解决方案1.在利用字符串计算字段相加求值时开始没有考虑到计算结果正好是实际值的倒叙,通过调试观察局部变量的方法发现了错误,将计算结果作了顺序的转换,使下面的计算得以正确2)通过本次实验,你的感受是什么?有什么收获通过这次实验我的感受是在实现算法时,首先要整理好清楚的思路,将设计的算法用流程图或者草图方式画出实现的步骤,这样能够更加有效率的进行编码,同时还能够使编码更加简洁清楚。

      同时我还对通过首部校验和来保证数据的可靠性的方法感到十分敬佩,利用很方便简单的方法就完成了校验最后通过这次实验,我也学习到了校验和算法的设计思想并亲手实现了,锻炼了自己的动手能力,也进一步对网络通信培养了兴趣六、附录六、附录[1] 程序全部代码 using System;using System.Collections.Generic;using System.Linq;using System.Text;namespace 校¡ê验¨¦和¨ª{class Program{static void Main(string[] args){string IP0 = “450000280000400034060ab73baf84710a687191“;string sum = ““; //存ä?放¤?发¤¡é送¨ª端?的Ì?反¤¡ä码?和¨ªstring sum1 = ““; //存ä?放¤?接¨®收º?端?的Ì?反¤¡ä码?和¨ªstring IP1 = ““; //第̨²一°?个?16位?字Á?段?string IP2 = ““; //第̨²二t个?string IP3 = ““; //第̨²三¨y个?string IP4 = ““; //第̨²四?个?string IP5= ““; //第̨²五?个?string IP6 = ““; //首º¡Á部?校¡ê验¨¦和¨ªstring IP7 = ““; //第̨²七?个?string IP8 = ““; //第̨²八ã?个?string IP9 = ““; //第̨²九?个?string IP10 = ““; //第̨²十º?个?IP1 = Getziduan(IP0, 0);IP2 = Getziduan(IP0, 4);IP3 = Getziduan(IP0, 8);IP4 = Getziduan(IP0, 12);IP5 = Getziduan(IP0, 16);IP6 = Getziduan(IP0, 20);IP7 = Getziduan(IP0, 24);IP8 = Getziduan(IP0, 28);IP9 = Getziduan(IP0, 32);IP10 = Getziduan(IP0, 36);Console.WriteLine(“IP1::::“ + IP1);Console.WriteLine(“IP2::::“ + IP2);Console.WriteLine(“IP3::::“ + IP3);Console.WriteLine(“IP4::::“ + IP4);Console.WriteLine(“IP5::::“ + IP5);Console.WriteLine(“IP6::::“ + IP6);Console.WriteLine(“IP7::::“ + IP7);Console.WriteLine(“IP8::::“ + IP8);Console.WriteLine(“IP9::::“ + IP9);Console.WriteLine(“IP10:::“ + IP10);Console.WriteLine(“首º¡Á部?校¡ê验¨¦和¨ª为aIP6:êo:êo“ + IP6);Console.WriteLine(“*******************************************“);Console.WriteLine(“计?算?接¨®收º?端?的Ì?反¤¡ä码?和¨ª“);IP6 = “0000000000000000“;Console.WriteLine(“发¤¡é送¨ª端?将?首º¡Á部?校¡ê验¨¦和¨ª字Á?段?置?零¢?IP6为a:êo:êo“ + IP6);Console.WriteLine(“求¨®反¤¡ä码?的Ì?结¨¢果?:êo“);IP1 = FanMa(IP1);IP2 = FanMa(IP2);IP3 = FanMa(IP3);IP4 = FanMa(IP4);IP5 = FanMa(IP5);IP6 = FanMa(IP6);IP7 = FanMa(IP7);IP8 = FanMa(IP8);IP9 = FanMa(IP9);IP10 = FanMa(IP10);Console.WriteLine(“IP1的Ì?反¤¡ä码?为a:êo:êo:êo“ + IP1);Console.WriteLine(“IP2的Ì?反¤¡ä码?为a:êo:êo:êo“ + IP2);Console.WriteLine(“IP3的Ì?反¤¡ä码?为a:êo:êo:êo“ + IP3);Console.WriteLine(“IP4的Ì?反¤¡ä码?为a:êo:êo:êo“ + IP4。

      点击阅读更多内容
      关于金锄头网 - 版权申诉 - 免责声明 - 诚邀英才 - 联系我们
      手机版 | 川公网安备 51140202000112号 | 经营许可证(蜀ICP备13022795号)
      ©2008-2016 by Sichuan Goldhoe Inc. All Rights Reserved.