循环冗余校验CRC简介

循环冗余校验(英语:Cyclic redundancy check,通称“CRC”)是一种根据网络数据数据包或电脑文件等数据产生简短固定位数校验码的一种散列函數,主要用来检测或校验数据传输或者保存后可能出现的错误。生成的数字在传输或者存储之前计算出来并且附加到数据后面,然后接收方进行检验确定数据是否发生变化。一般来说,循环冗余校验的值都是32位的整数。由于本函数易于用二进制的电脑硬件使用、容易进行数学分析并且尤其善于检测传输通道干扰引起的错误,因此获得广泛应用。此方是由W. Wesley Peterson于1961年发表。
CRC为校验和的一种,是两个字节数据流采用二进制除法(没有借位和进位,使用异或来代替减法)相除所得到的余数。其中被除数是需要计算校验和的信息数据流的二进制表示;除数是一个长度为(n+1)的预定义二进制数,通常用多项式的系数来表示。在做除法之前,要在信息数据之后先加上n个0. 冗余码的位数是n位。
冗余码的计算方法是,先将信息码后面补0,补0的个数是生成多项式最高次幂;将补零之后的信息码用模二除法(非二进制除法)除以G(X)对应的2进制码,注意除法过程中所用的减法是模2减法,即没有借位的减法,也就是异或运算。当被除数逐位除完时,得到比除数少一位的余数。此余数即为冗余位,将其添加在信息位后便构成CRC码字。

例如,假设信息码字为11100011,生成多项式G(X)=X^5+X^4+X+1,计算CRC码字。G(X) = X^5+X^4+X+1,也就是110011,因为最高次是5,所以,在信息码字后补5个0,变为1110001100000。用1110001100000模二除法除以110011,余数为11010,即为所求的冗余位。
因此发送出去的CRC码字为原始码字11100011末尾加上冗余位11010,即 1110001111010。接收端收到码字后,采用同样的方法验证,即将收到的码字用模二除法除以110011(是G(X)对应的二进制生成码),发现余数是0,则认为码字在传输过程中没有出错。

尽管在错误检测中非常有用,CRC并不能可靠地校验数据完整性(即数据没有发生任何变化),这是因为CRC多项式是线性结构,可以非常容易地故意改变量据而维持CRC不变。

单播,组播(多播),广播以及任播

单播(unicast): 是指封包在计算机网络的传输中,目的地址为单一目标的一种传输方式。它是现今网络应用最为广泛,通常所使用的网络协议或服务大多采用单播传输,例如一切基于TCP的协议。
组播(multicast): 也叫多播, 多点广播或群播。 指把信息同时传递给一组目的地址。它使用策略是最高效的,因为消息在每条网络链路上只需传递一次,而且只有在链路分叉的时候,消息才会被复制。
广播(broadcast):是指封包在计算机网络中传输时,目的地址为网络中所有设备的一种传输方式。实际上,这里所说的“所有设备”也是限定在一个范围之中,称为“广播域”。
任播(anycast):是一种网络寻址和路由的策略,使得资料可以根据路由拓朴来决定送到“最近”或“最好”的目的地。

在Linux运行ifconfig, 如果网卡信息中包含UP BROADCAST RUNNING MULTICAST,则支持广播和组播。

阅读全文

Netty5用户指南

Netty 是一个NIO client/server 网络编程框架, 可以快速且容易的开发基于协议(protocol)的网络客户端/服务器端的程序。 它极大的简化了TCP和UDP socket编程, 提供流水线化的操作。

'快速且容易'并不会导致应用难以维护和性能低下。 Netty经过仔细设计, 基于许多协议实现的经验如FTP, SMTP, HTTP以及各种二进制的和基于本文的老的协议, Netty成功的找到一种保证开发,性能,稳定性,灵活性的方式, 毋须折衷.

特性

设计

  • 为各种传输类型提供统一的API- 阻塞和非阻塞的socket
  • 灵活和可扩展的事件模型, 将关注点分隔
  • 高度可定制化的线程模型- 单线程, 一种或者多个线程池如SEDA
  • 真正无连接的数据报socket支持(since 3.1)

    易用

  • 提供Javadoc, 用户指南和例子
  • 除了JDK 1.5 (或以上版本)毋须第三方库支持

    性能

  • 更好的吞吐率,低延迟
  • 较少的资源占用
  • 最小化不必要的内存拷贝

    安全

  • 完整的SSL/TLS, StartTLS支持

    社区

  • 早期发布,发布频繁
  • 作者自2003就开始写类似的框架(mina), 一直收集用户的反馈。

    阅读全文