解析IPv4和IPv6分组的校验和算法
- 格式:doc
- 大小:34.00 KB
- 文档页数:3
ipv6校验规则IPv6是互联网协议IPv4的升级版,它拥有更高的地址可用性和更好的性能。
IPv6地址是一个128位的二进制数,而IPv4地址是一个32位的二进制数。
在IPv6中,地址被表示为8组16进制数字,每组数字之间是由冒号隔开的。
IPv6的校验规则是指在IPv6地址被使用前需要遵循一些约定的规则来确保地址是有效的。
以下是IPv6校验规则的步骤:1. 确认IPv6的地址格式IPv6地址的格式与IPv4地址不同,需要以“:”分隔,每个分段是由16进制数字组成。
它包括8个分组,每个分组包含四个十六进制数字,每个十六进制数字是由0到9,以及字母A、B、C、D、E、F组成。
例如,一个IPv6地址看起来像这样:2001:0db8:85a3:0000:0000:8a2e:0370:7334。
2. 确认IPv6的地址位数IPv6地址是由128位的二进制数字组成,因此每个地址组必须是16位的,特别注意的是,IPv6地址不能有前导零。
3. 验证IPv6地址的正常性IPv6地址需要验证它的“正常性”,这个过程是指检查地址是否包括非法字符,这些字符包括字母i,o和u。
如果存在这些非法字符,那么IPv6地址是不正常的。
4. 验证IPv6地址是否为公有地址IPv6地址可以分为公有地址和私有地址。
公有地址是分配给互联网服务提供商和企业的地址,而私有地址是分配给设备和网络的地址。
在验证IPv6地址时,必须确定这是公有还是私有地址。
5. 验证IPv6地址是否为链接对本地地址“链接对本地地址”是在本地网络中使用的地址,它只能在本地网络中使用。
这种地址使用方法类似于IPv4中的“127.0.0.1”,需要确认IPv6地址是否为链接对本地地址。
6. 检查IPv6地址的唯一性IPv6地址是唯一的,因此在分配地址时需要确保地址的唯一性。
如果两个设备使用相同的IP地址,则它们将无法有效地通信。
在网络通信中,IPv6是一个重要的网络协议。
1、概述互联网已经成为现代社会信息基础设施的重要组成部分,在国民经济发展和社会进步中起着举足轻重的作用,同时也成为当今高科技发展的重要支撑环境,互联网的巨大成功有目共睹。
现在被全球广泛使用的互联网协议IPv4是“互联网协议第四版”,已经有30年的历史。
从技术上看,尽管IPv4在过去的应用具有辉煌的业绩,但是现在看来已经露出很多弊端。
全球范围内WLAN、2.5G、3G无线移动数据网络的发展加快了以互联网为核心的通信模式的形成,由于移动通信用户的增长要比固定网用户快得多,非凡是各种具有联网功能的移动终端的迅猛发展,考虑到随时随地的、任何形式、直接的个人多媒体通信的需要,现有的IPv4已经远远不能满足网络市场对地址空间、端到端的IP连接、服务质量、网络安全和移动性能的要求。
因此人们寄希望于新一代的IP协议来解决以上问题。
IPv6协议正是基于这一思想提出的,它是“互联网协议第六版”的缩写。
在设计IPv6时不仅仅扩充了IPv4的地址空间,而且对原IPv4协议各方面都进行了重新考虑,做了大量改进。
除了提出庞大的地址数量外,IPv6与IPv4相比,还有很多的工作正在进行以期得到更高的安全性、更好的可治理性,对 QoS和多播技术的支持也更为良好。
下面的章节将从几个主要的方面探讨一下IPv6与IPv4的区别。
2、IPv4与IPv6协议的比较2.1 报头格式IPv4报头如表1所示,包含20bit+选项,13个字段,包括3个指针。
表1 IPv4报头IPv6报头由基本报头+扩展报头链组成,其中基本报头如表2所示,包含40bit,8个字段。
表2 IPv6报头IPv4和IPv6报头格式主要区别如下。
IPv6报头采用基本报头+扩展报头链组成的形式,这种设计可以更方便地增添选项以达到改善网络性能、增强安全性或添加新功能的目的。
2.1.1 固定的IPv6基本报头IPv6基本报头被固定为40bit,使路由器可以加快对数据包的处理速度,提高了转发效率,从而提高网络的整体吞吐量,使信息传输更加快速。
Ipv4 (2)简介 (2)地址 (2)地址格式 (2)分配 (3)专用网络 (3)虚拟专用网络 (3)链路本地地址 (3)环回地址(Loopback Address) (4)以0或255结尾的地址 (4)地址解析 (4)网络地址转换 (5)Ipv6 (5)简介 (5)IPv6编址 (6)IPv6格式 (6)IPv6位址的分类 (6)IPv6部署与应用 (6)转换机制 (7)Ipv4简介互联网协议版本4(英语:Internet Protocol version 4,IPv4)是互联网协议开发过程中的第四个修订版本,也是此协议第一个被广泛部署的版本。
IPv4与IPv6均是标准化互联网络的核心部分。
IPv4依然是使用最广泛的互联网协议版本,直到2011年,IPv6仍处在部署的初期。
IPv4是一种无连接的协议,操作在使用分组交换的链路层(如以太网)上。
此协议会尽最大努力交付分组,意即它不保证任何分组均能送达目的地,也不保证所有分组均按照正确的顺序无重复地到达。
这些方面是由上层的传输协议(如传输控制协议)处理的。
地址IPv4使用32位(4字节)地址,因此地址空间中只有4,294,967,296(232)个地址。
不过,一些地址是为特殊用途所保留的,如专用网络(约18百万个地址)和多播地址(约270百万个地址),这减少了可在互联网上路由的地址数量。
随着地址不断被分配给最终用户,IPv4地址枯竭问题也在随之产生。
基于分类网络、无类别域间路由和网络地址转换的地址结构重构显著地减少了地址枯竭的速度。
但在2011年2月3日,在最后5个地址块被分配给5个区域互联网注册管理机构之后,IANA的主要地址池空了。
这些限制刺激了仍在开发早期的IPv6的部署,这也是唯一的长期解决方案。
地址格式IPv4地址可被写作任何表示一个32位整数值的形式,但为了方便人类,它分配最初,一个IP地址被分成两部分:网络识别码在地址的高位字节中,主机识别码在剩下的部分中。
scapy ipv4 checksum 校验和计算方法IPv4协议是Internet协议簇中用于网络包传送的一个主要协议。
在IPv4协议中,每个数据包都会有一个校验和字段,用于验证数据包在传输过程中是否发生了错误。
校验和是通过对包括源IP地址、目标IP地址、协议类型、数据长度等在内的数据包头部和数据部分进行计算而得出的一个值,接收方可以通过计算校验和来验证数据包的完整性。
在计算IPv4包的校验和时,首先需要将整个数据包按16位作为一个单位进行分组,对各个16位的单位进行求和,最后再加上进位的值。
最终得到的结果取反就是IPv4包校验和的值。
下面我们将详细介绍计算IPv4包校验和的方法。
首先,我们需要了解IPv4协议数据包的格式。
一个典型的IPv4数据包包括了如下的字段:版本号、头部长度、区分服务、总长度、标识、标记、生存时间、协议类型、校验和、源IP地址、目标IP地址、选项(可选)、数据(Payload)等。
其中,我们关注的是校验和字段,也就是在IP头部中的第十个字节和第十一个字节。
接下来,我们来了解一下IPv4包校验和的计算过程。
在计算校验和时,我们需要对数据包中的各个16位的单位进行求和。
具体的计算方法包括以下几个步骤:1.对所有的16位的值进行求和,得到一个累加和。
2.将累加和按16位进行截取,进行溢出位的处理。
3.取得到的结果的反码作为校验和的值。
具体的计算过程为:1.首先,将所有的16位的值进行求和。
这里需要注意的是,需要将校验和字段先置为0,然后再对所有的16位的数据进行求和。
2.接着,将得到的累加和值按16位进行截取,并将溢出位加回到累加和值中。
3.最后,对得到的结果取反,得到最终的校验和值。
举个例子来说明:假设我们有一个IPv4数据包,其前20个字节依次为0101010101010101、0110011001100110、1001100110011001、1011011101110111。
解析IPV4报文和IPV6报文的checksum的算法:校验和(checksum)算法,简单的说就是16位累加的反码运算:计算函数如下:我们在计算时是主机字节序,计算的结果封装成IP包时是网络字节序,注意这两者之间的区别,我们在从IP包里读取要转化为主机字节序,往IP包里存入时要转化为网络字节序在存入。
UINT32 Checksum(UINT32 cksum, VOID *pBuffer, UINT32 size){INT8 num = 0;UINT8 *p = (UINT8 *)pBuffer;if ((NULL == pBuffer) || (0 == size)){returncksum;}while (size > 1){cksum += ((UINT16)p[num] << 8 & 0xff00) | (UINT16)p[num + 1] & 0x00FF;2个字节累加,先取网络字节序低位左移8位(变成主机字节序高位),与(加)上网络字节序中的高位(主机字节序地位),即网络字节序要先变成主机字节序在进行累加, size -= 2;num += 2;}if (size > 0)如果长度为奇数{cksum += ((UINT16)p[num] << 8) & 0xFFFF;如果总的字节数为奇数,则最后一个字节单独相加num += 1;}while (cksum>> 16){cksum = (cksum& 0xFFFF) + (cksum>> 16);累加完毕将结果中高16位再加到低16位上,重复这一过程直到高16位为全0}returncksum;}注意:UINT32 cksum的类型,这里是4个字节的,防止在累加的过程中,数据溢出,(例如0xFF累加时就会内存溢出)详细的计算过程和原理如下一:ip头的计算:直接对头部数据进行累加(不包括原来的checksum值):1、ipv4包头ipHeadLen = (pIpHeader->ver_ihl& 0x0F) << 2;在ipv4头中,版本类型和头长度加在一起是1个字节(8位),各占4位,版本类型在前,长度在后,所以要取长度只能取低4位,pIpHeader->chksum = 0;因为不包括原来的checksum值,所以在每次计算前先把checksum的值置0,然后计算 sum = Checksum(0, (VOID *)pIpHeader, ipHeadLen);对整个ip包头的累加pIpHeader->chksum = HTONS((UINT16)(~sum));结果为计算值的反码,(别忘转化为网络字节序)2、ipv6包头在ipv6中已经省略了checksum部分,但在后面的部分要有的,比如TCP/UDP包,别高兴的太早二、TCP/UDP报文的计算(举例UDP):这里的checksum包含两部分,一部分是伪头的累加,还有一部分是UDP包的累加(不包括原来的checksum值)伪头有分ipv4和ipv6两种,分别包含如下几部分,这里做下比较1、 ipv4类型的:第一部分,伪头部分的计算:sum = 0;udpLen =sizeof(UDP_HEADER_T) + dhcpLen;UDP的长度= UDP的包头长度+ UDP的数据长度sum += udpLen;或者,下面也是一样的,这里就是网络字节序和主机字节序的区别了,上面的是(主机字节序)直接累加,下面的是网络字节序,一定要变成主机字节序后累加pUdpHeader->len = HTONS(udpLen);主机字节序转化为网络字节序,存入数据包中,一定要注意,我们做的所有累加也是网络字节序,这里一定要搞清楚,以防混淆搞错了sum += (pUdpHeader->len>> 8 & 0x00FF);2个字节的累加,先取网络字节序的高位,右移8位,变成主机字节序的低位,累加sum += (pUdpHeader->len<< 8 & 0xFF00);在取网络字节序的低位,左移8位,变成主机字节序的高位,累加sum = Checksum(sum, (VOID *)&pIpHeader->saddr, 4);sum = Checksum(sum, (VOID *)&pIpHeader->daddr, 4);对4位的地址进行累加sum += ((UINT16)pIpHeader->proto & 0x00FF);对1位的协议类型进行累加伪头部分计算完成第二部分,UDP数据包的计算pUdpHeader->chksum = 0;注意:每次计算前别忘先把checksum的值置0,然后计算sum = Checksum(sum, (VOID *)pUdpHeader, udpLen);对整个UDP包的累加pUdpHeader->chksum = HTONS((UINT16)(~sum));结果为计算值的反码,(别忘转化为网络字节序)UDP数据包部分计算完成2、 ipv6类型的:第一部分,伪头部分的计算:sum = 0;udpLen =sizeof(UDP_HEADER_T) + dhcpLen;sum += udpLen;或者pUdpHeader->len = HTONS(udpLen);sum += (pUdpHeader->len>> 8 & 0x00FF);sum += (pUdpHeader->len<< 8 & 0xFF00);sum = Checksum(sum, (VOID *)&pIpHeader->saddr, 16); sum = Checksum(sum, (VOID *)&pIpHeader->daddr, 16); 对16位的地址进行累加sum += ((UINT16)pIpHeader->proto & 0x00FF); 伪头部分计算完成第二部分,UDP数据包的计算pUdpHeader->chksum = 0;注意:每次计算前别忘先把checksum的值置0,然后计算sum = Checksum(sum, (VOID *)pUdpHeader, udpLen);对整个UDP包的累加pUdpHeader->chksum = HTONS((UINT16)(~sum)); 结果为计算值的反码,(别忘转化为网络字节序)UDP数据包部分计算完成。
ipv4和ipv6正则表达式IPv4和IPv6正则表达式IPv4和IPv6是互联网中常用的两种IP地址类型。
为了验证和匹配这两种类型的IP地址,可以使用正则表达式。
本文将介绍如何使用正则表达式来验证和匹配IPv4和IPv6地址。
一、IPv4正则表达式IPv4地址由四个由点分隔的十进制数字组成,每个数字的范围是0-255。
下面是一个用于匹配IPv4地址的正则表达式示例:^(?:(?:25[0-5]|2[0-4][0-9]|[01]?[0-9][0-9]?)\.){3}(?:25[0-5]|2[0-4][0-9]|[01]?[0-9][0-9]?)$正则表达式解析:- ^(开始)和$(结束)限制了整个字符串必须是一个IPv4地址,没有其他额外的字符。
- (?:25[0-5]|2[0-4][0-9]|[01]?[0-9][0-9]?)匹配每个点分隔的数字。
其中,25[0-5]匹配250-255之间的数字,2[0-4][0-9]匹配200-249之间的数字,[01]?[0-9][0-9]?匹配0-199之间的数字。
- \.匹配点。
使用该正则表达式,可以验证一个字符串是否是有效的IPv4地址。
二、IPv6正则表达式IPv6地址由八个由冒号分隔的十六进制数字组成,每个数字的范围是0-FFFF。
下面是一个用于匹配IPv6地址的正则表达式示例:^(?:[0-9a-fA-F]{1,4}:){7}[0-9a-fA-F]{1,4}$正则表达式解析:- ^和$限制了整个字符串必须是一个IPv6地址,没有其他额外的字符。
- (?:[0-9a-fA-F]{1,4}:){7}匹配七个由冒号分隔的十六进制数字。
[0-9a-fA-F]{1,4}匹配一个十六进制数字,{1,4}表示该数字的长度为1到4位。
- [0-9a-fA-F]{1,4}匹配最后一个十六进制数字。
使用该正则表达式,可以验证一个字符串是否是有效的IPv6地址。
三、如何使用正则表达式要使用正则表达式验证和匹配IPv4或IPv6地址,可以使用编程语言中支持正则表达式的函数或类库。
ip校验规则一、IP校验规则简介IP校验规则是指用于验证IP地址格式和范围的规则,以确保网络通信的顺畅进行。
IP地址是互联网上设备之间互相通信的唯一标识,因此IP校验规则在保证网络稳定运行中起着至关重要的作用。
二、IP地址分类与表示方法1.IPV4地址IPV4地址是互联网最常用的地址类型,它采用32位二进制表示,总共分为A、B、C、D、E五类。
其中,A类地址范围为1.0.0.0至126.255.255.255,B类地址范围为128.0.0.0至191.255.255.255,C类地址范围为192.0.0.0至223.255.255.255,D类地址为组播地址,范围为224.0.0.0至239.255.255.255,E类地址为保留地址,范围为240.0.0.0至255.255.255.255。
2.IPV6地址IPV6地址是下一代互联网地址,采用128位二进制表示。
相较于IPV4,IPV6具有更多的地址空间,提高了网络安全性和隐私保护能力。
IPV6地址分为单播、组播和任播三种类型,用于不同场景的通信。
三、IP校验算法1.子网掩码子网掩码是一种用于划分IP地址的网络部分和主机部分的算法。
通过子网掩码,可以将一个大型网络划分为多个较小的子网,提高IP地址的利用率。
子网掩码通常用一个32位的二进制数表示,其中网络部分为1,主机部分为0。
2.CIDR(无类别域间路由)CIDR是一种用于表示网络地址的编码方式,它将IP地址和子网掩码合并为一个统一的表示形式。
CIDR地址格式为“IP地址/子网掩码”,如“192.168.1.0/24”。
CIDR有效地简化了网络地址的表示和计算,便于网络管理和规划。
3.网络层协议校验网络层协议校验是指对IP数据报进行校验,确保数据在传输过程中不被篡改。
主要方法有校验和算法、加密算法等。
这些算法可以检测到数据报在传输过程中的错误,保证数据完整性。
四、IP校验实例与应用1.网络诊断与故障排查通过IP校验规则,可以快速定位网络故障,如IP地址冲突、子网划分不当等问题。
《TCP/IP协议分析》实验报告实验序号:3 实验项目名称:分析IPv4和IPv6 数据包20网工学号姓名专业、班实验地点指导教师实验时间2022-9-14 一、实验目的及要求,步骤和结果动手项目3-1:使用Wireshark软件查看IPv4数据包首部所需时间: 20 分钟。
项目目标:学习使用Wireshark软件查看IPv4数据包的首部。
过程描述:本项目介绍如何捕获网络上的一个数据包,选择一个特定的数据包,查看该数据包的IPv4首部。
你可以捕获自己的数据进行分析,或启动Wireshark 软件,打开从本书配套网站上下载的文件IPv4Fields.pcap,直接跳到第(8)步。
(1)启动Wireshark软件(单击“开始”,指向“所有程序”,然后单击Wireshark。
也可以单击“开始”,在“运行”对话框中输入"Wireshark", 然后单击“确定”按钮)。
(2)单击Capture菜单,然后单击Interfaces 菜单项,出现Capture Interfaces 窗口。
(3)可能会显示有多个网卡,选定一个在Packets栏显示了实时数据包的网卡,然后单击Start 按钮,出现Capturing窗口。
(4)打开一个命令提示符窗口(单击“开始”按钮,在“运行”对话框中输入cmd,然后单击“确定”按钮)。
(5) ping 本地网络中的计算机IPv4地址。
(6)在命令提示符窗口中输入exit命令并按Enter键,关闭命令提示符窗口。
(7)在Wireshark软件中,单击菜单栏上的Capture,然后单击Stop (或者单击工具栏上的Stop 图标)。
(8)在数据包列表面板(上部面板)中选择一个TCP数据包(9)在数据包详细内容面板(中部面板),展开Internet Protocol Version4, 如图所示。
(10)查看Version和Header lenght字段的值。
(11)展开Differentiated Services Field, 查看Total Length和ldentification字段的值,然后再收起它。
ip校验规则摘要:一、IP 校验规则简介1.IP 地址的重要性2.IP 校验规则的作用二、IP 校验规则的分类1.网络层IP 校验规则2.传输层IP 校验规则三、IP 校验规则的应用1.网络安全防护2.网络通信优化3.网络设备配置四、IP 校验规则的发展趋势1.IPv6 地址的普及2.安全策略的完善3.智能化技术的融入正文:随着互联网的飞速发展,IP 地址在网络通信中扮演着越来越重要的角色。
IP 校验规则作为保障网络通信正常进行的关键技术,越来越受到人们的关注。
本文将为您介绍IP 校验规则的相关知识。
IP 校验规则主要用于检查IP 数据包的合法性,确保数据包在网络中的正确传输。
它主要包括网络层IP 校验规则和传输层IP 校验规则。
在网络层,IP 校验规则主要针对IP 地址进行校验,确保数据包的发送方和接收方能够正确识别对方。
例如,IPv4 地址采用32 位二进制数表示,其中前12 位表示网络地址,后24 位表示主机地址。
通过IP 校验规则,可以避免数据包在网络中的错误传输。
传输层IP 校验规则主要针对传输层协议进行校验,如TCP 和UDP。
这些协议在传输数据时需要确保数据的完整性和正确性。
传输层IP 校验规则通过对数据包的校验和进行计算,以验证数据在传输过程中是否发生错误。
IP 校验规则在实际应用中具有广泛的应用。
首先,在网络安全防护方面,IP 校验规则可以防止非法IP 地址入侵,保障网络的安全稳定。
其次,在网络通信优化方面,IP 校验规则可以提高数据包的传输效率,降低网络拥堵。
最后,在网络设备配置方面,IP 校验规则可以确保设备参数的正确性,提高设备的稳定性和可靠性。
随着互联网技术的不断发展,IP 校验规则也将不断完善。
IPv6 地址的普及将为IP 校验规则带来更大的挑战,同时也为网络安全提供了更丰富的策略。
此外,随着智能化技术的融入,IP 校验规则将变得更加智能化、自动化,以满足不断变化的需求。
解析IPv4和IPv6分组的校验和算法
77 发表于 2005-10-26 10:02:00
关于IP分组头的校验和(checksum)算法,简单的说就是16位累加的反码运算,但具体是如何实现的,许多资料不得其详。
TCP和UDP数据报头也使用相同法,的校验算但参与运算的数据与IP分组头不一样。
此外,IPv6对校验和的运算与IPv4又有些许不同。
因此有必要对IP分组的校验和算法作全面的解析。
IPv4分组头的结构如下所示:
0 1 2 3 0 1 2 3 4 5 6 7 8 9 0 1 2 3 4 5 6 7 8 9 0 1 2 3 4 5 6 7 8 9 0 1 +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+ |Version| IHL |Type of Service| Total Length | +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+ | Identification |Flags| Fragment Offset | +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+ | Time to Live | Protocol | Header Checksum | +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+ | Source Address | +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+ | Destination Address | +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+ | Options | Padding | +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
其中的"Header Checksum"域即为头校验和部分。
当要计算IPv4分组头校验和时,发送方先将其置为全0,然后按16位逐一累加至IPv4分组头结束,累加和保存于一个32位的数值中。
如果总的字节数为奇数,则最后一个字节单独相加。
累加完毕将结果中高16位再加到低16位上,重复这一过程直到高16位为全0。
下面用实际截获的IPv4分组来演示整个计算过程:
0x0000: 00 60 47 41 11 c9 00 09 6b 7a 5b 3b 08 00 45 00
0x0010: 00 1c 74 68 00 00 80 11 59 8f c0 a8 64 01 ab 46
0x0020: 9c e9 0f 3a 04 05 00 08 7f c5 00 00 00 00 00 00
0x0030: 00 00 00 00 00 00 00 00 00 00 00 00
在上面的16进制采样中,起始为Ethernet帧的开头。
IPv4分组头从地址偏移量0x000e开始,第一个字节为0x45,最后一个字节为0xe9。
根据以上的算法描述,我们可以作如下计算:
(1) 0x4500 + 0x001c + 0x7468 + 0x0000 + 0x8011 +
0x0000 + 0xc0a8 + 0x6401 + 0xab46 + 0x9ce9 = 0x3a66d
(2) 0xa66d + 0x3 = 0xa670
(3) 0xffff - 0xa670 = 0x598f
注意在第一步我们用0x0000设置头校验和部分。
可以看出这一分组头的校验和与收到的值完全一致。
以上的过程仅用于发送方计算初始的校验和,实际中对于中间转发的路由器和最终接收方,可将收到的IPv4分组头校验和部分直接按同样算法相加,如果结果为0xffff,则校验正确。
如何编写产生IPv4头校验和的C程序?RFC1071(Computing the Internet Checksum)给出了一个参考实现:
{
/* Compute Internet Checksum for "count" bytes
* beginning at location "addr".
*/
register long sum = 0;
while( count > 1 ) {
/* This is the inner loop */
sum += * (unsigned short) addr++;
count -= 2;
}
/* Add left-over byte, if any */
if( count > 0 )
sum += * (unsigned char *) addr;
/* Fold 32-bit sum to 16 bits */
while (sum>>16)
sum = (sum & 0xffff) + (sum >> 16);
checksum = ~sum;
}
对于TCP和UDP的数据报,其头部也包含16位的校验和,校验算法与IPv4分组头完全一致,但参与校验的数据不同。
这时校验和不仅包含整个TCP/UDP数据报,还覆盖了一个虚头部。
虚头部的定义如下:
0 7 8 15 16 23 24 31
+--------+--------+--------+--------+
| source address |
+--------+--------+--------+--------+
| destination address |
+--------+--------+--------+--------+
| zero |protocol| TCP/UDP length |
+--------+--------+--------+--------+
其中有IP源地址,IP目的地址,协议号(TCP:6/UDP:17)及TCP或UDP数据报的总长度(头部+数据)。
将虚头部加入校验的目的,是为了再次核对数据报是否到达正确的目的地,并防止IP欺骗攻击(spoofing)。