当前位置:文档之家› ip首部校验和算法

ip首部校验和算法

{ string buff = ""; buff = FanSum0(ip1, ip2, len); buff = FanSum0(buff, ip3, len); buff = FanSum0(buff, ip4, len); buff = FanSum0(buff, ip5, len); buff = FanSum0(buff, ip6, len); buff = FanSum0(buff, ip7, len); buff = FanSum0(buff, ip8, len); buff = FanSum0(buff, ip9, len); buff = FanSum0(buff, ip10, len); return buff;
string IP0 = "450000280000400034060ab73baf84710a687191";
string sum = "";
//存ä?放¤?发¤¡é送¨ª端?的Ì?反¤¡ä码?和¨ª
string sum1 = "";
//存ä?放¤?接¨®收º?端?的Ì?反¤¡ä码?和¨ª
string IP1 = "";
} for (int j = len-1; j >= 0; j--) {
buff1 = buff1 + buff[j]; }
if (k == 1) sum = FanSum0(buff1, "0000000000000001", 16);
else sum = uff1; return sum; }
求各字段的反码:
public static string FanMa(string zd) { string buff0 = ""; char a; for (int i = 0; i < zd.Length; i++) { a = zd[i]; if (a == '0') { buff0 = buff0 + "1"; } else {
2.设计计算首部校验和的的算法
(1)程序设计的函数模块关系
输入 IP 首部 string IP0
转化为二进制字符串并划分为 10 个字 段 IP1~IP10,函数 Getziduan() 求字段反码,函数 FanMa()
反码求和函数 FanSum();FanSum0();
求出由上一布得到的结果的反码,输出 结果
所以算法是正确的。
(二)结果分析
通过数据包正确接收和被丢弃两种情况对设计的校验和计算算法的比较,计 算的结果与实际情况校验和的值是一致的,因此在数据报在实际通信时,利用校 验和的方式可以判定所接收的数据报是否发生了变化,保证了可靠性。同时校验 和的方法又是比较简便快速的,减少了时间上的开销,因此是在实际情况下比较 适用的方法。
五、小结
(一)实验中曾经出现的犯过的错误、遇到的问题及相应的解决方案。 1.在利用字符串计算字段相加求值时开始没有考虑到计算结果正好是实际值的 倒叙,通过调试观察局部变量的方法发现了错误,将计算结果作了顺序的转换,
使下面的计算得以正确。
(二)通过本次实验,你的感受是什么?有什么收获。 通过这次实验我的感受是在实现算法时,首先要整理好清楚的思路,将设计的算 法用流程图或者草图方式画出实现的步骤,这样能够更加有效率的进行编码,同 时还能够使编码更加简洁清楚。同时我还对通过首部校验和来保证数据的可靠性 的方法感到十分敬佩,利用很方便简单的方法就完成了校验。最后通过这次实验, 我也学习到了校验和算法的设计思想并亲手实现了,锻炼了自己的动手能力,也 进一步对网络通信培养了兴趣。
a = ip1[i]; b = ip2[i]; if (a == '0' && b == '1' && k == 0) {
buff = buff + "1"; k = 0; continue; } if (a == '1' && b == '0' && k == 0) { buff = buff + "1";
六、附录
[1] 程序全部代码
using System; using System.Collections.Generic; using System.Linq; using System.Text; namespace 校¡ê验¨¦和¨ª {
class Program {
static void Main(string[] args) {
实验报告(3) ——首部检验和的编程实现 一、 实验人员 二、实验内容和要求 (一)实验内容
编写一个计算 IP 报文中首部校验和的程序,并且通过抓包随机选择一个数据报, 提取出 IP 报文首部部分,根据程序计算出校验和的计算值,与报文中检验和对 比,检验程序的正确性,计算结果为 0 保留数据报,否则丢弃。
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); Console.WriteLine("IP5的Ì?反¤¡ä码?为a:êo:êo:êo" + IP5); Console.WriteLine("IP6的Ì?反¤¡ä码?为a:êo:êo:êo" + IP6); Console.WriteLine("IP7的Ì?反¤¡ä码?为a:êo:êo:êo" + IP7); Console.WriteLine("IP8的Ì?反¤¡ä码?为a:êo:êo:êo" + IP8);
图 1 IP 数据包格式
(2)抓包得到的数据报
图 2 TCP 数据报
如图 2,通过 wireshark 抓包,随机选择一个 TCP 数据报,根据 TCP 数据报的格 式,我们分析数据报内容可以知道:首先开始 6 个字节为目的 mac 地址,后面 6 个字节为目的 mac 地址,后面 2 个字节为协议类型为 0800,是 IP 协议包。所以 再后面的 20 个字节就是 IP 数据报的首部部分。也就是实验所需要的数据。 IP首部为:450000280000400034060ab73baf84710a687191 并且,通过包的计算的校验和结果,此包被留下,校验和的值为0。也是座位后 面对设计程序计算得到结果的一个验证。
相关主题