数据链路层
数据链路层使用的信道主要有以下两种类型:
- 点对点信道:使用一对一的点对点通信方式,常用协议为PPP
- 广播信道:使用一对多的广播通信方式,由于主机数量多,因此需要使用专用的共享信道协议来协调这些主机的数据发送,常用协议为CSMA/CD协议
数据链路层常用的概念:
- 链路(link):又称物理链路,指从一个结点到相邻结点且中间没有任何其他的交换结点的一段物理线路(有线或无线)
- 数据链路(data link):又称逻辑链路,是指包括物理线路在内,以及必要的通信协议(旧称规程,procedure)、硬件、软件等网络设施所构成的逻辑链路,通常由网络适配器(包含了硬件和软件)来实现所需协议。
- 帧:数据链路层使用的协议数据单元,对应IP层的IP数据报(或分组、包),数据链路层会把网络层交下来的IP数据报添加首部和尾部封装成帧。
数据链路层的主要工作
数据链路层协议有很多,但它们的主要工作都相同:封装成帧、透明传输、差错检测
封装成帧
封装成帧(framing)指数据链路层会在数据的前后分别添加首部和尾部,将数据打包成一个帧,帧有以下特点:
- 一个完整的帧包括帧的数据部分、帧首部、帧尾部,每一种链路层协议都规定了所能传送的帧的数据部分长度上限最大传送单元MTU(Maximum Transfer Unit),标准以太网的默认值为1500字节,PPPoE协议(宽带拨号上网)首部和尾部占用8字节开销,因此允许的MTU为1492字节
- 帧的首部和尾部可以用来确定帧的界限,数据链路层从物理层接收比特流时,能根据首部和尾部标记,从比特流中识别出帧的开始和结束
- 在发送端,如果帧在发送过程中中断,它会从头重传整个帧,接收端能根据尾部缺失确认前一个是不完整的帧,从而丢弃帧
- 首部和尾部除了用来确定帧的界限外,它们还包含一些数据链路层协议的控制信息

当数据是由可打印的ASCII码组成的文本文件时,帧定界可以使用特殊的帧定界符。ASCII码为7位编码,一共可组合成128个不同的ASCII码,其中可打印的有95个,而不可打印的控制字符有33个。ASCII码使用控制字符SOH(Start OfHeader)放在帧的最前面,表示帧的首部开始。用控制字符EOT(End OfTransmission)表示帧的结束。SOH和EOT都是控制字符的名称,并不是三个字母组合,它们的十六进制编码分别是01(二进制是00000001)和04(二进制是00000100)
透明传输
当传输的数据是非ASCII码数据时(比如图片或者程序代码),数据中的某字节的二进制代码可能恰好为00000001(SOH)或00000100(EOT),数据链路层会错误地将其识别为“帧的边界”,把部分帧收下(误认为是个完整的帧),而把剩下的那部分数据丢弃(这部分找不到帧定界控制字符SOH)。为了解决这一问题,发送端的数据链路层会在数据中出现控制字符“SOH”或“EOT”时,在前面插入一个转义字符“ESC”(其十六进制编码是 1B,二进制是00011011),接收端的数据链路层在把数据送往网络层之前删除这个插入的转义字符,这种方法称为字节填充(byte stufing)或字符填充(character stuffing)。如果转义字符也出现在数据当中,那么解决方法仍然是在转义字符的前面插入一个转义字符。
上述处理对上层协议是透明的,即上层协议并不知道比特流在传输过程中曾被插入或转义过额外信息。链路层通过填充、转义等机制,保证任意数据都能被无歧义地封装与解析,使数据在逻辑上保持原样传递而让上层完全无感知,因此称为透明传输

差错检测
数据链路层使用循环冗余检验CRC(Cyclic Redundancy Check)检错技术,具体步骤为:
- 数据分组:将数据分为k比特一组,示例:分好组的序列M=101001(k=6)
- 通信双方约定即将使用的生成多项式(这些多项式通常由标准定义),假设所选择的生成多项式阶数为r,然后将多项式表示为二进制形式P,作为除数,方法为:按x的幂从高到低排列,系数为1的位写1,为0的位写0:
- 示例:
P=X3+X2+1,二进制表示为:1101,r=3 - IBM的16位CRC:
CRC-16=X16+X15+X2+1,二进制表示为:1 1000 0000 0000 0101,r=16 - 目前应用最广泛的是IEEE的32位标准CRC-32,多项式和二进制表示较长,这里略
- 示例:
- 计算CRC校验码:在原始序列M的末尾补r个0,这相当于做多项式乘法
M*2r,然后用补了0的M序列,做模2除法运算,不借位也不进位。这本质是进行“异或”操作,最后会生成r位余数,这就是CRC校验码,又称帧检验序列FCS(Frame Check Sequence)。示例:101001补充r=3个0,101001000除于生成多项式二进制码1101,商为110101(商无用),余数001即为序列M的CRC校验码 - 拼接成完整帧:将计算出的r位校验码添加到原始数据M末尾,形成最终的比特序列,示例:M的最终序列为101001001
- 接收方校验:接收方以帧为单位进行CRC检验,把每一个帧除于约定好的生成多项式二进制码,然后检查得到的余数R。示例:假设接收方收到M的最终序列101001001,除于1101,余0,无差错
- 若R=0,则判定这个帧没有差错(出现误码时R依然等于0的几率很小很小)
- 若R≠0,则判定这个帧有差错,丢弃该帧

CRC只提供差错检测技术,不处理帧丢失、帧重复、帧失序问题,为解决这些问题,会增加帧编号、确认、重传机制,但会进行区别:
- 对于有线链路,数据链路层协议不使用确认和重传机制,而交给上层协议,如TCP来实现这些功能
- 对于通信质量较差的无线链路,数据链路层协议使用确认和重传机制,数据链路层向上提供可靠传输的服务
点对点协议PPP
点对点协议PPP(Point-to-Point Protocol)就是用户计算机和ISP进行通信时所使用的数据链路层协议,支持在多种类型的链路上运行,其中最为著名的是基于以太网运行的PPP over Ethernet,简称PPPoE协议。PPP协议被设计为需要满足以下特点:
- 简单:它提供的是不可靠的数据报服务,只有CRC检验,不提供纠错、流量控制、拥塞控制等功能
- 封装成帧:PPP协议规定一些特殊的字符作为帧定界符(即标志一个帧的开始和结束的字符),以便使接收端从收到的比特流中能准确地找出帧的开始和结束位置。
- 透明性:当数据中碰巧出现和帧定界符一样的比特组合时,需要采用转义等措施进行区分
- 支持多种网络层协议:PPP协议之上支持多种网络层协议(如IP和IPX等)运行
- 支持多种类型链路:PPP能够在多种类型的链路上运行,包括串行链路、并行链路、以太网、光纤、以电磁波为载体的无线通信链路等
- 差错检测:PPP协议必须能够对接收端收到的帧进行检测,并立即丢弃有差错的帧。
- 检测连接状态:PPP协议必须具有一种机制能够及时(不超过几分钟)自动检测出链路是否处于正常工作状态
- 最大传送单元:PPP协议需要对每一种类型的点对点链路设置最大传送单元MTU的标准默认值(默认值为1500字节)。如果高层协议发送的分组过长并超过MTU的数值,PPP需要丢弃该帧,并返回差错。注意,MTU是数据链路层的帧可以载荷的数据部分的最大长度,而不是帧的总长度。
- 网络层地址协商:用于使点对点通信的双方能够通过协商知道或能够配置彼此的网络层地址,现代网络中这通过IPCP(网络层地址协商)实现,通常用于拨号上网时从ISP获取IP地址。在常见的家庭局域网中,计算机通过DHCP从路由器获取私有IP地址,而路由器通过IPCP从ISP获取公网IP地址。二者是获取IP的不同方案,不相互依赖,DHCP的本质在已经具备IP连通性的网络中,自动获取网络层配置参数(包括IP地址、子网掩码、默认网关等)。而IPCP本质是初始化链路并进行参数协商,让PPP链路两端“具备IP能力”。传统宽带通常通过PPPoE+IPCP来从ISP获取IP地址,但很多现代宽带逐渐支持IPoE来获取公网IP(直接通过DHCP,而不再使用PPP和IPCP)
- 数据压缩协商:提供一种方法来协商通信使用的数据压缩算法,早期的PPP通过CCP(压缩控制协议)实现数据压缩,但在现代网络中基本已经被弃用
PPP协议的组成
PPP协议的核心有三个部分:
- 将IP数据报封装到串行链路的方法(PPP诞生之初设计目标是用于电话线等串行传输信道),它既支持异步链路,也支持面向比特的同步链路,IP数据报在PPP帧中就是其信息部分,这个信息部分的长度受最大传送单元MTU的限制
- 链路控制协议LCP(Link ControlProtocol):一个用来建立、配置和测试数据链路连接的协议,一共有11种类型的LCP分组
- 网络控制协议NCP(Network Control Protocol):一整套控制协议,其中的每一个协议支持不同的网络层协议,如IP、OSI的网络层、DECnet、AppleTalk等
- 异步链路:数据逐字符(字节)传输,这里的“字符”不是指只能传输文本字符,而是数据是带有起始和停止边界的微小数据块,通常长一个字节,这样的微小数据块称为一个“字符”或一个“码元”。异步链路传输不依赖时钟信号作为比特信息的开始和结束判别,通用用于键盘、鼠标、传感器等突发性数据传输场景,它最早广泛用于电传打字机,因此“异步逐字符传输”这一称呼被流传下载了,现在,它支持传输任意被分割为组的微小数据包
- 同步链路:数据连续传送,通常一个帧为单位(可能几十到上千字节),通信双方需要共用或恢复同一个时钟信号,数据之间由于没有额外的起始/停止位,为了识别一个数据块的开始,通常使用一个同步字符或前导码表示帧开始传输,随后连续字节流,不允许有间隙(异步字符之间允许有任意长时间的间隙),现代高速串行总线PCIe、SATA、USB、DP都属于同步链路
PPP协议的帧格式

PPP帧首部分为四个字段:
- 标志字段F:占1字节,表示一个帧的开始(帧定界符),值为0x7E(二进制值01111110),尾部的最后一个字段也是该值,表示帧的结束。两个帧之间只需要有一个标志字段,如果连续出现两个,表示这是一个空帧,应当丢弃
- 地址字段A:占1字节,值为0xFF(11111111),原本为未来预留,但一直未使用,因此并不携带有效信息
- 控制字段C:占1字节,值为0x03(00000011),原本为未来预留,但一直未使用,因此并不携带有效信息
- 协议字段:占2字节,当值为0x0021时,表示PPP帧的信息字段承载的是IP数据报;当值为0xC021,表示信息字段中承载的是LCP数据;当值为0x8021,表示这是网络层的控制数据
尾部分为两个字段:
- FCS:使用CRC的帧检验序列FCS,占2字节
- 标志字段F:同首部的标志字段,用作帧定界符
信息部分长度受MTU限制,通常不超过1500字节
字节填充
当PPP使用异步传输时,如果信息字段中出现和标志字段一样的比特(0x7E)组合时,则需要进行转义,转义符为0x7D(即01111101),并使用字节填充:
- 把信息字段中出现的每一个0x7E字节转变成为2字节序列(0x7D,0x5E)
- 若信息字段中出现转义字符0x7D,则把0x7D转变成为2字节序列(0x7D,0x5D)
- 若信息字段中出现ASCII码的控制字符(即数值小于0x20的字符),则在该字符前面要加入一个0x7D字节,同时将该字符的编码加以改变(与0x20异或)。例如,出现0x03(在控制字符中是“传输结束”ETX)就要把它转变为2字节序列(0x7D,0x23)
- 接收端在收到数据后再进行与发送端字节填充相反的变换,就可以正确地恢复出原来的信息
零比特填充
PPP协议在使用同步传输时采用零比特填充方法来实现透明传输,由于标志字段0x7E(01111110)含有6个连续1,因此数据为了避免与其相撞,要执行以下操作:
- 在发送端,先扫描整个信息字段(通常用硬件实现),只要发现有5个连续1,则立即填入一个0,这样可以保证在信息字段中不会出现6个连续1。
- 接收端在收到一个帧时,先找到标志字段F以确定一个帧的边界,接着再用硬件对其中的比特流进行扫描。每当发现5个连续1时,就把这5个连续1后的一个0删除,这样就保证了透明传输:在所传送的数据比特流中可以传送任意组合的比特流,而不会引起对帧边界的错误判断。
PPP协议的工作流程
当用户拨号接入ISP后,用户电脑与ISP之间首先建立物理连接。随后,用户电脑发送一系列封装成PPP帧的链路控制协议(LCP)分组,与ISP协商并确定PPP参数,从而建立LCP连接。接着,进入网络层配置阶段,由网络控制协议(NCP)为新接入的用户分配一个临时IP地址,使用户电脑成为互联网上一台有IP地址的主机。用户通信结束时,NCP先释放网络层连接并收回IP地址,随后LCP释放数据链路层连接,最后释放物理层连接。具体流程为:
- PPP链路的起始处于“链路静止”(Link Dead)状态,此时用户电脑和ISP的路由器之间不存在物理层的连接。
- 当用户个人电脑通过调制解调器呼叫路由器时,路由器会检测到调制解调器发出的载波信号。双方建立了物理层连接后,PPP协议便进入“链路建立”阶段(LinkEstablish),旨在通过LCP(链路控制协议)建立链路层连接,并对相关配置选项进行协商。在此过程中,LCP会发送配置请求帧(Configure-Request),这是一个PPP帧,其协议字段被设置为LCP对应的代码,而信息字段则包含具体的配置请求。链路的另一端可以发送以下几种响应中的一种:
- 配置确认帧(Configure-Ack):所有选项都接受
- 配置否认帧(Configure-Nak):所有选项都理解但不能接受
- 配置拒绝帧(Configure-Reject):选项有的无法识别或不能接受,需要协商。
LCP配置选项包括链路上的最大帧长、所使用的鉴别协议,且不会使用PPP帧中的地址和控制字段(因为这两个字段的值是固定的,没有任何信息量,可以在PPP帧的首部中省略这两个字节)。
- 协商结束后双方就建立了LCP链路,接着就进入“鉴别”(Authenticate)状态。在这一状态,只允许传送LCP协议的分组、鉴别协议的分组以及监测链路质量的分组:
- 若使用口令鉴别协议 PAP(Password Authentication Protocol),则需要发起通信的一方发送身份标识符和口令,进行身份鉴别,系统允许用户可重试若干次
- 如果需要更好的安全性,可以使用更复杂的口令握手鉴别协议CHAP(Challenge-Handshake Authentication Protocol)
- 若鉴别身份失败,则转到“链路终止”(Link Terminate)状态
- 若鉴别成功,则进入“网络层协议”(Network-LayerProtocol)状态。
- 在“网络层协议”状态,PPP链路的两端的网络控制协议NCP会根据网络层协议互相交换网络控制分组,PPP协议两端的网络层可以运行不同的网络层协议,但使用同一个PPP协议进行通信。如果在PPP链路上运行的是IP协议,则两端在配置IP协议模块时,要使用NCP支持的IP控制协议IPCP(IP Control Protocol)来配置IP协议(如从ISP处协商获取公网IP地址)。IPCP分组也封装在PPP帧(其中的协议字段为0x8021)中并在PPP链路上传送。在低速链路上运行时,双方还可以协商使用压缩的TCP和IP首部,以减少在链路上发送的比特数。
- 当网络层配置完毕后,链路就进入可进行数据通信的“链路打开”(LinkOpen)状态。链路的两个PPP 端点可以彼此向对方发送分组。两个PPP 端点还可发送回送请求LCP分组(Echo-Request)和回送回答LCP分组(Echo-Reply),来检查链路的状态
- 数据传输结束后,可以由链路的一端发送终止请求LCP分组(Terminate-Request)来请求终止链路连接,在收到对方发来的终止确认LCP分组(Terminate-Ack)后,转到“链路终止”状态。如果链路出现故障,也会从“链路打开”状态转到“链路终止”状态。当调制解调器的载波停止后,则回到“链路静止”状态。
链路层的广播信道
广播信道是链路层另一类十分重要的信道,与点对点信道不同,广播信道支持一对多的通信方式,计算机网络中最为典型、日常使用最广泛的广播信道网络,就是局域网LAN(Local Area Network),局域网按照网络拓扑分为星形网、环形网、总线网。其中总线网以传统以太网最为著名,并且随着以太网技术的快速发展,以太网已经在局域网市场中占据了绝对优势,现在以太网几乎成为了局域网的同义词。
早年的局域网使用集线器(hub)和双绞线连接多台主机,集线器是物理层设备,它只做信号复制、整形增强,因此它从任意一个端口接收到的电信号都会被广播到除了信号来源端口以外的其他所有端口,这意味着连接在集线器上的所有主机的网卡,都会收到这个电信号,并将其还原成数据帧。随后,网卡在链路层检查帧头部的目的MAC地址,丢弃不是发给自己的帧。现在主流使用的交换机工作在链路层,不再会广播转发所有收到的帧(ARP等刻意广播的除外),更主要以单播形式工作。
本质上,局域网中的主机在共享信道,共享信道要解决的核心问题是多主机同时通信时的冲突/碰撞问题,技术上通常有两种解决方法:
- 静态划分信道:通过频分复用、时分复用、波分复用和码分复用等方式给用户分配独立的信道,但这种划分信道的方法代价较高,不适合于局域网使用
- 动态媒体接入控制,又称为多点接入(multiple access),其特点是信道并非在用户通信时固定分配给用户。主要分为以下两类:
- 随机接入:特点是所有的用户可随机地发送信息,但如果恰巧有两个或多个用户在同一时刻发送信息,那么在共享媒体上就要产生碰撞(即发生了冲突),因此,局域网需要有解决碰撞的网络协议。传统以太网通过CSMA/CD协议,即载波监听多点接入/碰撞检测来解决这一问题
- 受控接入:特点是用户不能随机地发送信息而必须服从一定的控制。这类的典型代表有分散控制的令牌环局域网和集中控制的多点线路探询(polling),即轮询机制
网卡
计算机与外界局域网的连接是通过通信适配器(adapter)进行的,适配器是指主机箱内插入的一块网络接口板,这种接口板又称为网络接口卡NIC(Network Interface Card),简称为网卡。现代计算机的适配器已经嵌入到主板中,不再使用单独的网卡,因此后续使用适配器这个更准确的术语。
这种通信适配器上面装有处理器和存储器(包括RAM和ROM),它需要满足以下功能:
- 串行与并行转换:适配器和局域网之间的通信是通过电缆或双绞线以串行传输方式进行的,而适配器和计算机之间的通信则是通过计算机主板上的I/O总线以并行传输方式进行的。因此,适配器要能进行数据串行传输和并行传输的转换
- 缓存:由于网络上的数据率和计算机总线上的数据率并不相同,因此在适配器中必须装有对数据进行缓存的存储芯片
- 驱动:适配器需要有相应的驱动程序并将其安装在计算机的操作系统中。驱动程序会告诉适配器,应当从存储器的什么位置上把多长的数据块发送到局域网,或者应当在存储器的什么位置上把局域网传送过来的数据块存储下来
- 适配器需要能够实现以太网协议
以太网帧在系统内核中由CPU进行组装,而数据的发送和接收由适配器完成,不需要占用CPU资源。通过直接内存访问(DMA)技术,适配器能直接从内存中取走待发送的帧,或将接收到的帧直接写入内存,独立完成数据收发。当适配器收到有差错的帧时,可以直接把这个帧丢弃而不必通知计算机。当适配器收到正确的帧时,它通过DMA写入内存,并使用中断来通知计算机,交付协议栈中的网络层。当计算机要发送IP数据报时,由协议栈在内存中预先完成帧的组装,再将整帧交由网卡发送至局域网。计算机的硬件地址(MAC地址)在适配器的ROM中,而计算机的软件地址(IP地址)则在计算机的内存中

以太网
以太网最早(1975年)由美国施乐(Xerox)公司的Palo Alto研究中心(简称为PARC)研发,当时的以太网是一种基带总线局域网,使用无源电缆作为总线来传送数据帧,并以历史上曾被用来描述电磁波传播介质的以太(Ether)来命名。
MAC协议的由来
历史上,由于各厂商的商业竞争,局域网曾出现过多个不同的协议标准,其中包括由DEC、英特尔和施乐联合发布的DIX Ethernet V2标准,以及IEEE发布的802.3局域网标准等。为了使不同类型的局域网能向上层提供统一接口,IEEE 802委员曾把局域网的数据链路层拆成两个子层:逻辑链路控制LLC(Logical Link Control)子层和媒介访问控制MAC(Medium Access Control)子层:
- LLC(Logical Link Control)子层:负责与介质无关的、通用逻辑控制功能,为网络层提供统一接口
- MAC(Medium Access Control)子层:负责与物理介质相关的、具体的介质访问控制算法,并组装、解析MAC帧
后来以太网在局域网市场中取得了垄断地位,几乎成为了局域网的代名词,DIX Ethernet V2也成了事实上的标准。IEEE 802委员会制定的LLC其作用逐渐被淡化了,很多厂商生产的适配器上仅装有MAC协议,而LLC的功能被简化到了驱动程序或硬件逻辑中。
以太网与CSMA/CD协议
最早的以太网是主机都连接到一根总线上,总线的特点是:当一台计算机发送数据时,总线上的所有计算机都能检测到这个数据,即以太网以广播通信方式工作。当数据帧中的目的地址与适配器ROM中存放的硬件地址不一致时,适配器会丢弃该数据帧,因此主机只会接收目的地址是自己的数据帧,通过这种方式,具有广播特性的总线上就实现了一对一的通信。人们也常把局域网上的计算机称为“主机”、“工作站”、“站点”或“站”,以太网有以下核心特点:
- 采用无连接的工作方式,数据帧不进行编号,无确认/重传机制(不像TCP面向连接可靠交付),只提供尽最大努力的交付,通过CRC查错,如果错误就丢弃,其他什么也不做(不像IP层通过ICMP通知源发送方)
- 使用曼切斯特编码,来解决传输的二进制基带信号连续0或连续1无法识别的问题
- 总线上有主机在发送数据时,总线会被占用。因此,同一时间只允许一台主机发送数据,否则各主机的信号会互相干扰,使得所发送数据被破坏。以太网通过CSMA/CD协议来协调总线上的各计算机和谐通信,CSMA/CD的全称为载波监听多点接入/碰撞检测(Carrier Sense Multiple Access with Collision Detection)
CSMA/CD协议
CSMA/CD的特点:
- 多点接入:以太网是总线型网络,多个主机以多点接入的方式连接在一根总线上
- 载波监听:指每个主机在发送前和发送中都必须不停地检测信道。发送前检测信道,是为了获得发送权,如果检测到其他站正在发送,则需要等待信道空闲时才能发送。
- 碰撞检测:指正在发送的主机也需要边发送边监听信道,具体为适配器需要边发送数据,边检测信道上的信号电压的变化情况,当信号电压变化幅度超过一定的门限值时,说明至少有两个站在同时发送数据,表明产生了碰撞。这种方法称为配置检测或冲突检测。任何一个正在发送数据的站,一旦发现总线上出现了碰撞,其适配器就要立即停止发送,并等待一段随机时间后再次发送
碰撞的产生
以太网中的主机发送数据前都需要确认信道空闲,才能发送数据。但其实就算站点在发送前监听到信道“空闲”,仍可能发生碰撞,根本原因在于电磁波在总线上的传播速率是有限的。具体碰撞成因是因为:电磁波在1km电缆的传播时延约为5μs,如果AB两个站点相距1km,那么A向B发出的数据,在约5us后才能传送到B。如果B在收到A发送的帧之前也发送了数据(因为B的载波监听检测到信道空闲),那么A和B发送的帧必然会在某个时间相撞。在局域网的分析中,常把总线上的单程端到端传播时延记为τ,则A最迟知道自己发送的数据发生了碰撞的时间是2倍端到端传播时延2τ,这一时间称为碰撞窗口(collisionwindow),或者争用期(contention period)。主机发送的数据,只有经过了争用期还没有检测到碰撞,才能确定这次发送不会发生碰撞。
重传与截断二进制指数退避
当主机确定发生碰撞后,所有主机都会停止发送,随后信道将进入空闲,如果所有主机监听到空闲后又立马开始重新发送,并让会导致再次碰撞,因此以太网使用截断二进制指数退避(truncated binary exponential backoff)策略来确定碰撞后重传的时机,有的主机可以立马重传,有的主机则需要退避(推迟)一个间隔:
- 协议规定基本退避时间为争用期2τ,具体的争用期时间是51.2μs(该值是为10Mbit/s,最大传输距离2500米的以太网标准计算出来的)。对于10Mbit/s以太网,争用期内可发送512bit,即64字节。因此说争用期是512比特时间(发送512bit所需的时间),或者直接使用比特作为争用期的单位,即争用期是512bit。
- 重传延迟时间计算方式:从整数集合 [0,1,….,(2k-1)] (其中 k=min(重传次数,10) )随机取一个数r,延迟时间为r*争用期
- 当重传达16次仍不能成功时(这表明同时打算发送数据的站太多,以致连续发生冲突),则丢弃该帧,并向上层报告
- 推迟的时间随重传次数而增大,因此也称为动态退避+ 在第1次重传时,k=1,随机数r从整数{0,1}中选一个数,因此重传可选择的推迟时间是0或1*争用期(随机选取),即主机可能立即重传,也可能需要等待2τ
- 若再发生碰撞,则在第2次重传时,k=2,随机数r就从整数{0,1,2,3}中选一个数。因此重传推迟的时间是在0,2τ,4τ和6τ这4个时间中随机选取的值
- 重传次数大于10时,k取10;当重传达16次,丢弃该帧,向上报告
以太网最短帧
碰撞还需要考虑一种情况,某站发送了一个很短的帧,由于发送时间很短,因此源站发送完毕之前并没有检测出碰撞,这个帧在链路中继续传播,在到达目的站之前和别的站发送的帧发生了碰撞。目的站会丢弃该帧(因为出现差错),发送站却不知道这个帧发生了碰撞,因而不会重传这个帧。为了避免发生这种情况,以太网规定了一个最短帧长64字节,即512bit。如果要发送的数据小于该长度,那么必须加入一些填充字节,使帧长不小于64字节。对于10Mbit/s以太网,发送512bit的时间需要51.2μs,即争用期。由此可见,以太网在发送数据时,如果在争用期(共发送了64 字节)没有发生碰撞,那么后续发送的数据就一定不会发生冲突。换句话说,如果发生碰撞,就一定是在发送的前64字节之内。由于一检测到冲突就立即中止发送,这时已经发送出去的数据一定小于64字节,因此凡长度小于64字节的帧都是由于冲突而异常中止的无效帧,应当丢弃。
此外,当发送数据的站发现发生了碰撞时,除了立即停止发送数据外,还要再继续发送32比特或48比特的人为干扰信号(Gamming signal),以便让所有用户都知道现在已经发生了碰撞。此外,以太网还规定帧间最小间隔为9.6μs,相当于96比特时间,这是为了使刚刚收到数据帧的站的接收缓存来得及清理,做好接收下一帧的准备。
CSMA/CD协议完整工作流程
根据以上,CSMA/CD协议的工作流程:
- 准备发送:适配器从网络层获得一个分组,加上以太网的首部和尾部,组成以太网帧,放入适配器的缓存中。发送之前,需要先检测信道。
- 检测信道:若检测到信道忙,则应不停地检测,一直等待信道转为空闲。若检测到信道空闲,并在96比特时间内信道保持空闲(保证了帧间最小间隔),就发送这个帧。
- 在发送过程中仍不停地检测信道,即网络适配器要边发送边监听。可能方式两种情况:
- 发送成功:在争用期内一直未检测到碰撞。这个帧肯定能够发送成功,发送完毕后,其他什么也不做。
- 发送失败:在争用期内检测到碰撞。这时立即停止发送数据,并按规定发送人为干扰信号。适配器接着就执行指数退避算法,等待倍512比特时间后,再次检测信道尝试重传。但若重传达16次仍不能成功,则停止重传而向上报错。
- 以太网每发送完一帧,需要把已发送的帧暂时保留一下。如果在争用期内检测出发生了碰撞,那么还要在推迟一段时间后再把这个暂时保留的帧重传一次
集线器、双绞线与星形拓扑
传统以太网最初为使用同轴电缆的总线型,后来开始使用更便宜和灵活的双绞线并开始采用星形拓扑,星形中心使用集线器(hub)连接站点,每个站需要用两对无屏蔽双绞线(放在一根电缆内),分别用于发送和接收,双绞线的两端使用RJ-45插头(水晶插头),集线器有以下特点:
- 集线器工作在物理层,它的每个接口仅仅简单地转发比特,不进行碰撞检测。若两个接口同时有信号输入(即发生碰撞),那么所有的接口都将收不到正确的帧
- 一个集线器有多个接口,例如8至16个,每个接口通过RJ-45插头用两对双绞线与一台计算机上的适配器相连
- 集线器采用了专门的芯片,进行自适应串音回波抵消。这样就可使接口转发出去的较强信号不致对该接口接收到的较弱信号产生干扰。每个比特在转发之前还要进行再生整形并重新定时。
- 集线器一般都有少量的容错能力和网络管理功能。如:某个适配器出现故障,不停地发送以太网帧时,集线器可以检测到这个问题,在内部断开与出故障的适配器的连线,使整个以太网仍然能够正常工作。且支持热插拔,出故障时不断电即可更换或增加新模块。集线器上的指示灯还可显示网络上的故障情况,给网络的管理带来了很大的方便。
此时的以太网从物理拓扑上看是是一个星形网,由于集线器不像交换机一样做接口隔离工作,因此以太网在逻辑上仍是一个总线网,各站共享逻辑上的总线,使用的还是CSMA/CD协议,网络中的各站必须竞争对传输媒体的控制,并且在同一时刻至多只允许一个站发送数据。
以太网的信道利用率
假设一个10Mbit/s以太网中有多个站在同时工作,一个站在发送帧时出现了碰撞。经过一个争用期2τ后,可能又出现了碰撞。经过若干个争用期后,一个站发送成功了。假定发送帧需要的时间是T0,它等于帧长(bit)除以发送速率(10 Mbit/s)

成功发送一个帧需要占用信道的时间是T0+τ,这是因为当一个站发送完最后一个比特时,这个比特还要在以太网上传播,最极端的情况下,比特在路径上传输需要时间τ。因此必须在经过时间T0+τ后以太网才完全进入空闲状态,才能允许其他站发送数据。要提高以太网的信道利用率,就必须减小τ与T0之比。在以太网中定义了参数a=τ/T0,当a趋近于0时,表示只要一发生碰撞,就立即可以检测出来,并立即停止发送,因而信道资源被浪费的时间非常非常少。这就要求分子的数值要小,而分母T0的数值要大些,即:
- 当数据率一定时,以太网的传输的长度受到τ限制(传输距离太大τ的数值也会太大)
- 同时以太网的帧长不能太短(否则T0的值会太小)
由于发送一帧占用线路的时间是T0+τ,帧本身的发送时间是T0,因此极限的信道利用率为:
以太网的MAC层
MAC地址
在局域网中,硬件地址(hardware address)又称为物理地址或MAC地址,它是IEEE802标准规定的48位固化在适配器(网卡)ROM中的全球地址,MAC地址绑定的是网卡,因此一个主机可以拥有多个MAC地址。MAC地址由IEEE的注册管理机构RA(Registration Authority)负责管理:
- RA负责分配地址字段的6个字节中的前三个字节(即高位24位),生产局域网适配器的厂家需要向IEEE购买由这三个字节构成的地址号(代表一个地址块),该地址号的正式名称是组织唯一标识符OUI(Organizationally Unique Identifier),通常也叫做公司标识符(company_id)。如,3Com公司生产的适配器的MAC地址的前三个字节是02-60-8C,一个公司可能有几个OUI,也可能有几个小公司合起来购买一个OUI。
- 地址字段中的后三个字节(即低位24 位)则由厂家自行指派,称为扩展标识符
(extendedidentifier),厂家只需要保证生产出的适配器没有重复地址即可。 - 一个OUI地址号可以生成224个不同的地址,通过这种方式得到的48位地址称为EUI-48,EUI表示扩展的唯一标识符(Extended Unique Identifier)。因此,MAC地址实际上就是适配器标识符EUI-48
- 地址的第一字节的最低位为I/G位(Individual/Group)。当I/G位为0时,表示该地址是一个单播地址(地址第一字节为x0,x2,x4,x6,x8,xA,xC,xE;x为任意值)。当IG位为1时表示这是组地址,用来进行多播(旧译组播,广播是组播的特例,地址第一字节为x1,x3,x5,x7,x9,xB,xD,xF;x为任意值)。因此,当IG位分别为0和1时,一个地址块可包含224个单个站地址和224个组地址。网卡会处理IG位,如:网卡A的MAC地址是 08:00:27:AB:CD:EF(IG位=0,站地址),当它收到目标MAC地址为 09:00:27:AB:CD:EF(IG位=1,组播地址)的数据帧时,网卡会检查IG位,发现是1(组播),由于自己并未加入这个组播组,且地址也不是广播地址FF:FF:FF:FF:FF:FF,因此网卡会直接丢弃该帧
- IEEE还考虑到有人并不愿意向IEEE的RA购买OUI。为此,IEEE把地址字段第一字节的最低第二位规定为G/L位(GlobalLocal)。当G/L位为0时是全球管理(类似于公网地址,保证在全球没有相同的地址),厂商向IEEE购买的OUI都属于全球管理。当地址字段的GL位为1时是本地管理(类似于本地地址),用户可任意分配网络上的地址。但网卡在工作时不会理会G/L位,无论G/L位为何值,只要目标MAC地址是自己的地址,网卡就会接收该帧。现代网络中,手机、电脑连接Wi-Fi时会用随机MAC(而不用自己的真实MAC以保护隐私),随机MAC地址的GL位通常为1,系统据此知道这不是真实硬件地址
- 实际上,IEEE 802标准规定MAC地址字段可采用6字节(48位)或2字节(16位)这两种中的一种,由于主流是使用6字节地址,因此采用2字节地址字段时全都是本地管理地址
一些特殊MAC地址
- FF-FF-FF-FF-FF-FF 广播地址
- 00-00-5E-00-00-00到00-00-5E-FF-FF-FF通常用于VRRP等协议的控制报文
- 00-00-5E的多播地址01-00-5E地址块中,部分用于IPv4多播(01-00-5E-00-00-00到01-00-5E-7F-FF-FF),剩余部分空间(01-00-5E-80-00-00到01-00-5E-FF-FF-FF)保留用于未来协议、实验
- 33-33开头的地址用于IPv6多播
MAC地址与帧类别
帧分为以下类别:
- 单播(unicast)帧:用于一对一通信,即收到的帧的MAC地址与本站的硬件地址相同。
- 多播(multicast)帧:用于一对多通信,即发送给本局域网上一部分站点的帧
- 广播(broadcast)帧:用于一对全体,即发送给本局域网上所有站点的帧,广播是多播的一种特殊形式,目的MAC地址为FF:FF:FF:FF:FF:FF
所有网卡都至少能够识别单播地址和广播地址,对于多播地址,网卡层面只能提供基础硬件过滤机制。具体来说:网卡能根据目的MAC地址的IG位轻松区分单播和多播,
且能从多播中识别出广播(因为地址全1),但网卡无法进一步判断收到的多播帧属于哪个具体的多播组,这意味着它需要依赖上层(IP层)的基于IP地址的过滤机制。
网卡可以配置为基于MAC地址过滤帧,也可以配置为混杂模式(promiscuous mode)工作,该模式下,网卡会监听并接收所有在以太网上传输的帧,而不管这些帧是发往哪个站。嗅探器(Snifer)工具就使用了设置为混杂方式的网络适配器来监听所有帧,网络维护和管理人员可以通过这种方式来监视和分析以太网上的流量,以便找出提高网络性能的具体措施;黑客(hacker或cracker)也常利用这种方法非法获取用户信息。
局域网上的硬件多播
进行多播时,目标MAC地址不可能填入多个MAC,因而需要一个“公用MAC地址”作为多播帧的目标MAC地址,也作为一个组的地址标识,为此,RA为IANA(互联网号码指派管理局)保留分配了OUI为00-00-5E的MAC地址块,其中:
- IG位为0(单播地址):范围为00-00-5E-00-00-00到00-00-5E-FF-FF-FF,该空间由IANA为特殊协议保留,通常用于VRRP(虚拟路由器冗余协议)等协议的控制报文
- IG位为1(多播地址):范围为01-00-5E-00-00-00到01-00-5E-FF-FF-FF,IANA将其拆为了两部分:
- 第25位(01-00-5E后的第一位)值为0时,用于IPv4组播地址映射,范围为01-00-5E-00-00-00到01-00-5E-7F-FF-FF
- 第25位值为1时,IANA将这部分组播空间保留用于未来协议、实验等,范围为01-00-5E-80-00-00到01-00-5E-FF-FF-FF
IPv4多播地址到MAC地址的映射
IANA拿到以01-00-5E开头的组播地址空间中,原本IANA可分配24位地址空间,由于01-00-5E后的第一位(整个MAC地址中的第25位)被IANA固定为了0,因此剩余23位可用于多播地址分配。而D类IP地址可供分配的有28位(32位IP地址去掉4位D类类别位),因此这28位中的前5位不能用来构成以太网硬件地址,即需要砍掉5位,IP层用剩余的23位来与链路层的23位MAC地址进行映射。

这样做的好处是:
- 地址搬移:当主机要发送IPv4组播包时,可以直接从IP地址中截取低23位,然后拼接固定的01-00-5E和第25位的0来组成MAC地址。
- bit级地址比对:当主机接收IPv4组播包时,可以根据组播MAC地址列表按位比较,来做初步筛选是否应该丢弃该帧
这极大地降低了硬件成本与实现复杂度(这在80-90年代十分重要),但带来的代价是被丢弃的5位可以产生32种(25)组合。这意味着一个MAC地址将映射32个不同的IP组播地址,由于映射不唯一,网卡无法仅靠MAC地址做完美过滤。它会将所有发给这32个IP组播地址中任意一个IP地址的包都收上来,然后交给IP层利用软件进行过滤,再把不是本主机要接收的数据报丢弃,这带来了额外的系统资源消耗。因此说,网卡只能基于多播地址列表做的初步筛选(这滤除了大量无关的广播域流量,大大上层协议栈的负担),通过网卡筛选的组播帧,目标是这32个组播地址中的某一个,但可能主机压根没加入该组,因此通过网卡筛选的组播帧依旧有可能被IP层丢弃
192.168.0.1,MAC地址为10:22:33:44:AA:BB
加入多播组239.1.2.3,其对应的以太网多播MAC地址为01:00:5E:01:02:03
IGMP与组管理
1. 主机A会发送一个IGMP报文以表示加入该组,该IGMP报文本身也是用“组播 MAC”发送,报文目标IP:239.1.2.3,目标MAC:01:00:5E:01:02:03
主机网卡会将该MAC地址写入多播过滤表,未来接到来自该MAC的帧将接收并交付IP层
2. 交换机监听到IGMP报文,会建立端口映射,后续该组的流量只会发到这个端口,而不是全网泛洪
239.1.2.3 → 端口X(主机 A 所在端口)
3. 本地的多播路由器收到IGMP报文后,会记录当前网段有239.1.2.3组播订阅者,并且会利用PIM等多播路由选择协议把这种组成员关系转发给互联网上的其他多播路由器,这些路由器会根据PIM协议工作方式建立转发树
之后,本地的多播路由器会定期发送 IGMP Query询问谁还在订阅,以动态更新订阅信息
数据发送
假设某台主机发送视频流到组播IP地址239.1.2.3
1. 发送端,主机封装数据报时
目标IP:239.1.2.3,源IP:xx.xx.xx.xx
封装以太网帧
目的MAC: 01:00:5E:01:02:03,源MAC: xx:xx:xx:xx:xx:xx
2. 公网的多播路由器根据PIM建立的转发树,转发多播数据报到多个目标多播路由器,其中就包括主机A所在局域网的本地多播路由器,本地多播路由器将其转发到主机A
3. 经过交换机时,交换机根据 IGMP Snooping表只转发到主机 A 所在端口,如果不支持Snooping则会泛洪到所有端口
4.主机收到以太网帧,检查目标 MAC,命中01:00:5E:01:02:03,接收帧并交付IP层,如果不在过滤表或数据出错,则会直接被硬件丢弃
5. IP 层软件过滤(解决 32:1 冲突),由于MAC地址为01:00:5E:01:02:03的映射IP地址有224.1.2.3,225.1.2.3,...239.1.2.3等,因此需要检查目标IP是否为239.1.2.3,是则接收,如果数据报目标IP为224.1.2.3,它依旧会被网卡接收,但由于主机未加入224.1.2.3的组播组,因此它会在IP层被丢弃MAC帧格式
以太网MAC帧格式有两种标准,一种是DIXEthernet V2标准(即以太网V2标准),另一种是IEEE 的802.3标准,常用的是以太网V2标准,其帧格式如下:

以太网帧由5个字段组成:
- 目的地址:长6字节
- 源地址:长6字节
- 类型:长2字节,标识上一层使用的是什么协议,如:当类型字段的值是0x0800时,就表示上层使用的是IP数据报
- 数据部分:长度在46到1500字节之间(46字节是这样得出的:最小长度64字节减去18字节的首部和尾部就得出数据字段的最小长度)
- FCS帧检验序列:长4字节,使用CRC校验
字节填充
发送时,如果数据字段的长度小于 46 字节,MAC子层会在数据字段的后面加入一个整数字节的填充字段,以保证整个以太网的MAC帧长不小于64字节。接收时,接收端的MAC子层在剥去首部和尾部后会把数据字段和填充字段一起交给上层协议,由IP层根据首部的“总长度”字段,丢弃填充字段。如:假设MAC层交付46字节的数据给IP层,如果IP数据报首部的总长度字段值为42字节,则IP层能识别出共有4字节填充字段,并会将其丢弃。
位同步
当一个站在开始接收MAC帧时,需要先让适配器的时钟与比特流达成同步,同步的方式为:从MAC子层向下传到物理层时需要在帧的前面插入8字节数据(由硬件生成),它由两个字段构成:
- 第一个字段是7个字节的前同步码(由1和0交替),它的作用是使接收端的适配器在接收MAC帧时能够迅速调整其时钟频率,使它和发送端的时钟同步,也就是“实现位同步”。
- 第二个字段是帧开始定界符,定义为10101011。它的前六位的作用和前同步码一样,最后的两个连续的1就是告诉接收端适配器:即将开始传输MAC帧信息,这是帧的开始定界符。
- MAC帧的FCS字段的检验范围不包括前同步码和帧开始定界符
- 当使用SONET/SDH进行同步传输时则不需要用前同步码,因为在同步传输时收发双方一直在保持位同步
帧定界
以太网的传输使用曼切斯特编码,每一个码元(无论0还是1)正中间一定有一次电压变换,因此当物理链路上的电压不再变化,意味着帧的传输已经结束,因此接收端能据此判断帧已经接收完毕,而不需要帧结束定界符,也不需要MAC帧有帧长度字段。以太网在传输帧时,两个帧之间需要有一定的间隔,以保证在帧间隙(IFG)期间,物理线路是彻底“安静”的,以便接收端能据此判断当前帧已经接收结束。当接收端收到下一个帧开始定界符时,也标志着下一个帧的传输开始了。因此可以通过帧开始定界符+数据流+物理链路静默来描述一个完整的以太网帧及其边界。
无效帧
IEEE802.3标准规定凡出现下列情况之一的即为无效的MAC帧,对于检查出的无效MAC帧就简单地丢弃。以太网不负责重传丢弃的帧:
- 帧的长度不是整数个字节;
- 帧检验序列FCS检测出有差错
- 收到的帧的MAC客户数据字段的长度不在46
1500字节之间。考虑到MAC帧首部和尾部的长度共有18字节,可以得出有效的MAC帧长度为641518字节之间
IEEE802.3标准规定的MAC帧格式
局域网主流使用的是以太网V2 MAC帧格式标准,IEEE802.3标准规定的MAC帧格式只用于少部分工业等领域,在后来的修订标准中,IEEE正式将 Ethernet II 的帧格式纳入了标准体系中,称为“DIX封装”或“以太网类型封装”,IEEE802.3标准规定的MAC帧格式与以太网V2 MAC帧格式的区别在于两个地方:
- IEEE 802.3规定的 MAC帧的第三个字段是“长度/类型”。当这个字段值大于0x0600时(相当于十进制的1536),就表示“类型”。这样的帧和以太网V2MAC帧完全一样。只有当这个字段值小于0x0600时才表示“长度”,即MAC帧的数据部分长度。但实际上,如之前“帧定界”一节所述,以太网传输使用曼切斯特编码,可以通过物理链路的“平静”来判别帧是否结束,而长度信息主要依赖IP层的首部的报文长度字段,链路层并不关心,因此帧长度这一字段无实际意义。
- 当“长度/类型”字段值小于0x0600时,数据字段必须装入上面的逻辑链路控制LLC子层的LLC帧。由于现在广泛使用的局域网只有以太网,因此 LLC 帧已经失去了原来的意义
扩展的以太网
为了拓展以太网的覆盖范围,通常会使用集线器(物理层)、交换机(链路层)等设备连接多个小型以太网,来创建出更大的以太网。这种扩展的以太网在网络层来看仍然属于一个网络。
物理层扩展以太网
以太网上的主机之间的距离不能太远,否则主机发送的信号经过太长的链路传输后会衰减到CSMA/CD协议无法正常工作的状态。在早期广泛使用粗、细同轴电缆的以太网时代,常采用工作在物理层的转发器来扩展网络覆盖范围。随着双绞线成为以太网的主流传输介质,使用转发器进行扩展的方式已非常少见。如今,扩展主机与集线器距离的一种方法是使用一对光纤和光纤调制解调器,由光纤调制解调器完成电信号与光信号的相互转换,从而轻松连接数公里外的设备。
局域网内部,使用多个集线器,可以连接多个星形结构以太网,如连接一个学院内的三个系:

这样做的好处是不同系之间的计算机能够进行跨系的通信,同时也扩大以太网的地理覆盖范围,但这带来了新的问题:
- 三个系的以太网互连起来之前,每一个系的以太网是一个独立的碰撞域(collision domain,又称为冲突域),即在任一时刻,在每一个碰撞域中只能有一个站在发送数据。如果一个系的以太网的最大吞吐量是10Mbit/s,那么三个系总的最大吞吐量共有30Mbit/s。
- 把三个系的以太网通过集线器互连起来后,三个碰撞域合并为了一个碰撞域,碰撞域的范围被扩大了,某个系的两个站进行通信时,其他任何系内部的站点都不能进行通信,整个网络最大吞吐量仍然是一个系的吞吐量10Mbit/s。
造成上述问题是因为集线器本质上是一个多接口(即多端口)的转发器,在通信时会将收到的数据转发到所有接口,它也不能把帧进行缓存
链路层扩展以太网
扩展以太网更常用的方法是在数据链路层进行,历史上最早使用网桥(bridge)进行扩展,网桥收到数据帧时,会根据其MAC帧的目的地址进行转发或丢弃(过滤),而不是向所有的接口转发此帧。后来出现的交换机也有相同的方式工作,并拥有更快的转发速度。
无论是网桥还是交换机,这些设备对子网中的主机和路由器是透明的,这是因为:
- 帧的寻址仍然是端到端的:以太网帧的源/目的MAC地址始终是通信双方(主机或路由器接口)的地址,而不会是交换机的地址,即便它们之间的传输要经过交换机。交换机本身不参与数据平面的寻址,其MAC地址只用于管理、控制平面协议,不会出现在数据帧中
- 转发过程中不改变帧内容:交换机不修改任何数据帧的封装和内容
- 交换机转发行为对端系统不可见:交换机自学习、转发、洪泛、过滤等操作,对收发端无感知
链路层交换机
1990年问世的交换式集线器(switchinghub),即以太网交换机,由于其高效的工作方式,很快便取代传统的网桥。交换机与网桥一样工作在
- 基于交换表完成转发和过滤功能,交换表中的一个表项通常包含:MAC地址、通向该MAC地址的交换机接口、表项放置在表中的时间(有效期)
- 交换机本质上是一个多接口的网桥,每个接口都可以与其他设备相连,以全双工方式并行工作,因此,主机与交换机之间可以独占传输介质,无碰撞地传输数据。而不像工作在物理层的转发器、集线器,某个接口工作其他接口需要等待。
- 交换机的接口设有存储器,能在输出端口繁忙时对后续帧进行缓存。如:连接在以太网交换机上的两台主机,同时向另一台主机发送帧,那么当这台主机的接口繁忙时,发送帧的这两台主机的接口会把收到的帧暂存一下,等目标主机接口空闲时再发送出去。有的交换机也可以工作在直通(cut-through)模式下,该方式下交换机不会缓存帧,而是直接转发。
- 支持不同接口工作在不同的速率下(如:接口1工作在10Mbit/s,接口2工作在100Mbit/s),互不干扰
- 支持即插即用,交换表可以通过自学习算法建立
交换机的自学习
交换机通过自学习的方式自动建立转发表,具体流程为:
- 交换机表初始为空
- 对于在每个接口接收到的每个入帧,该交换机在其表中存储:(1)在该帧源地址字段中的MAC地址;(2)该帧到达的接口;(3)当前时间。这样,交换机在收到目标地址为该MAC地址的帧时,就可以直接从对应接口转发出去
- 如果在一段时间(称为老化期agingtime)后,交换机没有接收到以该地址作为源地址的帧,就在表中删除这个地址。通过这种方式,交换机能及时清理已经离开当前网络的主机信息

如上述案例中,交换机交换表一开始是空的。假设A向B发送一个以太网帧,从接口1进入到交换机:
- 交换机收到帧后,先查找交换表,没有查到应向哪个接口转发这个帧(交换表中没有目的地址为B的项目),于是交换机向除接口1以外的所有接口广播这个帧,C和D收到该帧后,由于目的地址不对,将丢弃该帧。只B会收下这个目的地址正确的帧,这个过程称为过滤
- 同时,交换机知道了接口1连接了A,于是将这个帧的源地址A和接口1写入交换表中,之后目的地址为A的数据帧可以从接口1发送出去
- 之后,只要主机C和D向其他主机发送帧,它们的地址和接口信息也会被陆续写入到交换表中
- 交换表中的信息具有时效性,超过老化期而没有更新的信息会被删除

自学习的过程可能导致以太网帧会在网络的某个环路中循环传输,如上图中的两个交换机之间下环路,为了解决这种兜圈子问题,IEEE 的802.1D标准制定了一个生成树协议STP(SpanningTree Protocol)。其要点就是不改变网络的实际拓扑,但在逻辑上则切断某些链路,使得从一台主机到所有其他主机的路径是无环路的树状结构,从而消除了兜圈子现象
现在的以太网
早期的以太网由于技术条件限制,使用无源的总线结构,使用CSMA/CD协议以半双工方式工作。后来随着大规模集成电路以及专用芯片的发展,便宜可靠的以太网交换机开始大规模使用,以太网演变为使用星形结构。
由于使用交换机的星形以太网不使用共享总线,没有碰撞问题(争用期问题也消失了),因此不再需要载波监听,也不再使用CSMA/CD协议,而是以全双工方式工作。但以太网帧结构、最小帧长64字节、最大帧长1518字节等以太网的底层特性依旧保留了下来,因此,交换机星形网络依旧属于以太网的范畴,现代局域网在技术上依然是标准的以太网。
虚拟局域网VLAN
在IEEE 802.1Q标准中,虚拟局域网VLAN(Virtual LAN)是指由一些局域网网段构成的与物理位置无关的逻辑组,这些网段具有某些共同的需求。每一个VLAN 的帧都有一个明确的标识符,指明发送这个帧的计算机属于哪一个VLAN。

利用以太网交换机可以很方便地实现虚拟局域网,如上所示的网络拓扑,有以下特点:
- 在物理分布上,它们可以分为三个局域网:LAN1:(A1, A2, B1, C1),LAN2:(A3, B2, C2),LAN3:(A4, B3, C3)
- 通过以太网交换机的逻辑控制,也可以将它们分为三个虚拟局域网:VLAN1:(A1, A2, A3, A4), VLAN2:(B1, B2, B3);VLAN3:(C1, C2, C3)
- 当B3向VLAN2成员进行广播时,B1和B2会收到,但A4、C3不会收到该广播,即便它们连接到了同一个交换机中,这能有效遏止广播风暴带来的局域网性能恶化
- 用户可以通过VLAN技术根据需要自由组合设备和网络资源,跳出物理链路限制,精准配置广播范围等网络属性
VLAN标记

IEEE的802.3ac标准定义了以太网的帧格式的扩展,以便支持虚拟局域网。虚拟局域网协议允许在以太网的帧格式中插入一个4 字节的标识符,称为VLAN标记(tag),用来指明发送该帧的计算机属于哪一个虚拟局域网。插入VLAN标记后的帧称为802.1Q帧,具体格式:
- VLAN标记字段长4字节,插入在以太网MAC帧的源地址字段和类型字段之间。VLAN标记的前两个字节总是为0x8100(即二进制的1000000100000000),称为IEEE802.1Q标记类型。
- 当数据链路层检测到MAC帧的源地址字段后面的两个字节的值是 0x8100时,就知道现在插入了4 字节的VLAN标记。于是就接着检查后面两个字节的内容。在后面的两个字节中:
- 前3位是用户优先级字段
- 后面1位是规范格式指示符CFI(Canonical FormatIndicator)
- 最后的12位是该虚拟局域网VLAN标识符VID(VLAN ID),它唯一地标志了这个以太网帧属于哪一个VLAN。
- 由于用于VLAN的以太网帧的首部增加了4个字节,因此以太网的最大帧长从原来的1518字节(1500字节的数据加上18字节的首部)变为1522字节
以太网与PPPoE
以太网的高速发展
以太网在漫长的历史发展过程中,产生了诸多具有不同特色的标准,以太网的速率也不断提升,它们具有一些令人困惑的首字母缩写,如10BASE-T、10BASE-2、100BASE-T、1000BASE-LX、10GBASE-T和40GBASE-T等。在命名上,它们具有一定的规律,
- 首字母缩写词的第一部分指该标准的速率:10代表10Mbit/s,其他值如100、1000、10G或40G类似
- BASE指基带以太网,这意味着该物理媒介仅承载以太网流量,几乎所有的802.3标准都适用于基带以太网
- 首字母缩写词的最后一部分指物理媒介本身,以太网支持各种物理媒介(包括同轴电缆铜线和光纤)承载。一般而言,T指双绞铜线
无论名称如何复杂,它们中的大部分以太网技术在多年中已经被IEEE 802.3 CSMA/CD(Ethernet)工作组标准化了。
使用以太网进行宽带接入
当城域网和广域网都采用高速以太网时(如:10GB以太网),采用以太网接入可以实现端到端的以太网传输,中间不需要再进行帧格式的转换。
但是以太网本质是广播型二层网络,它支持负责在链路层提供无连接的帧转发能力,不支持宽带接入时的用户名和密码认证、与运营商建立链路等功能,而这恰恰是PPP协议的功能,于是有人把数据链路层的两个成功的协议PPP和以太网协议结合起来,即把PPP帧封装到以太网中来传输,这就是1999年公布的PPPoE(PPP over Ethernet),意为是“在以太网上运行 PPP”,如今无论是传统网线接入,还是光纤宽带接入FTTx,都是使用PPPoE的方式进行接入,二者的分工为:
- PPP协议用于串行点对点链路,具备完整的链路控制(LCP)、认证机制(PAP/CHAP)以及网络层参数协商能力(如通过IPCP分配IP地址)
- 以太网本质上是广播型网络,可以用于广播查找ISP的接入服务器,并承载PPP协议报文传输
- 二者结合,PPPoE通过在以太网的广播链路上引入会话机制,来在广播链路上实现用户与ISP服务器之间点对点连接(逻辑上的点对点),并支持在共享介质上实现独立的认证、计费和IP配置
PPPoE工作分为两个阶段:
- Discovery阶段(发现阶段):通过广播查找ISP的接入服务器,并协商建立会话,最终由服务器分配唯一的Session ID;随后进入会话(Session)阶段
- Session阶段(会话阶段):会话建立后,后续所有PPP报文都封装在以太网帧中,以“单播 + Session ID”方式传输,然后就进入标准PPP流程,即:LCP协商链路参数、PAP/CHAP认证账号密码、IPCP分配IP地址,实现用户宽带接入
- 当用户利用ADSL(非对称数字用户线)进行宽带上网时,从用户个人电脑到家中的ADSL调制解调器之间,传输的是以太网帧,当太网帧到了家里的ADSL调制解调器后,就转换成为ADSL使用的PPP帧。即PPP会话建立于ISP服务器和调制解调器/光猫/路由器之间,而不是PC上。调制解调器/光猫/路由器之后的网络依旧属于传统广播以太网。
- 当用户使用电话线接入时。则直接通过普通的电话线传送PPP帧,这已经和以太网没有关系了,所以这种上网方式不能称为以太网上网
物理层
物理层直接负责在物理传输介质上实现原始比特流的透明传送,其核心任务是要尽可能地屏蔽掉底层传输媒介和通信手段的差异,使物理层上面的数据链路层感觉不到这些差异,并确定与传输媒体的接口有关的一些特性:
- 机械特性:指明接口所用接线器的形状和尺寸、引脚数目和排列、固定和锁定装置等
- 电气特性:指明在接口电缆的各条线上出现的电压的范围
- 功能特性:指明某条线上出现的某一电平的电压的意义
- 过程特性:指明对于不同功能的各种可能事件的出现顺序
物理层协议旧称为物理层规程(procedure),它的种类众多,针对不同传输媒介通常使用不同的物理层协议,但它们通常都以串行传输方式输送数据。
通信系统模型
一个数据通信系统可划分为三部分:源系统(发送方)、传输系统、目的系统(接收方)。源系统包括源点(又称信号源,指产生数据的设备,如键盘、信号发生器)与发送器(如:调制器),目的系统包括接收器(如:解调器)与终点(又称信宿,指接收信号的终点,如屏幕)
信号分类
- 模拟信号:连续信号,信号取值是连续的
- 数字信号:离散信号,信号取值是离散的。在使用时域的波形表示数字信号时,代表不同离散数值的基本波形称为码元,使用二进制编码时,只有0和1两种不同的码元。
通信方式
通信中有以下三种通信方式:
- 单工通信:以单向方式通信,工作只需要一个信道,如:无线电广播、电视广播
- 半双工通信:通信的双方都可以发送/接收信息,但只能交替通信,即不能双方同时发送,不能同时接收,工作需要两个信道,如:某些对讲机的通信
- 全双工通信:通信的双方可以同时发送和接收信息,工作需要两条信道,如:电话等
基带信号与调制
基带信号:来自信源的信号,计算机输出的代表各种文字或图像文件的信号都属于基带信号。基带信号往往包含有较多的低频成分,甚至有直流成分,而许多信道并不能传输这种低频分量或直流分量,此时基带信号需要进行调制(modulation)。调制分为两大类:
- 基带调制:仅仅对基带信号的波形进行变换,使它能够与信道特性相适应。变换后的信号仍然是基带信号。对于数字信号,由于这种基带调制是把数字信号转换为另一种形式的数字信号,因此它也称为编码(coding)。对于模拟信号,它只会对信号波形进行调整,使其适应信道的传输特性,但不会将其频谱搬移到高频段
- 带通调制:本质上是一种频谱搬移,即把低频的基带信号搬移到信道支持的高频,方便传输,如:在无线通信中,如果基带信号本身频率很低,那么其波长会很长,而天线的工作波长与天线尺寸相比拟,因此需要的天线尺寸会很大,因此需要对基带信号进行带通调制。带通调制需要使用载波(carrier)进行调制,把基带信号的频率范围搬移到较高的频段。对于数字信号,调制后的信号通常会被转换为模拟信号,方便在模拟信道中传输。经过载波调制后的信号称为带通信号(带通意味着信号只有一段频率范围内能够通过信道)
编码
常用的编码方式有以下几种

- 不归零编码(NRZ,Non-Return-to-Zero)最大的优点是编码效率极高,一个码元携带一比特,带宽利用率达到100%,实现也最简单,但通信时严重依赖通信双方的时钟同步,否则接收方无法识别出连续的0或1的码元边界(没有自同步能力),常用于短距离、低噪声、有独立时钟线的场景(如板载的SPI总线)
- 归零制编码(RZ,Return-to-Zero)在传输完信号后强制回归零电平,解决了NRZ因连续同值而丢失时钟同步的问题,但带来的代价是每个比特需要两次电平变化,主瓣带宽翻倍,编码效率下降一半
- 曼彻斯特(Manchester)编码将时钟信号直接融入数据中,定义比特中间必须发生一次跳变,彻底解决了长连0/1的同步提取问题,且当信号不再跳变时意味着。缺点在于编码效率低至50%,因为每比特有两个码元,信号速率是数据速率的两倍。曼彻斯特编码被广泛用于以太网
- 差分曼彻斯特编码:曼彻斯特的改进型,它同样保证每个比特中间有一次跳变以提供时钟,但这次跳变只用于同步,不表示数据。数据由比特周期开始处是否有跳变来决定,这种“看边界不看方向”的设计,带来一个独特优势:抗极性反转。双绞线正负接反,DPSK调制后的相位模糊,都不会影响判决,因为差分曼彻斯特编码只关心跳变的有无而非方向
带通调制
以下是基本的调制方法

信道基础知识
码间串扰与奈奎斯特定则
信道的带宽是有限的,对于信号而言,信道本质上是一个带通滤波器。当信号通过信道时,超过信道带宽的直流、低频、高频分量部分会被大幅衰减甚至直接滤除。对于一个矩形波,它通过一个直流分量,加上无数个奇次谐波的正弦波叠加而成:上升沿和下降沿陡峭部分是通过极其丰富的高频正弦波分量叠加而成,而对于平顶平坦部分,则由直流和低频正弦波分量维持电平平坦。当矩形波通过带宽有限的信道时,高频部分被滤除/衰减后会导致脉冲的边沿部分不再陡峭,而是变得圆滑、拖沓,直流和低频部分被滤除则会导致平顶部分倾斜下垂,即波形顶部不再平坦,而是像斜坡一样往下掉,导致信号基线剧烈漂移。上述原因会导致接收端收到的波形前沿和后沿就变得不那么陡峭了,每一个码元所占的时间界限也不再是很明确的,而是前后都拖了“尾巴”。这样,在接收端收到的信号波形就失去了码元之间的清晰界限。这种现象称为码间串扰。
奈奎斯特第一准则指出,在任何信道中,码元传输的速率是有上限的,传输速率超过此上限,就会出现严重的码间串扰的问题。在带宽为B的理想低通信道下,能实现无码间串扰的最大码元速率是2B波特,这个极限叫奈奎斯特速率。
信噪比与香浓公式
噪声存在于所有的电子设备和通信信道中,并且是随机产生的,噪声会叠加到信号中,导致接收端对码元的判决产生错误(1误判为0或0误判为1)。但噪声的影响是相对的。如果信号相对较强,那么噪声的影响就相对较小。因此,信噪比就很重要。所谓信噪比就是信号的平均功率和噪声的平均功率之比,常记为S/N,并用分贝(dB)作为度量单位。即:
香农公式指出信道的带宽或信道中的信噪比越大,信息的极限传输速率就越高,信道的极限信息传输速率C为:
信道复用技术
- 频分复用FDM(Frequency Division Multiplexing):不同信号占用不同频段,同时传输
- 时分复用TDM(Time Division Multiplexing):不同信号占用同一频道的不同时间槽,轮流传输
- 波分复用WDM(Wavelength Division Multiplexing):本质是光的频分复用,不同信号使用不同波长的光波,在同一光纤中同时传输
- 码分复用CDM(Code Division Multiplexing):又称码分多址CDMA(Code Division Multiple Access)。在CDMA中,每一个比特时间会被划分为m个短的间隔,称为码片(chip)。通常m的值是64或128。使用CDMA的每一个站会被指派一个唯一的m bit 码片序列(chip sequence)。一个站如果要发送比特1,则发送它自己的mbit码片序列。如果要发送比特0,则发送该码片序列的二进制反码。多个站点之间的码片序列必须相互正交,这样当多个站点同时发送信号时,接收端能通过求积计算把不需要站点的信号过滤掉。