IP/UDP/TCP/ICMP数据报协议的校验和的区别和计算

IP,TCP,UDP,ICMP校验和的区别和计算 IP校验和的计算IP数据报的校验和只检验IP数据报的首部。当发送IP包时,需要计算IP报头的校验和: 把校验和字段置为0; 对IP头部中的每16bit进行二进制求和; 如果和的高16bit不为0,则将和的高16bit和低16bit反复相加,直到和的高16bit为0,从而获得一个16bit的值; 将该16bit的值取反,存入校验和字段。 当接收IP包时,需要对报头进行确认,检查IP头是否有误,算法同上 阅读详情

IP/UDP/TCP/ICMP数据报协议的校验和的区别和计算




1、现针对各种协议数据包校验的区别总结如下:

(1)IP校验和:

IP数据报的校验和只检验IP数据报的首部。

(2)UDP校验和:

UDP数据报计算校验和的方法和IP数据报校验和的方法相似,但是UDP的校验和是将首部和数据部分一起都校验。
并且在计算UDP校验和之前需要封装一个伪首部,伪首部结构如下(具体结构定义见后面代码部分):

源IP地址 | 目的IP地址 | 全 0 | 协 议 | UDP长度


(3)TCP校验和:

TCP 的校验和计算方法同UDP一样,同样要加上一个伪头部,区别是伪头部的协议码是0x06,长度是整个TCP报文的长度(包含TCP头部)。

(4)ICMP校验和:

ICMP校验和的计算方法一样,只不过只是对ICMP包整个进行校验和,没有伪头部,也不包括IP包头部。

总结如下: 计算IP数据报和ICMP的校验和时不需要封装伪首部,他俩不同的是IP数据报只检验IP数据报的首部,而ICMP数据报校验包括ICMP头部和数据部分(整个ICMP长度),TCP和UDP的校验方法和IP、ICMP校验方法一样,但是TCP和UDP校验之前需要封装伪首部。还有一个需要注意的是校验的顺序是从上(层)到下(层),如校验ICMP时,先校验ICMP后校验IP(ICMP数据包结构=ether + IP + ICMP), 并且校验之前需要先将校验和的值初始化为0.

2、以上的几种数据报的校验和的计算方法都一样,把校验部分看成以16位为单位的数字组成,依次进行二进制反码求和。

具体如下:
unsigned short check_sum(unsigned short *packet,int packlen)
{
register unsigned long sum = 0;
while (packlen > 1)
{
sum += *(packet++);
packlen -= 2;
}
if (packlen > 0)
sum += *(unsigned char *) packet;
while (sum >> 16)
sum = (sum & 0xffff) + (sum >> 16);


return (unsigned short) (~sum);
}

3、应用举例(UDP校验):

注:当一个数据包中有多个数据报协议时,校验的顺序必须是从上往下,
例:一个数据报的封装为 以太网首部+IP首部+UDP首部+数据,那么在计算校验和的步骤如下:
(1)分别将IP和UDP的校验和置0;
(2)计算UDP校验和(包括已封装伪首部的UDP头+数据);
(3)计算IP校验和;

下面为计算UDP校验和的示例:
//定义校验UDP时的伪首部结构体
typedef struct {
struct in_addr s_addr;         //源IP
struct in_addr d_addr;         //目的IP
unsigned char mbz;             //全0
unsigned char ptcl;            //协议
unsigned short plen;           //UDP长度(UDP头+数据)
}udp_psd_header;



udph->check = 0;           //不能省略
udph->check = udp_chksum(iph, udp_len); 
//校验和,这里传入参数iph(IP首部指针)是因为封装UDP伪首部时需要知道源IP、目的IP,而知道了IP首部指针,自然也就知道了UDP首部指针
iph->ip_sum = 0;            //不能省略
iph->ip_sum = check_sum((unsigned short*)iph, sizeof(struct ip));  //校验和

//UDP校验和程序
//校验UDP/TCP首部首先需要封装一个为首部,然后再校验,校验长度包括头和数据部分
unsigned short udp_chksum(void *data_ip,int udp_len)   //udp_len = UDP首部+数据
{
udp_psd_header * pudp_psd_header;
pudp_psd_header = (udp_psd_header *)malloc(udp_len+sizeof(udp_psd_header));
if(!pudp_psd_header) 
return -1;
memset(pudp_psd_header,0,udp_len+sizeof(udp_psd_header));
//封装伪首部
pudp_psd_header->s_addr= ((struct ip *)data_ip)->ip_src;
pudp_psd_header->d_addr= ((struct ip *)data_ip)->ip_dst;
pudp_psd_header->mbz=0;
pudp_psd_header->ptcl=IPPROTO_UDP;
pudp_psd_header->plen=htons(udp_len);

memcpy((unsigned char *)pudp_psd_header+sizeof(udp_psd_header),(unsigned char *)data_ip+sizeof(struct ip),udp_len);
return check_sum((unsigned short *)pudp_psd_header,udp_len+sizeof(udp_psd_header));

}



计算机网络—IP头部结构,TCP头部结构,UDP头部结构 IP头部结构 IP头部结构图如下 注意:一行32bit为4字节,扩展的时候总是一行一行的拓展,也就是4个字节4个字节的扩展 版本号(Version):长度4bit,标识目前采用的IP协议的版本号,一般的值0100(IPv4),0110(IPv6) 首部长度(Header Length):长度4bit,这个字段的作用是为了描述IP头部的长度,IP头部长度是可变的(最常用的是红框中的部分,一共占20字节)。 - 首部长度部分占4个bit位,取值范围是0-15,单位为32bit(4个字节) - 整个IP头部 阅读详情

相关推荐

以太网协议介绍(ARP、UDP、ICMP、IP)

IP:internet protocol(网际协议)IP协议是TCP/IP协议簇中的核心协议之一,也是TCP/IP协议的载体,IP协议规定了数据传输时的基本单元和格式。所有的TCP、UDP以及ICMP数据都是以IP数据报格式传输的。IP数据报格式:IP首部是以4(32bit)个字节为单位,版本:IPv4 or IPv6;IPv4的地址是4个字节,即为0100,IPv6是6个字节,即0110;

xzs520xzs的博客 1万+

IP校验和(checksum)原理

IP头部校验和原理,原始套接字自行组包用到,附带示例。

weixin_28673511的博客 6312

【计算机网络实验】IP协议和ICMP协议的抓包分析(wireshark)

计算机网络实验——基于wireshark的IP协议和ICMP协议抓包分析

发布一些个人学习笔记,分享一些可能在安全学习道路上遇到的问题、心得,一起学习一起进步 5745

ip数据报计算首部检验和

需要注意的是,在计算IP数据包首部检验和时,应该将源地址和目的地址转换成网络字节序,即大端序。网络字节序是一种规范化的字节序,用于在网络中传输数据,它的顺序与我们平时使用的主机字节序是不同的。当我们在使用互联网进行数据传输时,数据可能会被篡改或者损坏。为了保证数据传输的可靠性和完整性,计算IP数据包首部检验和是一种非常重要的校验机制。本文将会介绍计算IP数据包首部检验和的方法。首先,我们需要了解IP数据包首部的结构。

bigBbug的博客 8155

【计算机网络】Linux下的网络通信协议(TCP、UDP、IP、ICMP、ARP、DNS)

各层协议的作用:https://www.cnblogs.com/pengjie-py/p/11256483.htmlTCP/IP 意味着 TCP 和 IP 在一起协同工作。TCP 负责应用软件(比如你的浏览器)和网络软件之间的通信。IP 负责计算机之间的通信。TCP 负责将数据分割并装入 IP 包,然后在它们到达的时候重新组合它们。IP 负责将包发送至接受者。 TCP 详细总结戳:https:...

weixin_41646851的博客 1527

【上海大学计算机组成原理实验报告】一、数据传送实验

将58H写入A寄存器//将6BH写入W寄存器//将C3H写入R1寄存器//将C3H写入R1寄存器//了解实验仪器数据总线的控制方式//掌握数据传送的基本原理//掌握各寄存器的结构、工作原理及其控制方法//数据传送实验

HackerKevon的博客 3509

学习记录_网络层基础

初次学习网络协议记录,如有错误请见谅,欢迎大家补充修改哈。 目录 网络层_大概的结构: 网络层的首部由下述几个部分构成: 大概的字段功能: 具体的字段功能解释: [4位]-IP协议版本:指该IP包用于IPV6还是IPV4 [4位]-整个首部长度(缩放系数为4) [8位]-区分服务SOQ:用于在网络中通过优先级来调整传输先后 [16位]-总长度(首部长度+数据长度):用于记录整个IP包的长度,最大长度为65535个字节(即0xFFFF=216-1) [16位]-标识字段:用于给每一个IP.

LP的博客 435

【毕设】基于LoRa的物联网控制器:从原理图到PCB的完整硬件设计指南

本文提供了一份完整的基于LoRa的物联网控制器硬件设计指南,涵盖从系统框图、原理图设计到PCB布局布线的全流程。详细讲解了电源电路、单片机最小系统、信号接口以及LoRa无线模块等核心模块的设计要点与抗干扰技巧,并分享了实用的调试心得,旨在帮助电子、物联网专业学生顺利完成毕业设计,掌握低功耗远距离物联网节点的硬件开发实践。

weixin_42126677的博客 306

ICMP(协议)

ICMP协议

m0_62665450的博客 3098

Delphi 12社区版免费了!手把手教你搭建跨平台开发环境(Windows/macOS/Android/iOS)

本文详细介绍了如何利用新发布的Delphi 12社区版,免费搭建支持Windows、macOS、Android和iOS的跨平台开发环境。内容涵盖从环境准备、安装、配置各平台SDK(包括Android与macOS/iOS的PAServer连接),到创建首个FireMonkey跨平台应用、集成数据库以及调试部署的完整实战流程,帮助开发者零成本启动高效开发。

butter的博客 975

产生式系统的完整示例——医疗诊断系统(附python代码)

发烧(Fever)、咳嗽(Cough)、皮疹(Rash)、喉咙痛(SoreThroat)、头痛(Headache)、流涕(RunnyNose)、呼吸困难(ShortnessOfBreath)、白细胞计数高(HighWBC)、接触流感患者(ContactFlu)、接触麻疹患者(ContactMeasles)。(2)若规则库中存在尚未使用过的规则,而且它的前提(前件)可与综合数据库中的已知事实匹配,则转第(3)步;(3)执行当前选中的规则,并对该规则做上标记,把该规则执行后得到的结论送入综合数据库中。

搏博的专栏 1701

通讯协议之几种常用的数据帧校验方式

简介     我们知道数据在传输过程中,可能会存在数据出错的情况。为了保证数据传输的正确性,因此会采取一些方法来判断数据是否正确,或者在数据出错的时候及时发现进行改正。常用的几种数据校验方式有奇偶校验、CRC校验、LRC校验、格雷码校验、和校验、异或校验等。 一、奇偶校验 1. 定义 根据被传输的一组二进制代码中“1”的个数是奇数或偶数来进行校验。 使用:通常专门设置一个奇偶校验位,存放代码中“1”的个数为奇数还是偶数。若用奇校验,则奇偶校验位为奇数,表示数据正确。若用偶校验,则奇偶校验位为偶数,表示数据正

路过的熊的博客 9063

MacOS上如何修改jupyter book的默认打开地址以及如何复制文件路径

记点笔记,才换新系统小半年,还是不太熟悉,所以记录一下笔记,感觉之后也会用到,希望能帮到你们。主要内容是:修改jupyter的默认地址以及复制文件路径。

魔仙的博客 1978

IP TCP UDP ICMP校验和的区别和计算

IP校验和的计算 IP数据报的校验和只检验IP数据报的首部。 当发送IP包时,需要计算IP报头的校验和: 把校验和字段置为0; 对IP头部中的每16bit进行二进制求和; 如果和的高16bit不为0,则将和的高16bit和低16bit反复相加,直到和的高16bit为0,从而获得一个16bit的值; 将该16bit的值取反,存入校验和字段。 当接收IP包时,需要对报头进行确认,检查IP头是否有误,算法同上2、3步,然后判断取反 的结果是否为0,是则正确,否则有错。 代码如下: unsigned

輚至消亡 2708

3篇1章6节:R基础绘图之图形的保存和导出技巧

高质量图形导出是R语言用户在数据分析和科研工作中的重要技能。通过合理控制图形的分辨率、选择合适的颜色管理方案和文件格式,以及掌握批量保存图形的技巧,可以显著提升图形的展示效果和应用范围。这不仅有助于提高研究成果的展示质量,还能在各种专业场合中展现数据分析的精确性和美观性。

MD Code 1480

基于FPGA的万兆以太网UDP/IP协议栈讲解

31bit,这种传输次序为big endian(大端对齐)。TCP/IP所有二进制整数在网络中传输时都要求采用这种次序,因此这种传输次序又称为网络字节序。版本(Version)+首部长度(IHL):长度为1字节。版本[0:3]就是IPv4或者IPv6,一般选择IPv4,即版本值为4。首部长度[4:7]是指首部有多少个32位数,因为4位的最大值为15,因此首部最长为60字节,5表示固定最小值为20字节。选项部分(可选字段)的最大值为40字节,不够4的倍数要用0填充,使数据部分的起始地址为4的倍数。...

ltqdxl的博客 1万+

jre9下载 jdk9

(Java SE Runtime Environment 9.0) 9.0u175 官方最新版 【x86|x64】

IP、ICMP、UDP、TCP 校验和算法

以前看计算机网络相关的书,每次看到IP或者UDP报头校验和时,都一瞥而过,以为相当简单,不就是16bit数据的相加吗。最近在研究《TCP/IP详解 卷1:协议》这本书,看到校验和是16bit字的二进制反码和(晕,以前都没注意原来是反码和,看来以前看书不仔细啊!罪过,罪过~~),觉得很奇怪,为什么会用反码和,而不是直接求和呢?(因为我认为TCP/IP协议里面的算法和思想一般都是非常经典的,人家这么做

春风得意,马蹄仍急;少年豪情,一笑难回。 910

廖雪峰Python教程[完整版]

廖雪峰的python教程整理的,已经排好版了,而且还是完整的,适合小白

LinePhone3.2.7(android端最新版本) sip客户端

SIP客户端For android:LinePhone3.2.7(最新版本),官网地址:http://www.linphone.org/

ICMP、ARP、TCP/UDP协议

这里写目录标题一级目录二级目录三级目录一级目录二级目录三级目录 一级目录 二级目录 三级目录 一级目录 二级目录 三级目录

weixin_56422027的博客 1104

VC中sqlite的使用

在VC中对sqlite的使用,实现数据库大批数据的快速插入,读取数据库中的数据在ListCtrl中显示

关于checksum校验和算法

今天复习计网的时候看到了UDP头部有差错校验,其中的checksum算法没理的太清楚,索性写一篇博客,顺便回顾一下其他的。 校验和覆盖的内容: IP校验和:IP首部。 ICMP校验和:ICMP首部+ICMP数据; UDP、TCP校验和:首部+数据+12个字节伪首部(源IP地址、目的IP地址、协议、TCP/UDP包长)。 计算校验和的步骤: [1]把校验和字段设置为0。 [2]把需要校验的数据看成以16位为单位的数字组成,依次进行二进制反码求和。 [3]把得到的结果存入校验和字段中。 另外UDP、TCP数据报

weixin_42268798的博客 8494

UDP/IP传输协议

一、传输层最重要的协议就是TCP和UDP。TCP协议复杂,是面向连接的传输协议且传输可靠;而UDP协议简单,是面向无连接的传输协议,传输速度快但传输不可靠。可以将UDP协议看作IP协议暴露在传输层的一个接口。 UDP协议同样以数据报(datagram)的方式进行数据传输,而且UDP协议提出了端口(port)的概念。IP协议进行的是IP地址到IP地址的传输。但是每台计算机有多个通信通道,并将多个通...

大不列颠小小咸鱼 1万+

udp校验和计算方法_程序员必备基础知识-UDP协议的详细解析

【关注我】,学习不迷路。关于C/C++,Linux,golang,Nginx,ZeroMQ,MySQL,Redis,fastdfs,MongoDB,ZK,流媒体,CDN,P2P,K8S,Docker,ffmpeg,TCP/IP,协程,DPDK,嵌入式等学习资料,请大家加群私聊管理领取。QQ群:1106675687。一、UDP的概述(User Datagram Protocol,用户数据报协议)UD...

weixin_39630880的博客 5260

IP、TCP、UDP首部详解

IP首部 IP首部字段图 IP首部字段详情 4位版本: 协议版本号,IPv4是0100,IPv6是0110,目前基本都是IPv4版本。 4位首部长度: 指首部占32bit字的数目,包括选项区,也就是说单位是4个字节,如图1-1首部是20个字节,那首部字段值为5,即0101,首部最大值是1111,也就是说首部长度字段最大可表示15(1111)*4 = 60字节长度(包含选项段)。普通IP数据报(没...

xupeng1644的博客 5433

IP,TCP,UDP,ICMP校验和的区别

IP,TCP,UDP,ICMP校验和的区别 IP校验和=IP头部的计算 TCP, UP校验和=伪首部+TCP/UDP报头+数据 ICMP校验和=ICMP报头+数据

一天不学习,就浑身难受 599
上一篇: Linux系统在未登录的情况下修改root密码方法(linux系统忘记root密码,进不去系统怎么办)
下一篇: 怎样修改Linux的hostname
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值