纠错码简介

纠错码是个什么东西

引出

网络中的通信基于TCPUDP两个通信协议, 这大家都知道的, 什么TCP的三次握手等等, 面试经常被问到. 三次握手是为了保证连接的正确建立. 但是, 在通信的时候, 你如何保证你的消息正确送达了呢? 有人说了, 有收到请求的响应包. 但我说的不是这个,

比如说, 你发送了一个数字1, 你如何保证接受方收到的数字也是1呢? 毕竟, 在网络中环境如此复杂, 就算是物理上也不能保证数据一定是不变的啊. 比如有一个机房在上海, 你在北京访问, 那数据是要途径一千多公里的, 在这个传输的过程中会受到各种干扰, 很难保证数据不会失真.

这个时候, 纠错码出现了. 简单介绍一下, 其中所有有关数学的内容的去掉了, 毕竟太高深, 咱也不懂.

思考

因为计算机传输中只存在0和1, 所以可以简单将其类比为数字.

想象一个场景, 你需要将一组数字发送给B, 在发送的过程中, 每个数字都有20%的概率变成其他数字(途中收到干扰导致失真). 你们应该如何保证接收到的数字与发送的数字一致呢?

假定这组数字是: 123456789

方案一

根据概率论, 每个数字20%的概率会错乱, 也就是有80%是正确的. 那只要样本足够多, 那出现次数最多的就是正确的.

比如, 发送了5次, 收到的内容是:

  • 123456781
  • 127456789
  • 623456789
  • 123456789
  • 123459789

将每一位单独拿出来, 找到出现次数最多的数字就是正确的数字.

但是, 这样不能保证完全正确, 毕竟是概率事件, 需要通过增大样本数量来增加准确率. 只要传输的次数足够多, 就能够将错误的概率降低到足够小.

很好, 这样确实能解决问题. 但是, 如果只是通信间传输几k的数据还好, 如果下载一个1G的电影, 为了纠错, 需要你耗费10G的流量下载10遍, 你能接受么?

方案二

方案一被pass了. 既然多次传输不行, 又该如何是好呢? 单次传输的话, 仅仅依靠消息本身是肯定无法保证可靠的.

换个角度想一下, 既然每个数字的出错概率是20%, 那么如果将1个数字映射到4个数字上面, 整体出错的概率就下降了. 为了方便理解, 使用英文来表示映射关系, 即1(one), 2(two)...

如果你收到了一个数字345, 告诉你其中可能存在错误, 你是无法知道它原本的数字是什么的. 但如果你收到的是 ofe, 你应该能够很快想到它是 one, 并将其还原.

这个时候, 假设你收到的数据是这样的: one tno shree four fiae . 你应该能够很快将其还原为: 12345 . 只需要检查每个单词, 若是有效的直接转换, 若是无效的则转换为最接近的单词.

当然, 计算机在传输过程中是无法传输英文的, 所以将数字映射到另一个较长的数字(编码)上去. 这个编码就是 汉明代码. 如下:

  • 0000 -> 0000000
  • 0001 -> 0001011
  • 0010 -> 0010111
  • ...

将每一个4位都转换为7位. 这种方案存在匹配后的值是一个较接近的错误的值么? 据说不会, 涉及到数学领域, 没太懂.

至此, 其实纠错的任务已经接近完成了. 通过数据的冗余, 已经可以将出错的概率降低到很小了.

方案三

能否使用更少的数据来进行纠错呢? 下面介绍的就是了, 一种称为校验和的手段. 这种方法仅仅用来校验数据是否出错, 但不会对数据进行修复.

比如你需要传输的数字是: 4567.

在后边添加一位数字作为校验数字, 校验数字的生成规则是四个数字的和取个位数. 即: 4+5+6+7=22, 校验数字为 2.

当接到45672 这个数字时, 只需要进行简单的计算, 就可以知道数据是否正确. 其中任何一个数字出错, 结果都不会是2. 但是, 如果有两个数字出错呢? 你收到的数字是: 44772. 你通过计算发现校验数字是2. 嘿嘿.

也就是说, 一个校验数字只能保证一位出错的情况, 这时通过添加校验数字, 通过另外一个生成规则再生成一个校验数字添加到后边(这里不能使用同一个生成规则), 就可以处理两位出错的情况了. 但是三位出错呢? 为了保证完全校验, 就需要添加更多位数的校验数字.

但是如果是一个100mb的文件, 总不能用于校验的大小也是100mb吧. 勿慌, 只需要一个100位的数字进行校验. 这里又涉及数学领域了, 其出错的概率微乎其微, 几乎可以忽略.

还记得在各个官网下载文件的时候附送的MD5校验码吗? 没错, 就是它了. 可以校验文件在传输过程中是否被损坏或是否被篡改.

方案四

上面是添加校验数字的方案只能够检测数据是否出错, 而不能够对出错的数据进行修复. 现在将校验数字的思想改进一下, 使其可以对错误数据进行修复.

假设我们发送的数字是: 12341234123412134

将其每4位分开, 并分别计算其行和列的校验和. 如下图:

然后, 将其铺开进行传输: 123401234012340123404826

假如, 接收到的数据中有一位出错了, 数据变成了下面这种:

你通过计算, 发现第二行和第三列出现问题, 很快就可以定位到数字5. 计算第三列校验和: 3+5+3+3=14, 个位为4. 将5-2, 得到预测的原始数字3. 然后在计算第二行的校验和是否为0. 完成纠错. 最后将纠正后的正确的数字从中取出来. 得到原始的数据: 1234123412341234.

这种纠错方式被称为: 二维奇偶校验码.


计算机硬盘, 网络通信等都有着纠错码的身影, 它保证了数据的传输可靠. 在TCP的每个包中都存在校验和内容, 若校验出错, 则包会被直接丢弃.

简单说一下...

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/508425.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

计算机全加器简单实现

概述 用了这么久计算机, 都知道计算机有一个核心部件叫 CPU, 而 CPU中有一个小部件叫做全加器. 它是用来做什么的呢? 看名字就知道了, 做加法运算用的. 那么如何实现一个全加器呢? 你以为这又是一篇计算机内部原理的文章? 不, 放开那个女孩, 和我一起走进中学物理的课堂. …

TCP 三次握手的意义

概述 在网络的传输层协议中, 存在着两大悍将: TCP 和 UDP . 从前, 我傻傻的以为自己对他们虽谈不上精通, 但还是知道的, 但是, 我错了, 我被自己问住了, 我傻了. 啥也不是. UDP (这里为了介绍简单, 就不提数据在传输过程中的失真(纠错码)等情况了. 简单介绍一下, TCP才是今天…

GO 文档笔记

前言 最开始写 GO 的时候, 发现方法的注释并不支持param, return等参数, 搞得我都不知道该如何给自己的方法写文档说明了. 而且网上搜了搜也没有搜到教程, 甚是郁闷. 今天找到了GO内置的文档工具: godoc. (我用的1.14.3版本貌似不是自带工具了, 需要安装(配置代理): go get g…

有了 elseif 为什么还要 switch case

引出 你有没有想过既然有了if elseif, 为什么还要设计一个switch case的语法出来呢? 按理说, 一个语言的设计角度来说, 关键词越少越好吧, 而且多出来一种选择分支也没有看出太大用处. 以下几种switch case均可以写成if else的形式(java 代码): // 形式一 switch(a){case 1:…

计算矩阵中全1子矩阵的个数

前言 最近被我大哥安利了一道算法题, 这道题说难, 还不至于我做不出来, 说简单吧, 我还想不到最优解, 等把最优解告诉我之后, 我还正好能理解. 我甚至曾经怯怯的认为, 这题就是我哥专门给我找的, 嘿嘿, 心中说不出的小欢喜. 题来了, 此题出自力扣, 原题链接: https://leetco…

搭建本地 HTTPS 环境

前言 之前写自己的网站时, 申请过免费的https证书. 最近想在自己本地搭一个, 结果忘了当初证书是怎么来的了. 本来想着去申请个免费的证书, 但想了想, 我只需要在自己本地能使用就行了, 我自己的环境, 那当然是我说了算了. 只要能够将证书构造出来, 安装到本地就可以识别了. 搜…

nginx 端口转发

概述 这两天在写 go 项目, 一个 HTTP 服务器. 之前写的是 php 项目, nginx 监听80端口, 根据域名将请求分配给不同项目. 现在换了 go, 自然也想延续这个操作, 毕竟都是跑在同一台服务器上. 那么问题来了, 我的nginx 监听80端口的同时, go 服务器是无法同样监听80端口的. 这该如…

beego 优雅重启

前言 最近在写 go 的项目, http 用的 beego 框架. 因为 go 不想 php, 每次代码改动都需要重启服务, 所以代码发上线之后, 如何重启服务就成了一个问题. 如果强行重启的话, 不光在重启期间的所有访问都被拒绝了, 而且在杀掉进程的时候处理中的请求也挂了. 对于一个向用户正常提…

由 go orm 引发的探索

前言 今天遇到了一个 bug, 是 golang 的orm导致的. 使用了gorm框架. 通过实现Scan与Value可以将数据库中的 json 内容解析出来, 免除了 字符串再解码的步骤. 当时报错的代码大概是这样的: type TestContent struct {Id intContent Content // 数据库中的 json 结构 }type Con…

码云 Pages 搭建

因为一直在写博客, 就向着搭个 GithubPages 来展示, 一直都听说别人用它来搭建个人博客, 但一直停留在听说的阶段. 最近想着没事搞一搞, 也看看它到底是个什么东东. 不过咱一个写中文博客的, 就想着在码云上搭一个, 顺便还能被百度收录, 嘿嘿. 说干就干, 开搞. (Pages 服务只能…

golang chan 探究

前言 之前在看golang多线程通信的时候, 看到了go 的管道. 当时就觉得这玩意很神奇, 因为之前接触过的不管是php, java, Python, js, c等等, 都没有这玩意, 第一次见面, 难免勾起我的好奇心. 所以就想着看一看它具体是什么东西. 很明显, 管道是go实现在语言层面的功能, 所以我以…

计算机网络-信道复用技术

还记得计算机网络中的信道复用技术么? 来来来, 一起复习一下. why 问: 什么是信道复用. 在回答这个问题之前先看这样一个场景: 其中u1 u2是两个用户, 如果这两个用户之间连通的信道在他们使用过程中, 被他们完全占用了, 其他人就只能等着了. 那有人说了, 那就多架设信道不就…

IP 数据报首部分析

来来来, 爷们. 不是一直说纸上得来终觉浅么. 今咱就抓个数据报具体看一看真实网络中的 IP 报首部. 操作方法很简单, 使用wireshark进行抓包. 抓包后随便找个包看一下就行, 毕竟所有通信的包都需要经过网络层.(同时, wireshark会对协议的相关信息给出标识, 更方便我们查看) 其中…

git 子模块在项目中的使用

在公司的项目中, 经常会遇到一些公共的内容, 多个项目中间通用的, 不可能每次都将整个代码复制一遍, 遇到这种情况有很多不同的解决方案, 一般来说, 项目是通过 git 来管理的, 巧了, git 也同样支持子模块. 创建子模块 git submodule add gitgitee.com:hujingnb/submodule_so…

GO 内存对齐

前言 之前遇到过这样一个情况(发现问题的结构体并不长这样, 不过为了引出问题, 改了一下): type Test struct { b bool i3 int32 i8 int8 i64 int64 by byte } func main() { t : Test{} fmt.Printf("%d", unsafe.Sizeof(t)) } 创建一个结构体, 查看一下其内存占用.…

HBase 命令行

hbase是一款分布式数据库. 其对数据的索引只通过row key进行. 在存储数据的时候, 通过row key的排序进行存储. 在面对一个新的数据库时, 深究其原理并不知一个明智的选择, 正如开车一般, 大多数人都是先学会开车, 然后在开车的过程中车子出故障了, 再慢慢学着去修理. 不管怎么说…

《论可计算数及其在判定上的应用》简单理解

刚刚拜读了一本书, 《图灵的秘密》. 该书介绍了图灵的论文《论可计算数及其在判定上的应用》, 其指出: 一个拥有铅笔, 纸和一串明确指令的人类计算者, 可以被看做是一种图灵机. 那么图灵机是什么呢? 是图灵为了描述可计算数而引出的一个虚构的可以做一些简单操作的计算机器. 尽…

PHP为什么empty可以访问不存在的索引

开始之前, 先抛出问题: $arr []; echo empty: , PHP_EOL; var_dump(empty($arr[1])); echo is_array: , PHP_EOL; var_dump(is_array($arr[1]));这段代码的运行结果: 你是否和我有过同样的疑问? 同样是函数, 为什么empty访问不存在的索引就不会报错呢? 按理说哈, 函数调用的…

浮点数运算丢失精度

今天碰到了这样一个情况, 使我又去翻阅了原来课本, 在Pthon中如果输入下面这段程序: print(sys.float_info.max - 1.0) print(sys.float_info.max)结果如下: 结果发现, 这数字根本没有变化. 本来这没什么, 看这数字, 10的308次方, 也就是说, 减去的1是在308位之后了, 这里没有…

变量的作用域

起因 最近闲来无事, 在 Python 官网上看到了2.0版本, 是2001年的. 打算装起来体验一下最初发布的版本, 但是发现只有 Windows 版本, 所以我就装了个 Windows10的虚拟机, 就在我打算安装的时候, 发现: 这激起了我的好胜欲, 于是我就依次安装了Windows 8, Windows 7, Windows XP…