网络传输信号检测与纠正
一、网络校验和Internet Checksum
1.简介
Internet Checksum算法是一种用于检测数据传输错误的校验和算法,广泛应用于各种网络协议中。
2.应用场景
- IP层校验:在IP协议中,Checksum算法用于校验IP头部数据的完整性。发送方计算IP头部的校验和,并将其存储在IP头部中,接收方则重新计算接收到的IP头部的校验和,并与存储的值进行比较,以检测数据是否在传输过程中发生错误。
- TCP/UDP校验:TCP和UDP协议也使用Checksum算法来校验传输层数据的完整性。与IP头部校验类似,发送方计算传输层数据的校验和,并将其包含在相应的头部中,接收方则进行验证。
- 其他网络协议:除了IP、TCP和UDP之外,其他网络协议也可能使用Checksum算法来确保数据的完整性。
3.实践
- 算法实现:Internet Checksum算法的实现通常涉及将发送的数据以两字节为单位进行补码相加,然后将得到的32位数的低16位和高16位相加,并对结果求反,得到校验和。接收方则使用相同的算法进行验证。
- 编程实践:在编程中,可以使用各种编程语言来实现Internet Checksum算法。例如,在C语言中,可以通过逐字节读取数据、进行累加和计算以及求反等操作来实现该算法。
- 性能优化:在实际应用中,为了提高性能,可以对Checksum算法进行优化。例如,可以使用硬件加速、并行计算等技术来加速校验和的计算过程。
4.示例
基于反码(一补数)的加法原理
- 发送者:按序累加计算发送的数据,计算出一个校验和,再对校验和取反码,然后将该反码添加到发送数据序列的最后一起发送出去;
- 接收者:和发送者一样累加计算出一个校验和,然后使用该校验和与收到的反码相加,得到结果十六进制FFFF或者全是1的二进制。
- Checksum 二进制反码加法
1101
+1001
------
10110
|-->1 循环进位,最高位溢出到最低位,结果如下
= 0111
- Checksum 十六进制反码加法
F204
+F321
------
1E525 高位F+F相当于十进制15+15=30,按照16进制计算30-16=14=十六进制的E,然后高位加1,结果就是 F+F=1E;最后最高位溢出到最低位,结果如下
= E526
- 示例:网络中传输内容如下,然后进行校验检查
(1)内容: 00FE C523 FDA1 D68A AF02
00FE C523 FDA1 D68A AF02 的checksum=B6AE
00FE
+ C523
-------
= C621
+ FDA1
-------
1C3C2 循环进位,高位溢出到低位
= C3C3
+ D68A
-------
19A4D 循环进位,高位溢出到低位
= 9A4E
+ AF02
-------
14950
= 4951
取该结果的反码
第一种方式:十六进制 4951 二进制= 0100 1001 0101 0001,反码= 1011 0110 1010 1110
第二种方式:15减去每一位,及 15-4=11=B 15-9=6=6 15-5=10=A 15-1=14=E
最终反码结果,也是校验和checksum:B6AE
(2)发送的数据的时候,会将反码加到发送序列尾部
发送内容:00FE C523 FDA1 D68A AF02 B6AE
(3)接收者接收数据
接收者为了确保接收内容是正确的,会按照(1)步骤一样进行一次计算,但是得到得反码会与(1)发送内容的校验码 B6AE进行计算
00FE
+ C523
-------
= C621
+ FDA1
-------
1C3C2 循环进位,高位溢出到低位
= C3C3
+ D68A
-------
19A4D 循环进位,高位溢出到低位
= 9A4E
+ AF02
-------
14950
= 4951 接收者接收到的数据计算出来的结果,不需要取反,然后会使用该结果与收到数据尾部的反码进行加法运行
-------
+ B6AE 4951 + B6AE 接收者计算出的结果与发送者计算出的反码进行加法运算,得到结果如下
-------
= FFFF 当结果都是FFFF或者二进制全是1的时候(同样的十六进制数值取反相加会得到FFFF),证明接收的内容与发送的内容一致(接收内容正确)
二、循环冗余校验CRC
1.简介
在计算机网络和数据传输领域,循环冗余校验(CRC)是一种用于检测数据传输或存储中的错误的技术。CRC通过在数据后面添加一个校验码(也称为冗余位)来实现,这个校验码是基于原始数据和一些预设的参数(例如多项式)计算得出的。
2.应用场景
- 数据通信:在数据通过媒体或网络进行传输时,CRC校验码可以检测传输过程中可能发生的噪声、干扰或其他传输错误。接收方通过CRC校验码可以验证数据的完整性,并在必要时请求重新发送数据;
- 存储介质:在存储介质上读取或写入数据时,CRC校验码可以检测位翻转、介质故障等错误。通过在数据存储时使用CRC校验码,可以在读取数据时检测到这些错误,从而保证数据的完整性;
- 网络通信协议:许多网络通信协议(如Ethernet、WiFi、USB等)使用CRC校验码作为数据帧的一部分,以确保传输的数据准确无误。接收方在接收到数据帧后,使用CRC校验码来验证数据的完整性;
- 文件传输和存储:在文件传输和存储过程中,CRC校验码可以检测数据在传输或存储过程中可能发生的错误,确保文件内容的完整性和准确性;
- 其他应用:CRC校验码还应用于各种通信系统、存储系统和数据传输系统中,提高数据的可靠性,减少传输或存储过程中的错误。
3.实践
- 选择生成多项式:首先需要选定一个生成多项式 𝐺(𝑥),这个多项式的选取对于检测不同类型的错误非常重要。不同的协议可能采用不同的标准多项式,例如CRC-32、CRC-16等。
- 准备数据:
- 将原始数据视为一个二进制数𝐷(𝑥)。
- 为了计算CRC校验码,在数据的末尾添加𝑛个0位,其中𝑛是生成多项式𝐺(𝑥)的最高次幂减1。这样做是为了给校验位腾出空间。
- 模2除法运算:
- 使用模2除法(即不带借位或进位的二进制除法),将步骤2中得到的数据(附加上𝑛个零后的数据)除以生成多项式𝐺(𝑥)。
- 这里的“除法”实际上是按位异或(XOR)操作实现的。每次比较并执行XOR操作直到处理完所有位。
- 获得余数:上述除法的结果是一个余数(也是二进制形式),其长度比生成多项式的阶数少一位。这就是CRC校验码。
- 附加校验码:将此CRC校验码替换掉之前添加的𝑛个0位,形成最终要发送的数据。
- 验证:接收方收到数据后,用相同的生成多项式对整个消息(包括校验码部分)进行相同的计算。如果结果为0,则认为数据未受损;否则表示数据传输中出现了错误。
4.示例
(1)发送k位的数据
(2)创建一个包含n位的桢(n>k,n-k=额外的位数;额外的位数将用于创建桢检查序列,既生成多项式(𝐺(𝑥)))
(3)创建一个桢检查序列FCS(Frame Check Sequence),长度为n-k位
(4)使用模2运算(XOR),计算FCS
(5)将FCS添加到发送的数据桢尾部
(6)例子:
- 原始数据 D=1011010010 (10bit)
- 𝐺(𝑥))多项式 P=110010 (6bits)
- FCS初始数据 F=00000
发送数据演算过程
原始数据 将被填充的FCS
1011010010 00000 XOR 110010
演示运算过程
1 第1次-110010得到的结果
11 第2次-110010得到的结果
1101 第3次-110010得到的结果
1101000100第4次-110010得到的结果
101101001000000 XOR 110010
-110010
-----------------
= 111110 得到余数11111,继续从发送数据中取值补充位数到6,111110
- 110010
-----------------
= 110001 得到余数1100,继续从发送数据中取值补充位数到6,110001
- 110010
-----------------
= 110000 得到余数11,继续从发送数据中取值补充位数到6,110000
- 110010
-----------------
= 1000 得到求余结果,但是位数只有5位,而FCS的长度是5位,则需要在左侧补充0到FCS设置的长度,得到如下结果:
-----------------
= 01000 该结果就是FCS
-------------------------------
发送数据:原始数据+截取计算结果指定长度作为FCS
1011010010 01000 最终发送数据
-------------------------------
接收数据演算过程
原始数据 将被填充的FCS
1011010010 01000 XOR 110010
演示运算过程
1 第1次-110010得到的结果
11 第2次-110010得到的结果
1101 第3次-110010得到的结果
1101000100第4次-110010得到的结果
101101001001000 XOR 110010 注意:收到的数据结尾是01000
-110010
-----------------
= 111110 得到余数11111,继续从发送数据中取值补充位数到6位,111110
- 110010
-----------------
= 110001 得到余数1100,继续从发送数据中取值补充位数到6位,110001
- 110010
-----------------
= 110010 得到余数11,继续从发送数据中取值补充位数到6位,与发送端不同的地方值110010
- 110010
-----------------
= 00 得到余数00,由于后续没有可以计算了,最终结果是 0000
-----------------
= 0000 最终余数都是0
-------------------------------
当计算出来得余数是0时,接收者就可以合理地确定数据在传输中没有发生错误
-------------------------------
三、向前纠错FEC
1.简介
(1)简介
FEC(前向纠错,Forward Error Correction)是一种用于控制错误的编码形式,它允许数据接收者检测并纠正传输过程中产生的错误,而无需重新发送数据。这种方法特别适用于单向通信系统,如卫星通信、数字电视和深空通信等,其中请求重传数据可能不切实际或效率低下。
(2)编码方案
FEC通过在原始数据中添加冗余信息来工作。这些额外的信息使得接收端能够检测并自动纠正一定数量的比特错误。不同类型的FEC使用不同的编码方案,包括但不限于:
- 汉明码(Hamming Code):一种能纠正单个比特错误的线性纠错码。
- 里德-所罗门码(Reed-Solomon Code):广泛应用于数字通信和存储系统中,可以纠正多个连续比特的错误。
- 低密度奇偶校验码(LDPC, Low-Density Parity-Check Code):一种高效的现代编码技术,可以在非常高的数据率下操作,并提供接近香农极限的性能。
- 卷积码(Convolutional Code):通过将当前的数据位与之前的数据位结合生成编码输出,适用于需要高可靠性但不要求非常高数据速率的应用场景。
(3)优势与挑战
- 优势:
提高了数据传输的可靠性和效率,尤其是在高误码率的环境中
减少了因重传导致的延迟,适合实时应用。 - 挑战
编码和解码过程增加了计算复杂度。
需要在增加的数据量(由于冗余信息)与期望的纠错能力之间找到平衡。
2.应用场景
- 卫星通信:卫星通信通常涉及长距离传输,信号衰减严重,且由于延迟问题,重传请求(ARQ)机制不太实用。FEC可以显著提高数据传输的可靠性,减少数据包丢失
- 无线通信:在移动通信网络中,如4G/LTE、5G以及未来的6G网络,FEC用于对抗多径效应和信道噪声带来的影响。此外,Wi-Fi和蓝牙等短距离无线通信技术也常使用FEC来提高数据传输的鲁棒性
- 互联网传输:在实时视频流媒体服务中,FEC用于保证视频质量,即使在网络状况不佳的情况下也能避免卡顿。在点对多点的多播网络中,FEC能够有效减少重传请求的开销,并提高数据分发效率
- 光通信系统:在光纤通信中,FEC被用来补偿高速数据传输时的信噪比损失,提高系统的传输距离和容量
- 数字电视广播:数字电视广播系统使用FEC确保高质量的视频和音频信号传输,即使是在恶劣的接收条件下也能保持良好的观看体验
- VoIP(Voice over IP):在语音通信中,FEC可以帮助减少丢包引起的语音断续现象,提高通话质量
- 存储系统:在硬盘驱动器、固态驱动器(SSD)和其他存储介质中,FEC用于检测和纠正存储过程中的读取错误
- 深空通信:对于与太空探测器的通信,由于极长距离传输和信号衰减,FEC能够显著提高通信的稳定性
- 波分复用系统(DWDM):在长途密集波分系统中,FEC技术用于确保可靠的数据传输
- 400G以太网:现代通信系统广泛使用FEC技术来确保可靠和高性能的通信链路,特别是在400G以太网中,FEC模块的部署已成为标准
3.实践
- 编码阶段:在发送端,FEC编码器根据选定的编码方案对原始数据进行编码,产生包含冗余信息的新数据流。这个过程增加了传输数据量,但提供了纠错能力。
- 传输阶段:编码后的数据通过信道传输,在此过程中可能会引入错误。
- 解码阶段:在接收端,FEC解码器利用接收到的数据(包括原始数据和冗余信息)尝试纠正任何出现的错误。如果错误的数量不超过编码方案的设计能力,则可以完全恢复原始数据。
4.示例
(1)汉明码示例
- 汉明距离(Hamming Distance)
两个等长字符串在相同位置上不同字符的数目。换句话说,它是度量两个字符串(通常是编码信息)之间差异的方法。汉明距离的概念不仅适用于字符串,也适用于向量、二进制数等任何可以逐位比较的对象。 - 测量方法,两个长度相等的字符串或序列 a 和 b
1.确保长度相等:首先确认两个字符串或序列的长度相等。如果长度不等,则无法定义汉明距离。
2.逐位比较:从第一个字符开始,依次比较两个字符串或序列中的每一位(字符或数字)。如果某一位上的字符或数值不相同,则计数器加一。
3.统计差异总数:完成所有位的比较后,计数器中的值即为这两个字符串或序列之间的汉明距离。 - 示例:
k a r o l i n
k a t h r i n
^ ^
d(karolin,kathrin)=2 汉明距离为2
101101
110100
^^ ^
d(101101,110100)=3 汉明距离为3
(2)编码
- 错误纠正码 Error Correcting Code(ECC)
发生方和接收方都将拥有一个相同的字典
编码位序列 对应的代码(用于检测错误)
00 00000
01 11100
10 10011
11 01111
对发送数据进行编码
发送数据: 01 00 01 11 11 10 00 10
01 00 01 11 11 10 00 10
编码后: 11100 00000 11100 01111 01111 10011 00000 10011
真正要发送的数据就是上边编码后的序列
--------------------------------------------------------
例如,当第2个值发送后出现了错误
00
00000
10000 乱码,接收方查找不在字典里头,将会与“对应的代码”进行汉明距离计算
计算过程,10000与字典进行计算
字典 距离
00000 1
11100 2
10011 2
01111 5
得到距离最小的是“1”,故真实的编码是“00000”;
根据字典,该编码“00000”对应的数据是 00,故可以纠正第二个值的乱码
--------------------------------------------------------
例如:当第4个值发送后出现了错误
11
01111
01010 乱码,接收方查找不在字典里头,将会与“对应的代码”进行汉明距离计算
计算过程,01010与字典进行计算
字典 距离
00000 2
11100 3
10011 3
01111 2
得到距离最小的是“2”,但是却对应两个编码(00000,01111),这种情况就只能对这部分数据进行重传
--------------------------------------------------------
例如:当第6个值发送后出现了错误
10
10011
01111 乱码,但是接收方中的字典查询得到,这种情况几乎不可能;并且数据传输过程中还会有想CRC等冗余校验
(2)实际应用中的汉明码示例
基本原理
汉明码的核心思想是在原始数据位之间插入特定数量的校验位(parity bits),使得每个数据位都被至少一个校验位覆盖。这样,在接收端可以通过计算这些校验位来检查是否有错误发生,并且如果存在单一错误可以定位并纠正该错误。
编码过程
- 确定校验位的数量:假设数据长度为 m 位,则需要添加 r 个校验位以形成总长度为 n=m+r的汉明码字;r 必须满足以下条件:2的r次方≥m+r+1。(其中,m 是数据位数,r 是校验位数。)
- 计算和选择校验位的位置:
汉明码的校验位(r 个)应该放置在 2 的幂次位置,即 1,2,4,8,16,…1,2,4,8,16,…;
比如,如果数据位有 4 位,校验位应放在第 1 位、第 2 位、第 4 位等。 - 填充数据和校验位
假设我们要编码的数据是 4 位二进制数据 d1, d2, d3, d4。我们需要先在校验位的位置上填充校验位,再填入数据位。编码的格式如下:
P1 P2 D1 P3 D2 D3 D4 P5
- 计算校验位的值
每个校验位的值是根据一定规则计算的,规则是:每个校验位负责检查一些特定位置的位,确保这些位置的位(包括校验位本身)之和为偶数(即奇偶校验)。
计算校验位的规则:
P1 校验位负责检查所有 1、3、5、7 等位置上的位。
P2 校验位负责检查所有 2、3、6、7 等位置上的位。
P3 校验位负责检查所有 4、5、6、7 等位置上的位。
P4 如果有的话,会检查 8、9、10、11 等位置上的位。 - 具体计算步骤:
对于每个校验位,取它所负责检查的位(包括它自身)并计算它们的异或值。若异或结果为 1,则该校验位为 1;若结果为 0,则该校验位为 0。
。。。。。
有空再补充
7116

被折叠的 条评论
为什么被折叠?



