如何计算TCP和UDP校验和?

时间:2020-03-21 11:48:01  来源:igfitidea点击:

当我们通过网络发送和接收数据时,数据可能会被破坏,更改或者修改(这可能是偶然的,有意的作恶)。
无论是哪种情况,都需要一种方法,使接收者可以轻松地验证并弄清楚数据是否被更改或者损坏。

通常情况是这样。
发送方计算一个简短的校验和值(大小非常小),该值代表正在发送的消息/数据。
计算出的值可以与消息一起发送,也可以通过其他方法发送。
一旦接收到数据,接收器还将计算校验和。
如果(发送方和接收方)的值都相符,则数据不会损坏/未更改。

感谢设计哈希算法的密码学家。
一些流行的哈希算法是MD5,SHA1等。
我们可能已经注意到提供了我们要下载的文件的MD5和SHA1哈希值。
这是因为我们可以计算所下载文件的哈希值,然后,如果该哈希值与中提到的哈希值匹配,则可以确保该文件没有损坏/未更改。

MD5和SHA1主要用于验证文件的完整性。
但是,Internet通信(核心网络数据验证。
TCP和UDP数据验证)没有利用MD5或者SHA1.
互联网通信和哈希算法使用的方法相似,但不完全相同。
因为在每种情况下需求都是不同的。

冲突是哈希算法中最重要的因素。
毫无疑问,“没有两个哈希输出将具有相同的值”这一事实得到了保证。
如果有两个不同的数据集具有相同的哈希输出,则可以达到目的。
因为对于特定数据它应该是唯一的。
然后,只有我们可以验证完整性。
MD5和SHA1集中精力实现无碰撞输出。
它的设计确实很坚固,并且没有任何碰撞。
这就是其用于文件完整性验证的原因。
哈希函数的优点还在于它是哈希的一种方式。
如果我们具有哈希值,则无法获取数据。
这就是大多数时候密码以哈希值形式存储在数据库中的原因。
当用户输入密码时,登录程序将生成密码的哈希值,并将其与数据库中的哈希值进行比较。
如果两个值都匹配,则允许用户登录。

这样,TCP和UDP校验和计算就不必担心冲突了(与md5和sha1算法相比)。
快速有效地检测错误对于TCP和UDP校验和,而不是冲突而言,更为重要。

因此,TDP和UDP校验和使用补码方法来计算校验和。

一个补码就是什么,而是当我们将所有0更改为1以及将1s更改为0时所获得的值。
例如,110111001010的补码为001000110101.

补码方法如何用于UDP和TCP校验和计算?

让我们通过一个例子来理解这一点。
假设我们有一个UDP段或者一个TCP数据包。
我们要做的第一件事是将其分割并切成16位片段。
假设我们有以下三个16位数据。

1 0 0 1 1 0 1 0 0 1 0 1 0 1 1 0

0 0 0 0 1 0 1 1 1 0 0 0 1 1 1 0

0 0 0 0 1 1 0 1 1 1 0 0 1 1 0 0

如果我们使用二进制加法将这三个16位数据相加。
我们得到下面的16位数据(它是简单的二进制加法)。

1001101001010110 + 0000101110001110 + 0000110111001100 = 1011001110110000

我们的结果1011001110110000的补码是0100110001001111(这是我们的校验和)。
因此,我们基本上需要将数据(这是三个16位二进制数字)连同其校验和一起发送到reciaver。
要了解的主要是,接收者将获得数据以及我们计算出的校验和。

接收者将获得以下物品。

1 0 0 1 1 0 1 0 0 1 0 1 0 1 1 0(数据)

0 0 0 0 1 0 1 1 1 0 0 0 1 1 1 0(数据)

0 0 0 0 1 1 0 1 1 1 0 0 1 1 0 0(数据)

0 1 0 0 1 1 0 0 0 1 0 0 1 1 1 1(校验和)

接收者将简单地添加上述所有4件事。
数据以及校验和被加在一起。
让我们尝试添加它。

1001101001010110 + 0000101110001110 + 0000110111001100 + 0100110001001111 = 1111111111111111

如果16位数据和校验和的总和输出为1111111111111111.
所有字段将为1s。
即使有一个0,也意味着在传输过程中在数据中引入了错误。

这达到了目的。
与md5和sha1不同,它的计算和验证也非常简单。
当涉及二进制加法时,计算机是非常酷的:)。
这正是TCP和UDP校验和的计算方式。

关于此TCP和UDP校验和计算,还有更多的事情要理解。
校验和不仅使用TCP/UDP标头和数据进行计算。
它还会从IP标头中通告几位数据。
该数据有时称为伪标头。

伪头的全部内容约为12个字节(32位源地址+ 32位目标地址+ 8位保留+ 16位tcp长度+ 8位协议类型= 96位= 12字节)。
我们可以清楚地看到,尽管我们正在讨论传输层中的校验和计算,但其中大多数来自IP标头(来自网络层)。

这就是它的工作方式。
在发送方,当数据到达传输层时,系统现在需要计算校验和。
它临时构造伪头。
记住这个词是临时的。
构造此伪标头后,将其保留在缓冲区中。
然后,它通过将整个事物分成16位块(伪头,tcp数据,tcp头)开始计算校验和,然后将其相加。
最后,它像我们之前所做的那样计算补码。

计算完校验和后,校验和的结果将转到正确的位置。
这是TCP报头的校验和字段。
一旦将校验和放置在真实的TCP头中,则将临时创建的用于计算校验和的伪头丢弃。

但是,当计算校验和本身时,TCP报头中的校验和字段的值是多少?
我们了解到校验和计算本身使用TCP标头,数据和伪标头。
那么在此计算过程中,将在tcp标头的校验和字段中放置什么?

在计算校验和期间,该字段通常保持为0。
计算后,正确的值将替换所有0。

还请记住一个事实,即伪头永远不会离开系统。
它被丢弃,并且永远不会成为TCP标头,IP标头或者任何通过电线的内容的一部分。

那么在目标端会发生什么呢?

完全相同的事情也会在目标端发生。
构造一个临时的伪头并将其与实际的TCP头和数据一起提供给传输层。
这是临时添加到tcp/udp段的,以计算校验和。

如果临时伪头,tcp数据,tcp头的相加结果全部为1,则接收端可以确认数据未损坏。

为什么需要伪标头?

这是一个合理的问题。
因为IP(网络层)标头也有其自己的校验和字段。
那么在计算TCP/UDP校验和时从那里取几个字段有什么意义呢?

如果源地址或者目标地址不匹配,则校验和将失败。
请注意,即使网络数据包以某种方式到达传输层,也仍然需要使用校验和对源和目标进行二次验证。
主要目的是以100%的肯定性确认TCP/UDP数据已到达正确的目的地。

关于伪头的主要理解是,它永远不会离开系统。
但是它仍然通过添加另一层验证来完成其工作。
如果我们在几分钟内捕获了系统上的网络流量,则可以在wireshark等工具中看到TCP/UDP校验和值。

sudo tcpdump -vvv -s 0 -l -n port 80 -w tcp-out.pcap

上面的命令将捕获朝向端口号80的数据包,然后将输出写入名为tcp-out.pcap的文件。
然后可以将此文件导入到wireshark等工具中,以进行进一步分析。
我们应该能够在wireshark的TCP/UDP部分下看到校验和。

将数据均等地划分为16位的块也是不可能的(例如,最后一个块可能没有16位)。
为了解决这个问题,在校验和的计算过程中,二进制值前面加零以使其变为16位。