📜  计算机网络|错误检测(1)

📅  最后修改于: 2023-12-03 15:12:04.090000             🧑  作者: Mango

计算机网络 | 错误检测

介绍

在计算机网络中, 传输的数据往往会发生错误, 例如信号的干扰、传输介质的故障等等, 这就需要对数据进行错误检测和纠正。错误检测是通过添加冗余的方法检测出数据的错误, 而不是对错误进行修复。本文将介绍常见的错误检测方法以及如何在计算机网络中进行实现。

常见的错误检测方法
垂直奇偶校验(VRC)

垂直奇偶校验(VRC)是一种简单的错误检测方法, 它通过添加一个校验位来检测数据中的错误。

例如, 在二进制的数据位1011010后添加一个奇校验位, 得到10110101。其中的“1”的个数为奇数, 所以奇校验比特为1。如果数据在传输过程中发生了单一位错误, 检验将会失败。但是, 如果有两个或更多的位发生错误, 检验将不会发现这个错误。

奇偶校验(PC)

与垂直奇偶校验类似, 奇偶校验(PC)也是通过添加校验位来检测数据中的错误。

不同的是, 奇偶校验在每个字节的末尾添加一个校验位。这个校验位表示了这个字节中1的个数是否为偶数。如果某个字节在传输过程中发生了错误, 检验失败。

循环冗余校验(CRC)

循环冗余校验(CRC)是一种广泛使用的错误检测方法。它通过将数据转换成一个多项式来计算出一个余数, 并将这个余数添加到数据末尾作为检验和。

发送方使用同样的多项式进行计算, 并将计算出的余数发送给接收方。接收方将接收到的数据再次进行计算, 如果计算得到的余数与发送方发送的余数不同, 检验失败。

错误检测的实现

在计算机网络中, 错误检测通常是由硬件恩妍或操作系统内核完成。然而, 如果我们需要实现这些方法, 我们可以使用编程语言来模拟硬件和软件的实现。

垂直奇偶校验(VRC)的实现
def vrc(data):
    """
    垂直奇偶校验(VRC)的实现
    :param data: str 二进制数据位
    :return: str 添加垂直奇偶校验位后的数据位
    """
    count = data.count('1')
    if count % 2 == 0:
        # 偶校验
        return data + '0'
    else:
        # 奇校验
        return data + '1'
奇偶校验(PC)的实现
def pc(data):
    """
    奇偶校验(PC)的实现
    :param data: bytes 数据
    :return: bytes 添加奇偶校验位后的数据
    """
    result = bytearray()
    for byte in bytes:
        count = bin(byte).count('1')
        if count % 2 == 0:
            # 偶校验
            result.append(byte | 0x80)
        else:
            # 奇校验
            result.append(byte & 0x7f)
    return result
循环冗余校验(CRC)的实现
def crc(data, polynomial):
    """
    循环冗余校验(CRC)的实现
    :param data: bytes 数据
    :param polynomial: int CRC多项式
    :return: int 计算得到的余数
    """
    crc = 0
    for byte in bytes:
        crc = crc ^ byte << 8
        for i in range(8):
            if crc & 0x8000:
                crc = (crc << 1) ^ polynomial
            else:
                crc <<= 1
    return crc
总结

错误检测是计算机网络中非常重要的一个环节, 它可以帮助我们检测数据传输过程中的错误, 保证数据的完整性和正确性。本文介绍了常见的错误检测方法并给出了它们的实现代码片段, 希望能对你有所帮助。