【校验】TCP和UDP的校验和

  一开始,私以为校验和只是简单的求和得到的结果,后来在TCP和UDP里面看到使用的校验和方式有点奇怪--二进制反码(循环进位)求和

  人类的认知过程必将从简单到复杂,看下这个二进制反码循环求和是啥子意思。以16进制示例:

  1.对校验序列word1,word2...wordn的二进制表示求反码

  2.对求的反码序列循环进位求和,循环进位求和的意思是指把求和的进位加到低位,可能进位有x位,把这x位表示的数字和求和结果的16位相加。

  感觉好像变复杂了。没关系,二进制反码循环进位求和有以下特性:

  1.求和过程先求反码再二进制循环进位求和等价于先二进制循环进位求和再对求和结果求反码。(如此大大减少求反码的次数)

  2.与字节序(大端小端问题)无关。(这也许是许多协议使用这种方式求和的原因)

 1 ///@func:To caculate the Checksum of data
 2 ///@param:    1.nums :the number of sizeof(unsigned short int)
 3 ///
 4 unsigned short int WordCheckSum(const unsigned short int *data, unsigned short int nums)
 5 {
 6     short int index = 0;
 7     unsigned int sum = 0;
 8     unsigned short int checkSum ;
 9     for (index = 0; index < nums;index++)
10     {
11         sum += data[index];
12     }
13     //cout << "the sum of data is: " << hex << sum << endl;
14     checkSum = (unsigned short int)(sum & 0xffff)+(unsigned short int)(sum >> 16) ;
15     /*cout << "the checkSum of data is: " << checkSum << endl;*/
16     return ~checkSum;
17 }

  测试代码:

WORD data1[5] = {
        0x1122, 0x1122, 0x1122, 0x1122, 0x1122
    };
    WORD data2[5] = {
        0x2211, 0x2211, 0x2211, 0x2211, 0x2211
    };
    cout << "the CheckSum of data1 is: " << hex << WordCheckSum(data1, 5) << endl;
    cout << "the CheckSum of data2 is: " << hex << WordCheckSum(data2, 5) << endl;

  测试结果:

  可见,二进制反码求和与字节序无关。

时间: 2024-10-07 05:16:53

【校验】TCP和UDP的校验和的相关文章

使用Python计算IP、TCP、UDP校验和

1.1 ip校验和的计算 Ip校验是针对ip头部的,即仅校验ip头部,而对于ip数据部分的校验,则交由相应的四次协议来保证, ip 头部中校验和字段为16bit. 计算原理如下: 1.把校验和字段设置为0 2.计算ip头部中所有16bit的字之和 3.将2中得到的和按位取反,得到校验和. 1.2 tcp校验和的计算原理 对于ip层协议来说,其校验和只要计算ip头即可,那相对的,对于四层协议来说,其校验和则需要计算四层头部与四层数据. tcp校验需要将ip伪首部.tcp报头.tcp数据分为16位的

初入网络系列笔记(2)TCP和UDP

一.借鉴说明,本博文借鉴以下博文 1.BlueTzar,TCP/IP四层模型, http://www.cnblogs.com/BlueTzar/articles/811160.html 2.叶剑峰,漫谈TCP, http://www.cnblogs.com/yjf512/p/5909031.html 3.bizhu,TCP和UDP的区别(转), http://www.cnblogs.com/bizhu/archive/2012/05/12/2497493.html 4.任智康,TCP/IP.Ht

第六章TCP和UDP基本原理

TCP/IP协议族的传输层协议主要包括TCP和UDP.TCP是面向连接的可靠的传输协议.它支持在并不可靠的网络上实现面向连接的可靠数据传输.UDP是无连接的传输协议,主要用于支持在校可靠的链路上的数据传输,或用于对延迟敏感的应用. TCP/IP传输层的作用 TCP/IP的传输层位于应用层和网络层之间,为终端主机提供端到端的连接.TCP/IP的传输层有TCP和UDP两种主要协议.TCP和UDP都基于相同的网络层协议IP.传输层协议的主要作用: 提供面向连接或无连接的服务:传输层协议定义了通信两端点

以太网帧、TCP与UDP段以及IP数据报格式总结

传输层及其以下的机制由内核提供,是操作系统的一部分,应?层由?户进程提供应?层数据通过协议栈发到?络上时,每层协议都要加上?个数据?部(header),称为封装.不同的协议层对数据包有不同的称谓,在传输层叫做段(segment),在?络层叫做数据报(datagram),在链路层叫做帧(frame). 1.以太网帧格式 ?源地址和?的地址是指?卡的硬件地址(也叫MAC地址),长度是48位,是在?卡出?时固化的.Linux下可以?ifconfig命令看?下,"HWaddr 00:15:F2:14:9

TCP、UDP、RTP(RTCP)异同与区别

OSI七层模型OSI 中的层            功能                                                        TCP/IP协议族 应 用层                 文件传输,电子邮件,文件服务,虚拟终 端         TFTP,HTTP,SNMP,FTP,SMTP,DNS,Telnet 表示层                 数据格式化,代码转换,数据加密                                   

Linux 网络编程——TCP 和 UDP 数据报格式详解

TCP 报文格式 TCP(Transmission Control Protocol 传输控制协议)是一种面向连接的.可靠的.基于字节流的传输层通信协议. TCP 报文段的报头有 10 个必需的字段和 1 个可选字段.报头至少为 20 字节.报头后面的数据是可选项. 1)源端口(16位) 标识发送报文的计算机端口或进程.一个 TCP 报文段必须包括源端口号,使目的主机知道应该向何处发送确认报文. 2)目的端口(16位) 标识接收报文的目的主机的端口或进程. 3) 序号(也叫序列号)(32位) 用

【转】HTTP学习---TCP和UDP协议的区别与应用

[原文]https://www.toutiao.com/i6592813624689951239/ 概述 ⊙TCP/IP是个协议组,可分为三个层次:网络层.传输层和应用层. 在网络层有IP协议.ICMP协议.ARP协议.RARP协议和BOOTP协议. 在传输层中有TCP协议与UDP协议. 在应用层有FTP.HTTP.TELNET.SMTP.DNS等协议. ⊙TCP(Transmission Control Protocol),又叫传输控制协议:TCP 是面向连接的,并且是一种可靠的协议,在基于

TCP和UDP的区别

TCP和UDP的区别 TCP协议与UDP协议的区别 首先咱们弄清楚,TCP协议和UCP协议与TCP/IP协议的联系,很多人犯糊涂了,一直都是说TCP/IP协议与UDP协议的区别,我觉得这是没有从本质上弄清楚网络通信! TCP/IP协议是一个协议簇.里面包括很多协议的.UDP只是其中的一个.之所以命名为TCP/IP协议,因为TCP,IP协议是两个很重要的协议,就用他两命名了. TCP/IP协议集包括应用层,传输层,网络层,网络访问层. 其中应用层包括: 超文本传输协议(HTTP):万维网的基本协议

理解TCP和UDP协议

目录 TCP 协议 UDP协议 TCP和UDP的区别 TCP和UDP的使用场景 一 TCP协议 1.TCP的头部格式 理解TCP协议,首要的就是TCP协议的头部格式 ·        Source Port和Destination Port:分别占用16位,表示源端口号和目的端口号:用于区别主机中的不同进程,而IP地址是用来区分不同的主机的,源端口号和目的端口号配合上IP首部中的源IP地址和目的IP地址就能唯一的确定一个TCP连接: ·        Sequence Number:用来标识从T