admin 管理员组

文章数量: 887021

24考研深入浅出计算机网络笔记

文章目录

  • 24考研深入浅出计算机网络笔记
  • 前言
  • 第一章 概述
    • 1.1 因特网概述
    • 1.2 电路交换、分组交换和报文交换
    • 1.3 计算机网络的定义和分类
      • 1.3.1 计算机网络的定义
      • 1.3.1 计算机网络的分类
    • 1.4 计算机网络的性能指标
    • 1.5 计算机网络的体系结构
      • 1.5.1 常见的三种计算机网络体系结构
      • 1.5.2 计算机网络体系结构分层的必要性
      • 1.5.3 计算机网络体系结构分层思想举例
      • 1.5.4 计算机网络体系结构中的专用术语
  • 第二章 物理层
    • 2.1 物理层概述
    • 2.1 物理层下面的传输媒体
    • 2.3 传输方式
      • 2.3.1 串行传输和并行传输
      • 2.3.2 同步传输和异步传输
      • 2.3.3 单向通信、双向交替通信和双向同时通信
    • 2.4 编码与调制
      • 2.4.1 编码与调制基本概念
      • 2.4.2 常用编码方式
      • 2.4.3基本的带通调制方法和混合调制方法
    • 2.5 信道的极限容量
    • 2.6 信道复用技术
      • 2.6.1 信道复用技术的基本原理
      • 2.6.2 常用的信道复用技术
  • 第三章 数据链路层
    • 3.1 数据链路层概述
    • 3.2 数据链路层的三个重要问题
      • 3.2.1 封装成帧和透明传输
      • 3.2.2 差错检测
      • 3.2.3 可靠传输
    • 3.3 点对点协议PPP
    • 3.4 共享式以太网
      • 3.4.1 网络适配器和MAC地址
      • 3.4.2 CSMA/CD协议
      • 3.4.3 使用集线器的共享式以太网
      • 3.4.4 在物理层扩展以太网
      • 3.4.5 在数据链路层扩展以太网
    • 3.5 交换式以太网
    • 3.6 以太网的MAC帧格式
    • 3.7 虚拟局域网
    • 3.8 以太网的发展
    • 3.9 802.11无线局域网
      • 3.9.1 802.11无线局域网的组成
      • 3.9.2 802.11无线局域网的物理层
      • 3.9.3 802.11无线局域网使用CSMA/CA协议的原因
      • 3.9.4 CSMA/CA协议的基本工作原理
      • 3.9.5 802.11无线局域网的MAC帧
  • 第四章 网络层
    • 4.1 网络层概述
    • 4.2 网际协议IP
      • 4.2.1 异构网络互连
      • 4.2.2 IPv4地址及其编址方法
      • 4.2.3 IPv4地址的应用规划
      • 4.2.4 IPv4地址与MAC地址
      • 4.2.5 地址解析协议ARP
      • 4.2.6 IP数据报的发送和转发流程
      • 4.2.7 IPv4数据报的首部格式
    • 4.3 静态路由配置
    • 4.4 因特网的路由选择协议
      • 4.4.1 路由选择分类
      • 4.4.2 因特网采用分层次的路由选择协议
      • 4.4.3 路由信息协议(RIP)
      • 4.4.4 开放最短路径优先协议(OSPF)
      • 4.4.5 边界网关协议(BGP)
    • 4.5 网际控制报文协议(ICMP)
    • 4.6 虚拟专用网VPN和网络地址转换NAT
    • 4.7 IP多播
      • 4.7.1 IP多播技术的相关基本概念
      • 4.7.2 IP多播地址和多播组
      • 4.7.3 在局域网上进行硬件多播
      • 4.7.4 在因特网上进行IP多播需要的两种协议
    • 4.8 移动IP技术
    • 4.9 IPv6
      • 4.9.1 IPv6主要特点
      • 4.9.2 IPv6地址
      • 4.9.3 从IPv4向IPv6过渡
    • 4.10 软件定义网络SDN
  • 第五章 运输层
    • 5.1 运输层概述
    • 5.2 UDP和TCP的对比
    • 5.3 TCP
      • 5.3 .1 TCP报文段的首部格式
      • 5.3.2 TCP的运输连接管理
      • 5.3.3 TCP的流量控制
      • 5.3.4 TCP的拥塞控制
      • 5.3.6 TCP可靠传输的实现
  • 第六章 应用层
    • 6.1 应用层概述
    • 6.2 客户/服务器方式和对等方式
    • 6.3 动态主机配置协议DHCP
    • 6.4 域名系统DNS
    • 6.5 文件传送协议FTP
    • 6.6 电子邮件
    • 6.7 万维网WWW


前言

该文章笔记来源于B站湖科大教书匠计算机网络微课视频,部分地方做了些许调整,并加入了一些王道视频中的内容。主要目的是自己考研复习使用,也方便大家参考学习。

24考研王道计算机组成原理笔记

第一章 概述

1.1 因特网概述




  1. 若干节点和链路互连形成网络
  2. 若干网络通过路由器互连形成互连网(互联网)
  3. 因特网是当今世界上最大的互联网

1.2 电路交换、分组交换和报文交换

电路交换
由于链路一直存在,占用资源,导致线路传输效率一般都会很低。

分组交换
将 h1 的数据传输到 h3 的设备上来,考虑到中间交换机的缓存容量,所以采用报文的方式,将长数据分解成一段段的带首部的短数据。分组交换网中的节点先缓存短数据,然后从首部中提取出目的地址,按照目的地址查找自己的转发表,找到相应的转发接口后,将分组转发出去把分组交给下一个转发节点,经过多个节点的存储转发后,分组最终转发到目的主机。主机 h3 接收到数据后,去掉首部,将各数据段组合还原出原始报文。


报文交换

  • 报文交换是分组交换的前身。
  • 在报文交换中,报文被整个地发送,而不是拆分成若干个分组进行发送。
  • 交换节点将报文整体接收完成后才能查找转发表,将整个报文转发到下一个节点。
  • 因此,报文交换比分组交换带来的转发时延要长很多,需要交换节点具有的缓存空间也大很多。
  • 若要连续传送大量的数据,并且数据传送时间远大于建立连接的时间,则使用电路交换可以有较高的传输效率。然而计算机的数据传送往往是突发式的,采用电路交换时通信线路的利用率会很低。
  • 报文交换和分组交换都不需要建立连接(即预先分配通信资源),在传送计算机的突发数据时可以提高通信线路的利用率。
  • 将报文构造成若干个更小的分组进行分组交换,比将整个报文进行报文交换的时延要小,并且还可以避免太长的报文长时间占用链路,有利于差错控制,同时具有更好的灵活性。

1.3 计算机网络的定义和分类

1.3.1 计算机网络的定义

现阶段计算机网络的一个较好的定义:计算机网络主要是由一些通用的、可编程的硬件互连而成的,而这些硬件并非专门用来实现某一特定目的(例如,传送数据或视频信号)。这些可编程的硬件能够用来传送多种不同类型的数据,并能支持广泛的和日益增长的应用。

  • 可编程的硬件:不限于计算机,而是包括了智能手机、具有网络功能的传感器以及智能家电等智能硬件,这些硬件一定包含有中央处理单元(CPU)。
  • 各类应用:计算机网络并非只用来传送数据,而是能够基于数据传送,进而实现各种各样的应用,包括今后可能出现的各种应用。

1.3.1 计算机网络的分类

  • 交换方式:电路交换、报文交换、分组交换
  • 使用者:公用网(因特网)、专用网(军队、铁路、电力、银行)
  • 传输介质:有线网络、无线网络
  • 覆盖范围:
  • 拓步结构:

1.4 计算机网络的性能指标

计算机网络的性能指标被用来从不同方面度量计算机网络的性能,常用的八个计算机网络性能指标:速率、带宽、吞吐量、时延、时延带宽积、往返时间、利用率、丢包率。

  • 比特(bit,记为小写b)是计算机中数据量的基本单位,一个比特就是二进制数字中的一个1或0。
  • 数据量的常用单位有字节(byte,记为大写B)、千字节(KB)、兆字节(MB)、吉字节(GB)以及太字(TB)
  • 速率是指数据的传送速率(即每秒传送多少个比特),也称为数据率(Data Rate)或比特率(Bit Rate)。
  • 速率的基本单位是比特/秒(bit/s,可简记为b/s,有时也记为bps,即bit per second)。速率的常用单位有千比特/秒(kb/s或kbps)、兆比特/秒(Mb/s或Mbps)、吉比特/秒(Gb/s或Gbps)以及太比特/秒(Tb/s或Tbps)

1、速率


2、带宽


3、吞吐量

4、时延
时延是指数据从网络的一端传送到另一端所耗费的时间,也称为延迟或迟延。 数据可由一个或多个分组、甚至是一个比特构成。




5、时延带宽积

时延带宽积是传播时延和带宽的乘积。

6、往返时间
往返时间(Round-Trip Time,RTT)是指从发送端发送数据分组开始,到发送端收到接收端发来的相应确认分组为止,总共耗费的时间。

7、利用率

  • 链路利用率是指某条链路有百分之几的时间是被利用的(即有数据通过)。完全空闲的链路的利用率为零。
  • 网络利用率是指网络中所有链路的链路利用率的加权平均。


8、丢包率
丢包率是指在一定的时间范围内,传输过程中丢失的分组数量与总分组数量的比率。接口丢包率、网络丢包率、节点丢包率、路径丢包率、链路丢包率。



分组丢失主要有以下两种情况:

  • 分组在传输过程中出现误码,被传输路径中的节点交换机(例如路由器)或目的主机检测出误码而丢弃。
  • 节点交换机根据丢弃策略主动丢弃分组。

丢包率可以反映网络的拥塞情况:

  • 无拥塞时路径丢包率为0。
  • 轻度拥塞时路径丢包率为1%~4%。
  • 严重拥塞时路径丢包率为5%~15%

1.5 计算机网络的体系结构

1.5.1 常见的三种计算机网络体系结构




网络接口:有线的以太网接口,无线局域网的 wifi 接口等。
本质上 TCP/IP 只有网际层,运输层,应用层三层。IP 协议是 TCP/IP 体系结构网际层的核心协议。TCP 和 UDP 是 TCP/IP 体系结构运输层的两个重要协议。TCP/IP 体系结构的应用层包含了大量的应用层协议。例如 HTTP、SMTP、DNS、RTP 等。

  • IP 协议可以把不同的网络接口进行互连,并向其上的 TCP 协议和 UDP 协议提供网络互连服务。而 TCP 协议在享受 IP 协议提供的网络互联服务的基础上,可向应用层的相应协议提供可靠传输的服务。而 UDP 协议在享受 IP 协议提供的网络互联服务的基础上,可向应用层的相应协议提供不可靠传输的服务。IP 协议作为 TCP/IP 体系结构中的核心协议,一方面负责互连不同的网络接口,也就是 ip over everthing;另一方面为各种网络应用提供服务,也就是 everything over IP。
  • 在 TCP/IP 协议体系中包含有大量的协议,IP 协议和 TCP 协议是其中非常重要的两个协议。因此,用 TCP 和 IP 这两个协议来表示整个协议大家族。常称为 TCP/IP 协议簇。

1.5.2 计算机网络体系结构分层的必要性

计算机网络是个非常复杂的系统,“分层”可将庞大复杂的问题转化为若干较小的局部问题。

物理层

数据链路层

网络层

运输层

应用层

1.5.3 计算机网络体系结构分层思想举例








1.5.4 计算机网络体系结构中的专用术语

1、实体

  • 实体是指任何可发送或接收信息的硬件或软件进程。
  • 对等实体是指通信双方相同层次中的实体。

2、协议


3、服务

  • 在协议的控制下,两个对等实体在水平方向的逻辑通信使得本层能够向上一层提供服务。要实现本层协议,还需要使用下面一层所提供的服务。
  • 协议是“水平”的,而服务是“垂直”的。实体看得见下层提供的服务,但并不知道实现该服务的具体协议。下层的协议对上层的实体是“透明”的。
  • 在同一系统中相邻两层的实体交换信息的逻辑接口称为服务访问点SAP,它被用于区分不同的服务类型。帧的“类型”字段、IP数据报的“协议”字段,TCP报文段或UDP用户数据报的“端口号”字段都是SAP。
  • 上层要使用下层所提供的服务,必须通过与下层交换一些命令,这些命令称为服务原语。
  • 对等层次之间传送的数据包称为该层的协议数据单元(Protocol Data Unit,PDU)。同一系统内层与层之间交换的数据包称为服务数据单元(Service Data Unit,SDU)。

第二章 物理层

2.1 物理层概述

1、物理层要实现的的功能
解决在各种传输媒体上传输比特0和1的问题,进而给数据链路层提供透明传输比特流的服务。

2、物理层接口特性

2.1 物理层下面的传输媒体

  • 传输媒体是计算机网络设备之间的物理通路,也称为传输介质或传输媒介。
  • 传输媒体并不包含在计算机网络体系结构中。


1、导向型传输媒体





光纤的优点

  • 通信容量非常大
  • 抗雷电和电磁干扰性能好
  • 传输损耗小,中继距离长
  • 无串音干扰,保密性好
  • 体积小,重量轻

光纤的缺点

  • 切割光纤需要较贵的专用设备
  • 目前光电接口还比较昂贵

2、非导向型传输媒体


  • 由于微波会穿透电离层而进入宇宙空间,因此它不能经过电离层的反射传播到地面上很远的地方。
  • 微波是直线传播,一般只有五十公里左右,为了实现远距离通信,必须在一条微波通信信道的两个终端之间建立若干个中继站。中继站将前一站送来的信号经过放大后再发送到下一站,称为“接力”。
  • 微波通信:地面接力接力通信、卫星通信。


2.3 传输方式

2.3.1 串行传输和并行传输

串行传输是一个比特一个比特传输,因此发送端和传输端之间只需要一条数据传输线路即可。
并行传输是指一次性传输多个比特,而不是一个比特。接发收端有 n 条传输线路。成本高。


远距离传输是串行传输,计算机内部传输是并行传输,常见的数据总线宽度有 8 位,16位,32 位和 64 位。

2.3.2 同步传输和异步传输

同步传输:发送端发送连续不间断的信号,接收端按照时钟频率进行接收,因为发送端和接收端频率不同步,所以会产生一定的时钟误差,会导致接收端对比特信号的判别错位,那么要需要一些方式来使时钟保持同步。

  • 外同步:两条信号线,一条接收数据信号,一条接收时钟频率信号。
  • 内同步:发送端将时钟同步信号编码和发送数据一同发送(曼彻斯特编码)。

异步传输:发送数据是有间隔不联系的,接收端仅在每个字节的起始处对字节内的比特实现同步。为此,通常要在每个字节前后分别加上起始位和结束位。

2.3.3 单向通信、双向交替通信和双向同时通信


2.4 编码与调制

2.4.1 编码与调制基本概念




传输媒体和信道不能直接划等号

  • 对于单工传输,传输媒体中只包含一个信道,要么是发送信道,要么是接收信道。
  • 对于半双工和全双工传输,传输媒体中要包含两个信道,一个发送信道,一个接收信道。
  • 使用信道复用技术,一条传输媒体还可以包含多个信道。常见是将数字基带信号通过编码或调制的方法在相应的信道进行传输。

2.4.2 常用编码方式





在传输大量连续1或连续0的情况下,差分曼彻斯特编码信号比曼彻斯特编码信号的变化少。在噪声干扰环境下,检测有无跳变比检测跳变方向更不容易出错,因此差分曼彻斯特编码信号比曼彻斯特编码信号更易于检测。在传输介质接线错误导致高低电平翻转的情况下,差分曼彻斯特编码仍然有效。

2.4.3基本的带通调制方法和混合调制方法



2.5 信道的极限容量


信号在传输过程中或受到各种因素的影响,一个数字信号通过实际的信道后,波形会产生失真,在失真不严重时,在输出端还可根据已失真的波形还原出发送的码元。在失真严重时,很难判断这个信号是什么时候是1,什么时候是0,信号波形失去了码元之间的清晰界限。这种现象叫做码间串扰。
码元的传输速率越高、信号的传输距离越远、噪声干扰越大、传输媒体质量越差,信号经过传输后的失真就越严重。


码元传输速率又称为波特率、调制速率、波形速率或符号速率。
波特率与比特率有一定的关系:

  • 当1个码元只携带1比特的信息量时,波特率(码元/秒)与比特率(比特/秒)在数值上是相等的。
  • 当1个码元携带n比特的信息量时,波特率(码元/秒)转换成比特率(比特/秒)时,数值要乘以n。

问:尽管奈氏准则限制了最高码元传输速率,但是只要采用技术更为复杂的信号调制方法,让码元可以携带更多的比特,岂不是可以无限制地提高信息的传输速率吗?
答:回答是否定的。因为在实际的信道中会有噪声,噪声是随机产生的,其瞬时值有时会很大,这会影响接收端对码元的识别,并且噪声功率相对于信号功率越大,影响就越大。

  • 信道的频率带宽W或信道中的信噪比S/N越大,信道的极限信息传输速率C就越高。
  • 实际信道不可能无限制地提高频率带宽W或信道中的信噪比S/N。
  • 实际信道中能够达到的信息传输速率,要比香农公式给出的极限传输速率低不少。这是因为在实际信道中,信号还要受到其他一些损伤,例如各种脉冲干扰和信号衰减等,这些因素在香农公式中并未考虑。

在信道的频率带宽W一定的情况下,根据奈氏准则和香农公式,要想提高信息的传输速率,就必须采用多元制(更复杂的调制技术),并努力提高信道中的信噪比。

2.6 信道复用技术

2.6.1 信道复用技术的基本原理

  • 复用(Multiplexing)就是在一条传输媒体上同时传输多路用户的信号。
  • 当一条传输媒体的传输容量大于多条信道传输的总容量时,就可以通过复用技术,在这条传输媒体上建立多条通信信道,以便充分利用传输媒体的带宽。
  • 尽管实现信道复用会增加通信成本(需要复用器、分用器以及费用较高的大容量共享信道),但如果复用的信道数量较大,还是比较划算的。

2.6.2 常用的信道复用技术

常用的信道复用技术:频分复用FDM、时分复用TDM、波分复用WDM、码分复用CDM


  • 根据频分复用的设计思想,可在一根光纤上同时传输多个频率(波长)相近的光载波信号,实现基于光纤的频分复用技术。
  • 目前可以在一根光纤上复用80路或更多路的光载波信号。因此,这种复用技术也称为密集波分复用DWDM。
  • 铺设光缆的工程耗资巨大,应尽量在一根光缆中放入尽可能多的光纤,然后对每一根光纤使用密集波分复用技术。

例如,在一根光缆中放入100根速率为2.5Gb/s的光纤,对每根光纤采用40倍的密集波分复用,则这根光缆的总数据速率为(2.5Gb/s × 40)× 100 = 10000Gb/s = 10Tb/s。

  • CDMA将每个比特时间划分为m个更短的时间片,称为码片(Chip)。m的取值通常为64或128。
  • CDMA中的每个站点都被指派一个唯一的m比特码片序列(Chip Sequence)。某个站要发送比特1,则发送它自己的m比特码片序列;某个站要发送比特0,则发送它自己的m比特码片序列的反码。

【举例】
假设给某个站指派的8比特码片序列为01011001
该站发送比特1:发送自己的8比特码片序列01011001
该站发送比特0:发送自己的8比特码片序列01011001的反码10100110
将码片序列中的比特0记为-1,而比特1记为+1,可写出码片序列相应的码片向量。在本例中,该站的码片向量为(-1 +1 -1 +1 +1 -1 -1 +1)。
如果有两个或多个站同时发送数据,则信道中的信号就是这些站各自所发送一系列码片序列或码片序列反码的叠加。为了从信道中分离出每个站的信号,给每个站指派码片序列时,必须遵循以下规则:

  • 分配给每个站的码片序列必须各不相同,实际常采用伪随机码序列。
  • 分配给每个站的码片序列必须相互正交,即各码片序列相应的码片向量之间的规格化內积为0。

令向量A表示站A的码片向量,向量B表示站B的码片向量。两个不同站A和B的码片序列相互正交,就是向量A与向量B的规格化內积为0,如下式所示。






第三章 数据链路层

3.1 数据链路层概述


在讨论链路层传输过程时,不考虑解封问题,只看成水平层传输的过程。及局域网1中的主机 H1 经过路由器 R1,广域网,以及路由器 R2 连接到局域网2中的主机 H2。不同的数据链路层可能采取不同的数据链路层协议。

链路(Link)是指从一个节点到相邻节点的一段物理线路(有线或无线),而中间没有任何其他的交换节点。

数据链路(Data Link)是基于链路的。当在一条链路上传送数据时,除需要链路本身,还需要一些必要的通信协议来控制这些数据的传输,把实现这些协议的硬件和软件加到链路上,就构成了数据链路。
计算机中的网络适配器(俗称网卡)和其相应的软件驱动程序就实现了这些协议。一般的网络适配器都包含了物理层和数据链路层这两层的功能。

(Frame)是数据链路层对等实体之间在水平方向进行逻辑通信的协议数据单元PDU。

3.2 数据链路层的三个重要问题


帧的首部和尾部包含着重要的链路信息,例如这是以太网版本2的 MAC 帧首部中的各字段,包括帧的源地址、目的地址、类型等重要信息,尾部字段帧检验信息 FCS 字段,接收方通过该字段的值,用于判断帧在传输过程中是否产生了误码。

这是点对点协议 PPP 的帧格式。首部和尾部都有一个标志字段,接收方的数据链路层在收到物理层交付上来的比特流后,根据帧首部和尾部中的标志字段,就可以从收到的比特流中识别出帧的开始和结束。也就是进行帧定界。


如下图所示,发送方给接收方发送了两个帧,这时两个帧的帧首部和帧尾部都有一个标志字段,也就是帧定界符。接收方的数据链路层根据帧定界符就能从一连串比特流中识别出一个个的帧,然而,如果在帧的数据载荷部分恰好出现了帧首部和尾部中的标志字段取值相同的数据,在不采取其它措施的情况下接收方的数据链路层会出现帧定界的错误。

在传输过程中,由于实际的通信链路都不是理想的,表示比特的信号在信道上传输时,不可避免地会产生失真,甚至出现误码。即比特 0 变成比特 1,比特 1 变成比特 0,那么接收方的数据链路层收到该帧后,如何才能知道帧中出现了误码呢?这就需要采用差错检测措施。
例如,发送方的数据链路层采用某种检错技术,根据帧的内容计算出一个检错码,将检错码填入帧尾部,帧尾部中用来存放检错码的字段称为帧检验序列(FCS),接收方的数据链路层从帧尾部取出检错码,采用与发送方相同的检错技术,就可通过检错码检测出帧在传输中是否出现了误码。


3.2.1 封装成帧和透明传输

封装成帧是指数据链路层给上层交付下来的协议数据单元PDU添加一个首部和一个尾部,使之成为帧。
透明传输是指数据链路层对上层交付下来的协议数据单元PDU没有任何限制,就好像数据链路层不存在一样。

  • 面向字节的物理链路使用字节填充的方法实现透明传输。
  • 面向比特的物理链路使用比特填充的方法实现透明传输。
  • 帧的首部和尾部中包含有一些重要的控制信息。
  • 帧首部和尾部的作用之一就是帧定界。并不是每一种数据链路层协议的帧都包含有帧定界标志。

在传输过程中,如果帧定界和网络协议数据单元的数据发生重合,那还能鉴定出帧定界符么?
答案是否定的。解决这个问题时,可以在发送帧之前,对帧的数据部分进行扫描,每出现一个帧定界符,就在其前面插入一个转义字符。接收方数据链路层在物理层交付的比特流中提取帧,遇到第一个帧定界符时,认为这是帧的开始。当遇到转义字符时就知道,其后面的 1 字节内容虽然与帧定界符相同,但它是数据而不是定界符,剔除转义字符后,将其后面的内容作为数据继续提取。

要是在传输过程中遇到既包含帧定界符,又包含了转义字符,应该怎么处理?
方法依旧是对帧的数据部分进行扫描,每出现一个帧定界符或转义字符,就在其前面插入一个转义字符。转义字符是一个特殊的字符,其长度为1个字节,十进制为27,而并不是E、S、C这三个字符。


MAC 帧不需要帧尾,用的是帧间间隔。

为了提高数据链路层传输帧的效率,应当使帧的数据载荷的长度尽可能地大于首部和尾部的长度。
考虑到对缓存空间的需求以及差错控制等诸多因素,每一种数据链路层协议都规定了帧的数据载荷的长度上限,即最大传送单元(Maximum Transfer Unit,MTU)。例如,以太网的MTU为1500个字节。

3.2.2 差错检测

  • 实际的通信链路都不是理想的,比特在传输过程中可能会产生差错(称为比特差错):比特1可能变成比特0,比特0可能变成比特1。
  • 在一段时间内,传输错误的比特数量占所传输比特总数的比率称为误码率(Bit Error Rate,BER)。
  • 提高链路的信噪比,可以降低误码率。但在实际的通信链路上,不可能使误码率下降为零。
  • 使用差错检测技术来检测数据在传输过程中是否产生了比特差错,是数据链路层所要解决的重要问题之一。

检错编码–奇偶校验

  • 奇校验是在待发送的数据后面添加1个校验位,使得添加该校验位后的整个数据中比特1的个数为奇数。
  • 偶校验是在待发送的数据后面添加1个校验位,使得添加该校验位后的整个数据中比特1的个数为偶数。
  • 在所传输的数据中,如果有奇数个位发生误码,则所包含比特1的数量的奇偶性会发生改变,可以检测出误码。
  • 在所传输的数据中,如果有偶数个位发生误码,则所包含比特1的数量的奇偶性不会发生改变,无法检测出误码(漏检)。
  • 在实际使用时,奇偶校验又可分为垂直奇偶校验、水平奇偶校验以及水平垂直奇偶校验。



检错编码–循环冗余校验CRC

数据链路层广泛使用漏检率极低的循环冗余校验(Cyclic Redundancy Check,CRC)检错技术。
循环冗余校验CRC的基本思想:

  1. 收发双方约定好一个生成多项式G(X)。
  2. 发送方基于待发送的数据和生成多项式G(X),计算出差错检测码(冗余码),将冗余码添加到待发送数据的后面一起传输。
  3. 接收方收到数据和冗余码后,通过生成多项式G(X)来计算收到的数据和冗余码是否产生了误码。





    纠错编码–海明码




3.2.3 可靠传输

1、可靠传输的相关基本概念
使用差错检测技术(例如循环冗余校验CRC),接收方的数据链路层就可检测出帧在传输过程中是否产生了误码(比特差错)。
数据链路层向其上层提供的服务类型:

  • 不可靠传输服务:仅仅丢弃有误码的帧,其他什么也不做;
  • 可靠传输服务:通过某种机制实现发送方发送什么,接收方最终就能收到什么。

一般情况下,有线链路的误码率比较低。为了减小开销,并不要求数据链路层向其上层提供可靠传输服务。即使出现了误码,可靠传输的问题由其上层处理。
无线链路易受干扰,误码率比较高,因此要求数据链路层必须向其上层提供可靠传输服务。




  • 可靠传输服务并不局限于数据链路层,其他各层均可选择实现可靠传输。
  • 可靠传输的实现比较复杂,开销比较大,是否使用可靠传输取决于应用需求。

2、停止-等待协议的实现原理
发送方给接收方发送数据分组,‍‍接收方收到后对其进行差错检测,若没有误码,则接受该数据分组,‍‍并给发送方发送确认分组,简称为ack。发送方收到对所发送数据分组的确认分组后,‍‍才能发送下一个数据分组。
假设这个数据分组在传输过程中出现了误码,‍‍接收方收到后对其进行差错检测,‍‍发现了误码,则丢弃该数据分组,并给发送方发送否认分组,简称为nak‍‍。发送方收到对所发送数据分组的否认分组后,就知道了之前自己所发送的数据分组出现了差错,‍‍而被接收方拒绝,于是立刻重传该数据分组。‍‍
因此发送方每发送完一个数据分组后,‍‍并不能立刻将该数据分组从缓存中删除,只有在收到帧对该数据分组的确认后‍‍才能将其从缓存中删除。


超时重传
发送方给接收方发送数据分组,然而该数据分组在传输过程中丢失了,‍‍需要说明的是‍‍对于数据链路层点对点信道而言,不太容易出现这种情况,但对于多个网络,通过多个路由器‍‍互联的复杂互联网环境而言,这种情况是会经常出现的。‍‍
对于这种情况,接收方既然收不到数据分组,‍‍那么也就不会发送确认或否认分组。如果不采取其他措施,‍‍发送方就会一直处于等待接收方确认或否认分组的状态。为了解决该问题,‍‍可以在发送方发送完一个数据分组时,启动一个超时计时器。‍‍若到了超时计时器所设置的重传时间,‍‍而发送方仍收不到接收方的确认或否认分组,则重传原来的数据分组,这就叫做超时重传。‍‍

确认丢失
发送方发送了一个数据分组,接收方正确接收该数据分组后,给发送方发送确认分组,‍‍但该确认分组‍‍在传输过程中丢失了,这必然会造成发送方对之前所发送数据分组的超时重传。
为了避免分组重复这种传输错误,‍‍必须给每个数据分组带上序号。‍‍例如该数据分组的序号为0,对于停止等待协议,‍‍由于每发送一个数据分组,就进行停止等待,只要保证每发送一个新的数据分组,‍‍其序号与上次发送的数据分组的序号不同就可以了。因此用一个比特来编号就够了。‍‍即序号0和1,这样根据数据分组的序号,‍‍接收方就可以判断出该数据分组是否是重复的,接收方丢弃重复的数据分组,‍‍并给发送方发送帧对该数据分组的确认分组,以免发送方对该数据分组的再次超时重传。‍‍
发送方收到帧对0号数据分组的确认分组,就可以发送下一个数据分组了,其序号为1,‍‍接收方正确收到1号数据分组后,给发送方发送确认分组。

确认迟到
发送方发送0号数据分组,‍‍接收方正确接收后,给发送方发送确认分组,由于某些原因,该确认分组迟到了,‍‍这必然会导致发送方对0号数据分组的超时重传。‍‍在重传的0号数据分组的传输过程中,‍‍发送方收到了迟到的确认分组,于是发送一号数据分组,接收方收到重传的零号数据分组后,‍‍发现这是一个重复的数据分组,将其丢弃,并针对该数据分组给发送方发送确认分组,‍‍以免发送方再次超时重传该数据分组。‍‍
现在问题来了,我们可以非常清楚的看到,‍‍这是一个对0号数据分组的重复确认,但是发送方又如何知道呢?‍‍如果不采取其他措施的话,发送方会误认为这是对1号数据分组的确认,‍‍如果对确认分组也进行编号,就可以使发送方避免这种误判。
如图所示‍‍该确认分组的序号为0,发送方通过确认分组的序号,知道这是一个重复的确认分组,忽略即可。‍‍接收方正确接受一号数据分组后,给发送方发送针对该数据分组的确认,分组其序号为一,‍‍发送方收到该确认分组后,发送下一个数据分组,序号为0。‍‍

请注意‍‍该数据分组与之前序号为0的数据分组,不是同一个数据分组,我们用给确认分组编号的方法,‍‍解决了确认迟到所导致的重复确认的问题。需要说明的是‍‍对于数据链路层的点对点信道,往返时间比较固定,不会出现确认迟到的情况。‍‍因此‍‍如果只在数据链路层实现停止等待协议,可以不用给确认分组编号。

停止-等待协议的信道利用率
TD:发送方发送数据分组所耗费的发送时延
RTT:收发双方之间的往返时间
TA:接收方发送确认分组‍‍所耗费的发送时延
途中忽略了接收方对数据分组的处理时延,‍‍以及发送方对确认分组的处理时延

  • 若出现超时重传,对于传送有用的数据信息来说,信道利用率还要降低。
  • 在往返时间RTT相对较大的情况下,为了提高信道利用率,收发双方不适合采用停止-等待协议,而可以选择使用回退N帧(GBN)协议或选择重传(SR)协议。


3、回退N帧协议




  • 接收方每正确收到一个序号落入接收窗口的数据分组,就将接收窗口向前滑动一个位置,这样就有一个新的序号落入接收窗口。与此同时,接收方还要给发送方发送针对该数据分组的确认分组。
  • 发送方每收到一个按序确认的确认分组,就将发送窗口向前滑动一个位置,这样就有一个新的序号落入发送窗口,序号落入发送窗口内的数据分组可继续被发送。
  • 在回退N帧协议的工作过程中,发送方的发送窗口和接收方的接收窗口按上述规则不断向前滑动。因此,这类协议又称为滑动窗口协议。

①无传输差错的情况

  • 发送方将序号落在发送窗口内的0~4号数据分组,依次连续发送出去
  • 他们经过互联网的传输,‍‍正确到达了接收方,也就是没有出现乱序和误码
  • 接收方按序接收他们。每接收一个‍‍接收窗口就向前滑动一个位置,并给发送方发送帧对所接收分组的确认分组。
  • 0~4号确认分组,‍‍经过互联网的传输,正确到达了发送方,每接收一个发送窗口就向前滑动一个位置,‍‍这样就有新的序号落入了发送窗口,发送方可以将收到确认的数据分组,‍‍从缓存中删除了
  • 而接收方可以择机将已接收的数据分组交付上层处理。‍‍

累计确认
发送方将序号落在发送窗口内的0-4号数据分组,依次连续发送出去,他们经过互联网的传输,‍‍正确到达了接收方按序接收他们。当接收完0号和1号数据分组后,‍‍给发送方发送了一个累积确认ack1,当接收完2-4号数据分组后,‍‍又给发送方发送了一个累计确认ack4,假设ack1在传输过程中丢失了,‍‍而ack4正确到达了发送方,发送方接收ack4后就知道了,‍‍序号为4及之前的数据分组已被接收方正确接收了,于是将发送窗口向前滑动5个位置,‍‍这样就有新的序号落入了发送窗口,‍‍发送方可以将收到确认的数据分组从缓存中删除了,而接收方可以择机将已接收的数据分组‍‍交付上层处理。‍‍

累计确认的优缺点

  • 即使确认分组丢失,‍‍发送方也可能不必重传。例如本例ack1丢失了,‍‍但并没有造成一号数据分组的超时重传。
  • 可以减小接收方的开销,减少对网络资源的占用等。‍‍
  • 不能向发送方及时反映出‍‍接收方已经正确接收的、数据分组的信息。‍‍

②超时重传、回退N帧的情况
发送方将序号落在发送窗口内的这5个数据分组,依次连续发送出去,‍‍他们经过互联网的传输到达了接收方,假设他们在传输过程中受到了干扰,‍‍其中5号数据分组出现了误码,接收方通过数据分组中的检错码发现了错误,‍‍于是丢弃该数据分组。而后续到达的这4个数据分组的序号与接收窗口中的序号不匹配,‍‍接收方同样也不能接受他们,‍‍将他们丢弃,并对之前按序接收的最后一个数据分组进行确认,也就是发送ack4,‍‍每丢弃一个数据分组,就发送一个ack4,这4个ack4经过互联网的传输到达了发送方,‍‍发送方之前就接收过ack4,当收到这些重复的ack4时,‍‍就知道了之前所发送的数据分组出现了差错,于是可以不等超时计时器超时‍‍就立刻开始重传。‍‍


至于收到几个重复确认,就立刻重传,由具体实现来决定。‍‍在本例中,假设收到这4个重复的确认,并不会触发发送方立刻重传。一段时间后,‍‍超时计时器出现超时,发送方将发送窗口内已发送过的这些数据分组全部重传。‍‍在本例中,尽管序号为6701的数据分组,之前已经正确的到达接收方,‍‍但由于5号数据分组误码不被接受,他们也受到牵连而不被接受。‍‍发送方还要重传这些数据分组,‍‍这就是所谓的go back-n也就是回退n帧。‍‍可见当通信线路质量不好时,‍‍回推N帧协议的信道利用率并不比停止等待协议高。


对于本例,WT取值为8,‍‍发送方将序号落在发送窗口内的0-7号这8个数据分组依次连续发送出去,‍‍他们经过互联网的传输,正确到达了接收方,接收方按序正确接收他们后,‍‍给发送方发回累计确认ack7。‍‍假设ack7在传输过程中丢失了,‍‍这将导致发送方的超时重传,重传的0~7号数据分组到达接收方。接收方根据当前接收窗口内的序号,会对这8个数据分组按序接收,但是‍‍接收方之前已经接收过这8个数据分组了,现在是在重复接收,也就是说‍‍接收方无法分辨新旧分组,进而会产生分组重复这种传输差错,因此‍‍发送窗口的尺寸不能超过其上限。

注:小于8的时候,接收窗口的值不为0,而发送方发送的第一帧值为0,接收方拒绝接受。
总结:

4、选择重传协议
为了使发送方仅重传出现差错的数据分组,接收方不再采用累积确认,而需要对每一个正确接收的数据分组进行逐一确认。


发送方将序号落在发送窗口内的这4个数据分组,依次连续发送出去,‍‍他们经过互联网的传输陆续到达接收方,但其中的2号数据分组丢失了,‍‍只要序号落入接收窗口内,且无误码的数据分组,接收方都会接收。
接收方接收0号‍‍和1号数据分组,并发送0号和1号确认分组,接收窗口向前滑动两个位置,这样‍‍就有4和5这两个新的序号落入接收窗口,接收方接收3号数据分组并发送3号确认分组,‍‍但接收窗口不能向前滑动,因为3号数据分组是未按序到达的数据分组,‍‍这些确认分组经过互联网的传输,陆续到达发送方,每按序收到1个确认分组,‍‍发送窗口就向前滑动1个位置。
发送方接收0号和1号确认分组,‍‍发送窗口向前滑动两个位置,这样就有4和5这两个新的序号落入发送窗口,‍‍发送方将序号落入发送窗口的4号和5号数据分组发送出去,‍‍发送方现在可以将已经收到确认的0号和1号数据分组从发送缓存中删除了,‍‍而接收方可择机将以按序接收的0号和1号数据分组交付上层处理。

发送方接收3号确认分组,但发送窗口不能向前滑动,因为这是一个未按序到达的确认分组,‍‍发送方还未收到他之前的2号确认分组,不过需要记录3号数据分组已收到确认,‍‍这样该数据分组就不会超时重发。‍‍4号和5号数据分组到达接收方,接受方接受他们,‍‍并发送4号和5号确认分组,但接收窗口不能向前滑动,因为他们是未按序到达的数据分组,‍‍接收方还未收到他们之前的2号数据分组。‍‍
假设在4号和5号确认分组的传输过程中,‍‍发送方帧对2号数据分组的重传计时器超时了,发送方重传2号数据分组,‍‍4号和5号确认分组陆续到达发送方,发送方接收他们,但发送窗口不能向前滑动,‍‍因为他们是未按时到达的确认分组,发送方还未收到他们之前的2号确认分组,不过‍‍需要记录4号和5号数据分组已收到确认,这样他们就不会超时重发。‍‍

发送方之前重传的2号数据分组到达接收方,接收方接收该数据分组,并发送2号确认分组,‍‍接受窗口现在可以向前滑动4个位置,这样就有6‍‍701这4个新的序号落入接收窗口。‍‍
‍2号确认分组经过互联网的传输到达发送方,发送方接收该确认分组,‍‍发送窗口现在可以向前滑动4个位置,这样就有6701‍‍这4个新的序号落入发送窗口,发送方现在就可以继续将这4个序号的数据分组‍‍依次发送出去了。‍‍

下面我们就来看看,如果发送窗口和接收窗口的尺寸超过了他们的取值范围,‍‍会出现什么样的情况?‍‍
我们还是采用3个比特给分组编序号,即序号0~7,‍‍发送窗口的尺寸,WT取最大值,接收窗口的尺寸WR也取最大值,‍‍也就是WT等于WR‍‍=2的3-1次=4。假设我们故意将发送窗口尺寸WT设置为5,相应的‍‍将接收窗口尺寸WR也设置为5。
发送方将序号落入发送窗口内的0-4号这5个数据分组依次发送出去,‍‍他们经过互联网的传输,依次到达接收方,接收方接收他们,并发送0~4号确认分组,‍‍接收窗口向前滑动5个位置,这样就有5‍‍6701这5个新的序号落入接收窗口。

这些确认分组经过互联网的传输,陆续到达发送方,但其中的0号确认分组丢了,‍‍发送方接收1-4号确认分组,并记录1~4号数据分组已收到确认,发送窗口不能向前移动。‍‍
一段时间后,0号数据分组的重传计时器超时了,发送方重传0号数据分组,‍‍该数据分组经过互联网的传输到达接收方,‍‍其序号0落在接收窗口内,接收方会接收它,但是‍‍接收方先前已经正确接收过该数据分组了,如果现在还要接收,‍‍那就会出现分组重复这种传输差错。也就是说如果发送窗口和接收窗口的尺寸‍‍超过了取值范围,就会使接收方无法分辨新旧数据分组,‍‍进而出现分组重复这种传输差错。

总结:

3.3 点对点协议PPP

1、点对点协议PPP概述
点对点协议(Point-to-Point Protocol,PPP)是目前使用最广泛的点对点数据链路层协议。
一般的因特网用户通常都是要通过连接到某个因特网服务提供者ISP,‍‍例如中国电信、中国联通、中国移动这三大运营商才能接入因特网。‍‍这些ISP‍‍已经从因特网管理机构申请到了一批IP地址,用户计算机只有获取到ISP所分配的合法IP地址后,‍‍才能成为因特网上的主机。

用户计算机与ISP进行通信时所使用的数据链路层协议,‍‍通常就是PPP协议。在以太网上运行的PPP协议,‍‍即PPP over ethernet,简称为pppoe,它使得ISP可以通过DSL电路调制解调器、‍‍以太网等宽带接入技术,以以太网接口的形式‍‍为用户提供接入服务。‍‍另外点对点协议PPP也广泛应用于广域网路由器之间的专用线路。‍‍


从网络体系结构的角度看,PPP是数据链路层的协议,‍‍他将上层交付下来的协议数据单元‍‍封装成PPP帧。
为了支持不同的网络层协议,PPP协议包含了一套网络控制协议ncp‍‍s,其中的每一个协议支持不同的网络层协议,例如TCP/IP中的IP‍‍,网络操作系统中的IPX,苹果公司的apple talk等。
链路控制协议LCP,用于建立配置以及测试数据链路的连接,PPP协议能够在多种类型的点对点链路上运行,‍‍例如面向字节的异步联络,‍‍面向比特的同步链路。‍‍

2、PPP的帧格式

3、PPP帧的透明传输



4、PPP帧的差错检测

接收方每收到一个PPP帧就进行crc检验,若crc检验正确,就收下这个帧,‍‍反之就要丢弃这个帧,‍‍使用PPP的数据链路层,向上不提供可靠传输服务。

  1. PPP链路的开始和结束状态都是静止状态,‍‍这时并不存在物理层的连接。当检测到调制解调器的载波信号,并建立物理层连接后,‍‍PPP就进入链路的建立状态。‍‍
  2. 这时链路控制协议lcp开始协商一些配置选项,‍‍若协商成功‍‍则进入鉴别状态,若协商失败则退回到静止状态。所协商的配置选项,‍‍包括最大帧长,鉴别协议等。
  3. 可以不使用鉴别,也可以使用口令鉴别协议pap‍‍或挑战握手鉴别协议chap。若通信双方无需鉴别或鉴别身份成功,‍‍则进入网络状态,若鉴别失败则进入终止状态。
  4. 进入网络状态后,进行ncp配置,‍‍配置完成后就要进入打开状态。PPP链路的两端,通过相互交换网络层特定的ncp分组‍‍来进行ncp配置。‍‍如果在PPP链路上运行的是IP协议,则使用IP控制协议ipcp‍‍来对PPP链路的每一端配置IP模块,例如分配IP地址。
  5. 只要链路处于打开状态,‍‍就可以进行数据通信。当出现故障或链路的一端发出终止请求时,就进入终止状态。‍‍
  6. 当载波停止后‍‍则回到静止状态。

3.4 共享式以太网

  • 以太网(Ethernet)以曾经被假想的电磁波传播介质——以太(Ether)来命名。
  • 以太网最初采用无源电缆(不包含电源线)作为共享总线来传输帧,属于基带总线局域网,传输速率为2.94Mb/s。
    以太网目前已经从传统的共享式以太网发展到交换式以太网,传输速率已经从10Mb/s提高到100Mb/s、1Gb/s甚至10Gb/s。

3.4.1 网络适配器和MAC地址

1、网络适配器

  • 要将计算机连接到以太网,需要使用相应的网络适配器(Adapter),网络适配器一般简称为“网卡”。
  • 在计算机内部,网卡与CPU之间的通信,一般是通过计算机主板上的I/O总线以并行传输方式进行。
  • 网卡与外部以太网(局域网)之间的通信,一般是通过传输媒体(同轴电缆、双绞线电缆、光纤)以串行方式进行的。
  • 网卡除要实现物理层和数据链路层功能,其另外一个重要功能就是要进行并行传输和串行传输的转换。由于网络的传输速率和计算机内部总线上的传输速率并不相同,因此在网卡的核心芯片中都会包含用于缓存数据的存储器。
  • 在确保网卡硬件正确的情况下,为了使网卡正常工作,还必须要在计算机的操作系统中为网卡安装相应的设备驱动程序。驱动程序负责驱动网卡发送和接收帧。



2、MAC地址

  • 当多个主机连接在同一个广播信道上,要想实现两个主机之间的通信,则每个主机都必须有一个唯一的标识,即一个数据链路层地址。
  • 在每个主机发送的帧的首部中,都携带有发送主机(源主机)和接收主机(目的主机)的数据链路层地址。由于这类地址是用于媒体接入控制(Medium Access Control,MAC)的,因此被称为MAC地址。
  • MAC地址一般被固化在网卡的电可擦可编程只读存储器EEPROM中,因此MAC地址也被称为硬件地址。
  • MAC地址有时也被称为物理地址。不要被物理地址中的“物理”二字误导,误认为物理地址属于网络体系结构中物理层的范畴。物理地址属于数据链路层范畴。

假设主机 B 给主机 C 发送帧,则在帧首部中的目的地址字段,应填入主机 C 的 MAC 地址 C,而在源地址字段,应填入主机 B 的 MAC 地址 B,这样,总线上的其他各主机中的网卡,收到该帧后,就可以根据帧首部中的目的地址字段的值是否与自己的 MAC 地址匹配,决定丢弃或接受该帧。

  • 一般情况下,普通用户计算机中往往会包含两块网卡:一块是用于接入有线局域网的以太网卡,另一块是用于接入无线局域网的Wi-Fi网卡。
  • 每块网卡都有一个全球唯一的MAC地址。
  • 交换机和路由器往往具有更多的网络接口,所以会拥有更多的MAC地址。
  • 综上所述,严格来说,MAC地址是对网络上各接口的唯一标识,而不是对网络上各设备的唯一标识。


全球多播:例如,交换机的生成树协议STP使用的多播地址为01-80-C2-00-00-00
本地多播:剩余46比特为“全1”时,就是广播地址FF-FF-FF-FF-FF-FF

  • 接收:是指网卡从网络中收到某个帧;
  • 接受:是指网卡接收某个帧后,还要判断这个帧是否符合要求


四个交换机连接形成了一个环路,这样做的目的是为了提高网络的可靠性,然而,环路会造成广播帧在环路中永久兜圈的严重问题,为了解决该问题,交换机之间会交互一种特殊的帧,即BPDU,也就是网桥协议数据单元,各交换机根据 BPDU 中的一些参数,按照生成树协议所使用的生成树算法。最终某些交换机会阻塞自己的某些接口,这样就破除了环路,而 BPDU 首部中的目的地址,就是生成树协议专用的多播 MAC 地址01-80-C2-00-00-00

网卡从网络上每收到一个帧,就检查帧首部中的目的MAC地址,按以下情况处理:

  1. 如果目的MAC地址是广播地址(FF-FF-FF-FF-FF-FF),则接受该帧。
  2. 如果目的MAC地址与网卡上固化的全球单播MAC地址相同,则接受该帧。
  3. 如果目的MAC地址是网卡支持的多播地址,则接受该帧。
  4. 除上述三种情况外,丢弃该帧。

网卡还可被设置为一种特殊的工作方式:混杂方式(Promiscuous Mode)。工作在混杂方式的网卡,只要收到共享媒体上传来的帧就会收下,而不管帧的目的MAC地址是什么。

  • 对于网络维护和管理人员,这种方式可以监视和分析局域网上的流量,以便找出提高网络性能的具体措施。
  • 嗅探器(Sniffer)就是一种工作在混杂方式的网卡,再配合相应的工具软件(WireShark),就可以作为一种非常有用的网络工具来学习和分析网络。

全球单播MAC地址就如同身份证上的身份证号码,具有唯一性,它往往与用户个人信息绑定在一起。因此,用户应尽量确保自己拥有的全球单播MAC地址不被泄露。为了避免用户设备连接Wi-Fi热点时MAC地址泄露的安全问题,目前大多数移动设备都已经采用了随机MAC地址技术。

3.4.2 CSMA/CD协议

01 CSMA/CD协议的基本原理

  • 共享总线以太网具有天然的广播特性,即使总线上某个站点给另一个站点发送单播帧,表示帧的信号也会沿着总线传播到总线上的其他各站点。
  • 当两个或多个站点同时使用总线发送帧时,就会产生信号碰撞。


为了解决各站点争用总线的问题,共享总线以太网使用了一种专用协议CSMA/CD,它是载波监听多址接入/碰撞检测(Carrier Sense Multiple Access Collision Detection)的英文缩写词。

多址接入:即多个站点连接到一根总线上,各主机随机发送帧.

载波监听:假设站点 C 要发送帧,它首先进行载波监听,在检测到总线空闲 96 比特时间后,就可以发送帧了。

碰撞检测:假设在站点 C 使用总线发送帧的过程中,站点 B 也要发送帧,站点 B 进行载波监听,发现总线忙,于是持续检测总线,一旦发现总线空闲 96 比特时间,则立即发送帧,边发送帧还要边检测碰撞,这就是所谓的碰撞检测,只要没检测到碰撞,就可继续发送帧的剩余部分。

假设在站点 B 发送帧的过程中,站点 C 也要发送帧,站点 C 进行载波监听,检测到总线空闲,但总线实际上并不空闲,这是因为站点 B 发送的信号还没有传播到站点 C,站点 C 检测不到而已,站点 C 检测到总线空闲 96 比特时间后,就立即发送帧,这必然会产生碰撞,在产生碰撞的时刻,站点 B 和 C 都在边发送帧还要边检测碰撞。


产生碰撞的位置离站点 C 较近。因此,站点 C 比 B 更早检测到碰撞,并停止发送帧。退避一段随机时间后,重新从载波监听开始,以便重发之前遭遇到碰撞的帧,当站点 B 检测到碰撞后,立即停止发送。


退避一段随机时间后,重新从载波监听开始,以便重发之前遭遇到碰撞的帧,以太网还采取了一种叫做强化碰撞的措施。
强化碰撞:发送帧的站点一旦检测到碰撞,除了立即停止发送帧外,还要再继续发送32比特或48比特的人为干扰信号(Jamming Signal),以便有足够多的碰撞信号使所有站点都能检测出碰撞。

  • 载波监听检测到总线空闲,但总线并不一定空闲。
  • 使用CSMA/CD协议的共享总线以太网上的各站点,只是尽量避免碰撞并在出现碰撞时做出退避后重发的处理,但不能完全避免碰撞。
  • 在使用CSMA/CD协议时,由于正在发送帧的站点必须“边发送帧边检测碰撞”,因此站点不可能同时进行发送和接收,也就是不可能进行全双工通信,而只能进行半双工通信(双向交替通信)。


CSMA(Carrier Sense Multiple Access)是载波监听多址接入的英文缩写词。
CSMA属于争用型的媒体接入控制协议,连接在同一媒体上的多个站点使用该协议以竞争方式发送数据帧,可能出现冲突(也称为碰撞)。
TDMA、FDMA、CDMA是常见的物理层信道复用技术,属于静态划分信道,用于多用户共享信道,不会发生冲突。

02 共享式以太网的争用期


本例中的站点 A 和 B,它们分别位于共享总线以太网的两端,A 与 D 之间的信号传播时延,就是该以太网单程端到端传播时延,记为τ,假设纵坐标为时间,我们来看站点 A 和 D 都发送帧,并产生碰撞的情况。
在 t=0 时刻,主机 A 要发送帧,当检测到总线空闲 96 比特时间后,立即发送帧,在 t=τ-δ 时刻,站点 A 发送的帧还未到达站点 D,而站点 D 也要发送帧,尽管总线现在已经被站点 A 占用,但是站点 A 发送的信号还未到达站点 D,因此站点 D 检测不到总线忙,站点 D 检测到总线空闲 96 比特时间后,立即发送帧,这必然会产生碰撞,碰撞时刻为 t=τ-δ/2 时刻,但此时双方都检测不到碰撞,碰撞信号沿总线传播到总线的两端,在 t=τ 时刻,站点 D 首先检测到碰撞,于是立即停止发送帧,在 t=2τ-δ 时刻,站点 A 也检测到碰撞,于是立即停止发送帧,站点 A 和 D 发送帧都失败了,它们各自要退避一段随机时间后,再重新发送。

03 共享式以太网的最小帧长和最大帧长
假设站点 A 给 D 发送一个很短的帧,边发送边检测碰撞,由于该帧很短,因此很快就发送完毕,站点 A 不再检测碰撞。

假设该帧再传送过程中,站点 C 也要发送帧,站点 C 再检测到信道空闲 96 比特时间后发送
帧,这必然会产生碰撞,站点 D 最终收到遭遇碰撞的帧,丢弃即可。然而站点 A 并不知道已发送完毕的帧,遭遇了碰撞,不会重发该帧,这样,站点 D 就无法正确收到该帧。


  • 当某个站点在发送帧时,如果帧的前64B没有遭遇碰撞,那么帧的后续部分也就不会遭遇碰撞。也就是说,如果遭遇碰撞,就一定是在帧的前64B之内。
  • 由于发送帧的站点边发送帧边检测碰撞,一旦检测到碰撞就立即中止帧的发送,此时已发送的数据量一定小于64B。因此,接收站点收到长度小于64B的帧,就可判定这是一个遭遇了碰撞而异常中止的无效帧,将其丢弃即可。


04 共享式以太网的退避算法

  • 在使用CSMA/CD协议的共享总线以太网中,正在发送帧的站点一边发送帧一边检测碰撞,当检测到碰撞时就立即停止发送,退避一段随机时间后再重新发送。
  • 共享总线以太网中的各站点采用截断二进制指数退避(Truncated Binary Exponential Backoff)算法来选择退避的随机时间。

  • 如果连续多次发送碰撞,就表明可能有较多的站点参与竞争信道。但使用上述退避算法可使重传需要推迟的平均时间随重传次数而增大(即动态退避),因而减小产生碰撞的概率。
  • 当重传达16次仍不能成功时,就表明同时打算发送帧的站点太多,以至于连续产生碰撞,此时应放弃重传并向高层报告。

05 共享式以太网的信道利用率
如图所示,横坐标为时间,总线上的某个站点可能产生多次碰撞,并进行多次退避后,才能成功发送一个帧,帧的发送时延记为 T0,在最极端的情况下,源站点在总线的一端,而目的站点在总线的另一端,因此,还要经过一个单程到端的传播时延τ后,总线才能完全进入空闲状态,显然,发送一帧所需的平均时间由多个争用期,帧的发送时延,以及单程端到端的传播时延τ这三个部分构成。


3.4.3 使用集线器的共享式以太网

  • 早期的传统以太网是使用粗同轴电缆的共享总线以太网,后来发展到使用价格相对便宜的细同轴电缆。
  • 当初认为这种连接方法既简单又可靠,因为在那个时代普遍认为有源器件不可靠,而无源的电缆线才是最可靠的。然而,实践证明这种使用无源电缆线和大量机械接口的总线型以太网并不像人们想象的那么可靠。

使用细同轴电缆的共享总线以太网,为了避免信号的反射,在总线的两端,需要各连接一个终端匹配电阻,每一台要接入到总线的主机,都必须要配套使用一块带有 BNC 接口的网卡,和一个 BNC T 型接口。因此,这样的网络中就会有大量的机械连接点,若总线上的某个机械连接点接触不良或断开,则整个网络通信就不稳定或彻底断网。

  • 在使用细同轴电缆的共享总线以太网之后,以太网发展出来了一种使用大规模集成电路来替代总线、并且可靠性非常高的设备,叫作集线器(Hub)。
  • 站点连接到集线器的传输媒体也转而使用更便宜、更灵活的双绞线电缆。

集线器的一些主要特点如下:

  • 使用集线器的以太网虽然物理拓扑是星型的,但在逻辑上仍然是一个总线网。总线上的各站点共享总线资源,使用的还是CSMA/CD协议。
  • 集线器只工作在物理层,它的每个接口仅简单地转发比特,并不进行碰撞检测。碰撞检测的任务由各站点中的网卡负责。
  • 集线器一般都有少量的容错能力和网络管理功能。例如,若网络中某个站点的网卡出现了故障而不停地发送帧,集线器可以检测到这个问题,在内部断开与出故障网卡的连线,使整个以太网能正常工作。


来看网络中某个主机向另一个主机发送帧的情况。对于使用细同轴电缆的共享总线型以太网,表示帧的信号会沿总线传播到各个主机。对于使用集线器和双绞线的星型拓扑的共享式以太网,集线器收到帧后,会把帧从自己的其它各接口转发出去,这样,表示帧的信号也会传播到各个主机。

若网络中有多个主机要发送帧,对于这两种不同拓扑的共享式以太网,都会出现碰撞的情况。

  • IEEE于1990年制定了10BASE-T星型以太网的标准802.3i,这种以太网是局域网发展史上的一座非常重要的里程碑,它为以太网在局域网中的统治地位奠定了牢固的基础。
  • 10BASE-T以太网的通信距离较短,每个站点到集线器的距离不能超过100m。
  • IEEE 802.3以太网还可使用光纤作为传输媒体,相应的标准为10BASE-F,“F”表示光纤。光纤主要用作集线器之间的远程连接。

3.4.4 在物理层扩展以太网

01 扩展站点与集线器之间的距离

  • 共享总线以太网中两站点之间的距离不能太远,否则它们之间所传输的信号就会衰减到使CSMA/CD协议无法正常工作。

  • 在早期广泛使用粗同轴电缆或细同轴电缆共享总线以太网时,为了提高网络的地理覆盖范围,常用的是工作在物理层的转发器。

  • IEEE 802.3标准规定,两个网段可用一个转发器连接起来,任意两个站点之间最多可以经过三个网段。

  • 随着使用双绞线和集线器的10BASE-T星型以太网成为以太网的主流类型,扩展网络覆盖范围就很少使用转发器了。

  • 10BASE-T星型以太网中每个站点到集线器的距离不能超过100m,因此两站点间的通信距离最大不能超过200m。

  • 在10BASE-T星型以太网中,可使用光纤和一对光纤调制解调器来扩展站点与集线器之间的距离。这种扩展方法比较简单,所需付出的代价是:为站点和集线器各增加一个用于电信号和光信号转换的光纤调制解调器,以及它们之间的一对通信光纤。

  • 信号在光纤中的衰减和失真很小,因此使用这种方法可以很简单地将站点与集线器之间的距离扩展到1000m以上。

02 扩展共享式以太网的覆盖范围和站点数量

  • 以太网集线器一般具有8~32个接口,如果要连接的站点数量超过了单个集线器能够提供的接口数量,就需要使用多个集线器,这样就可以连接成覆盖更大范围、连接更多站点的多级星型以太网。
  • 采用多个集线器连接而成的多级星型以太网,在扩展了网络覆盖范围和站点数量的同时,也带来了一些负面因素。在物理层扩展的共享式以太网仍然是一个碰撞域,不能连接太多的站点,否则可能会出现大量的碰撞,导致平均吞吐量太低。

3.4.5 在数据链路层扩展以太网

01 使用网桥在数据链路层扩展以太网

  • 网桥(bridge)工作在数据链路层(包含其下的物理层),因此网桥具备属于数据链路层范畴的相关能力。而集线器仅工作在物理层。
  • 网桥可以识别帧的结构。网桥可以根据帧首部中的目的MAC地址和网桥自身的帧转发表来转发或丢弃所收到的帧。

02 网桥的主要结构和基本工作原理
使用网桥将两个使用集线器的共享式以太网互连起来,这回形成一个覆盖范围更大,站点数量更多的以太网,而原来的两个共享式以太网分别成为这个更大的以太网的一个网段,并且各自是一个独立的碰撞域。

转发表是网桥转发帧的依据,里面记录有网桥所知道的网络中各主机的 MAC 地址与自己的各接口的对应关系。网桥收到帧后,会在自身的转发表中查找帧的目的 MAC 地址,根据查找结果来转发或丢弃帧。

网桥转发帧:假设主机 A 给主机 D 发送单播帧,该单播帧被集线器转发给主机 B、C 以及网桥,主机 B 和 C 中的网卡根据该单播帧首部中的目的MAC 地址可知这不是发送给自己的帧,于是将其丢弃。网桥从自己的接口1收到该单播帧后,在转发表中查找主机 D 的目的 MAC 地址 D,根据查找结果可知,应从接口 2 转发该帧,于是就把该帧从自己的接口 2 转发给另一个网段,使主机 D 能够收到该帧,主机 D 中的网卡根据该单播帧首部中的目的 MAC 地址可知,这是发送给自己发的帧,于是接受该帧,而主机E和F中的网卡根据该单播帧首部中的目的MAC地址可知,这不是发送给自己的帧,于是将其丢弃。

网桥丢弃帧:假设主机 A 给 C 发送单播帧该单播帧被集线器转发给主机 B C 以及网桥,主机 B 中的网卡,根据该单播帧首部中的目的 MAC 地址可知,这不是发送给自己的帧,于是将其丢弃,而主机 C 中的网卡根据该单播帧首部中目的 MAC 地址可知,这是发送给自己的帧,于是接受该帧,网桥从自己的接口 1 收到该单播帧后,在转发表中查找主机 C 的目的 MAC 地址 C,根据查找结果可知,应从接口 1 转发该帧,然而网桥正是熊接口 1 收到该帧的,这表明主机 C 和主机 A 在同一个网段,主机 C 能直接收到这个帧,而不需要依靠网桥的转发,因此网桥会丢弃该帧。

网桥转发广播帧:假设主机 A 发送一个广播帧,广播帧的目的MAC 地址为全 F,该广播帧被集线器转发给主机 B C 以及网桥,主机 B 和 C 中的网卡会接受该帧,网桥从自己的接口 1 收到该广播帧,不用查找转发表,而是会通过除接收该帧的接口的其他接口转发该广播帧了,该广播帧通过集线器的转发到达该网段中的各主机,各主机中的网卡接受该广播帧。

上述举例的各种过程,是网桥通过其内部的接口管理软件和网桥协议实体来完成的。

03 透明网桥的自学习和转发帧的流程

  • 透明网桥(Transparent Bridge)通过自学习算法建立转发表。
  • 透明网桥中的“透明”,是指以太网中的各站点并不知道自己所发送的帧将会经过哪些网桥的转发,最终到达目的站点。也就是说,以太网中的各网桥对于各站点而言是看不见的。
  • 透明网桥的标准是IEEE 802.1D,它通过一种自学习算法基于以太网中各站点间的相互通信逐步建立起自己的转发表。

如图所示:使用网桥将原来独立的两个使用集线器的共享式以太网连接起来,就可形成一个覆盖范围更大站点数量更多的以太网,为了简单起见,将主机 A~F 各自网卡对的 MAC 地址分别简记为 A-F,网桥上电启动后,其转发表是空的,网桥需要在网络中各站点相互通信的过程中通过自学习来建立自己的转发表。
假设主机 A 给 B 发送单播帧,与主机 A 处于同一网段中的主机 B 和 C,以及网桥的接口 1 都会收到该单播帧,主机 B 中的网卡根据该单播帧的目的 MAC 地址 B 可知,这是发送给自己的帧而接受该帧;主机 C 中的网卡根据该单播帧的目的 MAC 地址 B 可知,这不是发送给自己的帧而将其丢弃。网桥从接口 1 收到该单播帧后,首先进行自学习,也就是进行登记,登记的内容为帧的源 MAC 地址 A 和该帧进入网桥的接口号 1,之后网桥要对该单播帧进行转发,网桥在自己的转发表中查找该单播帧的目的 MAC 地址 B,但没有找到,只能进行盲目地转发,也就是网桥只能通过除接收该单播帧的接口 1 以外的其他接口转发该单播帧。对于本例,其他接口只有接口 2,因此该单播帧会从网桥的接口 2 转发到另一个网段,该网段中的主机 D,E 和 F 收到该单播帧后将其丢弃。

假设主机 D 给 A 发送单播帧,与主机 D 处于同一网段中的主机 E 和 F 以及网桥的接口 2 都会收到该单播帧,主机 E 和 F 中的网卡根据该单播帧的目的 MAC 地址 A 可知这不是发送给自己的帧而将其丢弃。网桥从接口 2 收到该单播帧后,首先进行自学习,也就是进行登记,登记的内容为,帧的源 MAC 地址 D 和该帧进入网桥的接口号 2。之后网桥要对该单播帧进行转发,网桥在自己的转发表中查找该单播帧的目的 MAC 地址 A,可以找到相应的记录,从记录的接口号部分可知,应从接口 1 转发该帧,这属于明确地转发。该单播帧从网桥的接口 1 转发到另一个网段,该网段中的主机 A 收到并接受该单播帧,而主机 B 和 C 收到该单播帧后将其丢弃。

假设主机 C 给 A 发送单播帧,与主机 C 处于同一网段中的主机 A 和 B,以及网桥的接口 1 都会收到该单播帧。主机 A 中的网卡根据该单播帧的目的 MAC 地址 A 可知,这是发送给自己的帧而接受该帧,主机 B 中的网卡,根据该单播帧的目的 MAC 地址 A 可知,这不是发送给自己的帧而将其丢弃,网桥从接口 1 收到该单播帧后,首先进行自学习,也就是进行登记,登记的内容为帧的源 MAC 地址 C 和该帧进入网桥的接口号 1。

之后网桥对该单播帧进行转发,网桥在自己的转发表中,查找该单播帧的目的 MAC 地址 A,可以找到相应的记录,从记录的接口号部分可知,应从接口 1 转发该帧,然而网桥正是从接口 1 接收的该帧,这表明主机 C 与 A 在同一个网段,A 能够直接收到该帧,而不需要借助网桥的转发,因此网桥丢弃该帧。在本例中如果网络中的各主机陆续都发送了帧,则网桥会逐步建立起完整的转发表,即网桥的每个接口都与网络中哪些主机的 MAC 地址对应。

04 透明网桥的生成树协议STP
E1 和 E2 是两个独立的共享总线型以太网,使用网桥 B1 将它们互连起来,就形成了一个更大的以太网,为了提高以太网的可靠性,还使用了一个冗余的网桥 B2,将 E1 和E2 进行了连接,很显然添加 B2 后,以太网中出现了环路。如果以太网 E1 或 E2 中的某个主机发送了一个广播帧,则该广播帧就会在网桥 B1 和 B2 构成的环路中,按顺时针和逆时针两个方向永久兜圈。

  • 为了提高以太网的可靠性,有时需要在两个以太网之间使用多个透明网桥来提供冗余链路。
  • 在增加冗余链路提高以太网可靠性的同时,却给网络引入了环路。
  • 网络中的广播帧将在环路中永久兜圈,造成广播帧充斥整个网络,网络资源被白白浪费,而网络中的主机之间无法正常通信!
  • 为了避免广播帧在环路中永久兜圈,透明网桥使用生成树协议(Spanning Tree Protocol,STP),可以在增加冗余链路提高网络可靠性的同时,又避免环路带来的问题。不管网桥之间连接成了怎样复杂的带环拓扑,网桥之间通过交互网桥协议单元(Bridge Protocol Data Unit,BPDU),找出原网络拓扑的一个连通子集(即生成树),在这个子集里整个连通的网络中不存在环路。当首次连接网桥或网络拓扑发生变化时(人为改变或出现故障),网桥都会重新构造生成树,以确保网络的连通。

3.5 交换式以太网

01 交换式以网
网桥的接口数量很少,通常只有2~4个,一般只用来连接不同的网段。
使用网桥将原本独立的两个使用集线器的共享式以太网连接起来,就可形成一个覆盖范围更大,站点数量更多的以太网,而原本独立的两个共享式以太网,就分别成为这个更大的以太网的一个网段。

1990年面世的交换式集线器(Switching Hub),实质上是具有多个接口的网桥,常称为以太网交换机(Switch)或二层交换机。

  • “二层”是指以太网交换机工作在数据链路层(包括物理层)。
  • 与网桥相同,交换机内部的转发表也是通过自学习算法,基于网络中各主机间的通信,自动地逐步建立起来的。
  • 另外,交换机也使用生成树协议STP,来产生能够连通全网但不产生环路的通信路径


02 以太网交换机
以太网交换机(以下简称交换机)本质上就是一个多接口的网桥:

  • 交换机自学习和转发帧的流程与网桥是相同的。
  • 另外,交换机也使用生成树协议STP,来产生能够连通全网但不产生环路的通信路径。

交换机的每个接口可以连接计算机,也可以连接集线器或另一个交换机。

  • 当交换机的接口与计算机或交换机连接时,可以工作在全双工方式,并能在自身内部同时连通多对接口,使每一对相互通信的计算机都能像独占传输媒体那样,无碰撞地传输数据,这样就不需要使用CSMA/CD协议了。
  • 当交换机的接口连接的是集线器时,该接口就只能使用CSMA/CD协议并只能工作在半双工方。
  • 现在的交换机和计算机中的网卡都能自动识别上述两种情况,并自动切换到相应的工作方式。


交换机一般都具有多种速率的接口,例如10Mb/s、100Mb/s、1Gb/s甚至10Gb/s的接口,大部分接口支持多速率自适应。

  • 一般的交换机都采用“存储转发”方式,为了减小交换机的转发时延,某些交换机采用了直通(Cut- Through)交换方式。
  • 采用直通交换方式的交换机,在接收帧的同时就立即按帧的目的MAC地址决定该帧的转发接口,然后通过其内部基于硬件的交叉矩阵进行转发,而不必把整个帧先缓存后再进行处理。直通交换的时延非常小。直通交换不检查差错就直接将帧转发出去,有可能会将一些无效帧转发给其他主机。

03 共享式以太网与交换式以太网的对比(集线器与交换机的对比)
假设交换机已经通过自学习算法,逐步建立了完整的转发表,也就是学习到了网络中所有主机与自己各接口的对应关系。
1、主机发送单播帧的情况
假设主机 A 给 B 发送一个单播帧。对于使用集线器的共享式以太网,单播帧会通过集线器传播到网络中的其他各主机,其他各主机中的网卡会根据单播帧的目的 MAC 地址,决定接受或丢弃该帧。
对于使用交换机的交换式以太网,交换机收到单播帧后,根据帧的目的 MAC 地址和自身的转发表,将帧明确地转发给目的主机,而不是网络中的其他各主机,目的主机中的网卡,根据单播帧的目的 MAC 地址,决定接受该帧。

2、主机发送广播帧地情况
假设主机 A 发送了一个广播帧(广播帧首部中目的 MAC 地址字段地值应填入广播地址,即 48 比特全一,十六进制形式为全 F 的广播地址)。
对于使用集线器的共享式以太网,广播帧会通过集线器传播到网络中地其他各主机,其它各主机中的网卡,检测到帧的目的 MAC 地址是广播地址,就接受该帧。
对于使用交换机地交换式以太网,交换机收到广播帧后,检测到帧的目的 MAC 地址是广播地址,于是从除该帧进入交换机的接口的其他所有接口转发该帧,网络中其他各主机中的网卡收到该帧后,检测到帧的目的 MAC 地址是广播地址就接受该帧。
从本例可以看出,使用集线器的共享式以太网中的各主机属于同一个广播域,而使用交换机的交换式以太网中的各主机也属于同一个广播域,尽管集线器和交换机对广播帧的转发情况,从效果上看是相同的,但它们的基本原理并不相同,集线器只工作在物理层,它并不能识别帧首部中的目的 MAC地址,因为这属于数据链路层的范畴,不管集线器收到的是单播帧还是广播帧,集线器仅仅是将表示帧的信号从其他所有接口转发出去,而交换机工作在数据链路层,它可以识别帧的结构,从帧首部中提取出目的 MAC 地址,然后查找自己的转发表。根据查表结果,对帧进行明确转发或盲目转发或丢弃。

3、多对主机间同时通信的情况
假设主机 A 给 B 发送单播帧的同时,主机 C 给 D 也发送单播帧。对于使用集线器的共享式以太网,当多对主机同时通信时,必然会产生碰撞,遭遇碰撞的帧,会传播到网络中的各主机,各主机中的网卡检测到遭遇碰撞的帧后将其丢弃。
对于使用交换机的交换式以太网,由于交换机对收到的帧进行存储转发,并且能实现多对接口的高速并行交换,因此不会产生碰撞。A 发送给 B 的单播帧,以及 C 发送给 D 的单播帧,都会被交换机正确转发,主机 B 和 D 中的网卡,接受各自收到的单播帧。

如图所示,两个独立的共享式以太网,它们各自既是一个独立的广播域,也是一个独立的碰撞域,若用集线器将这两个独立的共享式以太网连接起来,则会形成一个具有更大广播域和碰撞域的共享式以太网。换句话说,使用集线器扩展共享式以太网既扩大了广播域,也扩大了碰撞域。


若用交换机将这两个独立的共享式以太网连接起来,则会形成一个具有更大广播域,但原本对立的两个碰撞域,仍被交换机隔离的以太网,换句话说使用交换机扩展共享式以太网,扩大了广播域,但隔离了碰撞域。


交换式以太网的网络性能远高于共享式以太网,集线器早已被交换机取代。

3.6 以太网的MAC帧格式






以太网 V2的数据链路层,将封装好的 MAC 帧交付给物理层进行发送,物理层在发送 MAC
帧之前,还要在其前面添加8字节的前导码,前导码中的前7个字节为前同步码,作用是使
接收方的时钟同步,之后的1字节为帧的开始符,表明其后面紧跟着的就是以太网帧。
接收方可能收到的无效 MAC 帧包括以下几种:

  • MAC帧的长度不是整数个字节
  • 通过MAC帧的FCS字段的值检测出帧有误码
  • MAC帧的长度不在64~1518字节

接收方收到无效的MAC帧时,就简单将其丢弃,以太网的数据链路层没有重传机制。

3.7 虚拟局域网

01 虚拟局域网VLAN的诞生背景
将多个站点通过一个或多个以太网交换机连接起来就构建出了交换式以太网。交换式以太网中的所有站点都属于同一个广播域。随着交换式以太网规模的扩大,广播域也相应扩大。巨大的广播域会带来一系列问题:广播风暴、难以管理和维护,带来潜在的安全问题。
广播风暴:假设网络中的某个主机要给另一个主机发送一个数据帧,但是在自己的 ARP 高速缓存表中,无法查到目的主机的 MAC 地址,于是首先要发送 ARP 广播请求来获取目的主机的 MAC 地址,该 ARP 广播请求会传遍整个网络,网络中的其他所有主机都可以收到该广播,这种情况就是所谓的广播风暴。

TCP/IP协议栈中的很多协议都会使用广播:地址解析协议ARP、路由信息协议RIPv1、动态主机配置协议DHCP
NetBEUI:Windows下使用的广播型协议
IPX/SPX:Novell网络的协议栈
Apple Talk:Apple公司的网络协议栈

02 虚拟局域网VLAN概述

  • 虚拟局域网(Virtual Local Area Network,VLAN)是一种将局域网内的站点划分成与物理位置无关的逻辑组的技术,一个逻辑组就是一个VLAN,VLAN中的各站点具有某些共同的应用需求。
  • 属于同一VLAN的站点之间可以直接进行通信,而不同VLAN中的站点之间不能直接通信。网络管理员可对局域网中的各交换机进行配置来建立多个逻辑上独立的VLAN。连接在同一交换机上的多个站点可以属于不同的VLAN,而属于同一VLAN的多个站点可以连接在不同的交换机上。
  • 虚拟局域网VLAN并不是一种新型网络,它只是局域网能够提供给用户的一种服务。

如图所示:一楼,二楼,三楼分别有一个局域网,可将它们通过另外一个交换机连成一个更大的局域网。那么原来每一个局域网成为现在这个局域网的一个网段。网络中的各主机属于同一个广播域,某个主机发送的广播数据包,其他所有主机都可以收到,根据应用需求,我们将该局域网划分为两个 VLAN:VLAN1 和 VLAN2,此后,VLAN1 中的广播数据包不会传送到 VALN2,VLAN2 中的广播数据包也不会传送到 VALN1,也就是说,同一个 VLAN 内部可以广播通信,不同 VLAN 之间不能广播通信。

03 虚拟局域网VLAN的实现机制
虚拟局域网VLAN有多种实现技术,最常见的就是基于以太网交换机的接口来实现VLAN。这就需要以太网交换机能够实现以下两个功能:

  • 能够处理带有VLAN标记的帧,也就是IEEE 802.1Q帧。
  • 交换机的各接口可以支持不同的接口类型,不同接口类型的接口对帧的处理方式有所不同。

IEEE 802.1Q帧也称为Dot One Q帧,它对以太网V2的MAC帧格式进行了扩展:在源地址字段和类型字段之间插入了4字节的VLAN标签(tag)字段。

  • 标签协议标识符TPID:长度为16比特,其值固定为0x8100,表示该帧是IEEE 802.1Q帧。
  • 优先级PRI:长度为3比特,取值范围是0~7,值越大优先级越高。当网络阻塞时,设备优先发送优先级高的802.1Q帧。
  • 规范格式指示符CFI:长度为1比特,取值为0表示MAC地址以规范格式封装,取值为1表示MAC地址以非规范格式封装。对于以太网,CFI的取值为0。
  • 虚拟局域网标识符VID:长度为12比特,取值范围是0~4095,其中0和4095保留不使用。VID是802.1Q帧所属VLAN的编号,设备利用VID来识别帧所属的VLAN。广播帧只在同一VLAN内转发,这样就将广播域限制在了一个VLAN内。

802.1Q帧一般不由用户主机处理,而是由以太网交换机来处理:

  • 当交换机收到普通的以太网MAC帧时,会给其插入4字节的VLAN标签使之成为802.1Q帧,该处理简称为“打标签”。
  • 当交换机转发802.1Q帧时,可能会删除其4字节的VLAN标签使之成为普通的以太网MAC帧,该处理简称为“去标签”。交换机转发802.1Q帧时也有可能不进行“去标签”处理,是否进行“去标签”处理取决于交换机的接口类型。

Access接口:

  • Access端口一般用于连接用户计算机
  • Access端口只能属于一个VLAN
  • Access端口的PVID值与端口所属VLAN的ID相同(默认为1)
  • Access端口接收处理方法:一般只接受“未打标签”的普通以太网MAC帧。根据接收帧的端口的PVID给帧“打标签",即插入4字节VLAN标记字段,字段中的VID取值与端口的PVID取值相等。
  • Access端口发送处理方法:若帧中的VID与端口的PVID相等,则“去标签”并转发该帧;否则不转发。

假设主机 A 发送一个广播帧:该帧从交换机的端口 1 进入交换机。由于端口 1 的类型是 Access,它会对接收到的“未打标签“的普通以太网 MAC 帧”打标签“,也就是插入 4 字节 VLAN 标记字段,字段中的 VID 取值与端口的 PVID 取值相等。由于端口 1 的 PVID 值等于 1,因此,所插入的 4 字节 VLAN 标记字段中的 VID的值也等于 1。
对于本例,广播帧中的 VID 的取值与端口 2,3,4 的 PVID 取值都等于 1,因此,交换机会
从这三个端口对帧进行“去标签“转发。

主机 A 发送广播帧的情况:该帧从交换机的端口 1 进入交换机,由于端口 1 的类型是Access,它会对收到的“未打标签“的普通以太网 MAC 帧”打标签“,也就是插入 4 字节的VLAN 标记字段。由于端口 1 的 PVID 值等于 2,因此,所插入的 4 字节 VLAN 标记字段中的 VID的值也等于 2,广播帧中的 VID 的取值与端口 2 的 PVID 取值都等于 2,因此,交换机会从端口 2 对帧进行“去标签“转发。


主机 C 发送广播帧的情况,该帧从交换机的端口 3 进入交换机。由于端口 3 的类型是Access,它会对接收到的“未打标签“的普通以太网 MAC 帧”打标签“,也就是插入 4 字节的 VLAN 标记字段,如图所示,由于端口 3 的 PVID 值等于 3,因此,所插入的 4 字节VLAN 标记字段中的 VID 的值也等于 3。广播帧中的 VID 的取值与端口 4 的 PVID 取值都等于 3,因此,交换机会从端口 4 对帧进行”去标签“转发。

Trunk接口:

  • Trunk端口一般用于交换机之间或交换机与路由器之间的互连
  • Trunk端口可以属于多个VLAN
  • 用户可以设置Trunk端口的PVID值。默认情况下,Trunk端口的PVID值为1。
  • Trunk端口发送处理方法:对VID等于PVID的帧, “ 去标签”再转发;对VID不等于PVID的帧,直接转发。
  • Trunk端口接收处理方法:接收“未打标签” 的帧,根据接收帧的端口的PVID给帧”打标签”
    ,即插入4字节VLAN标记字段,字段中的VID取值与端口的PVID取值相等;接收已打标签的帧。

假设主机 A 发送了一个广播帧,该帧从交换机 1 的端口 1 进入交换机,由于端口 1 的类型是 Access,它会对接收到的“未打标签“的普通以太网 MAC 帧”打标签“,也就是插入 4 字节的 VLAN 标记字段,由于端口 1 的 PVID 值等于 1,因此,所插入的 4 字节 VLAN 标记字段中的 VID的值也等于1,该广播帧中的VID的取值与端口2的PVID值都等于1,端口2的类型是Access,因此,交换机 1 会从端口 2 对帧进行“去标签“转发,该广播帧中的 VID 的取值与端口 5 的PVID 值都等于 1,端口 5 的类型是 Trunk,因此,交换机 1 会从端口 5 对帧进行”去标签“转发,很显然,该广播帧会从交换机 2 的端口 5 进入交换机 2。
对于本例,交换机 2 会对接收到的“未打标签“的普通以太网 MAC 帧”打标签“,也就是插入 4
字节的 VLAN 标记字段。由于端口 5 的 PVID 值等于 1,因此,所插入的 4 字节VLAN 标记字段中的 VID 的值也等于 1,该广播帧中的 VID 的取值与端口 1 和 2 的 PVID 值都等于 1,端口 1 和 2 的类型都是 Access,因此,交换机 2 会从端口 1 和 2 对帧进行”去标签“转发。

主机 C 发送广播帧的情况:该帧从交换机 1 的端口 3 进入交换机。由于端口 3 的类型是 Access,它会对接收到的“未打标签“的普通以太网 MAC 帧”打标签“,也就是插入 4 字节的 VLAN 标记字段。由于端口 3 的 PVID 值等于 2,因此,所插入的 4 字节VLAN 标记字段中的 VID 的值也等于 2,该广播帧中的 VID 的取值与端口 4 的 PVID 值都等于 2,端口 4 的类型是 Access,因此,交换机 1 会从端口 4 对帧进行”去标签“转发,该广播帧中的 VID 的取值与端口 5 的 PVID 值不相等,由于 Trunk 端口对 VID 不等于 PVID 的帧是直接转发的,因此,交换机 1 会从端口 5 对帧直接转发。该广播帧中的 VID 的取值与端口 3 和 4 的 PVID 值都等于 2,端口 3 和 4 的类型都是 Access类型,因此,交换机 2 会从端口 3 和 4 对帧进行“去标签“转发。


3.8 以太网的发展


1、100BASE-T以太网


2、吉比特以太网




3、10吉比特以太网


4、40/100吉比特以太网



5、小结

3.9 802.11无线局域网

3.9.1 802.11无线局域网的组成

  • 随着移动通信技术的发展,无线局域网(Wireless Local Area Network,WLAN)自20世纪80年代末以来逐步进入市场。
  • IEEE于1997年制定出了无线局域网的协议标准802.11,802.11无线局域网是目前应用最广泛的无线局域网之一,人们更多地将其简称为Wi-Fi(Wireless Fidelity,无线保真度)。
  • 802.11无线局域网可分为两类:有固定基础设施的和无固定基础设施的。固定基础设施是指预先建立的、能够覆盖一定地理范围的、多个固定的通信基站。802.11无线局域网使用最多的是它的固定基础设施的组网方式。

1、有固定基础设施的802.11无线局域网
如图所示:这是 802.11 无线局域网的有固定基础设施的组网方式,采用星型网络拓扑,位于其中心的基站被称为接入点,其英文缩写词为 AP。802.11 无线局域网的最小构件,称为基本服务集,其英文缩写词为 BSS,在一个 BSS 中,包含有一个 AP 和若干个移动站,本 BSS 内各站点之间的通信,以及与本 BSS 之外的站点之间的通信,都必须经过本 BSS 内的 AP 进行转发。

一个 BSS 可以是孤立的,也可以通过一个分配系统与其他 BSS 连接,这样就构成了一个扩展的服务集。分配系统的英文缩写词为 DS,扩展的服务集的英文缩写词为 ESS,DS 最常用的以太网,也可使用点对点链路或其他无线网络,ESS 还可为无线用户提供到其他非 802.11无线局域网的接入,例如通过 DS 有线连接到因特网。
假设 BSS1 中的移动站 A,要给 BSS2中的移动站 B 发送数据,则必须经过 API DS AP2,最终将数据转发到移动站 B。
若移动站 A 从 BSS1 漫游到 BSS2,在漫游过程中移动站 A 的接入点从 BSS1 中的 AP1 改为了 BSS2 中的 AP2,但移动站 A 仍然可保持与移动站 B 的通信。

被动扫描:AP 会周期性地发出信标帧,而移动站被动等待接收信标帧:

主动扫描:移动站主动发出探测请求帧,然后等待来自 AP 地探测响应帧

2、无固定基础设施的802.11无线局域网–自组织网络(ad hoc Network)
自组织网络并没有预先建立的固定基础设施,例如基站或接入点 AP,它是由一些对等地移动站点构成的临时网络。数据在自组织网络中被多跳存储转发,例如,这是该自组织网络中的某个源站 A,和目的站 E,它们之间的通信需要经过移动站 B,移动站 C,以及移动站 D 的存储转发,最终到达目的地 E。移动站 B C D,成为了移动站 A 与 E 之间通信的转发站,显然,转发站需要具备路由功能,自组织网络有其特定的路由选择协议,一般不能和因特网直接相连,需要通过网关或协议转换器接入到因特网。

3.9.2 802.11无线局域网的物理层

802.11无线局域网的物理层非常复杂,依据工作频段、调制方式、传输速率等,可将其分为多种物理层标准:

802.11无线网卡一般会被做成多模的,以便能适应多种不同的物理层标准,例如支持802.11b/g/n
无线局域网最初还使用红外技术(infrared,IR)和跳频扩频(Frequency Hopping Spread Spectrum,FHSS)技术。

3.9.3 802.11无线局域网使用CSMA/CA协议的原因

  • 对于802.11无线局域网,其使用无线信道传输数据,这与共享总线以太网使用有线传输介质不同。因此,802.11无线局域网不能简单照搬共享总线以太网使用的CSMA/CD协议。
  • 802.11无线局域网采用了另一种称为CSMA/CA的协议,也就是载波监听多址接入/碰撞避免(Carrier SenseMultiple Access/Collision Avoidance,CSMA/CA)。
  • CSMA/CA协议仍然采用CSMA/CD协议中的CSMA,以“先听后说”的方式来减少碰撞的发生,但是将“碰撞检测CD”改为了“碰撞避免CA”。尽管CA表示碰撞避免,但并不能避免所有的碰撞,而是尽量减少碰撞发生的概率。

802.11无线局域网不采用“碰撞检测CD”的原因如下:

  • 由于无线信道的传输环境复杂且信号强度的动态范围非常大,在802.11无线网卡上接收到的信号强度一般都远远小于发送信号的强度,信号强度甚至相差百万倍。因此,如果要在802.11无线网卡上实现碰撞检测,对硬件的要求非常高。
  • 即使能够在硬件上实现碰撞检测功能,但由于无线电波传播的特殊性(存在隐蔽站问题),还会出现无法检测到碰撞的情况,因此实现碰撞检测并没有意义。

隐蔽站问题:在理想情况下,无线电波的传播范围,是以发送站为圆心的一个圆形面积。从信号覆盖范围可以看出,A 无法检测到 B 发送的信号,B 也无法检测到 A 发送的信号。

假设 A 和 B 同时向接入点 AP 发送数据,这必然会产生碰撞,然而,根据无线信道的信号传播特点,碰撞信号的强度比较弱,即使分别传播到了 A 和 B,A 和 B 也无法检测到极度微弱的碰撞信号,这种问题就称为隐蔽站问题。

3.9.4 CSMA/CA协议的基本工作原理

如图所示,横坐标为时间,纵坐标表示 802.11 无线局域网中的各站点,假设信道是空闲的,源站要发送它的第 1 个数据帧,若检测到信道空闲,则在等待 DIFS 间隔后才能发送,DIFS是指 DCF 帧间间隔。等待DIFS间隔是考虑到可能有其他的站有高优先级的帧要发送。

本例假设现在没有其他高优先级帧要发送,因而源站就发送了自己的数据帧,目的站若正确收到该帧,则经过 SIFS 间隔后,向源站发送确认帧 ACK,若源站在重传计时器设置的超时时间内,没有收到 ACK,就必须重传之前已发送的数据帧,直到收到 ACK 为止,或者经过若干次的重传失败后,放弃发送。

由于无线信道的误码率较高,CSMA/CA协议还需要使用停止-等待的确认机制来实现可靠传输,这与使用CSMA/CD协议的共享式以太网不同。

在 NAV 这段时间内,若其他站也有帧要发送,就必须推迟发送,在 NAV 这段时间结束后,
再经过一个 DIFS 间隔,然后还要退避一段随机时间后,才能发送帧。

当且仅当检测到信道空闲并且这个数据帧是要发送的第一个帧时,才不使用退避算法,其他所有情况都必须使用退避算法,具体为:在发送第一个帧前检测到信道忙、每次重传、每次成功发送后要发送下一帧。

举例说明CSMA/CA 协议的退避算法,如图所示,横坐标为时间,纵坐标表示 802.11无线局域网中的各站点。

  1. 假设 A 正在占用无线信道发送帧,在 A 发送帧的过程中,B C D 也有帧要发送,用向上的箭头来表示,B C D 于是进行载波监听,发现信道忙,需要退避,根据退避算法选择出各自的随机退避时间,并在每个时隙对信道进行一次检测,当检测到信道由忙状态转为空闲状态,且经过帧间间隔 DIFS 后,退避计时器开始倒计时。
  2. 假设 C 的退避时间最短,当 C 的退避计时器到时后,C 立即开始发送帧,此时信道由空闲状态转换为忙状态,当 B 和 D 检测到信道忙后,就冻结各自剩余的退避时间。
  3. 假设在 C 占用无线信道发送帧的过程中,E 也要发送帧,E 于是进行载波监听,发现信道忙,需要退避,根据退避算法,选择出一个随机的退避时间,并在每个时隙对信道进行一次检测,当检测到信道由忙状态转为空闲状态,且经过帧间间隔 DIFS 后,退避计时器开始倒计时。
  4. 当 B 和 D检测到信道由忙状态转换为空闲状态,且经过帧间间隔 DIFS 后,它们各自的退避计时器重新开始从上次冻结的退避剩余时间倒计时,D 的退避计时器会首先到时,D 立即开始发送帧,此时信道由空闲状态转发为忙状态,当 B 和 E 检测到信道忙后,就冻结各自剩余的退避时间,当 D 发送完帧后,信道将转为空闲状态。
  5. 当 B 和 E 检测到信道由忙状态转换为空闲状态,且经过帧间间隔 DIFS 后,它们各自的退避计时器重新开始从上次冻结的退避剩余时间倒计时,E 的退避计时器会首先到时,E 立即开始发送帧,此时信道由空闲状态转为忙状态,当 B 检测到信道忙后,就冻结自己剩余的退避时间,当 E 发送完帧后,信道将转为空闲状态。
  6. 当 B 检测到信道由忙状态转换为空闲状态,且经过帧间间隔 DIFS 后,它的退避计时器重新开始从上次冻结的退避剩余时间倒计时,当 B 的退避计时器到时后,B 立即开始发送帧,若 B 发送完这一帧后还有帧要发送,则在检测到信道空闲,且经过帧间间隔 DIFS 后,还必须再退避一段随机时间后才能发送。

为了进一步降低发生碰撞的概率,802.11无线局域网允许源站对信道进行预约。
假设信道是空闲的,源站要发送它的第一个数据帧,若检测到信道空闲,则在等待 DIFS 帧间间隔后,先发送一个 RTS 帧,若目的站正确收到源站发来的 RTS 帧,在检测到信道空闲,且经过帧间间隔 SIFS 后,就向源站发送一个 CTS 帧作为响应,源站正确收到 CTS 帧后,在等待一个帧间间隔 SIFS 后,就可发送第一个数据帧了,目的站若正确收到该帧,则经过 SIFS 间隔后,向源站发送确认帧 ACK,除源站和目的站的其他各站,在收到 CTS 帧或数据帧后,就推迟访问信道,这样就确保了源站和目的站之间的通信不会受到其他站的干扰,若 RTS 帧发生碰撞,源站就不可能收到CTS帧,源站会执行退避算法重传RTS帧。

  • RTS(Request To Send)帧是短的控制帧,它包括源地址、目的地址和本次通信(包括目的站发回确认帧所需的时间)所需的持续时间。
  • CTS(Clear To Send)帧是短的响应控制帧,它也包括本次通信所需的持续时间(从RTS帧中将此持续时间复制到CTS帧中)。


802.11无线局域网为用户提供了以下三种选择:
❶ 使用RTS帧和CTS帧;
❷ 只有当数据帧的长度超过某个数值时才使用RTS帧和CTS帧;
❸ 不使用RTS帧和CTS帧。

  • 由于RTS帧和CTS帧都会携带通信需要持续的时间,这与之前介绍过的数据帧可以携带通信所需持续时间的虚拟载波监听机制是一样的,因此使用RTS帧和CTS帧进行信道预约,也属于虚拟载波监听机制。
  • 利用虚拟载波监听机制,站点只要监听到数据帧、RTS帧或CTS帧中的任何一个,就能知道信道将被占用的持续时间,而不需要真正监听到信道上的信号,因此虚拟载波监听机制能减少隐蔽站带来的碰撞问题。

如图所示:A 和 B 互为隐蔽站,A 给 AP 发送 RTS 帧进行信道预约,虽然 B 监听不到该帧,但却能监听到 AP 应答给 A 的 CTS 帧,B 根据 CTS 帧中的持续时间,修改自己的网络分配向量 NAV,在 NAV 指示的时间内,虽然B 监听不到 A 发送给 AP 的帧,但 B 也不会发送帧干扰 A 和 AP 的通信。

3.9.5 802.11无线局域网的MAC帧

802.11 无线局域网的 MAC 帧的格式比较复杂,本节课仅介绍其数据帧中的一些重要字段,如图所示,这是 802.11 无线局域网的数据帧格式,它由 30 字节的帧头,0~2312 字节的数据,以及 4 字节的帧尾这三部分组成。

1、帧头中包含有相关控制信息和地址信息。其中比较重要的控制位有去往DS 和来自 DS 控制位,它们用于控制帧头中地址 1–地址 4 这四个字段的内容和使用情况,DS 是分配系统的英文缩写词。
2、类型和子类型控制位,用于区分不同类型的帧,802.11 共有数据帧,控制帧和管理帧三种类型,而每种类型又分为若干种子类型。
3、有线等效保密 WEP控制位,用于指示是否使用了 WEP 加密算法,WEP 表明,使用在无线信道上的这种加密算法,在效果上可以和在有线信道上进行通信一样保密。

4、数据部分主要用来存放上层交付下来的待传送的协议数据单元,尽管数据载荷的最大长度为 2312 字节,但通常 802.11 无线局域网的数据帧的长度都不超过 1500 字节。
5、帧尾用于存放帧检验序列,采用CRC 检验码,帧头中的帧控制字段,是最复杂的字段。
6、持续期

7、序号控制

8、地址


注:地址1是直接要去的那个地址(直接目的),地址2是直接过来的那个地址(直接来源),地址3就是另外一个地址(最终目的/来源)。
举例说明:
①基本服务集 BSS1 中的站点 A 给 B 发送数据帧。


②若站点 A 要向位于 DS 的路由器 R 发送数据帧,这与站点 A 向 B 发送数据帧的情况类似。

A 需要把数据帧发送给 AP1,由于 DS 是以太网,因此 AP1会将 802.11 帧转换成以太网帧转发给 R,这时,以太网首部中的源地址和目的地址,分别是 A 和 R 的 MAC 地址。

③当 R 给 A 发回响应帧时,以太网帧首部中的源地址和目的地址分别是 R 和 A 的 MAC 地址,AP1 收到该以太网帧后,会将其转换成 802.11 帧转发给 A。可见,AP 具有网桥功能,注意802.11 帧中必须要携带 AP 的 MAC 地址,而以太网帧中却不需要携带 AP 的 MAC 地址,在以太网中,AP 与透明网桥一样,对各站点是透明的,因此以太网帧中就不需要指出 AP 的 MAC 地址,然而在 802.11 无线局域网中,在站点的信号覆盖范围内,可能会有多个 AP 共享同一个物理信道,但站点只能与其中的一个 AP建立关联,因此,802.11 帧中,就必须携带 AP 的 MAC 地址,来明确指出转发该帧的 AP。

第四章 网络层

4.1 网络层概述

01 分组转发和路由选择
网络层的主要任务就是将分组从源主机经过多个网络和多段链路传输到目的主机,可以将该任务划分为分组转发和路由选择两种重要的功能。
如图所示:这些异构型网络如果只是需要各自内部通信,那它们只需要实现各自的物理层和数据链路层即可,但是,如果需要将这些异构型网络互连起来,形成一个更大的互联网,就需要使用网络互连设备路由器。假设主机 A 是网络 N1 中的主机,主机 B是网络 N3 中的主机。

为了简单起见,有时我们可以不用画出这些网络,而将它们看作是一条链路即可。假设主机 A 给主机 B 发送分组,路由器 R1 收到后对其进行转发,从该网络拓扑可以看出,R1 可将该分组从自己的接口 2 转发,也可将该分组从自己的接口 3 转发。

R1如何知道应从自己的哪个接口转发分组?答案是转发表,路由器在自己的转发表中查找该分组的目的地址,以便对其按照查表结果进行转发。
那么转发表又是如何得来的呢?答案是路由表,那么路由表又是如何得来的呢?它是由路由器的路由选择处理机执行路由选择协议,并与其他相关路由器交换路由信息后得来的,如果网络拓扑比较简单,也可通过在路由器命令行输入命令的方式,对路由表进行静态配置。
注意,路由表需要对网络拓扑变化的计算最优化,而转发表是从路由表得出的,转发表的结构应当使查找过程最优化。为了简单起见,本课程在讨论路由选择的原理时,并不严格区分路由表和转发表,而是以路由表来表述问题。

02 网络层向其上层提供的两种服务

  • 面向连接的虚电路服务
  • 无连接的数据报服务


虚电路表示这是一条逻辑上的连接,分组沿着这条逻辑连接按照存储转发方式传送,而不是真正建立了一条物理连接。
而采用电路交换的电话通信,则是先建立一条真正的物理连接。因此,分组交换的虚连接与电路交换的连接只是类似,但并不完全一样。
分组的首部仅在连接建立阶段使用完整的目的主机地址,之后每个分组的首部只需要携带一条虚电路编号即可。
这种通信方式如果再使用可靠传输的网络协议,就可使所发送的分组最终正确(无差错按序
到达、不丢失、不重复)到达接收方。
很多广域分组交换网都使用面向连接的虚电路服务。例如,曾经的X.25和逐渐过时的帧中继(Frame Relay,FR)、异步传输模式(Asynchronnous Transfer Mode,ATM)。

这种通信方式所传送的分组可能误码、丢失、重复和失序。

在因特网所采用的 TCP/IP 体系结构中,网际层向其上层提供的是简单灵活的,无连接的尽最大努力交付的数据报服务,

4.2 网际协议IP

这是四层 TCP/IP 体系结构,网络接口层支持各种网络接口,网际协议 IP 是 TCP/IP 体系结构网际层中的核心协议,网际协议 IP 可以互连各种不同的网络接口,TCP 和 UDP 是运输层中的两个重要协议,TCP 为应用层中的某些协议提供可靠传输服务,而 UDP 为应用层中的某些协议提供不可靠传输服务,TCP 和 UDP 都是用网际协议 IP 提供的不可靠传输服务。由于网际协议 IP 是 TCP/IP 体系结构网络层中的核心协议,因此 TCP/IP 体系结构的网络层,常被称为网际层或 IP 层。在网际层中与 IP 协议配套使用的还有四个协议,分别是网际控制报文协议 ICMP,网际组管理协议 IGMP,逆地址解析协议 RARP,地址解析协议 ARP,在网际层中,RARP 和 ARP 画在 IP 下面,这时因为 IP 协议经常要使用这两个协议,ICMP 和 IGMP画在 IP 的上面,因为它们要使用 IP 协议。RARP 现在已被淘汰不使用了。

4.2.1 异构网络互连


4.2.2 IPv4地址及其编址方法

01 IPv4地址概述
IPv4地址是给因特网(Internet)上的每一个主机(或路由器)的每一个接口分配的一个在全世界范围内唯一的32比特的标识符。
由于IPv4地址由32比特构成,不方便阅读、记录以及输入等,因此IPv4地址采用点分十进制表示方法以方便用户使用。

02 IPv4地址的表示

注:8位无符号二进制整数转十进制数和十进制正整数转8位无符号二进制数见计算机组成原理第二章。24考研王道计算机组成原理笔记

03 IPv4地址的分类编址方法










解析:首先应该找出图中都有哪些网络。左边两个网络,右边三台交换机在一起也组成了一个网络,不要忘记,两台路由器通过一段链路直连,它们的直连接口也属于同一个网络,之后,可以根据各网络中主机和路由器接口总数量来决定各网络分配哪个类别的网络号。左上角的网络的主机数量为 655334,加上一个路由器接口,需要可分配的 IP 地址数量为65535,只能该网络分配一个 A 类网络号;左下角的网络的主机数量为 254,加上一个路由器接口,需要可分配的 IP 地址数量为 255,可以给网络分配一个 A 类或 B 类网络号,本着节约IP 地址的原则,给该网络分配一个 B 类网络号;右边网络的主机数量为 40,再加上一个路由器接口,需要可分配的 IP 地址数量为 41,给该网络分配一个 A 类,B 类或 C 类网络号都可以,本着节约 IP 地址的原则,给该网络分配一个 C 类网络号;中间连接的网络没有主机,只有两个路由器接口,需要可分配的 IP 地址数量为 2,给该网络分配一个 A 类,B 类或 C 类网络号都可以,本着节约 IP 地址的原则,给该网络分配一个 C 类网络号;依据网络号的类别,为每一个网络挑选一个网络号,A 类网络号的取值范围是 1-126,可在该范围内挑选一个网络号分配给这个网络;B 类网络号的取值范围是 128.0-191.255,可在该范围内挑选一个网络号分配给这个网络,C 类网络号的取值范围是 192.0.0~223.255.255,可在该范围内挑选一个网络号分配给这个网络,再挑选另一个分配给这个网络,不同网络的网络号不能相同,网络号分配完毕后就可给各主机和路由器的各接口分配 IP 地址了。需要注意的是,所分配的 IP 地址应该互不相同,并且其主机号部分不能出现“全 0”,因为这是网络地址,也不能出现“全 1”,因为这是广播地址,网络地址或广播地址都不能分配给主机或路由器的各接口,因为它们无法唯一标识一台主机或路由器的某个接口。

04 IPv4地址的划分子网编址方法
IPV4 地址编址方法的第二个历史阶段,也就是划分子网的 IPV4 地址,我们举例说明为什么会出现划分子网这样的需求。
如图所示,某单位有一个大型的局域网需要连接到因特网,如果申请一个 C 类网络地址,其可分配的 IP 地址数量只有 254 个,不够使用,因此该单位申请了一个 B 类网络地址,其可分配的 IP 地址数量达到了 65534 个,给每台计算机和路由器的接口分配一个 IP 地址后,还有大量的 IP 地址剩余,这些剩余的 IP 地址只能由该单位的同一个网络使用,而其他单位的网络不能使用。

随着该单位计算机网络的发展和建设,该单位又新增了一些计算机,并且需要将原来的网络划分成三个独立的网络,我们称其为子网 1,子网 2 和子网 3。假设子网 1 仍然使用原先申请到的 B 类网络地址,那么就需要为子网 2 和子网 3 各自申请一个网络地址,但这样会产生一些弊端:申请新的网络地址需要等待很长的时间并且要花费更多的费用;即便申请到了两个网络地址,这也会使其他路由器的路由表新增针对这两个新的网络的路由记录;另外,这样还会浪费原有网络中剩余的大量 IP 地址。

如果可以从 IP 地址的主机号部分借用一些位为子网号来区分不同的子网,就可以利用原有网络中剩余的大量 IP 地址,而不用申请新的网络地址。例如,对于本例,我们可以借用 16 位主机号中的 8 位作为子网号,假设我们给子网 1 分配的子网号为 0,给子网 2 分配的子网号为 1,给子网 3 分配的子网号为 2,之后,就可以给各自子网中的主机和路由器接口分配 IP 地址了。

如果未在图中标记子网号部分,那么我们或计算机又如何知道在分类地址中,主机号有多少比特被借用作为子网号了呢?这样我们就引出了一个划分子网的工具,他就是子网掩码。

  • 子网掩码可以表明分类IPv4地址的主机号部分被借用了几个比特作为子网号。
  • 与IPv4地址类似,子网掩码也是由32比特构成的。用左起多个连续的比特1对应IPv4地址中的网络号和子网号;之后的多个连续的比特0对应IPv4地址中的主机号。


将划分子网的IPv4地址与相应的子网掩码进行逐比特的逻辑与运算,就可得到该IPv4地址所在子网的网络地址。这样,网络号和子网号被保留,而主机号被清零 ,结果为 IP 地址所在子网的网络地址。

只要给定了一个分类的IPv4地址及其相应的子网掩码,就可以得出子网划分的全部细节。

分析:题目给定网络地址为 218.75.230.0,从它的左起第一个十进制数可知,这是一个 C 类网络地址,因此网络号占三个字节,主机号占一个字节。
218.75.230.0 是该网络上的第一个地址,由于这是一个 C 类网地址,因此网络号占 3 个字节,主机号占 1 个字节,将网络号保持不变,而主机号取最大值 255,这就是该网络上的最后一个地址。该 C 类网共有256 个地址,其中第一个地址作为该网络的网络地址也就是主机号“全 0”的地址。最后一个地址作为该网络的广播地址,也就是主机号“全 1”的地址。

之前分析过题目所给的子网掩码表明从主机号部分借用 1 比特作为子网号,也就是将该 C 类网均分为两个子网。我们将主机号写成 8比特的形式,从主机号借用 1 个比特作为子网号,子网号只能是 0 或 1。使用子网掩码255.255.255.128 可将 C 类网 218.75.230.0 均分为两个子网。


默认子网掩码是指在未划分子网的情况下使用的子网掩码。

05 IPv4地址的无分类编址方法

无分类编址方法使用的地址掩码与划分子网使用的子网掩码类似,由32比特构成。用左起多个连续的比特1对应IPv4地址中的网络前缀;之后的多个连续的比特0对应IPv4地址中的主机号。

为了简便起见,可以不明确给出配套的地址掩码的点分十进制形式,而是在无分类编址的IPv4地址后面加上斜线“/”,在斜线之后写上网络前缀所占的比特数量(也就是地址掩码中左起连续比特1的数量),这种记法称为斜线记法。

实际上,无分类域间路由选择CIDR是将网络前缀都相同的、连续的多个无分类IPv4地址,组成一个CIDR地址块,只要知道CIDR地址块中的任何一个地址,就可以知道该地址块的以下全部细节:

  • 地址块中的最小地址
  • 地址块中的最大地址
  • 地址块中的地址数量
  • 地址块中聚合某类网络(A类、B类、C类)的数量
  • 地址掩码

这是题目给出的地址块,斜线后面的数字为 20,表明该 IPV4 地址的前 20 个比特为网络前缀,也就是说所给地址左起第一个字节,第二个字节以及第三个字节的前 4 个比特,构成 20 比特的网络前缀,剩余12 个比特为主机号,因此,我们需要将该地址的第三个字节和第四个字节转换成二进制的形式,这样,我们就可以很容易看出 20 比特的网络前缀和 12比特的主机号。

  • 使用无分类编址方法,可以根据客户的需要分配适当大小的CIDR地址块,因此可以更加有效地分配IPv4的地址空间。
  • 使用无分类编址方法的另一个好处是路由聚合(也称为构造超网)

如图所示:路由器 R1 与 5 个网络以及路由器 R2 直接相连。路由器 R1 和 R2 互为相邻路由器,它们周期性地通告自己所知道的路由信息给对方。
R1 应该怎样地将路由信息通告给 R2 呢?如果 R1 将自己直连的这五个网络的路由记录都通告给 R2,则 R2 的路由表会增加 5 条路由记录。为了减少路由记录对路由表的占用,能否将这 5 条记录聚合成 1 条呢?答案是肯定的,其方法是“找共同前缀”,也就是找出这 5 个目的网络地址的共同前缀。这 5 个目的网络地址的左起前两个字节都是相同的,从第三个字节开始不同,因此,只需将第三个字节转换成二进制形式,这样就可以很容易找出这 5 个目的网络地址的共同前缀,共 22 个比特,我们将其记为“/22”。将共同前缀保持不变,而剩余的 10 个比特全部取 0,然后写成点分十进制形式,放在“/22”前面。这就是聚会后的地址块,也可以称为超网。

  • 网络前缀越长,地址块越小,路由越具体;
  • 若路由器查表转发分组时发现有多条路由条目匹配,则选择网络前缀最长的那条路由条目,这称为最长前缀匹配,因为这样的路由更具体。

4.2.3 IPv4地址的应用规划

IPv4地址的应用规划是指将给定的IPv4地址块(或分类网络)划分成若干个更小的地址块(或子网),并将这些地址块(或子网)分配给互联网中的不同网络,进而可以给各网络中的主机和路由器的接口分配IPv4地址。

01 使用定长子网掩码划分子网


用三个十进制数 255 来对应网络号部分,也就是用 24 个连续的比特 1 来对应网络号,而最后 8 个比特为 11100000,其中 3 个连续的比特 1 表示从主机号部分借用 3 个比特作为子网号,将这 8 个比特写为十进制数为 224。

这是子网1和子网2的细节,以此类推 ,我们可以得到划分子网的全部细节。

现在我们就可以从子网 1-8 中任选 5 个分配给图中的网络 1~5,通过本例可以看出,采用定长的子网掩码进行子网划分,只能划出 2^n 个子网,其中 n 是从主机号部分借用的用来作为子网号的比特数量,每个子网所分配的 IP 地址数量相同,容易造成 IP 地址的浪费,例如图中的网络 5 只需要 4 个 IP 地址,但是我们只能给它分配 32 个 IP 地址,这样就造成了 IP 地址的严重浪费。

02 使用变长子网掩码划分子网
既然网络 1 需要 9 个地址,那么分配给网络 1 的地址的主机号应为 4 个比特,因为 2^4 等于 16,这样网络 1 就可有 16 个地址,由于使用 4 个比特作为主机号,因此剩余 28 个比特可作为网络前缀;
既然网络 2 需要 28 个地址,那么分配给网络 2 的地址的主机号应为 5 个比特,因为 2^5 等于 32,这样网络 2 就可有 32 个地址,由于使用 5 个比特作为主机号,因此剩余 27 个比特可作为网络前缀。



4.2.4 IPv4地址与MAC地址

01 IPv4地址与MAC地址的封装位置
如图所示,这是 TCP/IP 的四层体系结构,这是某个应用层协议封装的应用层报文,也称为应用层协议数据单元。

  1. 应用层将其向下交付给运输层,运输层也看不懂,也无需看懂应用层报文的结构和内容,因此我们将其用黑色表示。运输层的相应协议,仅仅为其添加一个运输层首部,使之称为运输层协议数据单元,并将其向下交付给网际层。
  2. 网际层看不懂也无需看懂运输层协议数据单元的结构和内容,因此我们将其用黑色表示。网际层的 IP 协议仅仅为其添加一个 IP 首部,使之成为网际层协议数据单元,也就是 IP 数据报,并将其向下交付给数据链路层。
  3. 数据链路层看不懂也无需看懂网际层协议数据单位的结构和内容,因此我们将其用黑色表示,数据链路层的相应协议,仅仅为其添加一个首部和一个尾部,使之成为数据链路层协议数据单元,也就是封装成帧,并将其向下交付给物理层。
  4. 物理层看不懂也无需看懂数据链路层协议数据单元的结构和内容,仅仅将它们看作是比特流,以便将它们转换为相应的电信号,发送到传输媒体。由于 IP 地址属于 TCP/IP 体系结构中网际层的范畴,因此,在 IP 首部中应该封装有源 IP 地址和目的 IP 地址,相应的,由于 MAC 地址属于数据链路层的范畴,因此,在帧首部中应该封装有源 MAC 地址和目的 MAC 地址。

02 数据报传送过程中IPv4地址与MAC地址的变化情况
如图所示,这是三个局域网通过两个路由器互传起来的小型互联网,为了简单起见,图中各主机和路由器接口的 IP 地址和 MAC 地址,都用比较简单的标识符来表示,而并未使用实际的 IP 地址和MAC地址,请同学们注意,主机一般只有 1 个接口,因此需要 1 个 IP 地址和 1 个 MAC 地址,而路由器最少有 2 个接口,而每个接口需要 1 个IP 地址和 1 个 MAC 地址。

  • 假设主机 H1 给 H2 发送一个分组,该分组需要依次经过路由器 R1 和 R2 的转发才能最终到达 H2,我们从网络体系结构的角度,来看看数据包在传送过程中,IP 地址与 MAC 地址的变化情况,我们所关注的重点是网际层在封装IP 数据报时,源 IP 地址和目的 IP 地址应该填写什么,数据链路层在封装帧时,源 MAC 地址和目的 MAC 地址应该填写什么。因此,我们忽略网络体系结构中除网际层和数据链路层外的其他各层,各网际层进行水平方向的逻辑通信,各数据链路层进行水平方向的逻辑通信。
  1. 主机 H1 将数据包发送给路由器 R1,在网际层封装的 IP 数据报的首部中,源 IP 地址应填写主机 H1 的 IP 地址 IP1,目的 IP 地址应填写主机 H2 的 IP 地址 IP2,也就是从 IP1 发送给 IP2,数据链路层将 IP 数据报封装成帧,在帧首部中,源 MAC 地址应填写主机 H1 的 MAC 地址 MAC1,目的 MAC 地址应填写路由器 R1 的 MAC 地址 MAC3,也就是从 MAC1 发送给 MAC3。
  2. 路由器 R1 将收到的数据包转发给路由器 R2,在网际层封装的 IP 数据报的首部中,源 IP 地址字段和目的IP 地址字段的内容保持不变,仍然是从 IP1 发送给 IP2,而在数据链路层封装的帧的首部中,源 MAC 地址应填写路由器 R1 的 MAC 地址MAC4,目的 MAC 地址应填写路由器 R2 的MAC 地址 MAC5,也就是从 MAC4 发送 MAC5。
  3. 路由器 R2 将收到的数据包,转发给主机H2,在网际层封装的 IP 数据报的首部中,源 IP 地址字段和目的 IP 地址字段的内容保持不变,仍然是从 IP1 发送给 IP2,而在数据链路层封装的帧首部中,源 MAC 地址应填写路由器 R2 的 MAC 地址MAC6,目的 MAC 地址应填写,主机 H2 的 MAC 地址 MAC2,也就是从MAC6 发送给 MAC2。

  • 在数据包的传送过程中,数据包的源IP地址和目的IP地址保持不变;
  • 在数据包的传送过程中,数据包的源MAC地址和目的MAC地址逐链路(或逐网络)改变。



4.2.5 地址解析协议ARP

这是一个小型交换式以太网,为了简单起见,我们仅画出了该网络中的三台主机,这是它们各自所配置的 IP 地址,和其网卡上固化的 MAC 地址。假设主机 A 要给主机 B 发送一个分组,主机 A 知道主机 B 的 IP 地址,然而主机 A 不知道主机 B 的 MAC 地址,因此,主机 A 的数据链路层在封装以太网帧时,无法填写目的 MAC 地址,实际上,每台主机都会维护一个 ARP 高速缓存表,ARP 高速缓存表中,记录了 IP 地址和 MAC 地址的对应关系

主机 A 的 ARP 高速缓存表中的第一条记录是主机 A 之前获取到的主机 C 的IP 地址与 MAC 地址的对应关系,当主机 A 要给主机 B 发送分组时,会首先在自己的 ARP 高速缓存表中,查找主机 B 的 IP 地址所对应的 MAC 地址,但未找到。

于是主机 A 发送 ARP 请求报文来获取主机 B 的 MAC 地址,ARP 请求报文是广播报文,需要封装在以太网帧中发送,帧的目的 MAC 地址为广播地址,也就是 48 比特为全 1,十六进制为全 F 形式的地址。
为了简单起见,我们用简单的语言来描述 ARP 请求报文的内容,实际上 ARP 请求报文有其具体的格式。交换机收到封装有该 ARP 请求报文的以太网广播帧后,将其从自己的其他所有接口转发出去,这样,主机 B 和 C 都可以收到该广播帧,主机 C 的网卡收到该广播帧后,将其所封装的 ARP 请求报文送交上层处理,上层的 ARP 进程解析该ARP 请求报文,发现所询问的 IP 地址不是自己的地址,因此不予理会。主机 B 的网卡收到该广播帧后,将其所封装的 ARP 请求报文送交上层处理,上层的 ARP 进程解析该 ARP 请求报文,发现所询问的 IP 地址正是自己的 IP 地址,需要进行响应,主机 B 首先将 ARP 请求报文中所携带的主机A 的 IP 地址与 MAC 地址记录到自己的 ARP 高速缓存表中,然后给主机 A 发送 ARP 响应报文,以告知自己的 MAC 地址。

主机 B 给主机 A 发送 ARP 响应报文,ARP 响应报文是单播报文,需要封装在以太网帧中发送,帧的目的 MAC 地址为主机 A 的 MAC 地址,交换机收到封装有该 ARP 响应报文的以太网单播帧后,将其明确转发给主机 A,主机 A 的网卡收到该单播帧后,发现其目的 MAC 地址就是自己的 MAC 地址,于是接受该单播帧并将其所封装的 ARP 响应报文,送交上层处理,上层的 ARP 进程解析该 ARP 响应报文。
将其所包含的主机 B 的 IP 地址与 MAC 地址记录到自己的 ARP 高速缓存表中,主机 A 现在可以给主机 B 发送分组了。

需要说明的是,ARP 高速缓存表中的每一条记录都有其类型,分为动态和静态两种。


注意,ARP协议被用来解决同一个局域网上的主机或路由器的 IP 地址和 MAC 地址的映射问题,不能跨网络使用。
例如下图所示,主机 H1和 H2之间有路由器 R1和 R2共2个路由器,当主机 H1要给主机 H2发送分组时,不能跨网络使用 ARP,而是要逐段链路或逐个网络使用 ARP。

ARP协议的相关注意事项:

  • 由于ARP协议的主要用途是从网际层使用的IP地址解析出在数据链路层使用的MAC地址。因此,有的教材将ARP协议划归在网际层,而有的教材将ARP协议划归在数据链路层。这两种做法都是可以的。
  • 除了本节课介绍的ARP请求报文和响应报文,ARP协议还有其他类型的报文,例如用于检查IP地址冲突的“无故ARP”(Gratuitous ARP)。
  • 由于ARP协议很早就制定出来了(1982年11月),当时并没有考虑网络安全问题。因此,ARP协议没有安全验证机制,存在ARP欺骗和攻击等问题。

4.2.6 IP数据报的发送和转发流程

IP数据报的发送和转发过程包含以下两个过程:

  • 主机发送IP数据报
  • 路由器转发IP数据报


如图所示:路由器 R 的接口0连接了一个由交换机 S1和3台主机互连而成的交换式以太网,记为以太网1;路由器 R 连接了一个由交换机 S2和3台主机互连而成的另一个交换式以太网,记为以太网2。假设以太网1分配到的 CIDR 地址块为192.168.0.0/25;以太网2的 CIDR 地址块为192.168.0.128/25,我们从这两个 CIDR 地址块中,选择可分配给主机或路由器接口的 IP 地址,分别分配给这两个网络中各主机和路由器的各接口。
同一个网络中的主机之间可以直接通信,这属于直接交付,不同网络中的主机之间的通信,需要通过路由器来中转,这属于间接交付,那么源主机如何判断出目的主机是否与自己在同一个网络中呢?

假设主机 C 要给主机 F 发送 IP 数据报,主机 C 知道主机 F 的 IP 地址,于是将主机 F 的 IP 地址的前25个比特取出,与主机 C 自己的 IP 地址的前25个比特的网络前缀进行比较,我们将主机 C 的 IP 地址的左起第4个十进制数转换成8个二进制比特,将主机 F 的 IP 地址的左起第4个十进制数也转换成8个二进制比特,可以发现,它们的IP 地址的左起前25个比特并不完全相同,这就表明,主机 C 与 F 不在同一个网络,换句话说,从主机 C 所配置的 IP 地址可以看出,其网络前缀为25个比特,因此,如果主机 F 要与主机 C 处于同一个网络,则主机 F 的 IP 地址的前25个比特,必须与主机 C 的相同,而剩余7个比特主机号必须不同,综上所述,主机 C 给主机 F 发送 IP 数据报,这属于间接交付,也就是说,主机 C 给主机 F 发送 IP 数据报,需要经过路由器的转发。

那么,主机 C 又是如何知道需要将 IP 数据报交给哪个路由器来转发呢?实际上,用户为了让本网络中的各主机能与其他网络中的各主机进行通信,就必须给本网络中的各主机指定本网络中的一个路由器,由该路由器帮忙进行转发,所指定的路由器也就被称为默认网关。对于本例,我们可以将路由器接口0的 IP 地址指定给该接口所直连网络中的各主机作为默认网关。同理,可将路由器接口1的 IP 地址指定给该接口所直连网络中的各主机作为默认网关,这样,当本网络中的主机要和其他网络中的主机进行通信时,会将 IP 数据报发送给默认网关,由默认网关主机将 IP 数据报转发出去。
假设本例中的主机 A 要给主机 D 发送 IP 数据报,这属于间接交付,主机 A 会将该 IP 数据报发送给自己的默认网关,也就是图中所示的路由器,那么当路由器收到 IP 数据报后,又是如何进行转发的呢?路由器首先会检查收到的 IP 数据报是否正确,例如该 IP 数据报的生存时间是否结束,首部是否出现了误码等,若不正确,则丢弃该 IP 数据报,并向发送该 IP 数据报的源主机发送相应的 ICMP 差错报告。假设该 IP 数据报没有出现差错,路由器基于 IP 数据报首部中的目的 IP 地址在自己的路由表中,查找匹配的路由条目,若找到匹配的路由条目,则按该路由条目的指示进行转发,否则丢弃该 IP 数据报,并向发送该 IP 数据报的源主机发送相应的 ICMP 差错报告。

该 IP 数据报首部中,源 IP 地址192.168.0.1是主机 A 的 IP 地址,而目的 IP 地址192.168.0.129是主机 D 的 IP 地址。在我们给路由器的接口0配置 IP 地址和地址掩码后,路由器就可自行得出自己的接口0所直连网络的网络地址(对于给定CIDR 形式的 IP 地址192.168.0.126/25,可以找出该地址所在地址块的最小地址,也就是网络地址和最大地址,也就是广播地址。只要给路由器编写相应的程序,路由器也能具备该能力)。
综上所述,路由器可自行得出接口0的直连网络路由条目,目的网络为192.168.0.0,相应的地址掩码为255.255.255.128,不需要下一跳路由器因为该目的网络与接口0是直连的;同理,在我们给路由器的接口1配置 IP 地址和地址掩码后,路由器可自行得出接口1的直连网络路由条目,目的网络为192.168.0.128,相应的地址掩码为255.255.255.128,不需要下一跳路由器因为该目的的网络与接口1是直连的。需要说明的是路由表中可能还会有其他路由条目,这可能是用户或网络管理员手工配置的静态路由条目,也可能是路由器通过路由选择协议,自动获取到的动态路由条目。

路由器根据 IP 数据报的目的 IP 地址,在自己的路由表中查找匹配的路由条目,将 IP 数据报的目的地址192.168.0.129与第1条路由条目中的地址掩码255.255.255.128,进行逐比特逻辑与运算,得到网络地址192.168.0.128,该网络地址与第1条路由条目中的目的网络地址192.168.0.0不相同,因此第1条路由条目不匹配。

将 IP 数据报的目的地址192.168.0.129与第2条路由条目中的地址掩码255.255.255.128进行逐比特逻辑与运算,得到网络地址192.168.0.128,该网络地址与第2条路由条目中的目的网络地址192.168.0.128,因此第2条路由条目匹配,路由器根据匹配的路由条目中的下一跳的指示。

从自己的接口1直接交付 IP 数据报给主机 D,路由器只需通过 ARP 协议,获取到与自己的接口处于同一网络中的目的主机 D 的 MAC 地址,就可将 IP 数据报封装成帧后,发送给目的主机 D。

  • 上述路由器查表转发IP数据报的过程只是为了让同学们理解其最基本的工作原理。在路由器的实际研发过程中,需要设计很好的数据结构(甚至是专用硬件)以便提高查找速度。

我们再来看路由器对广播 IP 数据报的处理,假设主机 A 发送了一个广播 IP 数据报,该 IP 数
据报首部中目的地址字段的值,可以设置为192.168.0.127,这是主机 A 所在网络的广播地址,也可以设置为受限的广播地址255.255.255.255。主机 A 所在网络中的各主机和路由器的接口0都会收到该广播 IP 数据报,默认情况下,路由器不会对广播IP 数据报进行转发,也就是说路由器是隔离广播域的,试想一下,如果因特网中数量巨大的路由器,收到广播 IP 数据报后都进行转发,则会造成巨大的广播风暴,严重浪费因特网资源。


从主机 H1和主机 H2所配置的 IP 地址的 CIDR 形式可知,它们各自的26比特网络前缀是相同的,因此,H1和 H2属于同一个网络,需要使用交换机将它们互连起来。从主机 H3和主机 H4所配置的 IP 地址的 CIDR 形式可知,它们各自的26比特网络前缀是相同的,因此,H3和 H4属于同一个网络,需要使用交换机将它们互连起来。从主机 H2与 H3所配置的 IP 地址的 CIDR 形式可知,它们各自的26比特网络前缀是不同的,因此,H1和 H2所属的网络与 H3和 H4所属的网络不是同一个网络,因此,需要使用路由器将这两个不同的网络互连,该路由器就是这两个网络的默认网关。

根据我们之前课程所学过的通过给定的某个 CIDR 地址块中的 IP 地址得出该 IP 地址所在CIDR 地址块的全部细节的相关知识,我们还可以得出应该给该路由器的接口 IF1 分配的 IP 地址。同理还可以分析出,主机 H3 发送的是广播 IP 数据报,因此主机 H3 所在网络中的所有主机和路由器接口都能收到该广播数据报。

4.2.7 IPv4数据报的首部格式

  • IPv4数据报的首部格式及其内容是实现IPv4协议各种功能的基础。
  • 在TCP/IP标准中,各种数据格式常常以32比特(即4字节)为单位来描述。
  • 固定部分是指每个IPv4数据报都必须要包含的部分。
  • 某些IPv4数据报的首部,除了包含20字节的固定部分,还包含一些可选的字段来增加IPv4数据报的功能。
  • IPv4数据报首部中的各字段或某些字段的组合,用来表达IPv4协议的相关功能。

IP 数据报的首部常以 32 个比特为单位进行描述,图中的每一行都由 32 个比特(也就是 4 个字符)构成。每个小格子称为字段或者域。每个字段或某些字段的组合用来表达 IP 协议的相关功能。

1 版本
长度为4个比特,用来表示IP协议的版本。通信双方使用的IP协议的版本必须一致。目前广泛使用的IP协议的版本号为4(即IPv4)。
2 首部长度
长度为4个比特,该字段的取值以4字节为单位,用来表示IPv4数据报的首部长度。
最小取值为二进制的0101,即十进制的5,再乘以4字节单位,表示IPv4数据报首部只有20字节固定部分。
最大取值为二进制的1111,即十进制的15,再乘以4字节单位,表示IPv4数据报首部包含20字节固定部分和最大40字节可变部分。
3 可选字段
长度从1字节到40字节不等,用来支持排错、测量以及安全措施等功能。
虽然可选字段增加了IPv4数据报的功能,但这同时也使得IPv4数据报的首部长度成为可变的,这就增加了因特网中每一个路由器处理IPv4数据报的开销。实际上,可选字段很少被使用。
4 填充
用来确保IPv4数据报的首部长度是4字节的整数倍,使用全0进行填充。
当首部长度(20字节固定部分+可变部分)的长度不是4字节整数倍时,填充相应数量的全0字节,以确保IPv4数据报的首部长度是4字节的整数倍。

5 区分服务
长度为8个比特,用来获得更好的服务。
该字段在旧标准中叫作服务类型,但实际上一直没有被使用过。
1998年,因特网工程任务组IETF把这个字段改名为区分服务。
利用该字段的不同取值可提供不同等级的服务质量。
只有在使用区分服务时该字段才起作用,一般情况下都不使用该字段。
6 总长度
长度为16个比特,该字段的取值以字节为单位,用来表示IPv4数据报的长度(首部长度+数据载荷长度)。最大取值为二进制的16个比特1,即十进制的65535(很少传输这么长的IPv4数据报)。

7 标识,标志,片偏移

它们共同用于进行 IP 数据报分片,如图所示,网际层封装出的 IP 数据报,它将在数据链路层封装成帧,每一种数据链路层协议都规定了帧的数据载荷的最大长度,称为最大传输单元 MTU,例如,以太网的数据链路层规定 MTU 的值为1500 字节。如果某个 IP 数据报的总长度超过MTU 时,将无法封装成帧,需要将原 IP 数据报分片为更小的 IP 数据报,再将各分片 IP 数据报封装成帧。

  • 标识:长度为16个比特,属于同一个IPv4数据报的各分片数据报应该具有相同的标识。IP软件会维持一个计数器,每产生一个IPv4数据报,计数器值就加1,并将此值赋给标识字段。
  • 标志:最低位(More Fragment,MF),MF=1表示本分片后面还有分片,MF=0表示本分片后面没有分片。中间位(Don’t Fragment,DF),DF=1表示不允许分片,DF=0表示允许分片。最高位为保留位,必须设置为0。

举例说明 IP 数据报如何进行分片。假设有这样一个 IP 数据报,它由20字节的固定首部,和3800字节的数据载荷两部分构成,也就是说该 IP 数据报的总长为3820字节,假设使用以太网传送该 IP 数据报,以太网的最大传送单元 MTU 为 1500 字节,也就是以太网的数据载荷部分最大为 1500 字节,无法封装 3820 字节的 IP 数据报,因此需要把该 IP 数据报分片成几个更小的 IP 数据报,每个长度不能大于 1500 字节,然后再将每个分片 IP 数据报封装成一个以太网帧进行传输,为了更好地描述后续地分片工作,我们将原IP 数据报数据载荷部分地每一个字节都编上号,第一个字节编号为 0,最后一个字节编号为3799,我们可将原 IP 数据报地数据载荷分成三个更小地分片,第一个分片从 0 号字节到1399 号字节,共1400 个字节,第二个分片从 1400 号字节到 2799 号字节,共 1400 个字节,第三分片从2800 号字节到 3799 号字节,共 1000 个字节,分片结束后,给每个分片重新添加一个首部,使之成为 IP 数据报,思考这样一个问题:给各分片添加的首部是否完全相同呢?

原 IP 数据报首部中的总长度字段的十进制取值为3800+20,标识为23333,MF 分片的取值为 0,表示后面没有分片数据报,这就是最后一个分片数据报;DF 比特的取值为 0,表示该 IP 数据报准许被分片,由于这是未分片的原 IP 数据报, 因此片偏移为 0。
分片数据报1的数据载荷部分的第一个字节,就是原 IP 数据报数据载荷部分的第一个字节,因此,片偏移字段的取值为 0/8,除以 8 的原因是片偏移字段以 8 字节为单位;
分片数据报2只有片偏移字段的值与分片 1 IP 数据报的不同;
分片数据报3中 1000 字节是分片的长度,20 字节是固定首部的长度,标识字段的十进制取值与原 IP 数据报的相同,由于该分片就是最后一个分片,因此 MF 比特的取值为0,表示该分片后没有其他分片,该分片 IP 数据报准许被再次分片,因此 DF 比特的取值为0,该分片 IP 数据报数据载荷的第一个字节是原 IP 数据报数据载荷中编号为2800的字节,因此片偏移字段的取值为2800/8。

现在假定分片2的 IP 数据报经过某个网络时还需要再进行分片。其中一个分片长度为800字节,另一个分片长度为600字节,分片结束后,给每一个分片重新添加一个首部,使之成为 IP 数据报。


除最后一个分片数据报外,每个分片数据报的数据载荷的长度都必须是8字节的整数倍,否则会造成相邻后续分片数据报的片偏移不是整数。

8 生存时间(Time To Live,TTL)

  • 长度为8个比特,最大取值为二进制的11111111,即十进制的255。该字段的取值最初以秒为单位。因此,IPv4数据报的最大生存时间最初为255秒。路由器转发IPv4数据报时,将其首部中该字段的值减去该数据报在路由器上所耗费的时间,若结果不为0就转发,否则就丢弃。
  • 生存时间字段后来改为以“跳数”为单位,路由器收到待转发的IPv4数据报时,将其首部中的该字段的值减1,若结果不为0就转发,否则就丢弃。

假设采用如下图所示的网络拓扑,路由器 R1,R2,R3各自的路由表如图所示,为了简单起见,只给出了各路由器路由表中的由人工配置的静态路由条目,例如路由器 R2中的这条静态路由条目,它指出了 IP 数据报要到达网络 2,下一跳需要转发给路由器 R3,假设在人工配置这条静态路由条目时,错将下一跳配置成了 R1,这会导致将去往网络 2的 IP 数据报错误地转发给路由器 R1。
假设某个 IP 数据报从网络 1发往网络 2,该 IP 数据报到达 R1后,R1进行查表转发,发现了匹配的路由条目,其下一跳指示转发给 R2,于是 R1将该 IP 数据报转发给了 R2,R2收到该 IP 数据报后,进行查表转发,发现了匹配地路由条目,其下一跳指示转发给 R1,于是 R2将该 IP 数据报又转发回了 R1,很显然形成了路由环路,如果没有其他措施,IP 数据报将在路由环路中永久兜圈。

9 协议
长度为8个比特,用来指明IPv4数据报的数据载荷是何种协议数据单元PDU。
假设这是使用TCP/IP运输层的TCP协议构建的TCP报文段,运输层将其向下交付给网际层,网际层的IP协议将其作为数据载荷,并为其添加一个IP数据报首部,使之成为IP数据报,首部中协议字段的值被设置为6,用来指明该IP数据报的数据载荷封装的是TCP报文段。


10 首部检验和

  • 长度为16个比特,用于检测IPv4数据报在传输过程中其首部是否出现了差错。
  • IPv4数据报每经过一个路由器,其首部中的某些字段的值(例如生存时间TTL、标志以及片偏移等)都可能发生变化,因此路由器都要重新计算一下首部检验和。
  • 由于网际层并不向其高层提供可靠传输的服务,并且计算首部检验和是一项耗时的操作,因此在IPv6中,路由器不再计算首部检验和,从而更快转发IP数据报。

11 源IP地址、目的IP地址
源IP地址:长度为32个比特,用来填写发送IPv4数据报的源主机的IPv4地址。
目的IP地址:长度为32个比特,用来填写接收IPv4数据报的目的主机的IPv4地址。

4.3 静态路由配置

01 静态路由配置
静态路由配置是指用户或网络运维人员使用路由器的相关命令给路由器人工配置路由表。人工配置方式简单、开销小、但不能及时适应网络状态(流量、拓扑等)的变化,一般只在小规模网络中采用。
采用如图所示的网络拓扑和相应的 IP 地址配置,路由器 R1通过自己的接口0所配置的 IP 地址和地址掩码,可以自动得出接口0所在的网络,由于接口0与该网络直连,则下一跳不是路由器地址,而是通过接口0转发 IP 数据报给该网络中的某个主机,这属于直接交付,这条自动得出的路由条目的类型属于直连路由。同理,R1 还可自定得出接口 1 的直连网络路由条目。

假设 R1 要转发一个 IP 数据报给该网络中的某个主机,从图中可以看出,R1 应该将该IP 数据报转发给路由器 R2 的接口 0,但 R1 的路由表中并没有关于该目的网络的路由条目。换句话说,R1 并不知道目的网络的存在。因此,我们可以使用路由器的相关配置命令,给R1 添加一条到达该目的网络的路由条目,下一跳为路由器 R2 的接口 0 的地址,该路由条目是我们人工配置的静态路由。

假设 R2 要转发一个 IP 数据报给该网络中的某个主机,从图中可以看出,R2 应该将该 IP 数据报转发给路由器 R1 的接口 1,但R2 的路由表中并没有关于该目的网络的路由条目。因此我们可以给 R2 添加一条到达该目的网络的路由条目,下一跳为路由器 R1 的接口 1 的地址,类型为静态。

02 默认路由
路由器 R2 的接口 2 连接到了因特网。假设 R1 要转发一个 IP 数据报给因特网中某个网络的某个主机,从图中可以看出,R1 应该将该 IP 数据报转发给路由器 R2 的接口 0。由于因特网中包含了众多的网络,如果我们给 R1 添加针对这些网络的每一条路由条目,则会给人工配置带来巨大的工作量,并且使 R1 的路由表变得非常大,降低查表转发的速度,实际上对于具有相同下一跳的不同目的网络的路由条目,我们可以用一条默认路由条目来替代。默认路由条目中的目的网络地址为0.0.0.0,地址掩码也为0.0.0.0,其CIDR形式为0.0.0.0/0。对于本例,默认路由条目中的下一跳是路由器 R2 的接口 0 的地址,由于默认路由也是由我们人工配置的,因此其类型也是静态。

默认路由条目中的目的网络0.0.0.0/0,其中0.0.0.0表示任意网络,而网络前缀“/0”(相应的地
址掩码为0.0.0.0)是最短的网络前缀。路由器在查找转发表转发IP数据报时,遵循“最长前缀匹配”的原则,因此默认路由条目的匹配优先级最低。

03 特定主机路由
有时候,我们可以给路由器添加针对某个主机的特定主机路由条目。一般用于网络管理人员对网络的管理和测试,另外,在需要考虑某种安全问题时也可以采用特定主机路由。
网络192.168.2.0/24中,有一台IP地址为192.168.2.1的特定主机,在 R1 的路由表中添加一条到达该主机的特定主机路由条目,特定主机路由条目中的网络地址为192.168.2.1/32,特定主机路由条目中的下一跳是路由器 R2 的接口 0 的地址,由于特定主机路由也是由我们人工配置的,因此其类型也是静态。


使用静态路由配置可能出现以下导致产生路由环路的错误:

  • 配置错误
  • 聚合了不存在的网络
  • 网络故障

①配置错误
假设我们将路由器 R2下一跳错误地指向了 R3 的接口 0,则当 R2 要转发 IP 数据报到该网络时,下一跳会错误的转发给路由器 R3 的接口 0,R3 收到该 IP 数据报后,进行查表转发,找到了匹配的路由条目,下一跳应该转发给 R2 的接口 1,R2 收到该 IP 数据报后,进行查表转发找到了匹配的路由条目,下一跳应该转发给 R3 的接口 0,很显然,由于我们静态路由配置错误,导致 R2 和 R3 之间产生了路由环路,为了防止 IP 数据报在路由环路中永久兜圈,在 IP 数据报首部设有生存时间 TTL 字段,IP 数据报进入路由器后,TTL 字段的值被路由器减 1,若 TTL 字段的值减 1 后不等于 0,则被路由器转发,否则被丢弃。

②聚合了不存在的网络

假设 R2 要转发 IP 数据报到网络192.168.2.0/24,进行查表转发,找到了匹配的路由条目,下一跳应该转发给 R1 的接口 1,R1 收到该 IP 数据报后,进行查表转发,找到了匹配的路由条目后下一跳是通过接口 2 直接交付。

这条聚合路由实际上包含了四个网络。当 R2 要转发 IP 数据报到192.168.3.0/24这个不存在的网络时,进行查表转发,找到了匹配的路由条目,下一跳应该转发给R1 的接口 1,但对于这个不存在的网络,路由器 R2 应该不予转发,却错把它转发给了路由器 R1,R1 收到该 IP 数据报后,进行查表转发,只能走默认路由,下一跳应该转发给R2 的接口0,很显然,R1 和 R2 之间产生了路由环路。

针对这种情况,我们可以在 R2 的路由表中,添加针对所聚合的不存在的网络的黑洞路由。黑洞路由的下一跳为 null0,这是路由器内部的虚拟接口,可以把它形象的看成是一个黑洞,IP 数据报进入它后就有去无回了。也就是路由器丢弃了该 IP 数据报,而不是转发该 IP 数据报。
假设 R2 要转发 IP 数据报到这个不存在的网络,进行查表转发,找到了两条可选的路由条目,根据“最长前缀匹配”原则,将会选择这条到达该不存在网络的黑洞路由,下一跳为虚拟接口 null0,因此该 IP 数据报会进入这个黑洞。

③网络故障
假设路由器 R1 检测到其接口 0 所直连的网络192.168.1.0/24出现了故障而不可达,就会自动在其路由表中删除该直连网络的路由条目。之后,R2 要转发 IP 数据报到该网络,进行查表转发,找到匹配的路由条目,下一跳应该转发给 R1 的接口 1,R1 收到该 IP 数据报后,进行查表转发,找不到该 IP 数据报的目的网络的相关路由条目,只能走默认路由,下一跳应该转发给该地址,也就是转发给 R2 的接口 0,这样就将该 IP 数据报错误的转发给了R2,很显然,R1 和 R2 之间产生了路由环路。

针对这种情况,我们可以在 R1 的路由表中,添加针对该直连网络的黑洞路由。这样,当 R2 要转发 IP 数据报到该网络时,进行查表转发,找到匹配的路由条目,下一跳转发给 R1 的接口 1,R1 收到该 IP 数据报后,进行查表转发,找到匹配的路由条目,这是一条黑洞路由,下一跳为虚拟接口 null0,因此该 IP 数据报会进入这个黑洞。

假设一段时间后,之前的故障消失了,则 R1 又自动的得出了其接口 0 的直连网络的路由条目,并将我们之前人工配置的针对该直连网络的黑洞路由条目设置为失效状态。假设 R1 再次检测到其接口 0 所直连的网络出现了故障而不可达,则会自动在其路由表中删除该直连网络的路由条目,并将我们之前人工配置的针对该直连网络的黑洞路由条目设置为生效状态 。

4.4 因特网的路由选择协议

4.4.1 路由选择分类

4.4.2 因特网采用分层次的路由选择协议


因特网采用分层次的路由选择协议:

自治系统内部的路由选择简称为域内路由选择。域间路由选择使用外部网关协议 EGP 这个类别的路由选择协议。域内路由选择使用内部网关协议 IGP 这个类别的路由选择协议。在一个自治系统内部使用的具体的内部网关协议,与因特网中其他自治系统中选用何种内部网管协议无关,例如,在自治系统AS1内部,使用的内部网关协议为路由信息协议 RIP,而在自治系统AS2内部使用的内部网关协议为开放式最短路径优先 OSPF 协议,自治系统之间使用的外部网关协议为边界网关协议 BGP。

  1. 外部网关协议EGP和内部网关协议IGP只是路由选择协议的分类名称,而不是具体的路由选择协议。
  2. 外部网关协议和内部网关协议名称中使用的是“网关”这个名词,是因为在因特网早期的RFC文档中,没有使用“路由器”而使用的是“网关”这一名词。现在新的 RFC 文档中又改用“路由器”这一名词。因此,外部网关协议 EGP 可改称为外部路由协议 EGP,内部网关协议 IGP 可改称为内部路由协议 IGP。


路由器的基本结构
路由器是一种具有多个输入端口和输出端口的专用计算机,其任务是转发分组,整个路由器结构可划分为两大部分:一个是路由选择部分,另一个是分组转发部分。路由选择部分的核心构建是路由选择处理机,它的任务是根据所使用的路由选择协议,周期性的与其他路由器进行路由信息的交互来更新路由表。分组转发部分由三部分构成,分别是交换结构、一组输入端口,一组输出端口。

信号从某个输入端口进入路由器。物理层将信号转换成比特流,送交数据链路层处理。数据链路层从比特流中识别出帧,去掉帧头和帧尾后,送交网络层处理。
如果送交网络层的分组是普通待转发的数据分组,则根据分组首部中的目的地址进行查表转发,若找不到匹配的转发条目,则丢弃该分组,否则,按照匹配条目中所指示的端口进行转发。网络层更新数据分组首部中某些字段的值,例如将数据分组的生存时间减 1,然后送交数据链路层进行封装。数据链路层将数据分组封装成帧,送交物理层处理。物理层将帧看作是比特流,将其变换成相应的电信号进行发送。

如果送交网络层的分组是路由器之间交换路由信息的路由报文,则把这种分组送交路由选择处理机。路由选择处理机根据分组的内容来更新自己的路由表。(需要说明的是我们在之前的静态路由配置的相关课程中,并没有严格区分路由器中的路由表和转发表,这样有助于简化问题的分析,因此,在后续有关路由选择协议的课程中,我们仍然不严格区分路由表和转发表,还是以路由表来表述问题)

路由选择处理机除了处理收到的路由报文外,还会周期性地给其他路由器发送自己所知道的路由信息。

路由器的各端口还应具有输入缓冲区和输出缓冲区。输入缓冲区是适用于新进入路由器但还来不及处理的分组,输出缓冲区用来暂存已经处理完毕但还来不及发送的分组,需要说明的是,路由器的端口一般都具有输入和输出的功能,我们图中分别给出输入端口和输出端口,目的在于更好的演示路由器的基本工作过程,使大家更容易理解。

4.4.3 路由信息协议(RIP)

01 路由信息协议RIP的相关基本概念

  • 路由信息协议(Routing Information Protocol,RIP)是内部网关协议中最先得到广泛使用的协议之一,其相关标准文档为[RFC 1058]。
  • RIP要求自治系统AS内的每一个路由器,都要维护从它自己到AS内其他每一个网络的距离记录。这是一组距离,称为距离向量(Distance-Vector,D-V)。
  • RIP使用跳数(Hop Count)作为度量(Metric)来衡量到达目的网络的距离。RIP将路由器到直连网络的距离定义为1。RIP将路由器到非直连网络的距离定义为所经过的路由器数加1。RIP允许一条路径最多只能包含15个路由器,距离等于16时相当于不可达。因此RIP只适用于小型互联网。

  • RIP认为好的路由就是“距离短”的路由,也就是所通过路由器数量最少的路由。
  • 当到达同一目的网络有多条RIP距离相等的路由时,可以进行等价负载均衡,也就是将通信量均衡地分布到多条等价的路径上。



02 RIP的基本工作过程

  1. 路由器刚开始工作时,只知道自己到直连网络的RIP距离为1。
  2. 每个路由器仅和相邻路由器周期性地交换并更新路由信息。
  3. 若干次交换和更新后,每个路由器都知道到达本自治系统AS内各网络的最短距离和下一跳路由器,称为收敛。


03 RIP的距离向量算法
路由器 C 和 D 互为相邻路由器,它们之间周期性地交换并更新路由信息,路由器 C 的路由表中到达各目的网络地下一跳都记为问号,可以理解为路由器 D 并不需要关心路由器 C 的这些内容。假设路由器 C 的 RIP 更新报文发送周期到了,则路由器 C 将自己路由表中的相关路由信息封装到 RIP 更新报文中发送给路由器 D,我们可以简单地理解为路由器 C 将自己的路由表发送给了路由器 D,路由器 D 收到后对其进行改造,将到达各目的网络地下一跳都改为 C,距离都增加 1。

路由器 D 现在可以根据改造好的路由表,来更新自己先前的路由表了。

  1. 路由器 D 原来到达网络 N2 的距离是 2,下一跳经过路由器 C 的转发,现在路由器 D 知道了,到达网络 N2 仍然经过 C 的转发,距离变为了 5,也就是说,C 与 N2 之间的网络拓扑发生了变化,于是将自己这条路由表条目中的距离更新为 5,更新路由表的理由可总结为“到达目的网络,相同的下一跳,最新的消息,应该更新”。
  2. 路由器 D 原来不知道网络 N3 的存在,现在知道了,可以通过路由器 C 到达网络 N3。于是将该路由条目添加到自己的路由表中。更新路由表的理由可总结为“发现了新的网络,添加”。
  3. 路由器 D 原来到达网络 N6 的距离是 8,下一跳经过路由器 F 的转发,现在路由器 D 知道了,到达网络 N6 如果通过 C 来转发,则距离可缩短为 5,于是将自己这条路由条目中的距离修改为 5,下一跳修改为 C,更新路由表的理由可总结为“到达目的网络,不同的下一跳,新路由有优势,应该更新”。
  4. 路由器 D 原来到达网络 N8 的距离是 4,下一跳经过路由器 E 的转发,现在路由器 D知道了,到达网络 N8 还可以通过 C 来转发,距离也为 4,于是将该路由条目添加到自己的路由表中。更新路由表的理由可总结为“到达目的网络,不同的下一跳,但距离相等,进行等价负载均衡”。
  5. 路由器 D 原来到达网络 N9 的距离是 4,下一跳经过路由器 F 的转发,现在路由器 D 知道了,到达网络 N9 如果通过 C 来转发,则距离扩大为 6,于是不使用这条路由条目来更新自己的路由表。不更新路由表的理由可总结为“到达目的网络,不同的下一跳,新路由劣势,不应该更新”。

除了上述RIP路由条目更新规则,在RIP的距离向量算法中还包含以下一些时间参数:

  • 路由器每隔大约30秒向其所有相邻路由器发送路由更新报文。
  • 若180秒(默认)没有收到某条路由条目的更新报文,则把该路由条目标记为无效(即把RIP距离设置为16,表示不可达),若再过一段时间(如120秒),还没有收到该路由条目的更新报文,则将该路由条目从路由表中删除。


04 RIP存在的问题–“坏消息传播得慢”
如图所示:假设到达 R1 其直连网络 N1 的链路出现了故障,当 R1 检测出该故障后,会将到达 N1 的路由条目中的距离修改为 16,表示 N1 不可达,并等待 RIP 更新周期到时后,发送该路由信息给 R2,而此时 R2 的路由表中关于 N1 的路由条目仍然是先前通过 RIP 协议获取到的,也就是到达 N1 的距离为 2,下一跳通过 R1 转发。假设 R2 的 RIP 更新周期先到时,也就是 R2 的这条路由信息先到达 R1,而 R1 的这条路由信息后到达 R2。

当 R1 收到 R2 的这条路由信息后,就会被该谣言误导,认为可以通过 R2 到达 N1,距离为3,并在自己的 RIP 更新周期到时后,将这条路由信息发送给 R2。当 R2 收到 R1 的这条路由信息后,被该谣言误导,认为可以通过 R1 到达 N1,距离为 4,并在自己的 RIP 更新周期到时后,将这条路由信息发送给 R1。当 R1 收到 R2 的这条路由信息后,被该谣言误导,认为可以通过 R2 到达 N1,距离为 5。并在自己的 RIP 更新周期到时后,将这条路由信息发送给R2,很显然,只有当 R1 和 R2 的路由表中,到达 N1 的路由条目中的距离,都增加到 16 后,R1和 R2 才都知道 N1 不可达,也就是才收敛。

“坏消息传播得慢”的问题又被称为路由环路或RIP距离无穷计数问题。这是距离向量算法的一个固有问题。可以采取以下多种措施减少出现该问题的概率或减小该问题带来的危害:

  • 限制最大RIP距离为15(16表示不可达)。
  • 当路由表发生变化时就立即发送路由更新报文(即“触发更新”),而不仅是周期性发送。
  • 让路由器记录收到某个特定路由信息的接口,而不让同一路由信息再通过此接口向反方向传送(即“水平分割”)。

注意:使用上述措施仍无法彻底解决问题。因为在距离向量算法中,每个路由器都缺少到目的网络整个路径的完整信息,无法判断所选的路由是否出现了环路。

05 RIP版本和相关报文的封装

  • 现在较新的RIP版本是1998年11月公布的RIP2[RFC 2453],已经成为因特网标准协议。与RIP1相比,RIP2可以支持变长子网掩码和CIDR。另外,RIP2还提供简单的鉴别过程并支持多播。
  • RIP相关报文使用运输层的用户数据报协议UDP进行封装,使用的UDP端口号为520。从RIP报文封装的角度看,RIP属于TCP/IP体系结构的应用层;但RIP的核心功能是路由选择,这属于TCP/IP体系结构的网际层。

06 RIP的优缺点

4.4.4 开放最短路径优先协议(OSPF)

01 OSPF的相关基本概念

  • 开放最短路径优先(Open Shortest Path First,OSPF)协议是为了克服路由信息协议RIP的缺点在1989年开发出来的。“开放”表明OSPF协议不是受某一厂商控制,而是公开发表的。“最短路径优先”是因为使用了Dijkstra提出的最短路径算法(Shortest Path First,SPF)。
    注意:“开放最短路径优先”只是一个路由选择协议的名称,但这并不表示其他的路由选择协议不是“最短路径优先”。实际上,用于自治系统AS内部的各种路由选择协议(例如RIP),都要寻找一条“最短”的路径。
  • 链路状态(Link State,LS)是指本路由器都和哪些路由器相邻,以及相应链路的“代价(cost)”。“代价”用来表示费用、距离、时延和带宽等,这些都由网络管理人员来决定。
  • OSPF是基于链路状态的,而不像RIP是基于距离向量的。
  • OSPF基于链路状态并采用最短路径算法计算路由,从算法上保证了不会产生路由环路。
  • OSPF不限制网络规模,更新效率高,收敛速度快。

OSPF路由器邻居关系的建立和维护:
OSPF相邻路由器之间通过交互问候(Hello)分组来建立和维护邻居关系。问候(Hello)分组封装在IP数据报中,发往组播地址224.0.0.5。IP数据报首部中的协议号字段的取值为89,表明IP数据报的数据载荷为OSPF分组。
注意:OSPF分组直接使用网际层的IP数据报进行封装,而不像RIP报文需要使用运输层用户数据报协议UDP封装。从数据报按网络体系结构逐层封装的角度看,OSPF属于网际层协议,而RIP属于应用层协议(但其核心功能是路由选择,属于网际层)。

问候分组的发送周期为 10秒,因此每个路由器都会建立一个邻居表,例如路由器 R1 的邻居表中的每一个条目,对应记录其各邻居路由器的相关信息,包括邻居 ID、接口、以及“死亡”倒计时。
例如R2 是 R1 的一个邻居路由器,为简单起见,邻居 ID 就记为 R2,实践中应填写相应的路由器ID,该邻居路由器与自己的接口 1 相连,将接口号记为 1,“死亡”倒计时还剩余 36 秒,若在“死亡”倒计时到达 0 之前,再次收到了来自 R2 的问候分组,则重新启动针对该邻居条目的40 秒“死亡”倒计时,否则,当“死亡”倒计时为 0 时,则判定该邻居路由器不可达。 R4是 R1的另一个邻居路由器,邻居 ID 就记为 R4,该邻居路由器与自己的接口 0 相连,将接口号记为 0,“死亡”倒计时还剩余 18 秒。

链路状态通告:

链路状态更新分组
链路状态通告LSA被封装在链路状态更新(Link State Update,LSU)分组中,采用可靠的洪泛法(Flooding)进行发送。

  • 洪泛法的要点是路由器向自己所有的邻居路由器发送链路状态更新分组,收到该分组的各路由器又将该分组转发给自己所有的邻居路由器(但其上游路由器除外),以此类推。
  • 可靠是指收到链路状态更新分组后要发送确认,收到重复的更新分组无需再次转发,但要发送一次确认。


链路状态数据库

  • 使用OSPF的每一个路由器都有一个链路状态数据库(Link State Database,LSDB),用于存储链路状态通告LSA。
  • 通过各路由器洪泛发送封装有各自链路状态通告LSA的链路状态更新分组LSU,各路由器的链路状态数据库LSDB最终将达到一致。


基于链路状态数据库进行最短路径优先计算

02 OSPF的五种分组类型

03 OSPF的基本工作过程

  1. 相邻路由器之间周期性发送问候分组,以便建立和维护邻居关系。
  2. 建立邻居关系后,给邻居路由器发送数据库描述分组,也就是将自己的链路状态数据库中的所有链路状态项目的摘要信息,发送给邻居路由器,例如,R1 收到 R2 的数据库描述分组后,发现自己缺少其中的某些链路状态项目,于是就给 R2 发送链路状态请求分组,R2 收到后,将 R1 所缺少的链路状态项目的详细信息,封装在链路状态更新分组中发送给 R1,R1 收到后,将这些所缺少的链路状态项目的详细信息,添加到自己的链路状态数据库中,并给 R2发送链路状态确认分组。需要说明的是,R2 也可以向 R1 请求自己所缺少的链路状态项目的详细信息,最终,R1 和 R2 的链路状态数据库将达到一致,也就是链路状态数据库达到同步。
  3. 每 30 分钟或链路状态发生变化时,路由器都会发送链路状态更新分组,收到该分组的其他路由器将洪泛转发该分组,并给该路由器发回链路状态确认分组,这又称为新情况下的链路状态数据库同步。


04 多点接入网络中的OSPF路由器
当 OSPF 路由器在多点接入网络中建立邻居关系时,如果不采用其他机制,将会产生大量的多播分组,例如,这 5 台路由器连接在同一个多点接入网络中,它们周期性的发送问候分组以建立和维护邻居关系,这些路由器中的任意两个路由器都互为邻居关系,如图所示,邻居关系的数量为 n(n-1)/2,其中 n 是路由器的数量,这样,每个路由器要向其他(n-1)个路由器发送问候分组和链路状态更新分组。


非 DR/BDR 之间不能直接交换信息,而必须通过 DR/BDR 进行交换,若 DR 出现问题,则由BDR 顶替 DR,实现 DR 和 BDR 的选举并不复杂,无非就是各路由器之间交换一些选举参数,例如路由器优先级,路由器 ID,接口 IP 地址等,然后根据选举规则选出 DR 和 BDR,这与交换机生成树协议选举根交换机类似。

05 OSPF划分区域
为了使 OSPF 协议能够用于规模很大的网络,OSPF 把一个自治系统,再划分为若干个更小
的范围,称为区域。

  • 如图所示,这是一个规模很大的网络,我们将其划分成一个自治系统,在该自治系统内,所有路由器都使用 OSPF 协议,OSPF 将该自治系统再划分为 4 个更小的区域,每个区域都有一个 32 比特的区域标识符,可以用点分十进制表示,例如,主干区域的标识符必须为 0,也可表示成点分十进制的 0.0.0.0。
  • 主干区域用于连通其他区域,其他区域的标识符不能为 0 且互不相同,每个区域的规模不应太大,一般所包含的路由器不应超过200 个,划分区域的好处就是,把利用洪泛法交换链路状态信息的范围局限于每一个区域而不是整个自治系统,这样就减少了整个网络上的通信量。
  • 如果路由器的所有接口都在同一个区域内,则该路由器称为区域内路由器,为了本区域可以和自治系统内的其他区域连通,每个区域都会有一个区域边界路由器,它的一个接口用于连接自身所在区域,另一个接口用于连接主干区域,主干区域内的路由器称为主干路由器,我们也可以把区域边界路由器看作是主干路由器,在主干区域内还要有一个路由器专门和本自治系统外的其他自治系统交换路由信息,这样的路由器称为自治系统边界路由器。
  • 在本例中,区域边界路由器 R3 向主干区域发送自己所在区域 1 的链路状态通告,向自己所在区域发送区域 0,2,3 的链路状态通告,区域边界路由器 R4 向主干区域发送自己所在区域 2 的链路状态通告,向自己所在区域发送区域 0,1,3 的链路状态通告,区域边界路由器 R7向主干区域发送自己所在区域 3 的链路状态通告,向自己所在区域发送区域 0,1,2 的链路状态通告。


自治系统边界路由器(AS Border Router,ASBR):R6
主干路由器(Backbone Router,BBR):R3、R4、R5、R6和R7
区域内路由器(Internal Router,IR):区域1内的R1和R2,区域2内的R8,区域3内的R9
区域边界路由器(Area Border Router,ABR):R3、R4和R7

4.4.5 边界网关协议(BGP)

01 边界网关协议BGP的相关基本概念
边界网关协议(Border Gateway Protocol,BGP)属于外部网关协议EGP这个类别,用于自治系统AS之间的路由选择协议。
由于在不同AS内度量路由的“代价”(距离、带宽、费用等)可能不同,因此对于AS之间的路由选择,使用统一的“代价”作为度量来寻找最佳路由是不行的。

AS之间的路由选择还必须考虑相关策略(政治、经济、安全等)。BGP只能是力求寻找一条能够到达目的网络且比较好的路由(即不能兜圈子),而并非要寻找一条最佳路由。

  • 在配置BGP时,每个AS的管理员要选择至少一个路由器作为该AS的“BGP发言人”。一般来说,两个BGP发言人都是通过一个共享网络连接在一起的,而BGP发言人往往就是BGP边界路由器。
  • 使用TCP连接交换路由信息的两个BGP发言人,彼此称为对方的邻站(neighbor)或对等站(peer)。
  • BGP发言人除了运行BGP协议外,还必须运行自己所在AS所使用的内部网关协议IGP,例如RIP或OSPF。
  • BGP发言人交换网络可达性的信息,也就是要到达某个网络所要经过的一系列自治系统。
  • 当BGP发言人相互交换了网络可达性的信息后,各BGP发言人就根据所采用的策略,从收到的路由信息中找出到达各自治系统的较好的路由,也就是构造出树形结构且不存在环路的自治系统连通图。



02 BGP-4的四种报文


解析:R1和R2分别属于不同的自治系统AS1和AS2中,自治系统之间需要使用外部网关协议EGP这一类协议。具体为边界网关BGP,目前使用最多的版本是BGP-4,BGP-4报文被封装到TCP报文段中进行传输。

4.5 网际控制报文协议(ICMP)

01 网际控制报文协议ICMP概述

  • 为了更有效地转发IP数据报以及提高IP数据报交付成功的机会,TCP/IP体系结构的网际层使用了网际控制报文协议(Internet Control Message Protocol,ICMP)[RFC 792]。
  • 主机或路由器使用ICMP来发送差错报告报文和询问报文。
  • ICMP报文被封装在IP数据报中发送。


02 ICMP报文类型

①差错报告报文
常见的ICMP差错报告报文有五种:终点不可达、源点抑制、时间超过(超时)、参数问题、改变路由(重定向)
1 终点不可达:
假设 H1 会将 IP 数据报发送给路由器 R1,由 R1 帮其转发,若 R1 的路由表中没有网络 N3 的路由记录、默认路由以及主机 H2 的特定主机路由,则 R1 就不知道如何转发该数据报,只能将其丢弃,并向发送该数据报的源主机 H1 发送 ICMP 差错报告报文,其类型为终点不可达。

2 源点抑制:
例如 H1 给 H2 发送 IP 数据报,当该数据报传输到路由器 R2 时,由于 R2 拥塞,也就是 R2
比较繁忙,R2 根据自己的丢包策略丢弃了该数据报,并向发送该数据报的源主机 H1 发送ICMP 差错报告报文,其类型为源点抑制。

H1 给 H2 发送 IP 数据报,当该数据报传输到 H2 时,由于 H2 拥塞就丢弃了该数据报,并向发送数据报的源主机 H1 发送 ICMP 差错报告报文,其类型为源点抑制。

3 时间超时:

另外,当终点在预先规定的时间内未能收到一个数据报的全部数据报分片时,就把已收到的数据报片都丢弃,也会向源点发送时间超过(超时)报文。
4 参数问题

5 改变路由(重定向)
假设我们给主机 H1 指定的默认网关是路由器 R1,则 H1 要发往网络 N2的 IP 数据报都会传输给 R1,由其帮忙转发,当 R1 发现 H1 发往 N2 的数据报的最佳路由,不应当经过 R1 而是应当经过 R4 时,就用改变路由报文把这个情况告诉主机,于是,H1 就在自己的路由表中添加一个项目:到达 N2 应经过路由器 R4 而不是默认网关 R1,之后,H1要发往 N2 的 IP 数据报都会传输给 R4,由其帮忙转发。

以下情况不应发送ICMP差错报告报文:

  • 对ICMP差错报告报文不再发送ICMP差错报告报文。
  • 对第一个分片的IP数据报片的所有后续数据报片都不发送ICMP差错报告报文。
  • 对具有多播地址的IP数据报都不发送ICMP差错报告报文。
  • 对具有特殊地址(例如127.0.0.0或0.0.0.0)的IP数据报不发送ICMP差错报告报文。

②询问报文

03 ICMP的典型应用
①分组网间探测(Packet InterNet Groper,PING)

  • 分组网间探测PING用来测试主机或路由器之间的连通性。PING是TCP/IP体系结构的应用层直接使用网际层ICMP的一个例子,它并不使用运输层的TCP或UDP。PING应用所使用的ICMP报文类型为回送请求和回答。
  • 某些主机或服务器为了防止恶意攻击,并会不理睬外界发来的ICMP回送请求报文。

② 跟踪路由(traceroute)

  • 跟踪路由应用traceroute,用于探测IP数据报从源主机到达目的主机要经过哪些路由器。
  • 在不同操作系统中,traceroute应用的命令和实现机制有所不同:在UNIX版本中,具体命令为“traceroute”,其在运输层使用UDP协议,在网络层使用ICMP报文类型只有差错报告报文。在Windows版本中,具体命令为“tracert”,其应用层直接使用网际层的ICMP协议,所使用的ICMP报文类型有回送请求和回答报文以及差错报告报文。



4.6 虚拟专用网VPN和网络地址转换NAT

01 虚拟专用网VPN

虚拟专用网(Virtual Private Network,VPN):利用公用的因特网作为本机构各专用网之间的通信载体,这样形成的网络又称为虚拟专用网。

给专用网内各主机配置的IP地址应该是该专用网所在机构可以自行分配的IP地址,这类IP地址仅在机构内部有效,称为专用地址(Private Address),不需要向因特网的管理机构申请。在因特网中的所有路由器,对目的地址是专用地址的IP数据报一律不进行转发,这需要由因特网服务提供者ISP对其拥有的因特网路由器进行设置来实现。
[RFC 1918]规定了以下三个CIDR地址块中的地址作为专用地址:

我们给部门 A 的专用网分配的私有地址的网络号为 10.1.0.0,给部门 B 的专用网分配的私有地址的网络号为 10.2.0.0,两个专用网中各主机所分配的私有地址如图所示,需要注意的是,私有地址只能用于一个机构的内部通信,而不能用于和因特网上的主机通信,换句话说,私有地址只能用作本地地址而不能用作全球地址,在因特网中的所有路由器,对目的地址是私有地址的 IP 数据报一律不进行转发,很显然,部门 A 和 B 各自需要一个路由器具有合法的全球 IP 地址,这样,它们各自的专用网才能利用公用的因特网进行通信。

  1. 假设部门 A 中的这台主机,要给部门 B 中的另一台主机发送数据,它会将待发送数据封装成内部 IP 数据报,发送给路由器 R1,其首部中源地址字段的值为部门 A 中该主机的 IP 地址,目的地址字段的值为部门 B 中另一台主机的 IP地址。
  2. R1 收到该数据报后,发现其目的网络必须通过因特网才能到达,就将该内部 IP 数据报进行加密,这样就确保了内部 IP 数据报的安全,然后重新添加上数据报的首部,封装为在因特网上发送的外部数据报,其首部中源地址字段的值为路由器 R1 的全球地址,目的地址字段的值为路由器 R2 的全球地址。
  3. 路由器 R2 收到该外部 IP 数据报后,去掉其首部,将其数据部分进行解密,恢复出原来的内部 IP 数据报,这样就可以从其首部提取出源地址和目的地址,根据目的地址将该内部 IP 数据报发送给相应的主机,很显然,两个专用网内的主机间发送的数据报,是通过了公用的因特网,但在效果上就好像实在本机构的专用网上。


  • 本例所示的是同一机构内不同部门的内部网络所构成的VPN,又称为内联网VPN。
  • 有时,一个机构的虚拟专用网VPN需要某些外部机构(通常是合作伙伴)参加进来,这样的VPN就称为外联网VPN。
  • 在外地工作的员工需要访问公司内部的专用网时,只要在任何地点接入因特网,运行驻留在员工PC中的VPN软件,在员工的PC和公司的主机之间建立VPN隧道,就可以访问专用网中的资源,这种虚拟专用网又称为远程接入VPN。

02 网络地址转换

  • 尽管因特网采用了无分类编址方法来减缓IPv4地址空间耗尽的速度,但由于因特网用户数量的急剧增长,特别是大量小型办公室和家庭网络接入因特网的需求不断增加,IPv4地址空间即将耗尽的危险然仍没有解除(实际上,因特网号码分配管理局IANN于2011年2月3日宣布IPv4地址已经分配完毕)。
  • 网络地址转换(Network Address Translation,NAT)技术于1994年被提出,用来缓解IPv4地址空间即将耗尽的问题。
    NAT能使大量使用内部专用地址的专用网络用户共享少量外部全球地址来访问因特网上的主机和资源。这种方法需要在专用网络连接到因特网的路由器上安装NAT软件。装有NAT软件的路由器称为NAT路由器,它至少要有一个有效的外部全球地址IPG。这样,所有使用内部专用地址的主机在和外部因特网通信时,都要在NAT路由器上将其内部专用地址转换成IPG。

最基本的NAT方法
假设使用私有地址的该主机,要给因特网上使用全球 IP 地址的另一台主机,发送 IP 数据报,该主机将数据报发送给 NAT 路由器,数据报首部中源地址字段的值为该主机的私有地址IPA,目的地址字段的值为因特网上另一台主机的全球地址IPB,NAT 路由器从自己的全球 IP 地址池中,为该主机分配一个临时的全球 IP 地址IPG,并将 IP 数据报的源地址修改为该地址,然后将私有地址与全球地址的对应关系,记录在 NAT 转换表中,之后就可以转发该 IP 数据报了,请注意,此时该 IP 数据报中的源地址和目的地址都是全球 IP地址。

因特网上的这台主机给源主机发回数据报,数据报的源地址和目的地址都是全球 IP 地址。NAT 路由器收到该 IP 数据报后,在 NAT 转换表中进行查找,发现该数据报的目的地址所对应的私有地址为IPA,于是就将该数据报的目的地址修改为IPA,并将其发送给相应主机,请注意:此时该 IP 数据报中的源地址为因特网上那台主机的全球IP 地址,而目的地址为专用网中这台主机的私有地址。

网络地址与端口号转换方法

  • 由于目前绝大多数基于TCP/IP协议栈的网络应用,都使用运输层的传输控制协议TCP或用户数据报协议UDP,为了更加有效地利用NAT路由器中的全球IP地址,现在常将NAT转换和运输层端口号结合使用。这样就可以使内部专用网中使用专用地址的大量主机,共用NAT路由器上的1个全球IP地址,因而可以同时与因特网中的不同主机进行通信。
  • 将NAT和运输层端口号结合使用,称为网络地址与端口号转换(Network Address and Port Translation,NAPT)。现在很多家用路由器将家中各种智能设备(手机、平板、笔记本电脑、台式电脑、物联网设备等)接入因特网,这种路由器实际上就是一个NAPT路由器,但往往并不运行路由选择协议。



尽管NAT(和NAPT)的出现在很大程度上缓解了IPv4地址资源紧张的局面,但NAT(和NAPT)对网络应用并不完全透明,会对某些网络应用产生影响。
NAT(和NAPT)的一个重要特点就是通信必须由专用网内部发起,因此拥有内部专用地址的主机不能直接充当因特网中的服务器。

对于目前P2P这类需要外网主机主动与内网主机进行通信的网络应用,在通过NAT时会遇到问题,需要网络应用自身使用一些特殊的NAT穿透技术来解决。

4.7 IP多播

4.7.1 IP多播技术的相关基本概念

  • 单播:单播用于发送数据包到单个目的地,且每单播发送一份单播报文都使用一个单播IP地址作为目的地址。是一种点对点传输方式。
  • 广播是指发送数据包到同一广播域或子广播网内的所有设备的一种数据传输方式,是一种点对多点传输方式。
  • 组播(多播):当网络中的某些用户需要特定数据时,组播数据发送者仅发送一次数据,借助组播路由协议为组播数据包建立组播分发树,被传递的数据到达距离用户端尽可能近的节点后才开始复制和分发,是一种点对多点传输方式。 在因特网上进行的多播,称为IP多播。

如图所示,共有 60 个主机要接收来自视频服务器的同一个视频节目,如果采用单播方式,视频服务器需要发送 60 个该视频节目,这些视频节目通过各路由器的转发,最终到达各主机;如果采用多播方式,可将这 60 个主机看作是同一个多播组的成员,视频服务器只要向该多播组发送 1 个视频节目即可,由于路由器 R1 支持 IP 多播,R1 在转发该视频节目时,需要把该视频节目复制成 2 个副本,分别向路由器 R2 和 R3 转发 1 个副本,当该视频节目到达目的局域网时,由于局域网具有硬件多播功能,因此不需要复制该视频节目,在局域网上的该多播组成员都能收到这个节目。

要在因特网上实现IP多播,则因特网中的路由器需要解决哪些主要问题?
答:IP多播数据报的寻址和多播路由选择协议

4.7.2 IP多播地址和多播组

  • 在IPv4中,D类地址被作为多播地址(并非所有的D类地址都可以作为组播地址)。
  • 多播地址只能用作目的地址,而不能用作源地址。源地址总是为单播地址。
  • 用每一个D类地址来标识一个多播组,使用同一个IP多播地址接收IP多播数据报的所有主机就构成了一个多播组。每个多播组的成员是可以随时变动的,一台主机可以随时加入或离开多播组。多播组成员的数量和所在的地理位置也不受限制,一台主机可以属于几个多播组。
  • 非多播组成员也可以向多播组发送IP多播数据报。
  • 与IP数据报相同,IP多播数据报也是“尽最大努力交付”,不保证一定能够交付给多播组内的所有成员。不提供可靠交付,应用于UDP。
  • 对组播数据报不产生ICMP差错报文。



IP多播可以分为两种:只在本局域网上进行的硬件多播、在因特网上进行的多播。
目前大部分主机都是通过局域网接入因特网的。因此,在因特网上进行多播的最后阶段,还是要把IP多播数据报在局域网上用硬件多播交付给多播组的所有成员。

4.7.3 在局域网上进行硬件多播

  • 由于MAC地址(也称为硬件地址)有多播MAC地址这种类型,因此只要把IPv4多播地址映射成多播MAC地址,即可将IP多播数据报封装在局域网的MAC帧中,而MAC帧首部中的目的MAC地址字段的值,就设置为由IPv4多播地址映射成的多播MAC地址。这样,可以很方便地利用硬件多播来实现局域网内的IP多播。
  • 当给某个多播组的成员主机配置其所属多播组的IP多播地址时,系统就会根据映射规则从该IP多播地址生成相应的局域网多播MAC地址。

因特网号码指派管理局IANA,将自己从IEEE注册管理机构申请到的以太网MAC地址块中从01-00-5E-00-00- 00到01-00-5E-7F-FF-FF的多播MAC地址,用于映射IPv4多播地址。这些多播MAC地址的左起前25个比特都是相同的,剩余23个比特可以任意变化,因此共有 2^23 个。



对于本例,两个不同的 IP 多播地址,映射出了同一个多播 MAC 地址。由于IP多播地址与多播MAC地址的映射关系不是唯一的,因此收到IP多播数据报的主机还要在网际层利用软件进行过滤,把不是主机要接收的IP多播数据报丢弃。

举例说明,左边主机属于 IP 多播组 226.0.9.26,中间主机属于 IP 多播组 226.128.9.26,右边主机属于 IP 多播组 228.1.1.1,从网际层角度看,这是 3 个不同的 IP 多播组,各自映射出多播 MAC 地址,IP 多播组 226.0.9.26 和 226.128.9.26 映射出的以太网多播MAC 地址是相同的,这与 IP 多播组 228.1.1.1 映射出的以太网多播 MAC 地址是不同的,因此,从 MAC 层的角度看,图中有 2 个不同的硬件多播组。假设有一个封装有 IP 多播数据报的多播 MAC 帧传送到了这些多播组所在的局域网,IP 多播数据报的目的 IP 地址是IP 多播地址 226.128.9.26,多播 MAC 帧的目的 MAC 地址就是该 IP 多播地址映射出的多播 MAC 地址。

当该多播 MAC 帧到达各主机后,各主机需要根据该多播 MAC 帧的目的 MAC 地址决定是否接受该多播 MAC 帧,若接受,还要根据帧中封装的 IP 多播数据报的目的 IP 地址来决定是否在网际层接受该 IP 多播数据报。属于硬件多播组 01-00-5E-01-01 的各成员主机,从 MAC层就可判断出该多播 MAC 帧不是发送给自己所在硬件多播组的,各成员将其丢弃。属于硬件多播组 01-00-5E-00-09-1A 的所有主机收到该多播帧后,根据多播帧的目的 MAC 地址,就可知道这是发给自己的多播帧,于是 MAC 层接受该帧,并将其封装的 IP 多播数据报向上交付给网际层处理,网际层根据多播数据报的目的 IP 地址为 IP 多播地址 226.128.9.6 ,就可知道这不是发送给 IP 多播组 226.0.9.26 的多播数据报,因此,该 IP 多播组的所有成员丢弃该IP 多播数据报,而 IP 多播组 226.128.9.26 的所有成员,会接受该 IP 多播数据报。

4.7.4 在因特网上进行IP多播需要的两种协议

要在因特网上进行IP多播,就必须要考虑IP多播数据报经过多个多播路由器进行转发的问题。多播路由器必须根据IP多播数据报首部中的IP多播地址,将其转发到有该多播组成员的局域网。

01 网际组管理协议(Internet Group Management Protocol,IGMP)

  • 是TCP/IP体系结构网际层中的协议,其作用是让连接在本地局域网上的多播路由器知道本局域网上是否有主机(实际上是主机中的某个进程)加入或退出了某个多播组。
  • IGMP仅在本网络有效,使用IGMP并不能知道多播组所包含的成员数量,也不能知道多播组的成员都分布在哪些网络中。
  • 仅使用IGMP并不能在因特网上进行IP多播。连接在局域网上的多播路由器还必须和因特网上的其他多播路由器协同工作,以便把IP多播数据报用最小的代价传送给所有的多播组成员,这就需要使用多播路由选择协议。



02 多播路由选择协议
主要任务是在多播路由器之间为每个多播组建立一个多播转发树。找出以源主机为根节点的多播转发树。

  • 多播转发树连接多播源和所有拥有该多播组成员的路由器。构造树可以避免在路由器之间兜圈子。对不同的多播组对应于不同的多播转发树,同一个多播组对不同的源点也会有不同的多播转发树。
  • IP多播数据报只要沿着多播转发树进行洪泛,就能被传送到所有拥有该多播组成员的多播路由器。
  • 之后,在多播路由器所直连的局域网内,多播路由器通过硬件多播,将IP多播数据报发送给该多播组的所有成员。

如图所示,分布在不同局域网上的ABCEF主机,都是多播组 226.128.9.26 的成员,各路由器使用 IGMP 协议,就可获知自己所连接的局域网上是否有某个多播组的成员,去往该多播组的 IP 多播数据报,只要沿着该多播转发树进行洪泛,就能被传送到所有拥有该多播组成员的多播路由器,之后,在多播路由器所直连的局域网内,多播路由器通过硬件多播,将 IP 多播数据报发送给该多播组的所有成员。

  • 针对不同的多播组需要维护不同的多播转发树,而且必须动态地适应多播组成员的变化,但此时网络拓扑并不一定发生变化,因此多播路由选择协议要比单播路由选择协议(例如RIP、OSPF等)复杂得多。即使某个主机不是任何多播组的成员,它也可以向任何多播组发送多播数据报。为了覆盖多播组的所有成员,多播转发树可能要经过一些没有多播组成员的路由器(例如图中的R2)。

组播路由选择协议常使用的三种算法:

  • 基于链路状态的路由选择
  • 基于距离-向量的路由选择
  • 协议无关的组播(稀疏/密集)

4.8 移动IP技术


移动IP技术是指移动结点以固定的网络IP地址实现跨越不同网段的漫游功能,并保证基于网络IP的网络权限在漫游中不发生任何改变。

1 移动IP技术的基本工作原理 —— 代理发现与注册
在归属网络中,连接因特网的某个路由器上配置归属代理,在外地网络中,连接因特网的某个路由器上配置外地代理,移动主机 A 从它的归属网络漫游到一个外地网络 175.1.0.0/16。



2 移动IP技术的基本工作原理 —— 固定主机向移动主机发送IP数据报
假设固定主机 B 要给移动主机 A 发送一个 IP 数据报,该数据报会被路由到移动主机 A 的归属网络,归属代理会代替移动主机 A 接收该数据报,该数据报的源地址为固定主机 B 自己的 IP 地址,目的地址为移动主机 A 的永久地址 218.75.230.16。归属代理将数据报封装到一个新的 IP 数据报中,其首部中的目的地址为移动主机 A 的转交地址 175.1.1.1/16(这其实就是外地代理的 IP 地址),归属代理将这个新的 IP 数据报通过 IP 隧道发送给外地代理,外地代理收到后将其数据载荷即原 IP 数据报解封出来,根据其首部中的目的地址直接转发给位于外地网络中的移动主机 A。

注意:当外地代理和移动主机不是同一台设备时,转交地址实际上是外地代理的地址而不是移动主机的地址,转交地址既不会作为移动主机发送IP数据报的源地址,也不会作为移动主机所接收的IP数据报的目的地址。转交地址仅仅是归属代理到外地代理的IP隧道的出口地址。所有使用同一外地代理的移动主机都可以共享同一个转交地址。

3 移动IP技术的基本工作原理 —— 移动主机向固定主机发送IP数据报
假设位于外地网络中的移动主机 A 向固定主机 B 发送一个 IP 数据报,该 IP 数据报首部中的源地址为移动主机 A 的永久地址,而目的地址为固定主机 B 的 IP 地址,该 IP 数据报的发送和转发过程如图所示:

IP数据报被移动主机A按照正常的发送流程发送出去即可。由于IP路由器并不关心IP数据报的源地址,因此该IP数据报被直接路由到固定主机B,而无须再通过归属代理进行转发。为此,移动主机可以将外地代理作为自己的默认路由器,也可以通过代理发现协议从外地代理获取外地网络中其他路由器的地址,并将其设置为自己的默认路由器。

4.9 IPv6

4.9.1 IPv6主要特点

01 IPv6引进的主要变化

02 IPv6数据报的首部–基本首部

IPv6将IPv4数据报首部中不必要的功能取消了,这使得IPv6数据报基本首部中的字段数量减少到只有8个。但由于IPv6地址的长度扩展到了128比特,因此使得IPv6数据报基本首部的长度反而增大到了40字节,比IPv4数据报首部固定部分的长度(20字节)增大了20字节。

  1. 取消了首部长度字段,因为IPv6数据报的首部长度是固定的40字节。
  2. 取消了区分服务(服务类型)字段,因为IPv6数据报首部中的通信量类和流标号字段实现了区分服务字段的功能。
  3. 取消了标识、标志和片偏移字段,因为这些功能已包含在IPv6数据报的分片扩展首部中。
  4. 生存时间TTL字段改称为跳数限制字段,这样名称与作用更加一致。
  5. 取消了协议字段,改用下一个首部字段。
  6. 取消了首部检验和字段,这样可以加快路由器处理IPv6数据报的速度。
  7. 取消了选项字段,改用扩展首部来实现选项功能。




源地址字段和目的地址字段:长度都为128比特。分别用来填写IPv6数据报的发送端的IPv6地址和接收端的IPv6地址。

03 IPv6数据报的首部–扩展首部

  • IPv4数据报如果在其首部中使用了选项字段,则在数据报的整个传送路径中的全部路由器,都要对选项字段进行检查,这就降低了路由器处理数据报的速度。
  • 实际上,在路径中的路由器对很多选项是不需要检查的。因此,为了提高路由器对数据包的处理效率,IPv6把原来IPv4首部中的选项字段都放在了扩展首部中,由路径两端的源点和终点的主机来处理,而数据报传送路径中的所有路由器都不处理这些扩展首部(除逐跳选项扩展首部)。

4.9.2 IPv6地址


在IPv6地址的冒号十六进制记法的基础上,再使用“左侧零”省略和“连续零”压缩,可使IPv6地址的表示更加简洁。

  • “左侧零”省略是指两个冒号间的十六进制数中最前面的一串0可以省略不写。
  • “连续零”压缩是指一连串连续的0可以用一对冒号取代。


在一个IPv6地址中只能使用一次“连续零”压缩,否则会导致歧义。


冒号十六进制记法还可结合点分十进制的后缀。这在IPv4向IPv6过渡阶段非常有用。

CIDR的斜线表示法在IPv6中仍然可用。

03 IPv6地址的分类
IPv6数据报的目的地址有三种基本类型:

  • 单 播(unicast):传统的点对点通信
  • 多 播(multicast):一点对多点的通信。数据报发送到一组计算机中的每一个。IPv6没有采用广播的术语,而将广播看作多播的一个特例。
  • 任 播(anycast):这是IPv6新增的一种类型。任播的终点是一组计算机,但数据报只交付其中的一个,通常是按照路由算法得出的距离最近的一个。

[RFC 4291]对IPv6地址进行了分类:

  • 未指明地址
    • 128个比特为“全0”的地址,可缩写为两个冒号“::”。
    • 该地址不能用作目的地址,只能用于还没有配置到一个标准IPv6地址的主机用作源地址。
    • 未指明地址仅有一个。
  • 环回地址
    • 最低比特为1,其余127个比特为“全0”,即0:0:0:0:0:0:0:1,可缩写为::1。
    • 该地址的作用与IPv4的环回地址相同。
    • IPv6的环回地址只有一个。
  • 多播地址
    • 最高8比特为“全1”的地址,可记为FF00::/8。
    • IPv6多播地址的功能与IPv4多播地址相同。
    • 这类地址占IPv6地址空间的1/256。
  • 本地链路单播地址
    • 最高10比特为1111111010的地址,可记为FE80::/10。
    • 即使用户网络没有连接到因特网,但仍然可以使用TCP/IP协议。连接在这种网络上的主机都可以使用本地链路单播地址进行通信,但不能和因特网上的其他主机通信。
    • 这类地址占IPv6地址空间的1/1024。
  • 全球单播地址

4.9.3 从IPv4向IPv6过渡

  • 因特网上使用IPv4的路由器的数量太大,要让所有路由器都改用IPv6并不能一蹴而就。因此,从IPv4转变到IPv6只能采用逐步演进的办法。
  • 另外,新部署的IPv6系统必须能够向后兼容,也就是IPv6系统必须能够接收和转发IPv4数据报,并且能够为IPv4数据报选择路由.


01 双协议栈

  • 双协议栈(Dual Stack)是指在完全过渡到IPv6之前,使一部分主机或路由器装有IPv4和IPv6两套协议栈。
  • 双协议栈主机或路由器既可以和IPv6系统通信,又可以和IPv4系统通信。
  • 双协议栈主机或路由器记为IPv6/IPv4,表明它具有一个IPv6地址和一个IPv4地址。
    • 双协议栈主机在与IPv6主机通信时采用IPv6地址,而与IPv4主机通信时采用IPv4地址。
    • 双协议栈主机通过域名系统DNS查询目的主机采用的IP地址:若DNS返回的是IPv4地址,则双协议栈的源主机就使用IPv4地址;若DNS返回的是IPv6地址,则双协议栈的源主机就使用IPv6地址。

02 隧道技术
隧道技术(Tunneling)的核心思想是:

  • 当IPv6数据报要进入IPv4网络时,将IPv6数据报重新封装成IPv4数据报,即整个IPv6数据报成为IPv4数据报的数据载荷。
  • 封装有IPv6数据报的IPv4数据报在IPv4网络中传输。
  • 当IPv4数据报要离开IPv4网络时,再将其数据载荷(即原来的IPv6数据报)取出并转发到IPv6网络。

4.10 软件定义网络SDN

1 路由器的功能
如图所示,源主机给目的主机发送分组,该分组需要经过多个路由器的转发,最终到达目的
主机。

另一个功能是路由选择,从源主机到达目的主机的路径,可能不止一条,对于路由信息协议 RIP,它会选择经过路由器数量少的这条路径。

2 路由器之间传送的信息

3 网络层的数据层面和控制层面

  • 路由器之间交互路由信息,并利用路由算法得出路由表,再根据路由表得出转发表,我们把路由器的网络层,抽象的划分为两个层面,一个层面是控制层面,另一个层面是数据层面,或称为转发层面,这里所谓的层面与计算机网络体系结构中的分层是类似的,都是抽象的概念。

在控制层面中,每一个路由器无法独自创建出自己的路由表,路由器必须和相邻的路由器,周期性地交换路由信息,然后才能创建出自己的路由表,根据路由选择协议所使用的路由算法计算路由,需要由软件来完成,这需要花费较多地时间(时间长),一般是秒数量级;
在数据层面中,每一个路由器基于自己生成的转发表来转发分组,为了提高转发速率,现在的路由器一般都基于硬件进行转发,单个分组的转发时间为纳秒数量级(时间短)。






习题:
1.假定你要在SDN控制平面中实现一个新型路由选择协议,你将在哪个层次中实现该协议?
网络范围状态管理层。因为在这一层能获得有关网络的主机、链路、交换机和其他SDN控制设备的最新状态信息,可以根据这些信息的基础上实现新型路由选择协议,并通知给控制器落地执行。
2.谁是从控制器跨越南向接口发送的这些报文的接收者?谁是跨越北向接口从控制器发送的这些报文的接收者?
受控网络设备(路由器)、网络控制应用程序。

第五章 运输层

5.1 运输层概述

01 进程间基于网络的通信

  • 计算机网络体系结构中的物理层、数据链路层和网络层,它们共同解决了将主机通过异构网络互联起来所面临的问题,实现了主机到主机的通信。
  • 然而在计算机网络中实际进行通信的真正实体,是位于通信两端主机中的进程。
  • 如何为运行在不同主机上的应用进程提供直接的逻辑通信服务,就是运输层的主要任务。运输层协议又称为端到端协议。

局域网 1 上的主机,与局域网 2 上的主机通过互连的广域网进行通信,网络层的作用范围是主机到主机。
AP1 和 AP2 是局域网 1 上这台主机中的与网络通信相关的两个应用进程,AP3 和 AP4是局域网 2 上这台主机中的与网络通信相关的两个应用进程,AP 是应用进程的英文缩写词。运输层的作用范围是应用进程到应用进程,也称为端到端。

假设 AP1 与 AP4之间进行基于网络的通信,AP2 与 AP3 之间进行基于网络的通信,在运输层使用不同的端口,来对应不同的应用进程,然后通过网络层及其下层来传输应用层报文。如图所示,接收方的运输层通过不同的端口,将收到的应用层报文,交付给应用层中相应的应用进程。

为了简单起见,在学习和研究运输层时,我们可以简单的认为运输层直接为应用进程间的逻辑通信提供服务,“逻辑通信“的意思是运输层之间的通信好像是沿水平方向传送数据,但事实上,这两个运输层中并没有一条水平方向的物理连接,要传输的数据是沿着图中上下多次的虚线方向传送的。

02 TCP/IP运输层中的两个重要协议



03 运输层端口号

  • 运行在计算机上的进程是使用进程标识符(Process Identification,PID)来标识的。
  • 然而,因特网上的计算机并不是使用统一的操作系统,而不同操作系统(Windows、Linux、MacOS)又使用不同格式的进程标识符。
  • 为了使运行不同操作系统的计算机的应用进程之间能够基于网络进行通信,就必须使用统一的方法对TCP/IP体系的应用进程进行标识。
  • TCP/IP体系结构的运输层使用端口号来标识和区分应用层的不同应用进程。端口号的长度为16比特,取值范围是0~65535。


04 发送方的复用和接收方的分用

  • 发送方的某些应用进程所发送的不同应用报文,在运输层使 UDP 协议进行封装,称为 UDP复用,而另一些应用进程所发送的不同应用报文,在运输层使用 TCP 协议进行封装,这称为 TCP 复用。
  • 运输层使用端口号来区分不同的应用进程,不管是使用运输层的 UDP 协议封装成的 UDP 用户数据报,还是使用 TCP 协议封装成的 TCP 报文段,在网络层都需要使用 IP协议封装成 IP 数据报,这称为 IP 复用,IP 数据报首部中协议字段的值用来表明 IP 数据报的数据载荷部分,封装的是何种协议数据单元,取值为 6 表示封装的是 TCP 报文段,取值为17 表示封装的是 UDP 用户数据报。
  • 接收方的网际层收到 IP 数据报后进行 IP 分用,若 IP 数据报首部中协议字段的值为 17,则把 IP 数据报的数据在和部分所封装的 UDP 用户数据上交运输层的 UDP;若协议字段的值为6,把 IP 数据报的数据载荷部分所封装的 TCP 报文段上交运输层的 TCP,运输层对 UDP 用户数据报进行 UDP 分用,对 TCP 报文段进行 TCP 分用,也就是是根据端口号,将它们交付给上层相应的应用进程。


TCP/IP 体系的应用层常用协议所使用的运输层熟知端口号:

05 运输层端口号应用举例
如图所示,用户 PC,DNS服务器,web 服务器通过交换机进行互联,它们处于同一个以太网中。

web 服务器的域名为 www.porttest,DNS 服务器中记录有该域名所对应的 IP 地址,我们在用户 PC 使用网页浏览器来访问 web 服务器的内容,在网页浏览器的地址栏中输入 Web 服务器的域名,用户 PC 中的 DNS 客户端进程会发送一个 DNS 查询请求报文,其内容为“域名 www.porttest 所对应的 IP 地址是什么?”,DNS 查询请求报文需要使用运输层的 UDP 协议,封装成 UDP 用户数据报,其首部中的源端口字段的值在短暂端口号 49151~65535 中挑选一个未被占用的,用来表示 DNS 客户端进程,例如 49152,目的端口字段的值设置为53,这是 DNS 服务器端进程所使用的熟知端口号。

之后将 UDP 用户数据报封装在 IP 数据报中,通过以太网发送给 DNS 服务器,DNS 服务器收到该数据报后,从中解封出 UDP 用户数据报,UDP 首部中的目的端口号为 53,这表明应将 UDP 用户数据报的数据载荷部分也就是 DNS 查询请求报文交付给本服务器的 DNS 服务器端进程,DNS 服务器端进程解析 DNS 查询请求报文的内容,然后按其要求查找对应的 IP地址。
之后,会给用户 PC 发送 DNS 响应报文,其内容为“域名 www.porttest 所对应的IP 地址是 192.168.0.3”,DNS 响应报文需要使用运输层的 UDP 协议,封装成 UDP 用户数据报,其首部中的源端口字段的值设置为熟知端口号 53,表明这是 DNS 服务器端进程所发送的 UDP 用户数据报,目的端口字段的值设置为 49152,这是之前用户 PC 中发送 DNS 查询请求报文的 DNS 客户端进程所使用的短暂端口号。

之后,将 UDP 用户数据报封装在 IP 数据报中,通过以太网发送给用户 PC,用户 PC 收到该
数据报后,从中解封出 UDP 用户数据报,UDP 首部中的目的端口号 49152,这表明应将该UDP 用户数据报的数据载荷部分也就 DNS 响应报文交付给用户 PC 中的 DNS 客户端进程,DNS 客户端进程解析 DNS 响应报文的内容,就可知道自己之前所请求的 web 服务器的域名所对应的 IP 地址为 192.168.0.3。

现在用户 PC 中的 HTTP 客户端进程,可以向 web 服务器发送 HTTP 请求报文了。其内容为“首页内容是什么?”HTTP 请求报文需要使用运输层的 TCP 协议封装成 TCP 报文段,其首部中的源端口字段的值在短暂端口号 49151~65535 中挑选一个未被占用的,用来表示 HTTP客户端进程。例如仍然使用之前用过的 49152,目的端口字段的值设置为 80,这是 HTTP 服务器端进程所使用的熟知端口号。

之后,将 TCP 报文段封装在 IP 数据报中,通过以太网发送给 web 服务器,web 服务器收到该数据报后,从中解封出 TCP 报文段,TCP 首部中的端口号为 80,这表明应将该 TCP 报文
段的数据载荷部分也就是 HTTP 请求报文交付给本服务器中的 HTTP 服务器端进程,HTTP服务器端进程解析 HTTP 请求报文的内容,然后按其要求查找首页内容。之后会给用户 PC发送 HTTP 响应报文,其内容是 HTTP 客户端所请求的首页内容,HTTP 响应报文需要使用运输层的 TCP 协议封装成 TCP 报文段,其首部中的源端口字段的值设置为数值端口号 80,表明这是 HTTP 服务器端进程所发送的 TCP 报文段,目的端口字段的值设置为 49152,这是之前用户 PC 中发送 HTTP 请求报文的 HTTP 客户端进程所使用的短暂端口号。

之后,将 TCP 报文段封装在 IP 数据报中,通过以太网发送给用户 PC,用户 PC 收到该数据报后,从中解封出 TCP 报文段,TCP 首部中的目的端口号为 49152,这表明应将该 TCP 报文段的数据载荷部分也就是 HTTP 响应报文交付给用户 PC 中的 HTTP 客户端进程,HTTP 客户端进程解析 HTTP 响应报文的内容,并在网页浏览器中进行显示。这样我们就可以在网页浏览器中看到 web 服务器所提供的首页内容了。

5.2 UDP和TCP的对比


01 无连接的UDP和面向连接的TCP
“连接”指逻辑连接关系,而不是物理连接。

02 UDP和TCP对单播、多播和广播的支持情况

使用 TCP 协议的通信双方,在进行数据传输之前,必须使用“三报文握手”,来建立 TCP 连接,TCP 连接建立成功后,通信双方之间就好像有一条可靠的通信信道,通信双方使用这条基于 TCP 连接的可靠信道进行通信。
03 UDP和TCP应用层报文的处理

  • 先来看使用 UDP 协议的情况,发送方的应用进程,将应用层报文交付给运输层的 UDP,UDP 直接给应用层报文添加一个 UDP 首部,使之成为 UDP 用户数据报,然后进行发送,需要说明的是,为了简单起见,我们忽略运输层下面得到各层处理,接收方的 UDP 收到 UDP 用户数据报后,去掉 UDP 首部,将应用层报文交付给应用进程,也就是说,UDP 对应用进程交下来的报文既不合并也不拆分,而是保留这些报文的边界,换句话说,UDP 是面向应用报文的。
  • 再来看使用 TCP 协议的情况
  • 发送方的 TCP 把应用进程交付下来的数据块仅仅看作是一连串的、无结构的字节流,TCP并不知道这些待传送的字节流的含义,仅将它们编号并存储在自己的发送缓存中。
  • TCP 根据发送策略,从发送缓存中提取一定数量的字节,构建 TCP 报文段并发送,接收方的 TCP,一方面从所接收到的 TCP 报文段中,取出数据载荷部分并存储在接收缓存中,另一方面将接收缓存中的一些字节交付给应用进程,TCP不保证接收方应用进程所收到的数据块与发送方应用进程所发出的数据块具有对应大小的关系。
  • 例如,发送方应用进程交给发送方的 TCP 共 10 个数据块,但接收方的 TCP 可能只用了 4个数据块,就把收到的字节流交付给了上层的应用进程,但接收方应用进程收到的字节流,必须和发送方应用进程发出的字节流完全一样,当然接收方的应用进程必须有能力识别收到的字节流,把它还原成有意义的应用层数据,也就是说TCP 是面向字节流的,这正是 TCP 实现可靠传输、流量控制、以及拥塞控制的基础。
  • 需要说明的是,为了突出示意图的要点,我们只画出了一个方向的数据流,在实际网络中,基于 TCP 连接的两端,可以同时进行 TCP 报文段的发送和接收,也就是全双工通信,另外,图中 TCP 报文段的数据部分只包含了几个字节,实际当中,一个 TCP 报文段包含上千个字节是很常见的。

04 UDP和TCP对数据传输可靠性的支持情况

  • TCP/IP 体系结构的网际层,向其上层提供的是无连接不可靠的传输服务,当运输层使用 UDP 协议时,向其上层提供的也是无连接不可靠的传输服务。发送方给接收方发送 UDP 用户数据报,若传输过程中用户数据报受到干扰而产生误码,接收方 UDP 可以通过该数据报首部中的校验和字段的值,检查出产生误码的情况,但仅仅丢弃该数据报,其它什么也不做!发送方给接收方发送 UDP 用户数据报,如果该数据报被因特网中的某个路由器丢弃了,发送方 UDP 不做任何处理,因为 UDP 向上层提供的是无连接不可靠的传输服务,因此,对于 UDP 用户数据报出现的误码和丢失等问题,UDP 并不关心。基于 UDP 的这个特点,UDP 适用于实时应用,例如 IP 电话,视频会议等。
  • 尽管网际层中的 IP 协议,向上层提供的是无连接不可靠的传输服务,也就是说,IP 数据报可能在传输过程中出现丢失或误码,但只要运输层使用TCP 协议,就可向其上层提供面向连接的可靠传输服务,我们可将其想象成使用 TCP 协议的收发双方,基于 TCP 连接的可靠信道进行数据传输,不会出现误码、丢失、乱序以及重复等传输差错,TCP 适用于要求可靠传输的应用,例如文件传输。

05 UDP首部和TCP首部的对比

总结

5.3 TCP

5.3 .1 TCP报文段的首部格式

1、源端口、目的端口

2、序号seq、确认号ack、确认标志位ACK
确认号可以这样理解,若确认号为n,则表明到序号 n-1 为止的所有数据都已正确接收,期望接收序号为 n 的数据。

举例说明这三个字段的作用:

  • TCP 客户进程发送一个 TCP 报文段,该报文段首部中序号字段的取值为 201,这表示该 TCP 报文段数据载荷的第一个字节的序号为 201。假设数据载荷的长度为 100 字节,首部中确认号字段的取值为 800,这表示 TCP 客户进程收到了TCP 服务器进程发来的序号到 799 为止的全部数据,现在期望收到序号从 800 开始的数据。为了使确认号字段有效,首部中的确认标准位 ACK 的值必须设置为 1。
  • TCP 服务器进程收到该报文段后,也给 TCP 客户进程发送 TCP 报文段,该报文段首部中序号字段的取值为 800,这表示该 TCP 报文段数据载荷的第一个字节的序号为 800,这正好与TCP 客户进程的确认相匹配,假设数据载荷的长度为 200 字节。首部中确认字段的取值为301,这表示 TCP 服务器进程收到了 TCP 客户进程发来的序号到 300 为止的全部数据,现在期望收到序号从 301 开始的数据。为了使确认段数据有效,首部中的确认标志位 ACK 的值必须设置为 1。

3、数据偏移

4、保留
占6比特、保留为今后使用、目前应置为0
5、窗口

  • 占16比特,该字段的取值以字节为单位。
  • 指出发送本报文段的一方的接收窗口的大小,即接收缓存的可用空间大小,这用来表征接收方的接收能力。
  • 在计算机网络中,经常用接收方的接收能力的大小来控制发送方的数据发送量,这就是所谓的流量控制。

6、检验和
占16比特,用来检查整个TCP报文段在传输过程中是否出现了误码。与 UDP 类似,在计算校验和时,要在 TCP 报文段的前面加上 12 字节的伪首部。
7、同步标志位 SYN

  • 用于TCP“三报文握手”建立连接。
  • 当SYN=1且ACK=0时,表明这是一个TCP连接请求报文段。
  • 对方若同意建立连接,则应在响应的TCP报文段的首部中使SYN=1且ACK=1。
  • 综上所述,SYN为1的TCP报文段要么是一个连接请求报文段,要么是一个连接响应报文段。

8、终止标志位FIN

  • 用于TCP“四报文挥手”释放连接。
  • 当FIN=1时,表明此TCP报文段的发送方已经将全部数据发送完毕,现在要求释放TCP连接。

9、复位标志位RST

  • 用于复位TCP连接。
  • 当RST=1时,表明TCP连接中出现严重差错,必须释放连接,然后再重新建立连接。
  • RST置1还用来拒绝一个非法的TCP报文段或拒绝打开一个TCP连接。

10、推送标志位PSH

  • 出于效率的考虑,TCP的发送方可能会延迟发送数据,而TCP的接收方可能会延迟向应用进程交付数据,这样可以一次处理更多的数据。但是当两个应用进程进行交互式通信时,有时在一端的应用进程希望在键入一个命令后立即就能够收到对方的响应。在这种情况下,应用进程可以通知TCP使用推送(PUSH)操作。
  • 发送方TCP把PSH置1,并立即创建一个TCP报文段发送出去,而不需要积累到足够多的数据再发送。接收方TCP收到PSH为1的TCP报文段,就尽快地交付给应用进程,而不再等到接收到足够多的数据才向上交付。

11、紧急标志位URG、紧急指针

  • 当URG=1时,紧急指针字段有效。当URG=0时,紧急指针字段无效。
  • 紧急指针占16比特,以字节为单位,用来指明紧急数据的长度。当发送方有紧急数据时,可将紧急数据“插队”到发送缓存的最前面,并立刻封装到一个TCP报文段中进行发送。紧急指针会指出本报文段数据载荷部分包含了多长的紧急数据,紧急数据之后是普通数据。接收方收到紧急标志位为1的TCP报文段,会按照紧急指针字段的值从报文段数据载荷中取出紧急数据并直接上交应用进程,而不必在接收缓存中排队。

12、选项(长度可变,最大40字节)

  • 最大报文段长度MSS选项:指出TCP报文段数据载荷部分的最大长度,而不是整个TCP报文段的长度。
  • 窗口扩大选项:用来扩大窗口,提高吞吐率。
  • 时间戳选项:
    • 用于计算往返时间RTT
    • 用于处理序号超范围的情况,又称为防止序号绕回PAWS。
  • 选择确认选项:用来实现选择确认功能。

13、填充
若选项字段的长度加上20字节固定首部的长度不能被4字节整除时,需要填充相应数量的比特0,以确保首部长度能被4字节整除。

5.3.2 TCP的运输连接管理

01 “三报文握手”建立TCP连接

“三报文握手”建立TCP连接的目的在于解决以下三个主要问题:

  • 使TCP双方能够确知对方的存在。
  • 使TCP双方能够协商一些参数(例如最大报文段长度、最大窗口大小、时间戳选项等)。
  • 使TCP双方能够对运输实体资源进行分配和初始化。运输实体资源包括缓存大小、各状态变量、连接表中的项目等。

这是两台要基于 TCP 进行通信的主机,其中一台主机中的某个应用进程主动发起 TCP 连接建立,称为 TCP 客户,另一台主机中被动等待 TCP 连接建立的应用进程,称为 TCP 服务器,我们可以将 TCP 建立连接的过程比喻为“握手”。“握手”需要在 TCP 客户和服务器之间交换三个 TCP 报文段,最初,两端的 TCP 进程都处于关闭状态,一开始,TCP 服务器进程首先创建传输控制块,用来存储 TCP 连接中的一些重要信息,例如 TCP 连接表、指向发送和接收缓存的指针、指向重传队列的指针、当前发送和接收序号等。之后,就准备接受 TCP 客户进程的连接请求。

此时,TCP 服务器进程就进入监听状态,等待 TCP 客户进程的连接请求,TCP 服务器进程是
被动等待来自 TCP 客户进程的连接请求,而不是主动发起,因此称为被动打开连接。TCP 客
户进程也是首先创建传输控制块。

然后,在打算建立 TCP 连接时,向 TCP 服务器进程发送 TCP 连接请求报文段,并进入同步已发送状态,TCP 连接请求报文段首部中的同步位 SYN 被设置为 1,表明这是一个 TCP 连接请求报文段(TCP连接请求报文段和TCP连接请求确认报文段首部中的同步标志位SYN的值必须设置为1)。序号字段 seq 被设置了一个初始值 x,作为 TCP 客户进程所选择的初始序号。TCP 服务器进程收到TCP连接请求报文段后,如果同意建立连接,则向 TCP 客户进程发送TCP 连接请求确认报文段,并进入同步接收状态。该报文段首部中的同步位 SYN 和确认位ACK 都设置为 1,表明这是一个 TCP 连接请求确认报文段。序号字段 seq 被设置了一个初始值 y,作为 TCP 服务器进程所选择的初始序号。确认号字段 ack 的值被设置成了 x+1,这是对 TCP 客户进程所选择的初始序号x的确认。请注意:这个报文段也不能携带数据,因为它是 SYN 被设置为 1 的报文段(例如TCP连接请求报文段和TCP连接请求确认报文段),但同样要消耗一个序号。

TCP 客户进程收到 TCP 连接请求确认报文段后,还要向 TCP服务器进程发送一个普通的TCP 确认报文段,并进入连接已建立状态。该报文段首部中的确认位 ACK 被设置为 1,表明这是一个普通的 TCP 确认报文段。序号字段 seq 被设置为 x+1,这是因为 TCP 客户进程发送的第一个 TCP 报文段的序号为 x,并且不携带数据,因此第二个报文段的序号为 x+1。
请注意:TCP 规定普通的 TCP 确认报文段可以携带数据,但如果不携带数据,则不消耗序号。如果该报文段不携带数据,则TCP客户进程要发送的下一个数据报文段的序号仍为x+1。
确认号字段 ack 被设置为 y+1,这是对 TCP 服务器进程所选择的初始序号的确认。TCP 服务器进程收到该确认报文段后也进入连接已建立状态。现在,TCP 双方都进入了连接已建立状态。它们可以基于已建立好的 TCP 连接,进行可靠的数据传输了。

第三个TCP报文段是否多余?

  1. 考虑这样一种情况:TCP 客户进程发出一个 TCP 连接请求报文段。但该报文段在某些网络结点长时间滞留了。这必然会造成该报文段的超时重传,假设重传的报文段被 TCP 服务器进程正常接收。
  2. TCP 服务器进程给 TCP 客户进程发送一个 TCP 连接请求确认报文段,并进入连接已建立状态。请注意:由于我们改为”两报文握手“,因此 TCP 服务器进程发送完 TCP 连接请求确认报文段后,进入的是连接已建立状态,而不像”三报文握手“那样进入同步已接收状态并等待TCP 客户进程发来针对 TCP 连接请求确认报文段的普通确认报文段。
  3. TCP 客户进程收到 TCP 连接请求确认报文段后,进入 TCP 连接已建立状态。但不会给 TCP 服务器进程发送针对该报文段的普通确认报文段。现在TCP 双方都处于连接已建立状态。它们可以相互传输数据。
  4. 之后可以通过”四报文挥手“来释放连接。TCP 双方都进入了关闭状态。一段时间后,之前滞留在网络中的那个失效的 TCP 连接请求报文段,到达了 TCP 服务器进程。TCP 服务器进程会误认为这是 TCP 客户进程又发起了一个新的 TCP连接请求。于是给 TCP 客户进程发送 TCP 连接请求确认报文段,并进入连接已建立状态。该报文段到达 TCP 客户进程,由于 TCP 客户进程并没有发起新的 TCP 连接请求,并且处于关闭状态,因此不会理会该报文段。但 TCP 服务器已进入连接已建立状态,它认为新的 TCP连接已建立好了,并一直等待 TCP 客户进程发来数据,这将白白浪费 TCP 服务器进程所在主机的很多资源。


02 “四报文挥手”释放TCP连接
数据传输结束后,TCP 通信双方都可以释放连接。现在 TCP 客户进程和 TCP 服务器进程都处于连接已建立状态。
假设使用 TCP客户进程的应用进程通知其主动关闭 TCP 连接,TCP 客户进程会发送 TCP 连接释放报文段,并进入终止等待 1 状态,该报文段首部中的终止位 FIN和确认位 ACK 的值都被设置为 1,表明这是一个 TCP 连接释放报文段,同时也对之前收到的报文段进行确认。序号 seq 字段的值设置为 u,它等于 TCP 客户进程之前已传送过的数据的最后一个字节的序号加 1。请注意:TCP 规定终止位 FIN 等于 1 的报文段即使不携带数据,也要消耗掉一个序号。确认号ack字段的值设置为v,它等于TCP客户进程之前已收到的数据的最后一个字节的序号加1。

TCP 服务器进程收到 TCP 连接释放报文段后,会发送一个普通的 TCP 确认报文段并进入关
闭等待状态。该报文段首部中的确认位 ACK 的值被设置为 1,表明这是一个普通的 TCP 确
认报文段。序号 seq 字段的值设置为 v,它等于 TCP 服务器进程之前已传送过的数据的最后
一个字节的序号加 1,这也与之前收到的 TCP 连接释放报文段中的确认号匹配。确认号 ack
字段的值设置为 u+1,这是对 TCP 连接释放报文段的确认。TCP 服务器进程这时应通知高层
应用进程:TCP 客户进程要断开与自己的 TCP 连接。此时,从 TCP 客户进程到 TCP 服务器
进程这个方向的连接就释放了。

TCP 客户进程收到 TCP 确认报文后就进入终止等待 2 状态。等待 TCP 服务器进程发出的TCP 连接释放报文段。若使用 TCP 服务器进程的应用进程已经没有数据要发送了,应用进程就通知其 TCP 服务器进程释放连接。由于 TCP 连接释放是由 TCP 客户进程主动发起的,因此 TCP 服务器进程对 TCP 连接的释放称为被动关闭连接。TCP 服务器进程发送 TCP 连接释放报文段并进入最后确认状态。该报文段首部中的终止位 FIN 和确认位 ACK的值都设置为1,表明这是一个 TCP 连接释放报文段,同时也对之前收到的报文段进行确认。现在假定序号seq 字段的值为 w。这是因为在半关闭状态下,TCP 服务器进程可能又发送了一些数据。确认号 ack 字段的值为 u+1,这是对之前收到的 TCP 连接释放报文段的重复确认。

TCP 客户进程收到 TCP 连接释放报文段后,必须针对该报文段发送普通的 TCP确认报文段,之后进入时间等待状态。该报文段首部中的确认位 ACK 的值被设置为 1,表明这是一个普通的 TCP 确认报文段。序号 seq 字段的值设置为 u+1,这是因为 TCP 客户进程之前发送的 TCP 连接释放报文段虽然不携带数据,但要消耗掉一个序号。确认号 ack 字段的值设置为 w+1,这是对所收到的 TCP 连接释放报文段的确认。
TCP 服务器进程收到该报文段后就进入关闭状态。而 TCP 客户进程还要经过 2MSL 后才能进入关闭状态。MSL 的意思是最长报文段寿命,RFC793 文档建议为 2 分钟。也就是说 TCP 客户进入时间等待状态后还要经过 4 分钟才能进入关闭状态。这完全是从工程上来考虑的。对于现在的网络,MSL 取为 2 分钟可能太长了,因此 TCP 允许不同的实现可根据具体情况使用更小的 MSL 值。

那么,TCP 客户进程在发送完最后一个确认报文段后,为什么不直接进入关闭状态,而是要进入时间等待状态,2MSL 后才进入关闭状态,这是否有必要呢?
来看这种状态,TCP 服务器进程发送 TCP 连接释放报文段后进入最后确认状态。TCP 客户进程收到该报文段后,发送普通的 TCP 确认报文段,并进入关闭状态而不是时间等待状态。然而该 TCP 确认报文段丢失了,这必然会造成 TCP 服务器进程对之前所发送的 TCP 连接释放报文段的超时重传,并处于最后确认状态。重传的 TCP 连接释放报文段到达 TCP 客户进程。由于 TCP 客户进程属于关闭状态,因此不理睬该报文段,这必然会造成 TCP 服务器进程反复重传 TCP 连接释放报文段,并一直处于最后确认状态而无法进入关闭状态。

设想这样一种情况:TCP 双方已经建立了连接。后来TCP 客户进程所在的主机突然出现了故障。显然,TCP 服务器进程以后就不能再收到 TCP 客户进程发来的数据。因此应当有措施使 TCP 服务器进程不要再白白等待下去。换句话说,TCP 服务器进程应该如何发现这种情况呢?方法就是使用保活计时器。

5.3.3 TCP的流量控制

01 TCP流量控制的基本概念

TCP为应用程序提供了流量控制(Flow Control)机制,以解决因发送方发送数据太快而导致接收方来不及接收,造成接收方的接收缓存溢出的问题。流量控制的基本方法:接收方根据自己的接收能力(接收缓存的可用空间大小)控制发送方的发送速率。

02 TCP的流量控制
在因特网上的两台主机,它们之间已经建立了 TCP 连接,A 给 B 发送数据,B 对 A 流量控制。假设主机 A 发送的每个 TCP 数据报文段可携带100 字节数据,因此图中每个小格子表示100 个字节数据的序号。在主机 A 和 B 建立 TCP连接时,B 告诉 A:“我的接收窗口为 400”。因此,主机 A 将自己的发送窗口也设置为 400。这意味着主机 A 在未收到主机 B 发来的确认时,可将序号落入发送窗口中的全部数据发送出去。

  1. 主机 A 将发送窗口内序号 1-100 的数据,封装成一个 TCP 报文段发送出去。发送窗口内还有 300 字节可以发送,这里的seq 是 TCP 报文段首部中的序号字段,取值 1 表示 TCP 报文段数据载荷的第一个字节的序号是 1。这里的 DATA 表示这是TCP 数据报文段。

  2. 主机 A 将发送窗口内序号 101~200 的数据封装成一个 TCP 报文段发送出去。

  3. 发送窗口内还有 200字节可以发送,主机 A 将发送窗口内序号 201~300 的数据封装成一个 TCP 报文段发送出去。但该报文段在传输过程中丢失了。

  4. 主机 A 发送窗口内还有 100 字节可以发送。主机 B 对主机 A 所发送的 201 号以前的数据进行累计确认。并在该累计确认中将窗口字段的值调整为 300,也就是对主机 A 进行流量控制。这里的大写ACK 是 TCP报文段首部中的标志位,取值 1 表示这是一个 TCP 确认报文段。小写 ack 是 TCP 报文段首部中的确认号字段,取值 201表示序号 201 之前的数据已全部正确接收,现在希望收到序号 201 及其后续数据,rwnd 是 TCP 报文段首部中的窗口字段,取值300 表示自己的接收窗口大小为 300。

  5. 主机 A 收到该累计确认后,将发送窗口向前滑动,使已发送并收到确认的这些数据的序号移出发送窗口,由于主机 B 在该累计确认中将自己的接收窗口调整为了300,因此主机 A相应地将自己的发送窗口调整为 300。

  6. 目前,主机 A 发送窗口内的序号为 201-500,也就是主机 A 还可以发送这 300 字节。其中,201-300 号字节是已发送的数据,若重传计时器超时,它们会被重传。301-400 号字节以及 401-500 号字节还未被发送。可被分别封装在一个 TCP 报文段中发送。

  7. 主机 A 现在可将发送缓存中序号 1-200 的字节数据全部删除了,因为已经收到了主机 B 对它们的累计确认。主机 A 将发送窗口内序号301~400 的数据,封装成一个 TCP 报文段发送出去。

  8. 发送窗口内还有 100 字节可以发送,主机 A 将发送窗口内序号 401-500 的数据封装成一个 TCP 报文段发送出去。至此,序号落在发送窗口内的数据已经全部发送出去了,不能再发送新数据了。

  9. 现在,发送窗口内序号201~300 这 100 个字节数据的重传计时器超时了。主机 A 将它们重新封装成一个 TCP 报文段发送出去。暂时不能发送其他数据,主机 B 收到该重传的 TCP 报文段后,对主机 A 所发送的 501 号以前的数据进行累计确认,并在该累计确认中将窗口字段的值调整为 100,这是主机 B 对主机 A 进行的第二次流量控制。

  10. 主机 A 收到该累计确认后,将发送窗口向前滑动,使已发送并收到确认的这些数据的序号移出发送窗口。由于主机 B 在该累计确认中将自己的接收窗口调整为了 100,因此主机 A 相应的将自己的发送窗口调整为 100。

  11. 目前主机 A 发送窗口内的序号为 501~600,也就是主机 A 还可以发送这100字节。主机 A 现在可将发送缓存中序号 201-500 的字节数据全部删除了,因为已经收到了主机 B 对它们的累计确认。

  12. 主机 A 将发送窗口内序号 501-600 的数据封装成一个 TCP 报文段发送出去。至此,序号落在发送窗口内的数据已经全部发送出去了,不能再发送新数据了。

  13. 主机 A 所发送的 601 号以前的数据进行累计确认,并在该累计确认中将窗口字段的值调整为 0,这是主机 B 对主机 A进行的第三次流量控制。

  14. 主机 A 收到该累计确认后,将发送窗口向前滑动,使已发送并收到确认的这些数据的序号移出发送窗口。由于主机 B 在该累计确认中将自己的接收窗口调整为了 0。因此,主机 A 相应地将自己的发送窗口调整为 0。目前,主机 A 不能再发送一般的TCP 报文段了。主机 A 现在可将发送缓存中序号 501~600 的字节数据全部删除了,因为已经收到了主机 B 对它们的累计确认。

假设主机 B 向主机 A 发送了零窗口的报文段后不久,主机 B 的接收缓存又有了一些存储空间,于是主机 B 向主机 A 发送了接收窗口等于 300 的报文段,然而这个报文段在传送过程中丢失了,主机 A 一直在等待主机 B 发送的非零窗口的通知,而主机 B 也一直等待主机 A 发送的数据。如果不采取措施,这种相互等待而形成的死锁局面将一直持续下去。

①A发送的零窗口探测报文段到达B时,如果B此时的接收窗口值仍然为0,那么B根本就无法接受该报文段,又怎么会针对该报文段给A发回确认呢?
实际上TCP规定:即使接收窗口值为0,也必须接受零窗口探测报文段、确认报文段以及携带有紧急数据的报文段。
②如果零窗口探测报文段丢失了,还会打破死锁的局面吗?
回答是肯定的。因为零窗口探测报文段也有重传计时器,当重传计时器超时后,零窗口探测报文段会被重传。

5.3.4 TCP的拥塞控制

01 拥塞控制的基本概念

  • 在某段时间,若对网络中某一资源的需求超过了该资源所能提供的可用部分,网络性能就要变坏,这种情况就叫作拥塞(congestion)。计算机网络中的链路容量(带宽)、交换节点中的缓存和处理机等都是网络的资源。
  • 若出现拥塞而不进行控制,整个网络的吞吐量将随输入负荷的增大而下降。

如图所示,横坐标是输入负载,代表单位时间内输入给网络的分组数量。纵坐标是吞吐量,代表单位时间内从网络输出的分组数量。
具有理想拥塞控制的网络在吞吐量达到饱和之前,网络吞吐量应等于所输入的负载,故吞吐量曲线是 45 度的斜线。但当输入负载超过某一限度时,由于网络资源受限,吞吐量就不再增长而保持水平线,也就是吞吐量达到饱和,这就表明输入的负载中有一部分损失掉了。例如,输入到网络中的某些分组被某个结点丢弃了。虽然如此,在这种理想的拥塞控制作用下,网络的吞吐量仍然维持在其所能达到的最大值。
然而实际网络的情况就很不同了。随着输入负载的增大,网络吞吐量的增长率逐渐减小。也就是在网络吞吐量还未达到饱和时,就已经有一部分的输入分组被丢弃了。当网络的吞吐量明显地小于理想的吞吐量时,网络就进入了轻度拥塞的状态。更值得注意的是,当输入负载到达某一数值时,网络的吞吐量反而随输入负载的增带而减小,这时网络就进入了拥塞状态。当输入负载继续增大到某一数值时,网络的吞吐量就减小为 0,此时网络就无法工作了,这就是所谓的死锁。因此,进行拥塞控制是非常有必要的。实际的拥塞控制曲线应该尽量接近理想的拥塞控制曲线。

02 TCP的四种拥塞控制方法
慢开始(slow-start)、拥塞避免(congestion avoidance)、快重传(fast retransmit)、快恢复(fast recovery)
假定如下条件:

  • 数据是单方向传送的,而另一个方向只传送确认。
  • 接收方总是有足够大的接收缓存空间,因而发送方的发送窗口的大小仅由网络的拥塞程度来决定,也就是不考虑接收方对发送方的流量控制。
  • 以TCP最大报文段MSS(即TCP报文段的数据载荷部分)的个数作为讨论问题的单位,而不是以字节为单位(尽管TCP是面向字节流的)。

假设发送方给接收方发送 TCP 数据报文段。接收方收到后,给发送方发送 TCP 确认报文段。发送方要维护一个叫做拥塞窗口的状态变量,其值取决于网络的拥塞程度,并且动态变化。


①慢开始、拥塞避免
为了更清晰的显示出拥塞控制过程,我们还可以绘制这样一幅拥塞窗口随传输轮次变化的图,横坐标为传输轮次。传输轮次是指发送方给接收方发送数据报文段后,接收方给发送方发回相应的确认报文段,一个传输轮次所经历的时间其实就是往返时间。请注意:往返时间并非是恒定的数值。使用传输轮次是为了强调把拥塞窗口所允许发送的报文段都连续发送出去,并收到了对已发送的最后一个报文段的确认。纵坐标是拥塞窗口,他会随网络拥塞程度以及所使用的拥塞控制算法动态变化。

在 TCP 双方建立逻辑连接关系时,拥塞窗口的值被设置为 1。另外,还需设置慢开始门限的初始值。本例采用 16。在执行慢开始算法时,发送方每收到一个对新报文段的确认时,就把拥塞窗口值加 1,然后开始下一轮的传输。当拥塞窗口值增长到慢开始门限值时,就改为执行拥塞避免算法。由于发送方当前的拥塞窗口值是 1,而发送窗口值等于拥塞窗口值,因此,发送方当前只能发送一个 TCP 数据报文段。换句话说,拥塞窗口值是几,就能发送几个数据报文段。

  1. 如图所示,发送方发送 0 号数据报文段。接收方收到后,给发送方发回对 0 号报文段的确认报文段。发送方收到该确认报文段后,将拥塞窗口值加 1 增大到 2。这意味着发送方现在可以发送 1~2号共两个数据报文段。

  2. 接收方收到后,给发送方发回对 1-2 号报文段的确认报文段。发送方收到后,将拥塞窗口值加 2 增大到 4。发送方现在可以发送 3~6 号共四个数据报文段。接收方收到后给发送方发回对 3-6 号报文段的确认报文段。发送方收到后,将拥塞窗口值加4 增大到 8。发送方现在可以发送 7-14 号共八个数据报文段。接收方收到后给发送方发回对 7-14 号报文段的确认报文段。发送方收到后,将拥塞控制窗口值加 8 增大到 16。

  3. 发送方当前的拥塞窗口值已经增大到了慢开始门限值。之后我们要改用拥塞避免算法,也就是每个传输轮次结束后,拥塞窗口值只能线性加 1。而不像慢开始算法那样,每个传输轮次结束后,拥塞窗口值按指数规律增大。发送方现在可以发送 15~30 号共 16 个数据报文段。接收方收到后给发送方发回对 15-30 号报文段的确认报文段。发送方收到后,将拥塞窗口值加 1 增大到 17。发送方现在可以发送 31 至 47 号共 17 个数据报文段。接收方收到后给发送方发回对 31 至 47 号报文段的确认报文段。发送方收到后,将拥塞窗口值加 1 增大到 18。随着传输轮次的增加,拥塞窗口值每轮次都线性加 1。例如,当前拥塞窗口值增加到了 24。发送方现在可以发送 171 至 194 号,共 24个数据报文段。假设这 24 个数据报文段在传输过程中丢失了几个。这必然会造成发送方对这些丢失报文段的超时重传。

  4. 当发生超时重传时,就判断网络很可能出现了拥塞。采取相应的措施。一方面将慢开始门限值更新为发生拥塞时,拥塞窗口值的一半(网络发生拥塞时的拥塞窗口值是 24,因此,更新慢开始门限值为该值的一半,即 12。);另一方面,将拥塞窗口值减少为 1,并重新开始执行慢开始算法。拥塞窗口值又从1开始按指数规律增大。当增大到了新的慢开始门限值时,停止使用慢开始算法,转而执行拥塞避免算法,让拥塞窗口值按线性加 1 的规律增大。

②快重传算法和快恢复算法
有时,个别报文段会在网络中丢失,但实际上网络并未发生拥塞。这将导致发送方超时重传,并误认为网络发生了拥塞;发送方把拥塞窗口cwnd又设置为最小值1,并错误地启动慢开始算法,因而降低了传输效率。

  • 采用快重传算法可以让发送方尽早知道发生了个别TCP报文段的丢失。这就要求接收方不要等待自己发送数据时才进行捎带确认,而是要立即发送确认,即使收到了失序的报文段也要立即发出对已收到的报文段的重复确认。
  • “快重传”是指使发送方尽快(尽早)进行重传,而不是等重传计时器超时再重传。发送方一旦收到3个连续的重复确认,就将相应的报文段立即重传,而不是等该报文段的重传计时器超时再重传。

发送方发送 1 号数据报文段,接收方收到后给发送方发回对 1号报文段的确认。在该确认报文段到达发送方之前,发送方还可以将发送窗口内的 2 号数据报文段发送出去。接收方收到后给发送方发回对 2 号报文段的确认。在该确认报文段到达发送方之前,发送方还可以将发送窗口内的 3 号数据报文段发送出去,但该报文段丢失了,接收方自然不会给发送方发回针对该报文段的确认。发送方还可以将发送窗口内的四号数据报文段发送出去。接收方收到后发现这不是按序到达的报文段,因此,给发送方发回针对 2 号报文段的重复确认。表明:“我现在希望收到的是 3 号报文段。但是我没有收到 3 号报文段,而是收到了未按序到达的报文段”。发送方还可以将发送窗口内的 5 号数据报文段发送出去。接收方收到后发现这不是按序到达的报文段,因此,给发送方发回针对 2 号报文段的重复确认。发送方还可以将发送窗口内的 6 号数据报文段发送出去。接受方收到后发现这不是按序到达的报文段,因此,给发送方发回针对二号报文段的重复确认。至此,发送方会收到三个连续的对 2 号报文段的重复确认。就立即重传 3 号报文段。接收方收到后给发送方发回针对 6 号报文段的确认,表明序号到 6 为止的报文段都正确接收了。这样就不会造成对 3 号报文段的超时重传,而是提早进行了重传。对于个别丢失的报文段,发送方不会出现超时重传,也就不会误认为出现了拥塞而错误的降低拥塞窗口值为最小值 1。使用快重传可以使整个网络的吞吐量提高约 20%。

  • 与快重传算法配合使用的是快恢复算法,发送方一旦收到3个重复确认,就知道现在只是丢失了个别的报文段,于是不启动慢开始算法,而是执行快恢复算法。
  • 发送方将慢开始门限ssthresh的值和拥塞窗口cwnd的值都调整为当前cwnd值的一半,并开始执行拥塞避免算法。
  • 也有的快恢复实现是把快恢复开始时的cwnd值再增大一些,即cwnd=新ssthresh+3。既然发送方收到了3个重复的确认,就表明有3个数据报文段已经离开了网络。这3个报文段不再消耗网络资源而是停留在接收方的接收缓存中。可见现在网络中不是堆积了报文段而是减少了3个报文段,因此可以适当把cwnd值增大一些。

接下来给出 TCP 拥塞窗口值在拥塞控制时的变化情况举例。里面包含了 TCP 拥塞控制的四种算法。TCP 发送方一开始使用慢开始算法,让拥塞窗口值从 1 开始按指数规律增大,当增大到慢开始门限初始值时,停止使用慢开始算法。转而执行拥塞避免算法,让拥塞窗口只按线性加 1 的规律增大。当发生超时重传时,就判断网络可能出现了拥塞,采取相应的措施。一方面将慢开门限值更新为发生拥塞时拥塞窗口值的一半;另一方面,将拥塞窗口值减少为 1,并重新开始执行慢开始算法。拥塞窗口值又从 1 开始按指数规律增大。当增大到了新的慢开始门限值时,停止使用慢开始算法,转而执行拥塞避免算法,让拥塞窗口值按线性加 1 的规律增大。当发送方收到三个重复确认时,就进行快重传和快恢复。也就是更新慢开始门限值为当前拥塞窗口值的一半。并将拥塞窗口值也取为新的慢开始门限值,转而执行拥塞避免算法,让拥塞窗口值按线性加 1 的规律增大。

5.3.6 TCP可靠传输的实现

1 序号
这是因特网上的两台主机,它们之间已经建立了一个 TCP 连接。为了简单起见,我们假定数据传输只在一个方向进行。换句话说,发送方给接收方发送 TCP 数据报文段,接收方给发送相应的 TCP 确认报文段。这样的好处是讨论仅限于两个窗口,也就是发送方的发送窗口和接收方的接收窗口。TCP 的滑动窗口是以字节为单位的。

2 确认
假设发送方收到了一个来自接收方的确认报文段。在报文段首部中的窗口字段的值为 20,也就是接收方表明自己的接收窗口的尺寸为 20 字节。确认号字段的值为 31,这表明接收方希望收到下一个数据的序号是 31,而序号 30 为止的数据已经全部正确接收了。因此发送方根据这两个字段的值构造出自己的发送窗口。为了简单起见,我们假定网络不存在拥塞问题,也就是发送方在构造自己的发送窗口时,仅考虑接收方的接收窗口而不考虑拥塞窗口

由于本例中接收方告诉发送方自己的接收窗口尺寸为 20,因此发送方将自己的发送窗口尺寸也设置为 20。发送方在没有收到接收方确认的情况下,可以把发送窗口内的数据依次全部发送出去。凡是已经发送过的数据,在未收到确认之前,都必须暂时保留,以便在超时重传时使用。

发送窗口的前沿可能向后收缩,这发生在接收方通知的窗口变小了,但 TCP标准强烈不赞成这样做,因为很可能发送方在收到这个通知之前,就已经发送了窗口中的许多数据,现在又要收缩窗口,不让发送这些数据,显然就会产生错误。

现在假定发送方将发送窗口内序号 31 至 41 的数据封装在几个不同的报文段中发送出去。此时,发送窗口的位置并没有改变。发送窗口内序号 31~41 的数据已经发送但未收到确认,而序号 42 至 50 的数据是准许发送但还未发送的。


假设发送方之前发送的,封装有 32 和 33 号数据的报文段到达了接收方。由于数据序号落在接收窗口内,所以接受方接受它们,将它们存入接收缓存。但是它们是未按序到达的数据,因为 31 号数据还没有到达,这有可能是丢了,也有可能是滞留在网络中的某处。请注意:接收方只能对按序收到的数据中的最高序号给出确认。因此接收方发出的确认报文段中的确认序号仍然是 31,也就是希望收到 31 号数据。窗口字段的值仍为 20,表明接收方没有改变自己接收窗口的大小。

发送方收到该确认报文段后,发现这是一个针对 31 号数据的重复确认,就知道接收方收到了未按序到达的数据。由于这是针对 31 号数据的第 1 个重复确认,因此这并不会引起发送方针对该数据的快重传。另外接收方通知的窗口尺寸仍是 20,因此发送方仍保持自己的发送窗口尺寸为 20。现在假设封装有 31 号数据的报文段到达了接收方。接收方接受该报文段,将其封装的 31 号数据存入接收缓存。

接收方现在可将接收到的 31~33 号数据交付给应用进程。然后将接收窗口向前移动三个序号,并给发送方发送确认报文段。该确认报名段中窗口字段的值仍为 20,表明接收方没有改变自己接收窗口的大小。确认号字段的值为 34,这表明接收方已经收到了序号 33 为止的全部数据。

现在假设又有几个数据报文段到达了接收方,他们封装有 37、38 以及 40 号数据。这些数据的序号虽然落在接收窗口内,但他们都是未按序到达的数据,只能先暂存在接收缓存中。假设接收方先前发送的确认报文段到达了发送方。发送方接收后,将发送窗口向前滑动三个序号,发送窗口的尺寸保持不变,这样就有新序号 51~53 落入发送窗口内。而序号 31-33移出了发送窗口,现在可将 31-33 号数据从发送缓存中删除了,因为已经收到了接收方针对他们的确认。发送方继续将发送窗口内序号 42-53 的数据,封装在几个不同的报文段中发送出去。


3 重传
(1)超时重传
假设主机 A 和 B 是因特网上的两台主机,他们之间已经建立了 TCP 连接,纵坐标为时间,现在主机 A 给主机 B 发送 TCP 数据报文段 0, 并记录下当前的时间,主机 B收到后,给主机 A 发送相应的确认报文段,主机 A 收到确认报文段后,记录下当前的时间,那么主机 A 记录下的这两个时间,它们的差值就是报文段的往返时间 RTT。
由于这是第 0 个报文段的 RTT,我们就用 RTT0 来表示。试想一下,如果我们将超时重传时间 RTO 的值设置的比 RTT0 的值小,会出现怎样的情况呢?很显然这会引起报文段不必要的重传,使网络负荷增大,那么如果将超时重传时间 RTO 的值,设置的远大于 RTT0 的值呢,又会出现怎样的情况呢?很显然这会使重传推迟的时间太长,使网络的空闲时间增大,降低了传输效率。

例如现在主机 A给主机 B 发送 TCP 数据报文段 1。主机 B 收到后,给主机 A发送相应的确认报文段。主机 A 这次测得的报文段往返时间 RTT1 如图所示。显然 RTT1 远大于 RTT0。如果超时重传时间 RTO 还是我们之前所确定的略大于 RTT0 的话,这对于数据报文段 1 是不合适的,会造成该报文段不必要的重传。

不能直接使用略大于某次测量得到的往返时间RTT样本的值作为超时重传时间RTO。但是,可以利用每次测量得到的RTT样本计算加权平均往返时间RTTs,这样可以得到比较平滑的往返时间。
(2)冗余ACK

第六章 应用层

6.1 应用层概述


应用层是计算机网络体系结构的最顶层,是设计和建立计算机网络的最终目的,也是计算机网络中发展最快的部分。

6.2 客户/服务器方式和对等方式

  • 网络应用程序运行在处于网络边缘的不同的端系统上,通过彼此间的通信来共同完成某项任务。
  • 开发一种新的网络应用,首先要考虑的问题就是网络应用程序在各种端系统上的组织方式和它们之间的关系。目前流行的主要有以下两种:客户/服务器(Client/Server,C/S)方式、对等(Peer-to-Peer,P2P)方式。

01客户/服务器(Client/Server,C/S)方式

  • 客户和服务器是指通信中所涉及的两个应用进程
  • 客户/服务器方式所描述的是进程之间服务和被服务的关系
  • 客户是服务请求方,服务器是服务提供方。
  • 服务器总是处于运行状态,并等待客户的服务请求。

  • C/S方式是因特网上传统的、同时也是最成熟的方式,很多我们熟悉的网络应用采用的都是C/S方式。包括万维网WWW、电子邮件、文件传输FTP等。
  • 基于C/S方式的应用服务通常是服务集中型的,即应用服务集中在网络中比客户计算机少得多的服务器计算机上。由于一台服务器计算机要为多个客户机提供服务,在C/S应用中,常会出现服务器计算机跟不上众多客户机请求的情况。为此,在C/S应用中,常用计算机群集(或服务器场)构建一个强大的虚拟服务器。

02对等(Peer-to-Peer,P2P)方式

  • 在P2P方式中,没有固定的服务请求者和服务提供者,分布在网络边缘各端系统中的应用进程是对等的,被称为对等方。对等方相互之间直接通信,每个对等方既是服务的请求者,又是服务的提供者。
  • 目前,在因特网上流行的P2P应用主要包括P2P文件共享、即时通信、P2P流媒体、分布式存储等。
  • 基于P2P的应用是服务分散型的,因为服务不是集中在少数几个服务器计算机中,而是分散在大量对等计算机中,这些计算机并不为服务提供商所有,而是为个人控制的桌面计算机和笔记本电脑,它们通常位于住宅、校园和办公室中。

  • P2P方式的最突出特性之一就是它的可扩展性。因为系统每增加一个对等方,不仅增加的是服务的请求者,同时也增加了服务的提供者,系统性能不会因规模的增大而降低
  • P2P方式具有成本上的优势,因为它通常不需要庞大的服务器设置和服务器带宽。

6.3 动态主机配置协议DHCP

01 动态主机配置协议DHCP的作用
如何配置用户主机,才能使它们可以正常访问网络中的 Web 服务器。根据之前所学可知,需要给网络中的各主机正确配置 IP 地址、子网掩码、默认网关、DNS 服务器等网络相关配置信息。如果网络中的主机数量比较多,则这种手工配置的工作量就比较大,并且容易出错。

如果我们给网络中添加一台 DHCP 服务器;在该服务器中设置好可为网络中其他各主机配置的网络配置信息。网络中各主机开机后自动启动 DHCP 程序,向 DHCP 服务器请求自己的网络配置信息。这样网络中的各主机就都可以从 DHCP 服务器自动获取网络配置信息而不用手工参与。

02 动态主机配置协议DHCP的基本工作过程

DHCP 使用客户/服务器方式。在 DHCP 服务器上运行DHCP 服务器进程,也可简称为 DHCP 服务器;在用户主机上运行 DHCP 客户进程,也可简称为 DHCP 客户。DHCP 是 TCP/IP 协议体系应用层中的协议,它使用运输层的 UDP 所提供的服务。也就是说,DHCP 报文在运输层会被封装成为 UDP 用户数据报。DHCP 服务器使用的 UDP 端口是 67,DHCP 客户使用的 UDP 端口是 68,这两个 UDP 端口都是熟知端口。封装有 DHCP 报文的UDP 用户数据报在网络层会被封装成 IP 数据报,然后再根据所使用的网络接口,封装成相应的数据链路层的帧进行发送,例如封装成以太网帧。(为了简单起见,在后续描述过程中,除非有特别需要,否则将不再每次都描述 DHCP 报文逐层封装的过程。)

  • 当启用主机的 DHCP 后,DHCP客户将广播发送 DHCP 发现报文,封装该报文的 IP 数据报的源 IP 地址为 0.0.0.0,这是因为主机目前还未分配到 IP 地址,因此使用该地址来代替。目的 IP 地址为广播地址255.255.255.255,之所以进行广播发送,是因为主机现在并不知道网络中有哪几个 DHCP 服务器,它们的 IP 地址各是什么。由于是广播的 IP 数据报,因此网络中的所有设备都会收到该 IP 数据报,并对其层层解封,解封出封装有 DHCP 发现报文的 UDP 用户数据报。
  • 对于DHCP 客户,其应用层没有监听该 UDP 用户数据报目的端口 67 的进程也就是 DHCP 服务器进程,因此无法交付 DHCP 发现报文,只能丢弃;而对于 DHCP 服务器,其应用层始终运行着 DHCP 服务器进程,因此会接受该 DHCP 发现报文并作出响应。DHCP 报文的格式比较复杂,对于 DHCP 发现报文,我们只需知道其内部封装有事物 ID 和 DHCP 客户端的 MAC 地址即可。
  • DHCP 服务器收到 DHCP 发现报文后,根据其中封装的 DHCP 客户端的 MAC 地址来查找自己的数据库,看是否有针对该 MAC 地址的配置信息。如果有,则使用这些配置信息来构建并发送 DHCP 提供报文。如果没有,则采用默认配置信息来构建并发送 DHCP 提供报文。
  • 封装该报文的 IP 数据报的源 IP 地址为 DHCP 服务器的 IP 地址,目的 IP 地址仍未广播地址,仍然使用广播地址的原因是,主机目前还没有配置 IP 地址,为了使主机可以收到,只能发送广播。这样一来,网络中的所有设备都会收到该 IP 数据报,并对其层层解封,解封出封装有 DHCP 提供报文的 UDP用户数据报。对于 DHCP 服务器,其应用层没有监听该 UDP 用户数据报目的端口 68 的进程,也就是 DHCP 客户进程,因此无法交付 DHCP 提供报文,只能丢弃。对于 DHCP 客户,其应用层运行着 DHCP 客户进程,因此会接受该 DHCP 提供报文并作出相应处理。
  • DHCP 客户会根据 DHCP 提供报文中的事物 ID 来判断该报文是否是自己所请求的报文。换句话说,如果该事物 ID 与自己之前发送的 DHCP 发现报文中封装的事物 ID 相等,就表明这是自己所请求的报文,就可以接受该报文;否则就丢弃该报文。DHCP 提供报文中还封装有配置信息,例如 IP 地址、子网掩码、地址租期、默认网关、DNS 服务器等。需要注意的是,DHCP 服务器从自己的 IP 地址池中挑选待租用给主机的 IP 地址时,会使用 ARP 来确保所选 IP 地址未被网络中其他主机占用。在本例中,DHCP 客户会收到两个 DHCP 服务器发来的 DHCP 提供报文,DHCP 客户从中选择一个,一般来说,选择先到的那个。并向所选择的 DHCP 服务器发送 DHCP 请求报文。
  • 封装该报文的 IP 数据报的源 IP 地址仍为0.0.0.0,因为此时 DHCP 客户才从多个DHCP服务器中挑选一个作为自己的 DHCP 服务器,它首先需要征得该服务器的同意,之后才能正式使用向该 DHCP 服务器租用的 IP 地址;目的 IP 地址仍为广播地址,这样做的目的是,不用向网络中的每一个 DHCP 服务器单播发送 DHCP 请求报文,来告知它们是否请求它们作为自己的 DHCP 服务器。DHCP 请求报文中封装有事物 ID、DHCP 客户端的 MAC 地址、接受的租约中的 IP 地址和提供此租约的 DHCP 服务器段的 IP 地址等信息。在本例中,假设DHCP 客户选择 DHCP 服务器 1 作为自己的 DHCP 服务器,并且 DHCP 服务器 1 接受该请求。
  • 于是 DHCP 服务器 1 给 DHCP 客户发送 DHCP 确认报文,封装该报文的 IP 数据报的源 IP 地址为 DHCP 服务器1的 IP 地址;目的 IP 地址仍为广播地址。DHCP 客户收到该确认报文后,就可以使用所租用到的 IP 地址了。
  • 当租用期过了一半时,DHCP 客户会向 DHCP 服务器发送 DHCP 请求报文来请求更新租用期。封装该报文的 IP 数据报的源 IP 地址为 DHCP 客户之前租用到的 IP 地址,目的 IP 地址为 DHCP 服务器1的地址。DHCP 服务器若同意,则发回 DHCP 确认报文,这样DHCP 客户就得到了新的租用期。DHCP 服务器若不同意,则发回 DHCP 否认报文,这时DHCP 客户必须立即停止使用之前租用的 IP 地址,并重新发送 DHCP 发现报文来重新申请 IP 地址。DHCP 服务器若未做出响应,则在租用期过了87.5%时,DHCP 客户必须重新发送 DHCP请求报文,然后继续等待 DHCP 服务器可能作出的反应。若 DHCP 服务器未做出响应,则当租用期到期后,DHCP 客户必须立即停用之前租用的 IP 地址,并重新发送 DHCP 发现报文来重新申请 IP 地址。DHCP 客户可以随时提前终止 DHCP 服务器所提供的租用期,这时只需向 DHCP 服务器发送 DHCP 释放报文段即可。

03 DHCP中继代理
该网络中的各主机是否可以通过 DHCP 来自动获取到网络配置信息呢?答案是否定的,原因很简单,该网络中的主机广播发送 DHCP 发现报文,但该广播报文不会被路由器转发,而是丢弃(因为路由器可以隔绝广播域)。解决方式是给该路由器配置 DHCP 服务器的 IP 地址并使之成为 DHCP 中继代理。这样该网络中的各主机就可以通过 DHCP 来自动获取到网络配置信息了。当该路由器收到广播的 DHCP 发现报文后,会将其单播转发给 DHCP 服务器。使用 DHCP 中继代理的主要原因是我们并不愿意在每一个网络上都设置一个 DHCP 服务器,因为这样会使 DHCP 服务器的数量太多。

6.4 域名系统DNS

01 域名系统的作用
当我们在浏览器地址栏中输入某个 Web 服务器的域名时,用户主机会首先在自己的 DNS 高速缓存中查找该域名所对应的 IP 地址。如果没有找到,则会向网络中的某台 DNS 服务器查询。DNS 服务器中有域名和 IP 地址映射关系的数据库。当 DNS服务器收到 DNS 查询报文后,在其数据库中进行查寻,之后会将查寻结果发送给用户主机。现在,用户主机中的浏览器可以通过 Web 服务器的 IP 地址对其进行访问了。

因特网是否可以只使用一台DNS服务器?
这种做法并不可取。因为因特网的规模很大,这样的域名服务器肯定会因为超负荷而无法正常工作,而且一旦域名服务器出现故障,整个因特网就会瘫痪。早在1983年,因特网就开始采用层次结构的命名树作为主机的名字(即域名),并使用分布式的域名系统DNS。DNS使大多数域名都在本地解析,仅少量解析需要在因特网上通信,因此系统效率很高。由于DNS是分布式系统,即使单个计算机出了故障,也不会妨碍整个系统的正常运行。
02 因特网的域名结构

  • 因特网采用层次树状结构的域名结构。
  • 域名的结构由若干个分量组成,各分量之间用“点”隔开,分别代表不同级别的域名。
  • 域名系统既不规定一个域名需要包含多少个下级域名,也不规定每一级的域名代表什么意思。
  • 各级域名由其上一级的域名管理机构管理,而最高的顶级域名则由因特网名称与数字地址分配机构ICANN进行管理。


需要注意的是,名称相同的域名其登记未必相同。例如,com 是通用顶级域名,但我国顶级域名 cn 下也有一个名称为 com 的二级域名。


03 因特网上的域名服务器
域名和IP地址的映射关系必须保存在域名服务器中,供所有其他应用查询。显然不能将所有信息都储存在一台域名服务器中。DNS使用分布在各地的域名服务器来实现域名到IP地址的转换。





04 因特网的域名解析过程

  • 为了提高DNS的查询效率,并减轻根域名服务器的负荷和减少因特网上的DNS查询报文数量,在域名服务器中广泛地使用了高速缓存。高速缓存用来存放最近查询过的域名以及从何处获得域名映射信息的记录。由于域名到IP地址的映射关系并不是永久不变,为保持高速缓存中的内容正确,域名服务器应为每项内容设置计时器并删除超过合理时间的项目(例如,每个项目只存放两天)。
  • 不但在本地域名服务器中需要高速缓存,在用户主机中也很需要。许多用户主机在启动时从本地域名服务器下载域名和IP地址的全部数据库,维护存放自己最近使用的域名的高速缓存,并且只在从缓存中找不到域名时才向域名服务器查询。同理,主机也需要保持高速缓存中内容的正确性。


6.5 文件传送协议FTP

01 文件传送协议FTP的作用

  • 将某台计算机中的文件通过网络传送到可能相距很远的另一台计算机中,是一项基本的网络应用,即文件传送。
  • 文件传送协议(File Transfer Protocol,FTP)提供交互式的访问,允许客户指明文件的类型与格式(如指明是否使用ASCII码),并允许文件具有存取权限(如访问文件的用户必须经过授权,并输入有效的口令)。FTP屏蔽了各计算机系统的细节,因而适合于在异构网络中任意计算机之间传送文件。

FTP 采用客户/服务器方式。因特网上的 FTP客户计算机可将各种类型的文件上传到 FTP 服务器计算机。FTP 客户计算机也可以从 FTP 服务器计算机下载文件。

02 文件传送协议FTP的基本工作原理
1、主动模式(建立数据通道时,FTP服务器主动连接FTP客户)
如图所示,FTP 服务器监听熟知端口号 21。FTP 客户随机选择一个临时端口号与其建立 TCP 连接。这条 TCP 连接用于 FTP 客户与服务器之间传送 FTP 的相关控制命令。也就是说,这条 TCP 连接是 FTP 客户与服务器之间的命令通道。当有数据要传输时,FTP 客户通过命令通道告知 FTP 服务器来与自己的另一个临时端口号建立 TCP 连接,即建立数据通道。FTP 服务器使用自己的熟知端口号 20 与其建立 TCP 连接。这条 TCP 连接用于 FTP 客户与服务器之间传送文件。也就是说,这条 TCP 连接时 FTP 客户与服务器之间的数据通道。由于在建立数据通道时,FTP 服务器主动连接 FTP 客户,因此称为主动模式。

2、被动模式(建立数据通道时,FTP服务器被动等待FTP客户的连接)
对于 FTP 客户与服务器之间命令通道的建立,它与主动模式并没有什么不同。不同之处在于,当有数据要传输时,FTP 客户通过命令通道通知 FTP 服务器开启某个协商好的临时端口被动等待来自 FTP 客户的 TCP 连接以建立数据通道。这时 FTP 服务器使用的是与 FTP 客户协商好的临时端口号。FTP 客户发起与 FTP 服务器的 TCP 连接以建立数据通道。由于在建立数据通道时,FTP 服务器被动等待FTP 客户的连接,因此称为被动模式。

6.6 电子邮件

01 电子邮件系统的组成

  • 电子邮件系统采用客户/服务器方式。
  • 电子邮件系统的三个主要组成构件:用户代理,邮件服务器,以及电子邮件所需的协议。
  • 用户代理是用户与电子邮件系统的接口,又称为电子邮件客户端软件。
  • 邮件服务器是电子邮件系统的基础设施。因特网上所有的因特网服务提供者ISP都有邮件服务器,其功能是发送和接收邮件,同时还要负责维护用户的邮箱。


02 简单邮件传送协议(Simple Mail Transfer Protocol,SMTP)的基本工作过程
发送方邮件服务器周期性地扫描邮件缓存,如果发现有待转发的邮件,则发送方邮件服务器中的 SMTP 客户会与接收方邮件服务器中的 SMTP 服务器进行 TCP 连接。之后SMTP 客户就可以基于这条 TCP 连接给 SMTP 服务器发送 SMTP 命令,共 14 条。SMTP 服务器也会给SMTP 客户发送相应的应答,共 21 种。SMTP 客户与服务器之间通过命令与应答的交互方式最终实现 SMTP 客户发送邮件给 SMTP 服务器。
当 TCP 连接建立成功后,SMTP 服务器会主动推送服务就绪应答给 SMTP 客户。应答代码 220 后面可能跟有描述信息。

SMTP 客户收到该应答后,向服务器表明身份,告知自己的域名。具体命令为HELO,其后为命令参数。SMTP 服务器若认为身份有效,则发回应答代码250;否则发回其他代码。

SMTP 客户收到该应答后,使用命令 MAIL FROM 来告诉服务器邮件来自何方。SMTP 服务器若认为合理,则发回应代码 250;否则发回其他错误代码。SMTP 客户收到该应答后,使用命令 RCPT TO 来告诉服务器邮件去往何方,也就是收件人邮箱。SMTP 服务器中如果有该收件人邮箱,则发回应代码 250;否则发回其他错误代码。SMTP 客户收到该应答后,使用DATA 命令来告诉服务器自己准备发送邮件内容了。SMTP 服务器如果准备好接收,发回应答代码354;否则,发回其他错误代码。SMTP 客户收到该应答后,就向服务器发送邮件内容。SMTP 客户发送完邮件内容后,还要发送结束符。SMTP 服务器若收件成功,则发回应答代码250;否则,发回其他错误代码。SMTP 客户收到该应答后,使用命令 QUIT 向服务器请求断开连接。SMTP 服务器发回应答代码221表示接受请求并主动断开连接。

03 电子邮件的信息格式
首部和主体的信息都需要由用户来填写。首部中包含有一些关键字,后面加上冒号。例如,关键字From,后面填入发件人的电子邮件地址,一般由邮件系统自动填入;关键字 To,后面填入一个或多个收件人的电子邮件地址;关键字 Cc,后面填入一个或多个收件人以外的抄送人的电子邮件地址。抄送人收到邮件后,可看可不看邮件,可回可不回邮件;关键字 Subject,后面填入邮件的主题。它反映了邮件的主要内容。很显然,最重要的关键字是 To 和Subject,它们往往是必填选项。用户写好首部后,邮件系统将自动地将信封所需的信息提取出来并写在信封上。所以用户不需要填写电子邮件信封上的信息。在填写完首部各关键字的内容后,用户还需要撰写邮件的主体部分,这才是用户想传递给收件人的核心信息。

04 多用途因特网邮件扩展

  • SMTP协议只能传送ASCII码文本数据,不能传送可执行文件或其他的二进制对象。
  • SMTP不能满足传送多媒体邮件(例如带有图片、音频或视频数据)的需要。并且许多其他非英语国家的文字(例如中文、俄文、甚至带有重音符号的法文或德文)也无法用SMTP传送。
  • 为解决SMTP传送非ASCII码文本的问题,提出了多用途因特网邮件扩展 (Multipurpose Internet MailExtensions,MIME)。增加了5个新的邮件首部字段,这些字段提供了有关邮件主体的信息。定义了许多邮件内容的格式,对多媒体电子邮件的表示方法进行了标准化。定义了传送编码,可对任何内容格式进行转换,而不会被邮件系统改变。
  • 实际上,MIME不仅仅用于SMTP,也用于后来的同样面向ASCII字符的HTTP。

假设发送方发送的电子邮件中包含有非 ASCII 码数据,则不能直接使用 SMTP 进行传送。需要经过MIME 进行转换,将非 ASCII 码数据转换为 ASCII 码数据。然后就可以使用 SMTP 进行转发传送了。接收方也要使用 MIME 对接收到的 ASCII 码数据进行逆转换,这样就可以得到包含有非 ASCII 码数据的电子邮件。

05 常用的邮件读取协议

06 基于万维网的电子邮件

①用户 A 要给用户 B 发送邮件。用户 A 使用浏览器登陆邮件服务器网站,撰写并发送邮件给用户 B。用户 B 也使用浏览器登陆邮件服务器网站,读取收到的邮件。用户 A 和 B 在发送和接收邮件时与服务器之间都使用的是 HTTP 协议,而不需要使用 SMTP 和 POP3协议。
②假设用户 A 使用网易邮件服务器,用户 C 使用谷歌邮件服务器,用户 A 要给用户 C 发送邮件。用户 A 使用浏览器登陆自己的邮件服务器网站,撰写并发送邮件给用户 C,使用的是 HTTP 协议。用户 A 的邮件服务器使用SMTP 将邮件发送给用户 C 的邮件服务器。用户 C 也使用浏览器登陆自己的邮件服务器网站,读取收到的邮件,使用的也是 HTTP 协议。

6.7 万维网WWW

01 万维网概述

  • 万维网(World Wide Web,WWW)并非某种特殊的计算机网络。它是一个大规模的、联机式的信息储藏所,是运行在因特网上的一个分布式应用。
  • 万维网利用网页之间的超链接将不同网站的网页链接成一张逻辑上的信息网。
  • 浏览器最重要的部分是渲染引擎,也就是浏览器内核。负责对网页内容进行解析和显示。不同的浏览器内核对网页内容的解析也有不同,因此同一网页在不同内核的浏览器里的显示效果可能不同;网页编写者需要在不同内核的浏览器中测试网页显示效果。
  • 为了方便地访问在世界范围的文档,万维网使用统一资源定位符URL来指明因特网上任何种类“资源”的位置。
  • URL的一般形式由以下四个部分组成:< 协 议 > : / / < 主 机 > : < 端 口 > / < 路 径 >


超文本标记语言 (HyperText Markup Language,HTML)使用多种“标签”来描述网页的结构和内容

02 超文本传输协议HTTP

浏览器可以只下载文本部分。就像我们进入了百度音乐的这样一个网站,那进入之后我们就可以看到有很多歌曲但是现在他们不能播放,我们要做的就是点击这样一个播放按钮,点击播放按钮之后才可以播放音乐,那这个点击播放按钮之后其实就是再次循环了这样八个步骤。

HTTP/1.0采用非持续连接方式。在该方式下,每次浏览器要请求一个文件都要与服务器建立TCP连接,当收到响应后就立即关闭连接。

  • 每请求一个文档就要有两倍的RTT的开销。若一个网页上有很多引用对象(例如图片等),那么请求每一个对象都需要花费2RTT的时间。
  • 为了减小时延,浏览器通常会建立多个并行的TCP连接同时请求多个对象。但是,这会大量占用万维网服务器的资源,特别是万维网服务器往往要同时服务于大量客户的请求,这会使其负担很重。

在这三个报文的最后一个报文的数据载荷部分,携带有 HTTP 请求报文。服务器收到后给客户发回 HTTP响应报文。

HTTP/1.1采用持续连接方式。在该方式下,万维网服务器在发送响应后仍然保持这条连接,使同一个客户(浏览器)和该服务器可以继续在这条连接上传送后续的HTTP请求报文和响应报文。这并不局限于传送同一个页面上引用的对象,而是只要这些文档都在同一个服务器上就行。
为了进一步提高效率,HTTP/1.1的持续连接还可以使用流水线方式工作,即浏览器在收到HTTP的响应报文之前就能够连续发送多个请求报文。这样的一个接一个的请求报文到达服务器后,服务器就发回一个接一个的响应报文。这样就节省了很多个RTT时间,使TCP连接中的空闲时间减少,提高了下载文档的效率。
03 HTTP的报文格式


04 使用Cookie在服务器上记录用户信息

  • 早期的万维网应用非常简单,仅仅是用户查看存放在不同服务器上的各种静态的文档。因此HTTP被设计为一种无状态的协议。这样可以简化服务器的设计。
  • 现在,用户可以通过万维网进行各种复杂的应用,如网上购物、电子商务等。这些应用往往需要万维网服务器能够识别用户。
  • Cookie提供了一种机制使得万维网服务器能够“记住”用户,而无需用户主动提供用户标识信息。也就是说,Cookie是一种对无状态的HTTP进行状态化的技术。

用户主机中的浏览器进程首先与万维网服务器中的服务器进程建立 TCP 连接。当用户的浏览器进程初次向服务器进程发送 HTTP 请求报文时,服务器进程就会为其产生一个唯一的Cookie 识别码,并以此为索引在服务器的后端数据库中创建一个项目,用来记录该用户访问该网站的各种信息。接着就会给浏览器进程发回 HTTP响应报文。在响应报文中,包含有一个首部字段为 Set-Cookie 的首部行,该字段的取值就是 Cookie 识别码。当浏览器进程收到该响应报文后,就在一个特定的 Cookie 文件中添加一行,记录该服务器的域名和 Cookie 识别码。当用户再次使用该浏览器访问这个网站时,每发送一个 HTTP 请求报文,浏览器都会从 Cookie 文件中取出该网站的 Cookie 识别码,并放到 HTTP 请求报文的 Cookie 首部行中。服务器根据 Cookie 识别码就可以识别出该用户,并返回该用户的个性化网页。


本文标签: 深入浅出 计算机网络 笔记