编码(NRZ、NRZI、曼彻斯特、4B/5B)

将节点和链路变成可用构件的第一步,是清楚它们如何连接,以使比特从一个节点传输到另一个节点。正如在前一节中提到的,信号是在物理链路上传播的。因此,我们的任务是将源节点准备发送的二进制数据编码为链路能够传送的信号,然后在接收节点将信号解码成相应的二进制数据。我们忽略调制的细节并假设处理两种离散信号,即高信号电平和低电平。实际上,这些信号可能对应着铜线链路上的两个不同电压或光纤链路上的两个不同能量级。

 
正如之前已提到的,本章讨论的大部分功能是由网络适配器(network adaptor)完成的,它是一个将节点连接到链路上的硬件。网络适配器包括一个信令构件,它在发送节点把比特编码为信号,而在接收节点将信号解码为比特。因此,如图2-3所示,信号在两个信令构件之间的链路上传输,而比特在两个网络适配器之间流动。
 
 
回到将比特编码为信号的问题。显然,要做的就是将数值1映射为高电平,数值0映射为低电平。这是一种称为不归零(NonReturn to Zero, NRZ)的编码方案所采用的映射。例如,图2-4以图解方式描述了一个特定的比特序列(图的上部)及其对应的NRZ编码信号(图的下部)。
 
 
NRZ的问题是,几个连续的1表示在一段时间内信号在链路上保持为高电平,类似地,几个连续0表示信号在一段时间内保持为低电平。一长串0和1导致两个基本问题。第一个问题是,它会导致基线漂移(baseline wander)状态。尤其是接收方保持一个它所看到的信号平均值,然后用这个平均值区分高、低电平。当收到的信号远低于这个平均值时,接收方就断定看到了0,同样,远高于这个平均值的信号被认为是1。当然,问题是太多连续的1或0会使这个平均值发生改变,使得检测信号中很难出现明显的变化。
 
第二个问题是,由高到低和由低到高的频繁转换必须使用时钟恢复(clock recovery)。直观地讲,时钟恢复问题就是:编码和解码过程都由一个时钟来驱动,每个时钟周期发送方发送1比特,接收方恢复1比特。为了使接收方能恢复发送方发送的比特,发送方和接收方的时钟必须精确同步。如果接收方时钟比发送方时钟稍快或稍慢,那么,接收方就不能正确地解码信号。可以采用在另一条线上发送时钟给接收方的方法,但这种方案不太可行,因为这使布线费用增加一倍,所以接收方改由收到的信号得到时钟,这就是时钟恢复过程。无论何时,只要信号有从1到0或从0到1的跳变,接收方就知道这是在时钟周期的边界上,它能够自己进行重新同步。然而,若长时间没有这样的跳变就会导致时钟漂移。所以,无论传送什么数据,时钟恢复都依赖于信号内有许多跳变。
 
有一种方法可以解决这个问题,称为不归零反转(NonReturn to Zero Inverted,NRZI),发送方将当前信号的跳变编码为1,将当前信号的保持编码为0。这样就解决了连续1的问题,但是显然未解决连续0的问题。NRZI如图25所示。还有一种方法称为曼彻斯特编码(Manchester encoding),这种颇具独创性的方法通过传输NRZ编码数据与时钟的异或值使时钟与信号结合在一起。(把本地时钟看作一个从低到高变化的内部信号,一对低/高变化的电平看作一个时钟周期。)图25也给出了曼彻斯特编码。注意,曼彻斯特编码将0作为由低到高的跳变,1作为由高到低的跳变。因为0和1都导致信号的跳变,所以接收方能有效地恢复时钟。(还有一种曼彻斯特编码的变种,称为差分曼彻斯特(differential Manchester)编码。其方法是若信号的前一半与前一比特信号的后一半信号相等则编码为1,若信号的前一半与前一比特信号的后一半信号相反则编码为0。)
 
 
曼彻斯特编码方案存在的问题是使链路上信号跳变的速率加倍,这意味着接收方有一半的时间在检测信号的每一个脉冲。信号变化的速率称为链路的波特率(baud rate)。在曼彻斯特编码中,比特率是波特率的一半,所以认为编码的效率仅为50%。记住,如果接收方保持比图25中的曼彻斯特编码要求的更快的波特率,那么在相同的时间段中,NRZ和NRZI能传输2倍的比特数。
 
我们考虑的最后一种编码方法称为4B/5B,它力求不扩大高信号或低信号的持续期而解决曼彻斯特编码的低效问题。4B/5B的思想是在比特流中插入额外的比特以打破一连串的0或1。准确地讲,就是用5个比特来编码4个比特的数据,之后再传给接收方,因此称为4B/5B。5比特代码是由以下方式选定的:每个代码最多有1个前导0,并且末端最多有两个0。因此,当连续传送时,在传输过程中任何一对5比特代码连续的0最多有3个。然后,再将得到的5比特代码使用NRZI编码传输,这种方式说明了为什么仅需关心多个连续0的处理,因为NRZI已解决了多个连续1的问题。注意,4B/5B编码的效率为80%。
 
表2-2给出了16个可能的4比特数据符号对应的5比特代码。注意,由于5比特足以编码32个不同的代码,因此我们仅用了16个,剩下的16个可用于其他目的。其中,11111
 
可用于表示线路空闲,00000表示线路不通,00100表示停止。在剩下的13个码中,7个是无效的(因为它们违反了1个前导、0或两个末尾0的规则),另外6个代表各种控制符号。在本章后面将会看到,某些组帧协议会使用这些控制符号。
posted @ 2016-03-09 13:02  苍月代表我  阅读(21249)  评论(1编辑  收藏  举报