物理层链路层知识脉络
==================

## 网络概述

网络的基本功能是快速而广泛地传递信息。在计算机网络之前，实际上已经存在了其他网络，即电信网络（电话网）和有线电视网络。电话网络的基本原理是采用`电路交换`，即通信的双方在进行通信之前必须首先建立连接，在通信结束后释放连接，在这种方式下双方进行通信时，通信链路始终是独占的。

然而这种方式并不适用于计算机网络，这是因为计算机的数据往往是突发性地出现在传输线路上，采用`电路交换`的方式会使得通信链路的利用率极低，因为被用户占用的大部分的时间内链路都是空闲的。为了解决这种问题，计算机网络是采用`分组交换`的方式，`分组交换`的核心在于存储转化技术，即将一个要发送的报文划分成一个个等长的数据段，再加上控制信息后构成`分组`，数据以`分组`为单位进行传输。需要注意的是，这种数据传输并不是基于连接的，整个通信链路被路由器划分成若干区段，在一个`分组`到达某个路由器后，路由器将该`分组`存储下来，然后查找转发表，将该`分组`转发到另一段合适的链路上。这样，在数据传输时，它所占用的通信链路只是一个个小小的区段而已，而这些区段都是可以复用的，因而提高了传输的效率。

为了评价某个计算机网络的性能，给出了若干个指标，如数据率，带宽，时延，时延带宽积等，对每个指标都需要有一定的理解。需要注意的是，数据率或者数据的传输速度，并不是指数据在链路上的“传播速度”，后者接近光速，只与采用的具体传输媒体有关。这里的数据率或者数据传输速度，乃是数据从主机发送到链路上的速度，它取决于链路的带宽。同样，应该能够区分`传输时延`和`传播时延`的区别。

为了实现计算机之间的通信与数据共享，需要制定相关的通信协议与规程，这就形成多层次的计算机网络体系结构。这里需要把握体系结构与它的具体实现之间的区别，具体说来就类似于抽象数据类型与具体数据结构，接口与实现之间的区别。

## 物理层

物理层主要需要解决两个问题，一是如何实现二进制比特流在通信链路上的传输，另一个则是如何使这样的数据传输更加高效。为了解决比特流在链路上的传输问题，首先需要解决如何使用电气信号来表示比特流的问题，一种方式是采用基带信号来表示比特流，将比特流转化为基带信号的方式称为编码，具体说来，编码的方式有归零编码，不归零编码，曼彻斯特编码和差分曼彻斯特编码等；另一种方式是采用带通信号，将比特流转化为带通信号的方式称为调制，调制的方法有调幅，调频，调相等。这样，在接收端就可以识别这些基带信号或者带通信号，通过解码或者解调，来得到发送端想要发送的信息。

奈奎斯特定理和香农定理分别指出了码元传输速率和数据传输率的极限值，想要使数据传输更加高效就需要尽可能地改善条件来逼近这个极限值。一种方式是通过编码，使得每个码元携带的信息量更多，从而提高数据传输率。此外的话，就是需要选择高带宽的传输媒体，比如光纤，来提升码元传输速率。

为了提高信道的使用率，物理层还需要解决信道复用的问题，即使得多对用户同时使用一个信道进行通信。信道复用的方法主要有`频分复用`，`时分复用`，其中采用光纤通信的`频分复用`又被称为`波分复用`。`时分复用`固定为每个用户分配一段时间使用信道，但是这将导致信道的整体利用率不高，为了解决这个问题，进一步提出了`统计时分复用`的概念，来动态分配每个用户占用信道的时间。此外，还有一种复用方式称为`码分复用`，即每个用户使用不同且相互正交的码型，所有用户的信号都同时在信道上传输。接受方只需要用特定用户的码型与收到的信号做内积，就可以得到目标用户发来的信号。

## 数据链路层

站在物理层的基础上，数据链路层就不用考虑比特流是如何在通信链路上传输的问题了，而可以认为发送方的比特流经过链路层直接就到达了接受方，仿佛底层没有物理层存在似的。

数据链路层的首要任务是对接收到的比特流进行检错，这是因为实际传输条件并不是理想的，存在各种干扰信号，因而难免存在比特流传输错误的情况；而为了进行检错，就必须对比特流进行分帧，只有这样才能针对某一帧计算检错码；对比特流分帧需要使用`帧界定符`，这将导致传输的比特流中不能出现与`帧界定符`编码相同的数据，因此这里还存在一个`透明传输`的问题，即数据链路层对要传送的数据来说是透明的。综上，数据链路层的三个任务是`封装成帧`，`透明传输`和`差错检测`。

有两个常用的数据链路层的协议，分别是点对点协议(PPP, Point-to-point Protocol)和IEEE802.3以太网协议，它们适用于不同的场合。

顾名思义，`PPP`协议用于解决点对点传输过程中的问题。为了将数据`封装成帧`，`PPP`协议使用一个标志字段来表示一个帧的开始和结束，为了实现`透明传输`，`PPP`协议可以使用`字节填充`或者`0比特填充`两种方法；它通过在帧的最后加上一个帧检验序列(FCS, Frame Check Sequence)，使用循环冗余检验`CRC`来实现`差错检测`。需要指出的是，数据链路层的`差错检测`并不能检查出所有的传输差错，它可以检查到最基本的`比特差错`，除此以外还有的`帧丢失`，`帧重复`和`帧失序`错误数据链路层就无能为力了，这种错误需要高层的协议来检测与解决。

除此以外，`PPP`协议还包括一个链路控制协议(LCP, Link Control Protocol)和一套网络控制协议(NCP, Network Control Protocol)。`PPP`链路一开始总是处于`链路静止`状态，在双方建立了物理层连接后就进入了`链路连接`状态。此后，通信的双方通过发送`LCP配置请求帧`来进行`LCP配置协商`，协商通过后，使用`NCP`对网络层进行配置，配置成功后，进入`链路打开`状态。此后就可以进行数据的传输了。

以太网（局域网）是使用广播信道的数据链路层。为了使局域网内每台主机都可以收到某台主机发出的信息，局域网采用总线的方式进行连接，多台主机共享总线信道。总线结构会催生一些其他问题，比如如果多台主机同时发送信息，应该如何协调总线上的冲突？因此关于以太网的讨论就关于如何实现广播（避免冲突）而展开。

为了避免信道使用的冲突，以太网采用多点接入载波监听/冲突检测(CSMA/CD, Carrier Sense Multiple Access/Collision Detection)协议。为了避免以太网上的多台主机同时发送信息，主机在发送前应该首先监听信道，即`先听再发`，在信道空闲时再发送信号；然而，这仍不足以解决冲突，因为信号在链路上的传输具有一定的时延，可以存在一种情况，即两台主机同时监听到了信道空闲，随后同时开始发送信号，此时就会产生碰撞(collision)。为了解决碰撞，`CSMA/CD`规定主机在发送信号后还应该继续监听信道，即`边发边听`，一旦监听到别的主机发送的信号，便立即停止发送，一段时间后，再重新尝试发送。这里的碰撞重传的时机，是采用`截断二进制指数退避`算法来计算，采用这种方法可以在多次发生碰撞后，平均推迟重传的时间更长，从而减小发生碰撞的概率，恢复系统的稳定。

这样还存在一个问题，设想某台主机发送一个很短的帧，此时另一台主机也同时在发送。由于帧太短了，该主机在监听到碰撞信息前就已经完成发送了，这种情况下该主机就无法重传该帧。为了避免这种问题，`CSMA/CD`协议还规定了最短帧长，为512比特，即端到端往返时间传输的比特量。此外还有一些细节的规定，比如`强化碰撞`和`帧间最小间隔`的概念，在此不再赘述。

可以使用集线器(hub)或者交换机（网桥）来扩展以太网。需要注意的是，集线器工作在物理层，它只是简单地转发收到的数据而已。采用了集线器的以太网表现出星型拓扑结构，但是在逻辑上仍然是总线型的，以太网帧通过集线器进行广播；而交换机工作在数据链路层，它具有存储转发的功能，因此交换机可以支持主机之间的点对点传输——数据发送到交换机后，交换机通过查找`帧交换表`将数据传输到目标主机。使用了交换机后的以太网在无论是拓扑结构上还是逻辑上都是星型结构。此时，由于不再需要对信号进行广播，因此也不存在对信道的争用，上面讨论的`CSMA/CD`协议已经不再有用武之地。
