计算机网络

这个笔记配合计算机网络微课堂食用效果更佳,这位老师的PPT做得真的好,讲得也特别简单易懂,力推!

1. 计算机网络概述

1.1 网络、互连网(互联网)和因特网

网络(Network)由若干结点(Node)和连接这些结点的链路(Link)组成。

多个网络还可以通过路由器互连起来,这样就构成了一个覆盖范围更大的网络,即互联网(或互连网)。因此,互联网是“网络的网络(Netwrok of Networks)”。

因特网(Internet)是世界上最大的互连网络(用户数以亿计,互连的网络数以百万计)。

internet与lnternet的区别:

  • internet(互联网或互连网)是一个通用名词,它泛指由多个计算机网络互连而成的网络。在这些网络之间的通信协议可以是任意的。
  • Internet(因特网) 则是一个专用名词,它指当前全球最大的、开放的、由众多网络相互连接而成的特定计算机网络,它采用TCP/IP协议族作为通信的规则,其前身是美国的ARPANET。

1.2 因特网发展的三个阶段

因特网服务提供者ISP(Internet Service Provider):提供给用户IP地址的角色,每个用户通过ISP提供的IP地址使用互联网,没有IP地址不可以使用互联网。我国主要的ISP是我们熟悉的中国电信、中国联通和中国移动这三大电信运营商。

1.3 因特网的组成

因特网由边缘部分和核心部分组成。

  1. 边缘部分
    由所有连接在因特网上的主机组成。这部分是用户直接使用的,用来进行通信(传送数据、音频或视频)和资源共享

  2. 核心部分
    由大量网络和连接这些网络的路由器组成。这部分是为边缘部分提供服务的(提供连通性和交换)

1.4 计算机网络三种数据交换方式

1.4.1 电路交换

电话交换机接通电话线的方式称为电路交换。

从通信资源的分配角度来看,交换(Switching)就是按照某种方式动态地分配传输线路的资源。

电路交换的三个步骤:

  1. 建立连接(分配通信资源)
  2. 通话(一直占用通信资源)
  3. 释放连接(归还通信资源)

在建立后不论通信资源有没有使用,都不会进行中断,除非用户中断。当使用电路交换来传送计算机数据时, 其线路的传输效率往往很低。

1.4.2 分组交换

把整块数据/信息分为多个数据段(相对于报文传输而言),数据段分开传输。在数据段前面加上首部后,成为一个分组。以分组为单位传输。

各个分组交换机会把分组先存储下来,然后根据其头部信息中的目的地址,发送给下一个交换机。各个交换机进行对分组信息的储存转发后,最终到达接收方。接收方处理及再去除分组首部,还原出报文。传输完成。

在转发过程中有两个特点:

  1. 各分组从发送方到达接收方可以经过不同的交换机。
  2. 各分组到达接收方的顺序不定,可能出现乱序。

在分组传输中各个角色主要功能:

  • 发送方:构造分组,发送分组
  • 路由器:缓存分组,转发分组
  • 接收方:接受分组,还原报文

1.4.3 报文交换

每一个结点接收整个报文,检查目标结点地址,然后根据网络中的通信情况在适当的时候转发到下一个结点。经过多次存储转发,最后到达目标,因而这样的网络叫存储转发网络。其中的交换结点要有足够大的存储空间(一般是磁盘),用以缓冲收到的长报文。

报文交换主要用于早期的电报通信网,现在较少使用,通常被较先进的分组交换方式所取代。

1.4.4 三种交换方式的对比

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

计算机网络主要是一些通用的、可编程的硬件互连而成的,而这些硬件并非专门用来实现某一特定目的的,这些可编程的硬件能够用来传送多种不同类型的数据(如音频、数据等),这些可编程的软件能支持广泛和日益增长的应用。

  1. 按照交换技术分类

    • 电路交换网络
    • 报文交换网络
    • 分组交换网络
  2. 按使用者分类

    • 公用网:电信公司构建的大型网络,面对公众开放,只要交钱既可使用,又叫公众网
    • 专用网:某个部门为本单位的特殊业务工作需要而建造的网络。例如铁路部门、电信部门专门为自己构建的,不对外开放的网络
  3. 按照传输介质分类

    • 有线网:双绞线(日常使用网线)、光纤
    • 无线网:WIFI
  4. 按覆盖范围分类

    • 广域网 WAN:覆盖面积通常为几十公里到几千公里,可以覆盖国家范围、洲际范围,有时也称为远程网。负责互连分布在不同区域的城域网和局域网,是最大范围的网络。
    • 城域网 MAN:覆盖范围一般是一个城市。作用距离为5到50公里。通常作为城市骨干网,互连大量企业、机构、学校。
    • 局域网 LAN:局域网一般是微信计算机或工作站通过告诉线路相连,范围一般是一个实验室、一栋楼或一个校园。覆盖范围1公里左右,通常由某个单位单独拥有、使用和维护。
    • 个域网 PAN:个人区域网络。非用来连接普通计算机,而是在个人工作的地方把个人使用的电子设备,鼠标、键盘、耳机等用无线的方式连接起来形成的个人网络系统。覆盖范围10米左右。
  5. 按拓扑结构分类

    • 总线型网络:总线型网络用单根传输线把计算机连接起来。

      优点是建网容易,增减节点方便,节省线路。

      缺点是重负载时通信效率不高,任意一处出现故障后全网瘫痪。

    • 星型网络:星型网络是将每个计算机都以单独的线路与中央设备相连。中央设备现在一般是交换机或路由器。

      优点:便于网络的集中控制和管理。

      缺点:成本高,中央设备对故障敏感。

    • 环型网络:环形网络是将所有计算机网络接口连接成一个环。环可以是单环或者双环,环中信号是单向传输的。

    • 网状型网络:在网状结构中,每个节点至少由两条路径与其他节点相连接,多用在广域网中。

      优点:可靠性高。

      缺点:控制复杂,线路成本高。

以上四种结构中可以任意组合形成更加复杂的网络。

1.6 计算机网络的性能指标

1.6.1 速率

1.6.2 带宽

用来表示网络的通信线路所能传送数据的能力,因此网络带宽表示在单位时间内从网络中的某一点到另一个点所能通过的“最高数据率”。

单位:b/s(kb/s, Mb/s, Gb/s, Tb/s),与速率相同。

1.6.3 吞吐量

吞吐量表示在单位时间内通过某个网络(或信道、接口)的数据量。

吞吐量被经常用于对现实世界中的网络的一种测量,以便知道实际上到底有多少数据量能够通过网络。

吞吐量受网络的带宽或额定速率的限制。

1.6.4 时延

发送时延

发送速率受网卡的发送速率、信道带宽、接口速率影响。发送效率遵循木桶原理,由速率最低的模块决定,所以在选择网线、路由器等设备时,要考虑到整体的速率平衡问题。

发送速率 = min[网卡发送速率,信道带宽,交换机或路由器的接口速率]

传播时延

电磁波在自由空间的传播速率:

在铜线中:

在光纤中:

要计算传播时延,先确定传播媒体,进而可以确定电磁波在该传输媒体中的传输速率。

处理时延

处理时延是路由器收到分组后对其进行存储转发产生的时延。不方便计算。排队时延也归到处理时延中。

在题目中,一般会写“处理时延忽略不计”。发送时延占主导还是传播时延占主导,要根据具体例子实际分析。

1.6.5 时延带宽积

若发送端连续发送数据,则在所发送的第一个比特即将到达终点时,发送端就已经发送了时延带宽积个比特。

链路的时延带宽积又称为以比特为单位的链路长度。

1.6.6 往返时间(RTT)

从发送端发送信息开始,到发送端接收到来自接收端发送的确认信息,称为往返时间(RTT)。

在许多情况下,因特网上的信息不仅仅单方向传输,而是双向交互。我们有时很需要知道双向交互一次所需的时间,因此,往返时间(RTT,Round-Trip Time)是一个重要的性能指标。

1.6.7 利用率

利用率分为信道利用率和网络利用率。

  • 信道利用率:用来表示某信道有百分之几的时间是被利用的(有数据通过)
  • 网络利用率:全网络的信道利用率的加权平均

根据排队论,当某信道的利用率增大时,该信道引起的时延也会迅速增加。

如果令:

  • :网络空闲时延
  • :网络当前时延
  • :利用率

那么则有下列关系:

  • 当网络的利用率达到50%时,时延就要加倍
  • 当网络的利用率超过50%时,时延急剧增大
  • 当网络的利用率接近100%时,时延就趋于无穷大

因此,一些拥有较大主干网的ISP通常会控制它们的信道利用率不超过50%。如果超过了,就要准备扩容,增大线路的带宽。也不能使信道利用率太低,这会使宝贵的通信资源被白白浪费。应该使用一些机制,可以根据情况动态调整输入到网络中的通信量,使网络利用率保持在合理范围内。

1.6.8 丢包率

  1. 丢包率即分组丢失率,是指在一定的时间范围内,传输过程中丢失的分组数量与总分组数量的比率。
  2. 丢包率具体可分为接口丢包率、结点丢包率、链路丢包率、路径丢包率、网络丢包率等。
  3. 丢包率是网络运维人员非常关心的一个网络性能指标,但对于普通用户来说往往并不关心这个指标,因为他们通常意识不到网络丢包。
  4. 分组丢失主要有两种情况:
    • 分组在传输过程中出现误码,被结点丢弃;
    • 分组到达一台队列已满的分组交换机时被丢弃;在通信量较大时就可能造成网络拥塞。
  5. 因此,丢包率反映了网络的拥塞情况:
    • 无拥塞时路径丢包率为0
    • 轻度拥塞时路径丢包率为1%~4%
    • 严重拥塞时路径丢包率为5%~15%

1.7 计算机网络体系结构

必看!计算机网络体系结构的分层思想,这个PPT做得真的绝了。

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

1.7.1.1 实体

实体:任何可发送或接受信息的硬件或软件进程。

对等实体:收发双方相同层次中的实体。

1.7.1.2 协议

协议:控制两个对等实体进行逻辑通信的规则的集合。

协议的三要素:语法、语义、同步

  • 语法:定义所交换信息的格式
  • 语义:定义收发双方所要完成的操作
  • 同步:定义收发双方的时序关系

1.7.1.3 服务

在协议的控制下,两个对等实体间的逻辑通信使得本层能够向上一层提供服务。

要实现本层协议,还需要使用下面一层所提供的服务。

协议是“水平的”,服务是“垂直的”。

实体看得见相邻下层所提供的服务,但并不知道实现该服务的具体协议。也就是说,下面的协议对上面的实体是“透明”的。

服务访问点:在同一系统中相邻两层的实体交换信息的逻辑接口,用于区分不同的服务类型。

  • 数据链路层的服务访问点为帧的“类型”字段。
  • 网络层的服务访问点为IP数据报首部中的“协议字段”。
  • 运输层的服务访问点为“端口号”。

服务原语:上层使用下层所提供的服务必须通过与下层交换一些命令。

协议数据单元PDU:对等层次之间传送的数据包称为该层的协议数据单元。

服务数据单元SDU:同一系统内,层与层之间交换的数据包。

多个SDU可以合成为一个PDU;一个SDU也可划分为几个PDU。

2. 物理层

2.1 基本概念

物理层考虑的是怎样才能在连接各种计算机的传输媒体上传输数据比特流。

物理层为数据链路层屏蔽了各种传输媒体的差异,使数据链路层只需要考虑如何完成本层的协议和服务,而不必考虑网络具体的传输媒体是什么。

传输媒体不属于任何一层,如果一定要分类,则属于物理层。

物理层协议的主要任务:

  • 机械特性:指明接口所用接线器的形状和尺寸、引脚数目和排列、固定和锁定装置。
  • 电气特性:指明在接口电缆的各条线上出现的电压的范围。
  • 功能特性:指明某条线上出现的某一电平的电压表示何种意义。
  • 过程特性:指明对于不同功能的各种可能事件的出现顺序。

由于传输媒体种类众多(双绞线、光纤等),物理连接方式也很多(点对点连接、广播连接等),因此物理协议有很多种,但是每一种都需要包括以上四个特性。

2.2 物理层下面的传输媒体

2.2.1 导引型传输媒体

在导引型传输媒体中,电磁波被导引沿着固体传播媒体传播。

常见的导引型传输媒体有:

  • 同轴电缆:生活中最常见的就是电视线。用于模拟传输。价格较贵,布线不够灵活方便。

  • 双绞线:双绞线是最古老又常用的传输媒体。也就是生活中最常见的网线。双绞线的构成就是把两个互相绝缘的铜导线并排放在一起,按照一定规则绞合起来,因此称为双绞线。

    绞合的作用:①抵御部分来自外界的电磁波干扰;②减少来自相邻导线的电磁干扰。

  • 光纤:每一根光纤是非常细的,因此需要将它做成很结实的光缆,一根光缆少则只有一根光纤,多则可能有数十根甚至数百根光纤。 光纤的芯非常细。

    优点:①通信容量大;②传输损耗小,远距离传输时更加经济;③抗雷电和电磁干扰性能好,在大电流脉冲干扰的环境下尤为重要;④无串音干扰,保密性好,不易被窃听;⑤体积小,重量轻。

    缺点:①割接需要专用设备;②光电接口价格较贵。

  • 电力线:电力线是一种比较古老的技术。应用电力线传输信号的实例最早是电力线电话。但是在目前,以电力线构建局域网已不能满足需求。

2.2.2 非导引型传输媒体

非导引型的传播媒体是自由空间。

电磁波频率过大对人体有害,因此一般使用介于无线电波到红外的频率来进行信息传播。

常见的非导引型传输媒体有:

  • 无线电波:无线电波用于国际广播、海事和航空通讯等。无线电波中的低频和中频端主要以地面波形式传播。高频和甚高频主要用电离层的反射传播。
  • 微波:微波用于无线电话、无线网络、雷达、人造卫星接收等。在数据通信中占有重要地位。微波在空间中主要以直线传播,其传播距离一般只有50公里左右。传统的微波通信主要有地面微波接力通信和卫星通信。
  • 红外线:利用红外线传输数据,例如电视遥控等。红外通信属于点对点无线传输。不能越障,传输距离短,传输速率低。
  • 可见光:LIFI可以实现使用可见光通信,但是目前还在实验阶段,所以暂时无法取代WIFI。

2.3 物理层的传输方式

2.3.1 串行传输和并行传输

串行传输:指数据是一个比特一个比特依次发送的,只需要一条传输链路。数据在进行远距离传输的时候用的是串行传输,不是并行传输。

并行传输:指一次发送n个比特而不是一个比特,为此在发送端和接收端之间需要有n条传输线路。并行传输的优点是速度为串行传输的n倍。缺点是成本高。计算机内部数据的传输一般使用并行传输。

2.3.2 同步传输和异步传输

同步传输:数据库以稳定的比特流形式传输,字节之间没有间隔。接收端在每个比特信号的中间时刻进行检测,以判别接收到的是比特0还是比特1。由于不同设备的时钟周期存在差异,不能做到完全相同,在传输大量数据的过程中判别时刻的累计误差会导致接收端对比特信号的判别位置错位,因此需要采取方法使收发双方的时钟保持同步。

异步传输:使用异步传输方式时,以字节为独立的传输单位,字节之间的间隔时间不固定的(因此称为异步传输)。接收端仅在每个字节的起始处对字节内的比特实现同步。为此,通常要在每个字节的前后分别加上起始位和结束位。异步指的是字节之间异步。字节之间的时间间隔不固定。但是,字节中的每个比特依旧要同步,各个比特的持续时间要相同。

2.3.3 单工、半双工、全双工通信

单工通信:通信双方只有一个数据传输方向,只需要一条信道。例如无线电、广播。

半双工通信:通信双方有两个数据传输方向,但是不可以同时通信。需要两条信道。例如对讲机就是这种通信方式。

全双工通信:通信双方有两个数据传输方向,可以进行同时通信。需要两条信道。例如实时电话就是这种通信方式。

2.4 编码与调制

编码:编码就是在不改变信号性质的情况下仅对数字基带信号的波形进行变换。编码后产生的信号仍为数字信号。可以在数字信道中传输。

调制:把数据基带信号的频率范围,搬移到较高的频段,并转换为模拟信号,称为调制。调制后产生模拟信号,在模拟信道中传输。

码元:构成信号的一段波形。

2.4.1 常用编码

  • 不归零编码(NRZ):在整个码元时间内,不会出现零电平。为了辨别码元个数,在发送信号时需要发送方和接收方做到严格的同步。一般需要额外一根传输线来传输时钟信号,实现同步的目的。接收方按照时钟信号的节拍来逐个接收码元。但是额外一根线资源造成浪费,在计算机网络中的数据传输一般不采用这类编码。
  • 归零编码(RZ):在传输过程中,每个码元传输结束后都要“归零”。因此接收方只要在信号归零后进行采样,而不需要单独的时钟信号。归零编码相当于把时钟信号用“归零”的方式放在了数据之内,看作一种自同步的信号。但是在传输过程中,大部分的数据带宽都用来传输零电平数据,造成资源浪费。编码效率低。
  • 反向不归零编码(NRZI):在码元时间内不会出现零电平。若后一个码元时间内所持续的电平与前一个码元时间内所持续的电平不同(也称为电平反转)则表示0,若电平保持不变则表示1。
  • 曼彻斯特编码:在码元中间时刻会产生跳变,跳变的含义可以自己定义。例如由低电平到高电平代表1(或0)信号,由高电平到低电平代表0(或1)信号。码元中间时刻的跳变既代表时钟,又代表数据。传统以太网使用的就是曼彻斯特编码。
  • 差分曼彻斯特编码:在差分曼彻斯特编码中间也有跳变,但是此跳变只代表时钟信号。具体的数据由码元开始处电平是否变化来表示。例如在码元结束和码元开始的时候电平做对比,有变化代表0(或1),无变化代表1(或0)。

2.4.2 基本调制

  • 调幅:对基带信号的波幅进行调整,例如将上图的1信号波幅进行改变,在接收方读取时有载波输出为1。
  • 调频:对基带信号频率进行调整,例如将0信号调制为频率f1,1信号调制为频率f2。
  • 调相:对基带信号相位进行调制,例如将0信号的初相位调整为0度,1信号的初相位调整为180度。

但是在以上基本调制方法中,1个码元只能包含1个比特信息。

2.4.3 混合调制

如果频率和相位混合调制,因为频率和相位是相关的,即频率是相位随时间的变化率。所以一次只能调制频率和相位两个中的一个。

通常情况下,相位和振幅可以结合起来一起调制,称为正交振幅调制QAM。

比如QAM-16,在QAM-16中有12种相位,每种相位有1或2种振幅可选择。

由于此调制方法可以调制出16种码元,要完整的表示这16种情况,码元内是二进制数据,因此至少需要4个二进制数,也就是4个比特数据,因此在QAM-16调制方法中,每个码元可以表示4个比特数据。为了防止传输出错导致错误,相邻码元之间的对应关系使用格雷码(相邻二进制数只有一位不同)。

2.5 信道的极限容量

在实际传输过程中由于通信质量的问题会导致传输信号被干扰,导致信号波形失去了码元之间的清晰界限,这种现象叫码间串扰。

2.5.1 奈氏准则

为了防止信道数据过大导致码间串扰,因此做出了信号极限容量的预测。其中最著名的就是奈氏准则。

奈氏准则:在假定的理想条件下,为了避免码间串扰,码元传输速率时有上限的。

奈氏准则计算公式

理想低通(无噪声)信道下极限数据传输速率:

其中,C是数据传输速率(bit/s),W是信道带宽(Hz),V是信号状态数(可调制的不同波形的数量)。

2.5.2 香农公式

香农公式:带宽受限且有高斯白噪声干扰的信道的极限信息传输速率。

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

3. 数据链路层

3.1 数据链路层概述

数据链路层的功能:实现数据在一个网络之间的传输。

链路:从一个节点到一个相邻节点的一段物理线路,而中间没有任何其他交换节点。

数据链路:数据链路是把实现通信协议的硬件和软件加到链路上构成的。

数据链路以帧为单位传输和处理数据。

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

3.2.1 封装成帧

封装成帧是把网络层交付的协议数据单元,添加帧头和帧尾的操作,称为封装成帧。主要目的是为了在链路上以帧为单元传输数据,从而实现数据链路层本身的功能。

封装后的MAC帧格式:

3.2.2 差错检测

差错检测:接收方主机收到帧后,通过检错码和检错算法,就可以判断出帧在传输过程中是否出现了误码。

在传输过程中可能会产生比特差错:1 可能会变成 0, 而 0 也可能变成 1。

  1. 发送方会基于发送的数据和检错算法计算出检错码,并放在帧尾。
  2. 接收方主机根据数据链路层放在帧尾的检错码和检错算法来判断传输过程是否有错误。
  3. 若接收方主机收到有误码的帧后,将该帧丢弃。

3.2.3 可靠传输

如果数据链路层向其上层提供的是不可靠服务,丢弃就丢弃了,不会有更多措施;如果数据链路层向其上层提供的是可靠服务,就还需要其它措施,确保接收方主机还可以重新收到被丢弃的这个帧的正确副本。

可靠传输是数据链路层中最基本、最重要的问题。

以上三个问题都是使用点对点信道的数据链路层来举例的。如果使用广播信道的数据链路层除了包含上面三个问题外,还有一些问题要解决:

  1. 在发送信号过程中,如何识别是否发送的是给目的主机?

    在发送数据过程中,信号是以广播的形式发送,因此数据中需要带有发送主机和目的主机地址,来实现识别主机的目的。常用的解决方法是编址:将帧的目的地址添加在帧中一起传输。

  2. 数据碰撞:在数据发送过程中可能出现有两个主机同时发送数据,就会造成数据碰撞。

    常用的解决方法就是控制协议:CSMA/CD。

随着技术的发展,交换技术的成熟,在有线(局域网)领域使用点对点链路和链路层交换机的交换式局域网取代了共享式局域网,在无线局域网中仍然使用的是共享信道技术。

3.3 封装成帧

(看3.2.1)

在物理层中会将构成帧的各比特,转换成电信号交给传输媒体,为了便于接收方数据链路层从物理层交付比特流中提取出一个一个的帧,因此需要帧头跟帧尾来做一个帧定界,来实现从比特流中提取出一个一个的帧。

例如在ppp帧的格式中,在帧头和帧尾各有一个帧定界标志,由1子节组成,其01111110和01111110所包裹的数据就是一个帧,数据链路层可以识别这个帧定界从而提取出一个帧。

但是也存在没有帧定界标志的数据链路层协议:比如MAC帧,该帧的提取由物理层添加的前导码来识别开始,并且按照稳定的时钟周期,在每一帧的结束会有96比特发送时间的间隔,以此来识别一个帧的结束。

前导码由两部分组成:前同步码,作用是使接收方的时钟同步;帧开始定界符,表明其后面紧跟着的就是MAC帧。

3.3.1 透明传输

透明传输:是指数据链路层对上层交付的传输数据没有任何限制,就好像数据链路层不存在一样。

在传输数据过程中可能会出现数据比特流与帧定界标志符一样的情况,造成误读定界标志导致传输错误。在这种情况下,说明数据链路层对于数据有了一个要求:不能存在与定界符一样的数据编码。这就代表着对上层交付的数据有了限制,就不是透明传输了。因此为了实现透明传输,需要在数据链路层对数据进行处理。

在数据链路层中会对数据的处理来实现透明传输功能,例如:字节填充、比特填充,主要思路是在每一个传输数据中出现的定界符进行转义,防止误读。

字节填充:在面向字节的物理链路中适用。主要步骤:

  1. 通过在数据中出现控制字符“SOH”或“EOT”的前面插入一个转义字符“ESC”(其十六进制编码是1B)。
  2. 接收端的数据链路层在将数据送往网络层之前删除插入的转义字符。
  3. 如果转义字符也出现在数据当中,那么应在转义字符前面插入一个转义字符 ESC。当接收端收到连续的两个转义字符时,就删除其中前面的一个。

比特填充:适用于面向比特传输的物理链路。主要步骤:

  1. 在数据链路层中发送帧前扫描帧的数据部分,若出现连续的5个1,将在5个1后插入1个0(因为帧定界标志符为01111110)。
  2. 在接收方数据链路层接收帧时,将帧的数据部分中的每5个1后面的0剔除即可。

为了提高帧的传输效率,应当使帧的数据部分的长度尽可能大些。但考虑到差错控制等多种因素,每一种数据链路层协议都规定了帧的数据部分的长度上限,即最大传送单元(MTU,Maxinum Transfer Unit)。

3.4 差错检测

(看3.2.2)

比特差错:实际的通信链路都不是理想的,比特在传输过程中可能会产生差错: 1可能会变成0,而0也可能变成1。

误码率(BER):在一段时间内,传输错误的比特占所传输比特总数的比率称为误码率(BER,Bit Error Rate)

差错检测码(FCS):使用差错检测码来检测数据在传输过程中是否产生了比特差错,是数据链路层所要解决的重要问题之一。

3.4.1 奇偶校验

由于奇偶校验的漏检率比较高,因此一般在数据链路层中不使用。

3.4.2 循环冗余校验(CRC,Cyclic Redundancy Check)

循环冗余检验是一种可靠性非常高的校验方法。

3.5 可靠传输

(看3.2.3)

3.5.1 可靠传输基本概念

使用差错检测技术(例如循环冗余校验CRC),接收方的数据链路层就可检测出帧在传输过程中是否产生了误码(比特错误)。

数据链路层向上层提供的服务类型:

  • 不可靠传输服务:仅仅丢弃有误码的帧,其他什么也不做;
  • 可靠传输服务:想办法实现发送端发送什么,接收端就收到什么。

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

比特差错只是传输差错中的一种。从整个计算机网络体系结构来看,传输差错还包括分组丢失、分组失序以及分组重复。

  • 分组丢失:路由器输入队列由于空间不足,主动丢弃收到的分组,造成分组丢失。
  • 分组失序:由于传输过程中选择失序的问题,接收方实际收到的数据与发送方发送的分组顺序不同造成分组失序。
  • 分组重复:分组在传输过程中由于某种原因在线路中滞留,导致一定时间内没有到达接收方,触发发送方超时重传机制,最终导致接收方收到了两个相同分组,造成分组重复。

分组丢失、分组失序以及分组重复这些传输差错,一般不会出现在数据链路层,而会出现在其上层。因此可靠传输服务并不仅局限于数据链路层,其它各层均可选择实现可靠传输。

TCP/IP体系结构中的以太网便不要求数据链路层实现可靠传输。

可靠传输的实现比较复杂,开销也比较大,是否使用可靠传输取决于应用需求。

3.5.2 三种可靠传输实现机制

可靠传输服务并不局限于数据链路层,在其他各层协议均可选择实现。

3.5.2.1 停止-等待协议(SW,Stop and Wait)

停止-等待协议:发送方每发送一个分组,就停止发送并等待接收方的确认分组。当收到接收方的确认分组后,才能发送下一个数据分组,如此反复进行。

停止-等待协议有4个最基本原则:

  1. 确认与否认。在每个数据发送后,接收方接到后会发送ACK(确认)信号确认无误收到,发送方收到ACK信号后便开始发送下一个数据。

    接收方检测收到数据出现误码后,会发送NAK(否认)信号,发送方接收到NAK信号后会重新发送缓存区中的数据。

    因此,在此过程中,发送方与接收方一直处于一种停止等待对方的过程,在此过程中要进行确认与否认,这也是停止-等待协议的最基本原则。

  2. 超时重传。此原则可以避免当数据传输过程中出现丢失,导致接收方一直等不到数据传送到达,而发送方又在等待接收方发送确认信号,系统处于互等的请况。

    为解决该问题,可以在发送方发送完一个数据分组时,启动一个超时计时器。若到了超时计时器所设置的重传时间而发送方仍收不到接收方的任何ACK或NAK,则重传原来的数据分组,这就叫超时重传。

    一般可将重传时间选为略大于“从发送方到接收方的平均往返时间”。

  3. 确认丢失。此原则可以避免接收方发送ACK信号后,由于传输问题出现ACK信号丢失,导致发送方没收到确认信号,重传分组,此时接收方重新接收到一样的分组,造成分组重复错误。

    为避免分组重复这种传输错误,必须给每个分组带上序号。对于停止-等待协议,由于每发送一个数据分组就停止等待,只要保证发送一个新的数据分组,其发送序号与上次发送的数据分组序号不同即可,因此用一个比特来编号就足够了。

  4. 确认迟到。此原则可以避免接收方发送ACK信号后,由于传输问题出现ACK信号迟到,导致发送方没收到确认信号,重传分组,下一时刻ACK到达,开始传输下一个分组,但是此时超时重传的分组已经发送出去,接收方接收到后会发送一个一样的ACK信号。

    所以同样需要给ACK或NAK信号编号。但在点对点通信中,传输的时钟周期比较固定,很少出现确认迟到的情况,可以不用给确认分组编号。

注意事项

  • 接收端检测到数据分组有误码时,将其丢弃并等待发送方的超时重传。但对于误码率较高的点对点链路,为使发送方尽早重传,也可给发送方发送NAK分组。
  • 为了让接收方能够判断所收到的数据分组是否是重复的,需要给数据分组编号。由于停止-等待协议的停等特性,只需1个比特编号就够了,即编号0和1。
  • 为了让发送方能够判断所收到的ACK分组是否是重复的,需要给ACK分组编号,所用比特数量与数据分组编号所用比特数量一样。
  • 点对点信道的数据链路层一般不会出现ACK分组迟到的情况,因此在数据链路层实现停止-等待协议可以不用给ACK分组编号。
  • 超时计时器设置的重传时间应仔细选择。一般可将重传时间选为略大于“从发送方到接收方的平均往返时间”。
    • 在数据链路层点对点的往返时间比较确定,重传时间比较好设定。
    • 然而在运输层,由于端到端往返时间非常不确定,设置合适的重传时间有时并不容易。

停止-等待协议的信道利用率

信道利用率就是发送方发送时延占据整个事件比例。

  • :数组分组的发送时延
  • :接收方主机的处理时延
  • :往返时延

则停止-等待协议的信道利用率计算公式为:

当往返时延RTT远大于数据帧发送时延TD时(卫星链路),信道利用率非常低。若出现超市重传,信道利用率更低,因此就出现了另外两种协议:回退N帧协议GBN、选择重传协议SR。

3.5.2.2 回退N帧协议(GBN,Go-Back-N)

回退N帧协议可以理解为停止等待协议的一种优化,在相同的时间内,使用停止-等待协议的发送方只能发送一个数据分组,而采用流水线传输的发送方,可以发送多个数据分组。

回退N帧协议在流水线传输的基础上,利用发送窗口限制发送方可连续发送数据分组的个数。

  1. 使用3个比特给分组编序号,0~7
  2. 发送窗口的尺寸取值:,本例取
  3. 接收窗口的取值:

为停止-等待协议SW。

对于发送过程无差错情况

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

累计确认:接收方不一定要对收到的数据分组逐个发送确认,而可以在收到几个数据分组后(由具体实现),对按序到达的最后一个数据分组发送确认,ACKn表示序号为n及以前的所有数据分组都已正确接收。比如即使 ACK1丢失了,也有ACK4来确认,发送方也可能不必重传。

  • 累计确认的优点:减少接收方的开销,减少对网络资源的占用。
  • 累计确认的缺点:不能向发送方及时发送接收方正确接受数据分组的信息。

对于有差错情况

在传输过程中,5号数据分组出现错误,接收方在接收5号分组时通过其检错码发现了错误,于是丢弃该分组。而后续到达的分组通过对比序号发现序号不匹配,接收方就选择不接受它们,将它们丢弃,并且回传按序接受的最后一个正确数据分组,发送ACK4,每丢弃一个分组就发送一个最后正确数据分组信号。

在本例中,尽管序号为6,7,0,1的数据分组正确到达接收方,但由于5号数据分组误码不被接受,它们也“受到牵连”而不被接受。发送方还要重传这些数据分组,这就是所谓的 Go-back-N (回退N帧)。可见,当通信线路质量不好时,回退N帧协议的信道利用率并不比停止-等待协议高。

回退N帧协议在流水线传输的基础上利用发送窗口来限制发送方连续发送数据分组的数量,是一种连续自动重传请求(ARQ,Automatic Repeat-reQuest)协议。在协议的工作过程中发送窗口和接收窗口不断向前滑动,因此这类协议又称为滑动窗口协议。

在实际传输过程中,假设所有的分组都被接收,此时发送一个ACK7,但是ACK7在传输过程中丢失。此时发送方到一定时间后触发超时重传机制,重新发送0~7编号分组。此时接送方接收到后,会比对分组序号,发现分组序号符合当前窗口选择接收。但是此时0~7分组实际上已经接收过了,出现了分组重复差错。

回退N帧协议的缺点:一个数据分组的误码就会导致其后续多个数据分组不能被接收方接收而丢弃,尽管它们没有误码。这必然会导致发送方对这些数据分组的超时重传,对通信资源造成极大浪费。基于此,为了进一步提高传输性能,就提出了选择重传协议SR。

3.5.2.3 选择重传协议(SR,Selective Request)

为了进一步提高性能,可设法只重传出现误码的数据分组。因此,接收窗口的尺寸不应再等于1(而应大于1),以便接收方先收下失序到达但无误码并且序号落在接收窗口内的那些数据分组,等到所缺分组收齐后再一并送交上层。这就是选择重传协议。

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

  1. 使用3个比特给分组编序号,0~7
  2. 发送窗口的尺寸取值:,本例取
  3. 接收窗口的取值:

选择重传协议的基本流程:

  1. 发送方将发送窗口内分组0123发送给接收方,且此时2号分组出现丢失。

  2. 接收方能正确接收0,1序号分组,并且发送ACK0,ACK1。并且此时接收窗口向前滑动。

  3. 接收方接收3号数据分组,并且发送ACK3,但是由于此时2号分组没有收到,不能向后滑动窗口,只能继续接收剩余窗口。此时发送方会对发送窗口中的3号数据做已确认标记,防止超时重发。

  4. 此时发送方收到ACK0,ACK1将窗口向后滑动,并且将4,5号数据发送出去。

  5. 接收方接收到4,5号分组后,回传ACK4,ACK5。

  6. 2号数据触发超时重传机制,此时将2号数据发送过去,接收方接收到后回传ACK2,并且此接收方有序并且已确认分组已经连续,向后滑动窗口。

  7. 发送方接收到ACK2信号后,所有发送窗口都满足确认,并且已经连续,发送窗口也向后滑动。

  8. 重复上述过程,直至完成所有分组的传输。

如果发送窗口和接收窗口超过了取值范围,就会使接收方无法区分新、旧数据分组,进而出现分组重复这种差错。

3.6 点对点协议(PPP)

点对点协议(PPP,Point-to-Point Protocol)是目前使用最广泛的点对点数据链路层协议。

PPP协议是数据链路层使用的一种协议,它的特点是:简单;只检测差错,而不是纠正差错;不使用序号,也不进行流量控制;可同时支持多种网络层协议。

PPP协议为在点对点链路传输各种协议数据报提供了一个标准方法,主要由以下三部分构成:

  • 对各种协议数据报的封装方法(封装成帧)
  • 链路控制协议(LCP):用于建立、配置以及测试数据链路的连接
  • 一套网络控制协议(NCPs):其中的每一个协议支持不同的网络层协议

3.6.1 PPP的帧格式

3.6.2 点对点协议透明传输

PPP实现透明传输的两种方法:

  • 面向字节的异步链路采用插入转义字符的字节填充法
  • 面向比特的同步链路采用插入比特 0 的比特填充法

3.6.3 差错检测

3.6.4 工作状态

3.7 媒体接入控制(MAC)

3.7.1 基本概念

数据媒体接入控制(MAC,Medium Access Control),其要着重考虑的问题就是如何协调多个发送和接收站对一个个共享传输媒体的占用,也就是解决冲突的问题。

随着技术的发展,交换技术的成熟和成本的降低,具有更高性能的使用点对点链路和链路层交换机的交换式局域网在有线领域已完全取代了共享式局域网,但由于无线信道的广播天性,无线局域网仍然使用的是共享媒体技术。

3.7.2 静态划分信道

预先固定分配好信道,这类方法非常不灵活,对于突发性数据传输信道利用率会很低。通常在无线网络的物理层中使用,而不是在数据链路层中使用。

复用是通信技术中的一个重要概念,复用就是通过一条物理线路同时传输多路用户的信号。当网络中传输媒体的传输容量大于多条单一信道的总通信量时,就可以利用复用技术在一条物理线路上建立多条通信信道来充分利用传输媒体的带宽。

常用的复用技术有4种:频分复用FDM、时分复用TDM、波分复用WDM、码分复用CDM。

3.7.2.1 频分复用FDM

频分复用FDM:将整个带宽分为多份,用户在分配到一定的频带后,在通信过程中自始至终都占用这个频带。

频分复用的所有用户在同样的时间占用不同的带宽资源(注意,这里的“带宽”是频率带宽而不是数据的发送速率)。

接收端通过相应的分用器通过滤波将各路信号分开。将合成的复用信号恢复成原始的多路信号。

3.7.2.2 时分复用TDM

  • 将时间划分成一个个的时间间隙。
  • 时分复用技术将传输线路的带宽资源按一个个的时间间隙轮流分配给不同的用户。
  • 每个用户只在所分配的时隙里使用线路传输数据。
  • 时分复用是将时间划分为一段段等长的时分复用帧(TDM帧)。每一个时分复用的用户在每一个 TDM 帧中占用固定序号的时隙。
  • 每一个用户所占用的时隙是周期性地出现(其周期就是TDM帧的长度)的。
  • TDM 信号也称为等时 (isochronous) 信号。
  • 时分复用的所有用户在不同的时间占用同样的频带宽度。

3.7.2.3 波分复用WDM

波分复用就是光的频分复用。

光信号传输一段距离后会衰减,所以要用掺铒光纤放大器放大光信号。

3.7.2.4 码分复用CDM

码分复用,由于该技术主要用于多址接入,人们更常用的名词时码分多址CDMA(Code Division Multiple Access)

同理:频分复用(FDM)和时分复用(TDM)都可用于多址接入,相应的名词是频分多址(FDMA)和时分多址(TMDA)。

复用和多址的区别:

与FDM和TDM不同,CDM的每一个用户可以在同样的时间使用同样的频带进行通信。

由于各用户经过特殊挑选的不同码型,因此个用户之间不会造成干扰。

CDM最初是用于军事通信的,因此这种系统发送的信号有很强的抗干扰能力,其频谱类似于白噪声,不易于被敌人发现。随着技术的进步,CDMA设备的价格和体积都大幅度下降,因为现在已广泛用于民用的移动通信中。

在CDMA中,每一个比特时间再划分为m个短的间隔,称为码片(Chip)。通常m=64或128。为了简单起见,在后续的举例中,假设m为8。(注意:1个比特时间是指发送1个比特所花费的时间)

使用CDMA的每一个站被指派一个唯一的m bit码片序列(Chip Sequence)。

  • 一个站如果要发送比特1,则发送它自己的m bit码片序列
  • 一个站如果要发送比特0,则发送它自己的m bit码片序列的二进制反码

这种通信方式称为序列扩频DSSS。

码片序列的挑选原则如下:

  • 分配给每个站的码片序列必须各不相同,实际常采用伪随机码序列。

  • 分配给每个站的码片序列必须相互正交(规格化内积为0)。

    令向量 S 表示站 S 的码片序列,令向量 T 表示其他任何站的码片序列

    两个不同站 S 和 T 的码片序列正交,就是向量 S 和 T 的规格化内积为 0

3.7.3 动态接入控制

对于动态接入控制,我们主要关注随机接入。

最初的以太网是将许多计算机都连接到一根总线上。易于实现广播通信。当初认为这样的连接方法既简单又可靠,因为总线上没有源器件。

但是在多个主机共用一个总线时,避免不了会出现碰撞的问题。如何协调总线各个主机的工作,尽量避免碰撞是一个必须解决的重要问题。因此就出现了载波监听多址接入/碰撞检测 CSMA/CD协议,用于解决碰撞问题。

随机接入分为总线型局域网和无线型局域网。总线型局域网使用的是CSMA/CD协议。无线型局域网使用的是CSMA/CA协议。

3.7.3.1 CSMA/CD协议

载波监听多址接入/碰撞检测(CSMA/CD,Carrier Sense Multiple Access/Collision Detection)

  1. 多址接入(MA):多个站连接在一条总线上,竞争使用总线

  2. 载波监听(CS):每一个站在发送帧之前先要检测一下总线上是否有其它站点在发送帧(“先听后说”)

    • 若检测到总线空闲 96 比特时间,则发送这个帧
    • 若检测到总线忙,则继续检测并等待总线转为空闲 96 比特时间,然后发送这个帧

    其中,96比特时间是发送96比特需要的时间(帧间最小间隔),其作用是可以检测出一个帧的结束。

    但是实际上,总线上并没有什么“载波”。因此, “载波监听”就是用电子技术检测总线上有没有其它计算机发送的数据信号。

  3. 碰撞检测(CD):每一个正在发送帧的站边发送边检测碰撞(“边说边听”)

    • 一旦发现总线上出现碰撞,则立即停止发送,退避一段随机时间后再次发送(“一旦冲突,立即停说,等待时机,重新再说”)

    “碰撞检测”就是计算机边发送数据边检测信道上的信号电压大小。当几个站同时在总线上发送数据时,总线上的信号电压摆动值将会增大(互相叠加)。当一个站检测到的信号电压摆动值超过一定的门限值时,就认为总线上至少有两个站同时在发送数据,表明产生了碰撞。所谓“碰撞”就是发生了冲突。因此碰撞检测也称冲突检测。在发生碰撞时,总线上传输的信号产生了严重的失真,无法从中恢复出有用的信息来。

争用期(碰撞窗口)

  • :以太网单程端到端传播时延。
  • :站发送数据到站检测到碰撞所经历的一段时间。
  • :纵轴向下,时间的正向进行。
  • 电磁波在 1km 电缆传播时延约等于 s

由图可以看出,当发生碰撞时,最长需要的时间就能检测到本次是否发生碰撞(也就是碰撞点在最远端)。因此,以太网中,端到端的往返传播时延称为争用期或碰撞窗口。也就是说在这段时间才有可能发生碰撞,若这段时间没有发生碰撞,则不再会发生碰撞。

每一个主机在自己发送帧之后的一小段时间内,存在着遭遇碰撞的可能性。这一小段时间是不确定的。它取决于另一个发送帧的主机到本主机的距离,但不会超过总线的端到端往返传播时延,即一个争用期时间。

显然,在以太网中发送帧的主机越多,端到端往返传播时延越大,发生碰撞的概率就越大。因此,共享式以太网不能连接太多的主机,使用的总线也不能太长。

  • 10Mb/s以太网把争用期定为 512 比特发送时间,即,因此其总线长度不能超过 5120m,但考虑到其他一些因素,如信号衰减等,以太网规定总线长度不能超过 2500m。

最小帧长

A站发送一个帧完毕后,不再针对该帧进行碰撞检测,而这时候C站检测到信道空闲时间 96 bit,发送帧,将产生碰撞。D站收到碰撞过后有差错的帧,将该帧丢弃。A站不知道已发送完毕的帧遭遇碰撞,所以不进行重传。显然,以太网的帧长不能太短!

  • 以太网规定最小帧长为64字节,即512比特(512比特时间即为争用期)
    • 如果要发送的数据非常少,那么必须加入一些填充字节,使帧长不小于64字节。
  • 以太网的最小帧长确保了主机可在帧发送完成之前就检测到该帧的发送过程中是否遭遇了碰撞
    • 如果在争用期(共发送64字节)没有检测到碰撞,那么后续发送的数据就一定不会发生碰撞;
    • 如果在争用期内检测到碰撞,就立即中止发送,这时已经发送出去的数据一定小于64字节,因此凡长度小于64字节的帧都是由于碰撞而异常中止的无效帧。

最小帧长的计算:

最大帧长

在此传输情况中,A发送了一个很长的帧,占用了大量时间,造成B、C无法传输数据,并且可能会造成某一端的缓冲区满的情况。因此便提出了最大帧长的概念。

截断二进制指数退避算法

信道利用率

一般信道利用率:

极限信道利用率:

参数a的值尽量小,以提高信道利用率。因此以太网端到端的距离应受到限制,以太网帧的长度应尽量长些。

帧发送流程

帧接收流程

CSMA/CD协议曾经用于各种总线结构以太网和双绞线以太网的早期版本中,现在的以太网基于交换机和全双工连接,不会有碰撞,因此没有必要使用CSMA/CD协议。

3.7.3.2 CSMA/CA协议

载波监听多址接入/碰撞避免协议 CSMA/CA(Carrier Sense Multiple Access / Collosion Acoidance)

CSMA/CA协议的工作原理

  1. 源站为什么在检测到信道空闲后还要再等待DIFS帧间间隔时间?

    因为要考虑到可能有其它的站有高优先级的帧要发送。若有,就要让高优先级帧先发送。

  2. 目的站为什么正确接收数据帧后还要等待一段时间SIFS才能发送ACK帧?

    SIFS是最短的帧间间隔,用来分隔属于一次对话的各帧。在这段时间内,一个站点应当能够从发送方式切换到接收方式。

对于发送过程中其他信道检测到信道忙:

信道预约机制:为了尽可能减少碰撞的概率和降低碰撞的影响,802.11标准允许要发送数据得站点对信道进行预约。

对于一次信道预约要进行的过程:

  1. 源站在发送数据帧之前先发送一个短的控制帧,称为请求发送RTS(Request To Send),它包括源地址、目的地址以及这次通信(包括相应的确认帧)所需的持续时间。
  2. 若目的站正确收到源站发来的RTS帧,且媒体空闲,就发送一个响应控制帧,称为允许发送CTS(Clear To Send),它也包括这次通信所需的持续时间(从RTS帧中将此持续时间复制到CTS帧中)。
  3. 源站收到CTS帧后,再等待一段时间SIFS后,就可发送其数据帧。
  4. 若目的站正确收到了源站发来的数据帧,在等待时间SIFS后,就向源站发送确认帧ACK。

虚拟载波监听机制:除RTS帧和CTS帧会携带通信需要持续的时间,数据帧也能携带通信需要持续的时间。

此时,C知道信道将被占用多长时间,在这段时间内C不能发送帧,即A给B发送数据帧时不会受到C的干扰。

3.8 MAC地址、IP地址及ARP协议

  • MAC地址是以太网的MAC子层所使用的地址,属于数据链路层。
  • IP地址是TCP/IP体系结构网际层所使用的地址。
  • ARP协议属于TCP/IP体系结构的网际层,其作用是已知设备所分配到的IP地址,使用ARP协议可以通过该IP地址获取到设备的MAC地址。

3.8.1 MAC地址

使用点对点信道的数据链路层不需要使用地址;使用广播信道的数据链路层必须使用地址来区分各主机。

MAC地址一般被固化在网卡(网络适配器)的电可擦可编程只读存储器(EEPROM)中,因此MAC地址也被称为硬件地址。MAC地址有时也被称为物理地址,但这并不意味着MAC地址属于网络体系结构中的物理层。

一般情况下,用户主机会包含两个网络适配器:有线局域网适配器(有线网卡)和无线局域网适配器(无线网卡)。每个网络适配器都有一个全球唯一的MAC地址。而交换机和路由器往往拥有更多的网络接口,所以会拥有更多的MAC地址。综上所述,MAC地址是对网络上各接口的唯一标识,而不是对网络上各设备的唯一标识。

字节发送顺序:第一字节 -> 第六字节

字节内比特发送顺序: ->

单播MAC地址举例

  1. 主机B给主机C发送单播帧,主机B首先要构建该单播帧,在帧首部中的目的地址字段填入主机C的MAC地址,源地址字段填入自己的MAC地址,再加上帧首部的其他字段、数据载荷以及帧尾部,就构成了该单播帧。

  2. 将该帧发送给出去。

  3. 此时A接收该单播帧,发现该单播帧的目的MAC地址与自己的MAC地址不匹配,丢弃该帧;C接收该单播帧,发现该单播帧的目的MAC地址与自己的MAC地址匹配,接受该帧,并将该帧交给其上层处理。

广播MAC地址举例

  1. 主机B首先要构建该广播帧,在帧首部中的目的地址字段填入广播地址,也就是十六进制的全F,源地址字段填入自己的MAC地址,再加上帧首部中的其他字段、数据载荷以及帧尾部,就构成了该广播帧。

  2. 发送该广播帧。

  3. 主机A和C都会收到该广播帧,发现该帧首部中的目的地址字段的内容是广播地址,就知道该帧是广播帧,主机A和主机C都接受该帧,并将该帧交给上层处理。

多播MAC地址举例

主机A发送含有多播地址的多播帧,其他主机根据自己的多播组列表,判断是否接收帧。

主机A要发送多播帧给该多播地址。将该多播地址的左起第一个字节写成8个比特,第一个字节的最低比特位是1,表明该地址是多播地址。快速判断地址是不是多播地址,就是上图所示箭头所指的第十六进制数不能整除2(1,3,5,7,9,B,D,F),则该地址是多播地址。

  1. 构建该多播帧,在帧首部中的目的地址字段填入该多播地址,源地址字段填入自己的MAC地址,再加上帧首部中的其他字段、数据载荷以及帧尾部,就构成了该多播帧。

  2. 将该多播帧发送出去,主机B、C、D都会收到该多播帧,各用户给自己主机配置多播组列表如图所示:

    可以看出主机B属于两个多播组,主机C也属于两个多播组,而主机D不属于任何多播组。

  3. 主机B和C发现该多播帧的目的MAC地址在自己的多播组列表中,主机B和C都会接受该帧。主机D发现该多播帧的目的MAC地址不在自己得多播组列表中,则丢弃该多播帧。

3.8.2 IP地址

3.8.3 ARP协议

ARP协议(地址解析协议)可以实现IP地址到MAC地址的相互转换。

在每一个主机中都有一个高速缓存表,可以记录IP地址和MAC地址的对应信息。

ARP的作用范围:逐段链路或逐个网络使用。

ARP没有安全验证机制,存在ARP欺骗(攻击)问题。

3.9 集线器与交换机的区别

早期的计算机网络中,常用的是总线型以太网。传统以太网最初是使用粗同轴电缆,后来演进到使用比较便宜的细同轴电缆,最后发展为使用更便宜和更灵活的双绞线。但是随着网络的发展被逐渐淘汰,出现了两种新型以太网结构:使用双绞线和集线器(HUB)的星型以太网、使用集线器(HUB)在物理层扩展以太网。

3.9.1 使用双绞线和集线器HUB的星型以太网

采用双绞线的以太网采用星型拓扑,在星型的中心则增加了一种可靠性非常高的设备,叫做集线器 (hub)。

集线器的以太网在逻辑上仍是个总线网,需要使用CSMA/CD协议来协调各主机争用总线,只能工作在半双工模式,收发帧不能同时进行。

3.9.2 使用集线器(HUB)在物理层扩展以太网

使用集线器扩展:将多个以太网段连成更大的、多级星型结构的以太网,会扩大广播域和碰撞域。

3.9.3 以太网交换机

以太网交换机是在数据链路层扩展以太网。

在集线器中,数据是以广播的形式发送,而在交换机中,会发送到目的主机,因此其效率要高很多。

3.9.4 集线器与交换机的对比

  1. 在单播情况下,集线器会像总线型一样把信号全部转发出去,而交换机只会发送给目标主机。
  2. 在广播情况下,二者无明显区别。

当网络中多台主机同时给另一台主机发送单播帧,对于使用集线器的共享总线型以太网,必然会产生碰撞,遭遇碰撞的帧会传播到总线上的各主机;对于使用交换机的交换式以太网,交换机收到多个帧时,将它们缓存起来,然后逐个转发给目的主机,不会产生碰撞。

3.10 以太网交换机自学习和转换帧的流程

  • 以太网交换机工作在数据链路层(也包括物理层)
  • 在以太网交换机中,有一个帧交换表。其中记录了帧的目的MAC地址对应的接口号。
  • 以太网交换机是一种即插即用设备,刚上电启动时其内部的帧交换表是空的。随着网络中各主机间的通信,以太网交换机通过自学习算法自动逐渐建立起帧交换表。

每条记录都有自己的有效时间,到期自动删除。这是因为MAC地址与交换机接口的对应关系并不是永久性的,比如更换主机、更换网卡等导致MAC地址改变。

PDU(Protocol Data Unit)的意思是协议数据单元,它是计算机网络体系结构中对等实体间逻辑通信的对象。

以太网交换机工作在数据链路层(也包括物理层),它接收并转发的PDU通常称为帧。以太网交换机收到帧后,在帧交换表中查找帧的目的MAC地址所对应的接口号,然后通过该接口转发帧。

3.11 以太网交换机的生成树协议(STP)

由于在实际使用过程中,可能会出现线路故障导致无法通信。若A与B之间的线路故障会导致B与A、C之间无法通信。

以太网交换机使用生成树协议(Spanning Tree Protocol,STP),可以在增加冗余链路来提高网络可靠性的同时又避免网络环路带来的各种问题。

  • 不论交换机之间采用怎样的物理连接,交换机都能够自动计算并构建一个逻辑上没有环路的网络,其逻辑拓扑结构必须是树型的(无逻辑环路);
  • 最终生成的树型逻辑拓扑要确保连通整个网络;
  • 当首次连接交换机或网络物理拓扑发生变化时(有可能是人为改变或故障),交换机都将进行生成树的重新计算。

3.12 虚拟局域网(VLAN)

广播风暴会浪费网络资源和各主机的CPU资源。

虚拟局域网VLAN(Virtual Local Area Network)是一种将局域网内的设备划分成与物理位置无关的逻辑组的技术,这些逻辑组具有某些共同的需求。

3.12.1 VLAN的实现机制

虚拟局域网VLAN技术是在交换机上实现的,需要交换机能够实现以下功能:

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

3.12.1.1 IEEE 802.1Q帧

3.12.1.2 交换机的端口类型

  • 交换机的端口类型有以下三种:
    • Access
    • Trunk
    • Hybrid(思科交换机没有此端口)
  • 交换机各端口的缺省VLAN ID
    • 在思科交换机上称为 Native VLAN,即本征VLAN。
    • 在华为交换机上称为 Port VLAN ID,即端口VLAN ID,简记为PVID。
3.12.1.2.1 Access端口

Access端口主要用于交换机与用户计算机之间的互连。

对于VLAN的实现,可以通过划分VLAN后,修改Access端口的PVID:

从而可以实现广播域的划分。

3.12.1.2.2 Trunk端口
  • Trunk端口一般用于交换机之间或交换机与路由器之间的互连。
  • Trunk端口可以属于多个VLAN。
  • 用户可以设置Trunk端口的PVID值。默认情况下,Trunk端口的PVID值为1。
  • Trunk端口发送处理方法:

    • 对 VID等于PVID的帧,“去标签” 再转发

    • 对 VID不等于PVID的帧,直接转发

  • Trunk端口接收处理方法:

    • 接收 “未打标签” 的帧,根据接收帧的端口的PVID给帧 “打标签”,即插入4字节VLAN标记字段,字段中的VID取值与端口的PVID取值相等
  • 接收 “已打标签” 的帧
3.12.1.2.3 Hybrid端口

4. 网络层

4.1 网络层概述

  • 网络层的主要任务是实现网络互连,进而实现数据包在各网络之间的传输。
  • TCP/IP参考模型的网络层提供的是无连接、不可靠的数据报服务。
  • 要实现网络层任务,需要解决以下主要问题:
    • 网络层向运输层提供怎样的服务(“可靠传输” 还是 “不可靠传输”)
    • 网络层寻址问题
    • 路由选择问题

每一个路由器都有一个路由表,路由表中记录了目的网络以及各级跳的路由器端口,以此来选择走哪个路由器到达端口。

路由记录表的记录有两种情况生成:

  1. 由用户或网络管理员进行人工配置。这种方法只适用于规模较小且网络拓扑不改变的小型互联网。
  2. 实现各种路由选择协议,由路由器执行路由选择协议中所规定的路由选择算法,而自动得出路由表中的路由记录,这种方法更适合规模较大且网络拓扑经常改变的大型互联网。

因特网是目前全世界用户数量最多的互联网,它使用TCP/IP协议栈。由于TCP/IP协议栈的网络层使用网际协议IP,它是整个协议栈的核心协议,因此在TCP/IP协议栈中网络层常称为网际层。

4.2 网络层提供的两种服务

4.2.1 面向连接的虚电路服务

  • 可靠通信由网络来保证
  • 必须建立网络层的连接——虚电路VC(Virtual Circuit)
  • 通信双方沿着已建立的虚电路发送分组
  • 目的主机的地址仅在连接建立阶段使用,之后每个分组的首部只需携带一条虚电路的编号(构成虚电路的每一段链路都有一个虚电路编号)。
  • 这种通信方式如果再使用可靠传输的网络协议,就可使所发送的分组最终正确到达接收方(无差错按序到达、不丢失、不重复)
  • 通信结束后,需要释放之前所建立的虚电路。
  • 很多广域分组交换网都使用面向连接的虚电路服务。例如,曾经的X.25和逐渐过时的帧中继FR、异步传输模式ATM等。

4.2.2 面向无连接的数据报服务

  • 可靠通信应当由用户主机来保证
  • 不需要建立网络层连接
  • 每个分组可走不同的路径
  • 每个分组的首部必须携带目的主机的完整地址
  • 这种通信方式所传送的分组可能误码、丢失、重复和失序。
  • 由于网络本身不提供端到端的可靠传输服务,这就使网络中的路由器可以做得比较简单,而且价格低廉(与电信网的交换机相比较)。
  • 因特网采用了这种设计思想,也就是将复杂的网络处理功能置于因特网的边缘(用户主机和其内部的运输层),而将相对简单的尽最大努力的分组交付功能置于因特网核心。

4.3 IPv4地址

4.3.1 IPv4地址概述

  • 在TCP/IP体系中,IP地址是一个最基本的概念,我们必须把它弄清楚。

  • IPv4地址就是给因特网(Internet)上的每一台主机(或路由器)的每一个接口分配一个在全世界范围内是唯一的32比特的标识符。

  • IP地址由因特网名字和数字分配机构ICANN(Internet Corporation for Assigned Names and Numbers)进行分配。

    • 我国用户可向亚太网络信息中心APNIC(Asia Pacific Network Information Center)申请IP地址, 需要缴费。
    • 2011年2月3日,互联网号码分配管理局IANA(由ICANN行使职能)宣布,IPv4地址已经分配完毕。
    • 我国在2014至2015年也逐步停止了向新用户和应用分配IPv4地址。同时全面开展商用部署IPv6。
  • IPv4地址的编址方法经历了如下三个历史阶段:

  • 32比特的IPv4地址不方便阅读、记录以及输入等,因此IPv4地址采用点分十进制表示方法以方便用户使用。

4.3.2 分类编址的IPv4地址

分类的IPv4地址共分为 5 类:A类地址、B类地址、C类地址、D类地址、E类地址。

4.3.2.1 A类地址

  • 最小网络号 0,保留不指派
  • 第一个可指派的网络号为 1,网络地址为 1.0.0.0
  • 最大网络号 127,作为本地环回测试地址,不指派
    • 最小的本地环回测试地址为 127.0.0.1
    • 最大的本地环回测试地址为 127.255.255.254
  • 最后一个可指派的网络号为 126,网络地址为 126.0.0.0
  • 可指派的网络数量为 (减2的原因是除去最小网络号0和最大网络号127)
  • 每个网络中可分配的IP地址数量为 (减2的原因是除去主机号为全 0 的网络地址和全 1 的广播地址)

4.3.2.2 B类地址

  • 最小网络号也是第一个可指派的网络号 128.0
    网络地址为 128.0.0.0
  • 最大网络号也是最后一一个可指派的网络号 191.255
    网络地址为 191.255.0.0
  • 可指派的网络数量为
  • 每个网络中可分配的IP地址数量为 (减2的原因是除去主机号为全 0 的网络地址和全1的广播地址)

4.3.2.3 C类地址

  • 最小网络号也是第一个可指派的网络号 192.0.0
    网络地址为 192.0.0.0
  • 最大网络号也是最后一一个可指派的网络号 223.255.255
    网络地址为 223.255.255.0
  • 可指派的网络数量为
  • 每个网络中可分配的IP地址数量为 (减2的原因是除去主机号为全 0 的网络地址和全 1 的广播地址)

4.3.2.4 一般不使用的特殊IP地址

4.3.3 划分子网的IPv4地址

首先先明确为何要引出划分子网的概念:在 ARPANET 的早期,IP 地址的设计确实不够合理:

  1. IP 地址空间的利用率有时很低。
  2. 给每一个物理网络分配一个网络号会使路由表变得太大因而使网络性能变坏。
  3. 两级的 IP 地址不够灵活。

例如:某一个大型局域网需要连接到因特网:

  • 此时由于C类地址不够存放所有主机,选择可分配主机数为65534个的B类地址,但是很明显此时会有很多主机地址没有被利用。
  • 但是对于剩余的IP地址只能由该单位的同一个网络使用,其他网络不得使用。

随着单位的发展,该单位需要将原来的网络划分成三个独立的网络。此时只能选择为子网申请新的网络号,但是申请新的网络号会带来以下弊端:

  • 需要等待时间和花费更多的费用
  • 会增加其它路由器中路由表记录的数量
  • 浪费原有网络中剩余的大量IP地址

因此提出了一种解决办法:从多余的主机号中借用一部分作为子网号,而不用申请新的网络地址。

但是此时出现了一个新的问题:计算机要如何知道分类地址中有多少比特被用作子网号了呢?这就提出了一个子网掩码的概念。

32bit子网掩码可以表明分类IP地址的主机号部分被借用了几个比特作为子网号。

  • 子网掩码用连续的比特1来对应网络号和子网号。
  • 子网掩码用连续的比特0来对应主机号。
  • 将划分子网的IPv4地址与其相应的子网掩码进行逻辑与运算就可以得到IPv4地址所在的子网的网络地址

4.3.4 无分类编址的IPv4地址

划分子网在一定程度上缓解了因特网在发展中遇到的困难,但是数量巨大的C类网因为其地址(主机地址)空间太小没有得到充分使用,而因特网的IP地址仍在加速消耗,整个IPv4地址空间面临全部耗尽的威胁。

因此因特网工程任务组IETF又提出了无分址编址方式来解决地址紧张的问题。

1993年,IETF发布了无分类域间路由选择(Classless Inter-Domain Routing,CIDR),其主要的特点:

  • CIDR消除了传统的A类、B类和C类地址,以及划分子网的概念。
  • CIDR可以更加有效分配IPv4的地址空间(使地址空间分配不再被主机号所限制,做到自由的根据主机规模分配),并且可以在新的IPv6使用之前允许因特网的规模继续增长。
  • CIDR使用各种长度的网络前缀(network-prefix)来代替分类地址中的网络号和子网号。

CIDR使用斜线记法,或称之为CIDR记法。即在IPv4地址前面加上斜线“/”,在斜线后面写上网络前缀所占比特数量(就是分类地址中的网络号和子网号)。

CIDR实际上使将网络前缀都相同的连续IP地址组成一个“CIDR地址块”。我们只要知道CIDR地址块中的任何一个地址就可以知道该地址块的全部细节,例如:

  • 地址块的最小地址
  • 地址块的最大地址
  • 地址块中的地址数量
  • 地址块聚合某类网络(A类、B类、C类)的数量
  • 地址掩码(也可继续称为子网掩码)

这里就出现了一个聚合的概念。其实聚合就是将多个小的网络连接起来,一起用一个大的网络分配给它们,向因特网只申请一个大的网络号,而不用申请多个小的网络号,因此形成了多个小网络聚合成一个大网络,减少了网络号的消耗。

4.3.5 IPv4地址的应用规划

IPv4地址的应用规划考虑的是给定一个IPv4地址块,如何将其划分成几个更小的地址块(来满足多子网划分),并将这些地址块分配给互联网中不同网络,进而可以给各网络中的主机和路由器接口分配IPv4地址。

IPv4的应用规划有两种:

  • 定长子网掩码(FLSM,Fixed Length Subnet Mask)

    使用同一个子网掩码来划分子网

    每个子网所分配的IP地址数量相同,造成IP地址浪费

  • 变长子网掩码(VLSM,Variable Length Subnet Mask)

    使用不同的子网掩码来划分子网

    每个子网所分配的IP地址数量可以不同,尽可能减少对IP地址的浪费

在地址块的分配原则中,每个子块的起点位置不能随意选取,只能选取块整数倍的地址作为起点,也就是比特位置上的位置。最好是先给大的子块分配子网。

4.4 IP数据报的发送和转发过程

IP数据包的发送和转发过程包含两个部分:

  • 主机发送IP数据报

    判断目的主机是否与自己在同一个网络:

    • 若在同一个网络,则属于直接交付
    • 若不在同一个网络,则属于间接交付,传输给主机所在网络的默认网关(路由器),由默认网关帮忙转发
  • 路由器转发IP数据报

    1. 检查IP数据报首部是否出错:
      • 若出错,则直接丢弃该IP数据报并告诉源主机
      • 若没有出错,则进行转发
    2. 根据IP数据报的目的地址在路由表中查找匹配的条目:
      • 若找到匹配的条目,则转发给条目中指示的下一跳
      • 若找不到,则丢弃该IP数据报并告诉源主机

4.5 静态路由配置及其可能产生的路由环路问题

静态路由配置是指用户或网络管理员使用路由器的相关命令给路由器人工配置路由表。

  • 这种人工配置方式简单、开销小。但不能及时适应网络状态(流量、拓扑等)的变化。
  • 一般只在小规模网络中采用。

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

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

对于有多个网络存在时,如连接到因特网,对每个网络都进行静态配置显然是不现实的,因此就引出了默认路由的概念。

静态路由配置错误导致路由环路问题:

聚合了不存在的网络而导致路由环路问题:

网络故障而导致路由环路问题:

假设路由器R1检测到其接口0所直连的网络出现了故障而不可达,就会自动在其路由表中删除该直连网络的路由条目。

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

4.6 路由选择协议

4.6.1 路由选择协议概述

路由器的选择协议分为两种:静态路由选择和动态路由选择。

静态路由选择 动态路由选择
由人工配置的网络路由、默认路由、特定主机路由、黑洞路由等都属于静态路由 路由器通过路由选择协议自动获取路由信息
这种人工配置方式简单、开销小
但是不能及时适应网络状态(流量、拓扑等)的变化
比较复杂、开销比较大
能较好的适应网络状态的变化
一般只在小规模网络中采用 适用于大规模网络

因特网所采用的路由选择协议的主要特点:

  1. 自适应:采用动态路由选择,能较好的适应网络状态的变化
  2. 分布式:路由器之间通过相互之间的信息交互,交换路由信息
  3. 分层次:将整个因特网划分为许多较小的自治系统AS(Autonomous System),例如,一个较大的因特网服务提供商(电信)就可以划分成一个自治系统,对于自治系统内部和自治系统外部,分别采用不同类别的路由选择协议进行路由选择。

因特网采用分层次的路由选择协议,自治系统之间称为域间路由选择,自治系统内称为域内路由选择。自治系统之间称为外部网关协议EGP(也可称为外部路由协议ERP),自治系统内称为内部网关协议IGP(也可称为内部路由协议IRP)。此处的网关就是路由器,只不过是路由器早期的名称。

注意:路由协议只是一个名称,并不是一个具体的协议。

4.6.1.1 常见的路由选择协议

4.6.1.2 路由器的基本结构

路由器是具有多个输入端口和输出端口的专用计算机,其任务是转发分组。

路由器主要由两部分组成:

  • 路由选择部分:
    核心构件是路由选择处理机,根据路由器选择协议,周期性的和其他路由器进行路由信息交互,构建路由表。
  • 分组转发部分:
    分组转发部分主要有三部分组成:交换结构、一组输入端口和一组输出端口。

路由表与转发表:

  • 路由表一般仅包含从目的网络到下一跳的映射。
  • 路由表需要对网络拓扑变化的计算最优化。
  • 转发表是从路由表得出的。
  • 转发表的结构应当使查找过程最优化。
  • ps:一般不严格区分路由表和转发表。

路由器还具有输入缓冲区、输出缓冲区。输入缓冲区用于存储新进入路由器但还来不及处理的分组。输出缓冲区用来存储已经处理完毕但是还来不及发送的分组。

4.6.1.3 路由器的基本工作过程

  1. 某IP数据报进入路由器输入端口后处理过程:①物理层将其信号转变成比特流,送交数据链路层处理;②数据链路层从比特流中识别出帧,去掉帧头和帧尾后送交网络层处理;③网络层中接收后判断其分组类型,若是普通的数据分组,会将其发送到分组处理机中;若是路由之间交换路由信息的路由报文,则会将该路由报文转发给路由处理机,路由处理机根据分组报文更新自己的路由表。
  2. 某数据报进入分组处理机构后处理过程:分组处理机会根据其分组首部中的目的地址进行查表转发,若找不到目的地址,则丢弃该分组,否则转发到下一个对应端口。
  3. 某IP数据报进入路由器输出端口后处理过程:①输出端口网络层会更新数据分组首部中某些字段的值,例如将数据分组生存时间(TTL)-1,然后送交数据链路层处理;②数据链路层封装成帧,交给物理层处理;③物理层将帧转为对应的比特流,在转换成电信号进行发送。

4.6.2 路由信息协议(RIP)的基本工作原理

RIP协议认为好的路由就是“距离短”的路由,就是所通过路由器数量最少的路由。

当到达同一目的网络有多条 “距离相等” 的路由时,可以进行等价负载均衡,就是将通信量均衡地分布到多条等价的路由上。

RIP包含以下三个要点:

  • 和谁交换信息:仅和相邻路由器交换信息
  • 交换什么信息:自己的路由表
  • 何时交换信息:周期性交换(例如每30秒)

4.6.2.1 RIP基本工作过程

4.6.2.2 RIP的路由条目的更新规则

4.6.2.3 RIP协议存在“坏消息传得慢”的问题

由于N1出现故障,R1路由器将N1的距离设置为16(16认为不可达)。

此时R2根据以前RIP协议获得的路由器情况,发送更新请求给R1,而此时R1的更新情况还没发给R2。

此时R1的路由器表先收到R2的路由器表后会根据上面说的更新规则进行更新,将N1到R2的距离更新为3。此时数据就是被谣言误导的。此后,两路由器之间会一直以被误导的数据进行循环更新路由数据,直到双方距离达到16(认为不可达)时,才会选择放弃传输。

在此过程中,就会出现路由环路,导致路由器间被占用长达数分钟的时间。

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

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

但是,就算采取了上述措施,由于向量计算算法的本质决定,“坏消息传得慢”问题还是有可能会出现。

4.6.3 开放最短路径优先(OSPF)的基本工作原理

  • 开放最短路径优先OSPF,是为了克服RIP的缺点在1989年开发出来的。

    • “开放”表明OSPF协议不是受某一家厂商控制,而是公开发表的
    • “最短路径优先”,是因为使用了迪杰斯特拉的最短路径算法SPF(最小生成树)
  • OSPF是基于链路状态的,而不是像RIP那样基于距离向量的。

  • OSPF采用SPF算法计算路由,从算法上保证了不会产生路由环路。
  • OSPF不限制网络规模,更新效率高,收敛速度快。
  • 链路状态是指本路由器都和哪些路由器相连,以及相应链路的代价。
    • 代价用来表示费用、距离、时延、带宽等等。代价的计算方法由网络管理人员来决定的,没有统一

4.6.3.1 五种OSPF分组类型

  1. 问候(Hello)分组:用来发现和维护邻居路由器的可达性
  2. 数据库描述(Database Description)分组:向邻居路由器给出自己的链路状态数据库中的所有链路状态项目的摘要信息
  3. 链路状态请求(Link State Request)分组:向邻居路由器请求发送某些链路状态项目的详细信息
  4. 链路状态更新(Link State Update)分组:路由器使用这种分组将其链路状态进行洪泛发送,即用洪泛法对全网更新链路状态
  5. 链路状态确认(Link State Acknowledgment)分组:这是对链路状态更新分组的确认分组

4.6.3.2 OSPF的基本工作过程

主要可以看成三个部分:

  1. 通过发送问候分组建立和维护邻居关系

  2. 链路状态数据库同步:

    先发送数据库描述分组,将自己链路状态数据库中的所有链路状态项目的摘要信息发送给邻居路由。

    路由器发送自己缺失某些链路状态摘要信息中的详细信息,就会向相邻路由发送链路状态请求分组。

    相邻路由器收到链路更新请求后会返回路由状态更新分组。

    发送请求的网络收到更新分组后会返回确认分组,一次更新数据过程结束。

  3. 同步状态后的链路状态数据库同步:
    在30分钟后或者链路状态发生变化后,会进行新的更新状态过程。

4.6.3.3 OSPF在多点接入网络路由器中邻居关系的建立

区域之间分为主干区域和区域。在图中可以看到有4种路由器:

  1. 区域内路由器(IR):只用于区域内通信。
  2. 区域边界路由器(ABR):用于区域间通信。
  3. 自治系统边界路由器(ASBR):用于和其他自治系统通信。
  4. 主干路由器(BBR):位于主干区域的路由器。

使用分层次划分区域的方法,虽然使交换信息的种类变多了,也使OSPF协议更复杂了,但是能使区域内部交换信息量大大减少,使得OSPF能用于规模很大的自治系统中。

4.6.4 边界网关协议(BGP)的基本工作原理

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

4.6.4.1 四种BGP-4报文

  1. OPEN(打开)报文:用来与相邻的另一个BGP发言人建立关系,使通信初始化
  2. UPDATE(更新)报文:用来通告某一路由的信息,以及列出要撤销的多条路由
  3. KEEPALIVE(保活)报文:用来周期性地证实邻站的连通性
  4. NOTIFICATION(通知)报文:用来发送检测到的差错

BGP刚刚运行时,BGP的邻站会交换整个BGP路由表,以后只需要在路由情况发生变化时更新有变化的部分。这样做对节省网络带宽和减少路由器的处理开销都有好处。

4.7 IPv4数据报的首部格式

在IP协议中分为两部分:

  • 固定部分:由20字节组成,是每个IP数据报都必须包含的部分。
  • 可变部分:可选字段,由40个字节组成,用来增加IP数据报的功能。

IP数据报的首部的每一行都由32个比特(4个字节)组成。在图中的每个小格子称为字段或者域。每个字段或者某个字段的组合用来表示IP协议的相关功能。

相关字段功能解释

  • 版本:占4比特,表示IP协议的版本。

    通信双方使用的IP协议的版本必须一致,目前广泛使用的IP协议版本号为4(即IPv4)。

  • 首部长度:占4比特,表示IP数据报首部的长度。

    该字段的取值以4字节为单位。

    最小十进制取值为5,表示IP数据报首部只有20字节固定部分;最大十进制取值为15,表示IP数据报首部包含20字节固定部分和最大40字节可变部分。

  • 区分服务:占8比特,用来获得更好的服务。

    该字段在旧标准中叫作服务类型,但实际上一直没有被使用过。

    只有在使用区分服务时,该字段才起作用。利用该字段的不同数值可提供不同等级的服务质量。一般情况下都不使用该字段。

  • 总长度:占16比特,表示IP数据报的总长度(首部+数据载荷)。

    最大取值为十进制的65535,以字节为单位。

  • 标识:占16比特。

    属于同一个数据报的各分片数据报应该具有相同的标识。

    IP软件维持一个计数器,每产生一个数据报,计数器值加1,并将此值赋给标识字段。

  • 标志:占3比特,各比特含义如下:

    ​ DF位:1表示不允许分片;0表示允许分片

    ​ MF位:1表示“后面还有分片”,0表示“这是最后一个分片”

    ​ 保留位:必须为0

  • 片偏移:占13比特,指出分片数据报的数据载荷部分偏移其在原数据报的位置有多少个单位。

    片偏移以8个字节为单位。

  • 生存时间TTL:占8比特。

    最初以秒为单位,最大生存周期为255秒。路由器转发IP数据报时,将IP数据报首部中的该字段的值减去IP数据报在本路由器上所耗费的时间,若不为0就转发,否则丢弃。

    现在以“跳数”为单位,路由器转发IP数据报时,将IP数据报首部中的该字段的值减1,若不为0就转发,否则丢弃。

  • 协议:占8比特,指明IPv4数据报的数据部分是何种协议数据单元。

    常用的一些协议和相应的协议字段值如下:

    | 协议名称 | ICMP | IGMP | TCP | UDP | IPv6 | OSPF |
    | ————— | —— | —— | —— | —— | —— | —— |
    | 协议字段值 | 1 | 2 | 6 | 17 | 41 | 89 |

  • 首部校验和:占16比特,用来检测首部在传输过程中是否出现差错。比CRC校验码简单,称为因特网校验和。

    IP数据报每经过一个路由器,路由器都要重新计算首部校验和,因为某些字段(生存时间、标志、片偏移等)的取值可能发生变化。

    由于IP层本身并不提供可靠传输的服务,并且计算首部校验和是一项耗时的操作,因此在IPv6中,路由器不再计算首部校验和,从而更快转发IP数据报。

  • 源IP地址和目的IP地址:各占32比特,用来填写发送该IP数据报的源主机的IP地址和接收该IP数据报的目的主机的IP地址。

  • 可选字段:长度从1个字节到40个字节不等,用来支持排错、测量及安全等措施。

    可选字段增加了IP数据报的功能,但这同时也使得IP数据报的首部长度成为可变的。这就增加了每一个路由器处理IP数据报的开销。实际上可选字段很少被使用。

  • 填充字段:因为IP地址首部的可选字段的长度为1个字节到40个字节不等,为了确保首部长度整体为4字节的倍数,因此需要用首部填充字段进行填充。

4.7.1 数据载荷

4.7.2 IP数据报分片

标识、标志、片偏移这三个字段共同用于数据报分片,此时就引起了数据报分片的概念。

简单来说,数据报分片就是数据报长度超过最大传输单元(MTU)时,将数据报进行分割的操作。

数据报长度超过最大传输单元(MTU)时将无法封装成帧,因此就将原IP数据报进行分片,使其成为更小的IP数据报。再逐个分配IP数据报封装成帧进行递交给物理层处理。

4.7.3 TTL防止路由环路

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

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

4.8.1 ICMP中的差错报告报文

ICMP中差错报告报文共有5种,分别是:终点不可达、源点抑制、时间超过、参数问题、改变路由(重定向)。

终点不可达:

源点抑制:

时间超过:

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

参数问题:

改变路由:

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

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

4.8.2 ICMP中的询问报文

4.8.3 ICMP的应用

4.8.3.1 分组网间探测PING

分组网间探测(Packet InterNet Groper,PING):

  • 用来测试主机或路由器之间的连通性
  • 应用层直接使用网际层的ICMP(没有经过运输层的TCP或UDP)
  • 使用ICMP回送请求和回答报文

4.8.3.2 跟踪路由traceroute

  • 用来测试IP数据报从源主机到达目的主机要经过哪些路由器
  • Windows版本
    • tracert命令
    • 应用层直接使用网际层ICMP
    • 使用了ICMP回送请求和回答报文以及差错报告报文
  • Unix版本
    • traceroute命令
    • 在运输层使用UDP协议
    • 仅使用ICMP差错报告报文

跟踪路由traceroute实现原理:简单来说,就是先发送一个TTL = 1的报文,当TTL到达第一个路由器后TTL变为0,此时路由器会回送时间超过差错报文,此时就能知道第一个路由信息。此时源主机再发送TTL = 2 的报文,当TTL到达第二个路由器后TTL变为0,此时路由器会回送时间超过差错报文,此时就能够知道第二个路由的地址。如此反复,直到到达最后一个路由。

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

4.9.1 虚拟专用网VPN(Virtual Private Network)

第一种方式就是采用电信公司的通信线路,这种方法简单方便,但是租金太贵。

第二种方式就是将两个网络通过因特网进行通信,但是他们之间的IP地址又如何分配?

首先明确一个概念:

  • 利用公用的因特网作为本机构各专用网之间的通信载体,这样的专用网称为虚拟专用网(VPN)

  • 由于IPv4地址的紧缺,一个机构在因特网上能够申请到的IPv4的地址数量往往是小于本机构所拥有得到主机数量。因此,虚拟专用网中个主机所分配的地址应该是本机构可自由分配的专用地址,而不是需要申请的、在因特网上使用的公有地址。

  • 在IPv4地址空间中就规定了这样的特殊地址分配方案:

    专用(私有)地址:

    10.0.0.0~10.255.255.255(10/8地址块)

    172.16.0.0~172.31.255.255(172.16/12地址块)

    192.168.0.0~192.168.255.255(192.168/16地址块)

    这些地址可以在本地自由分配,不会在因特网中造成冲突。私有地址只能用作本地地址,不能用作全球地址。

本地地址:仅在机构内部使用的 IP 地址,可以由本机构自行分配,而不需要向互联网的管理机构申请。

全球地址:全球唯一的 IP 地址,必须向互联网的管理机构申请。

在因特网中的所有路由器,对目的地址是私有地址的IP数据报一律不进行转发。

为了使两个部门的网络能够跟因特网连通,因此还需要两个路由器具有合法的全球IP地址,这样才能实现通过因特网通信。

虽然两个专用网内的主机间发送的数据报是通过了公用的因特网,但在逻辑上就好像是在本机构的专用网上传送一样。数据报在因特网中可能要经过多个网络和路由器,但从逻辑上看,R1和R2之间好像是一条直通的点对点链路,因此这种通信方式又称为IP隧道技术。

如上图所示,同一机构内不同部门的内部网络所构成的虚拟专用网VPN又称为内联网VPN。

有时一个机构的VPN需要有某些外部机构(通常就是合作伙伴)参加进来,这样的VPN就称为外联网VPN。

在外地工作的员工需要访问公司内部的专用网络时,只要在任何地点接入到因特网,运行驻留在员工PC中的VPN软件,在员工的PC和公司的主机之间建立VPN隧道,即可访问专用网络中的资源,这种VPN称为远程接入VPN。

4.9.2 网络地址转换NAT(Network Address Translation)

虽然因特网采用了无分类编址方式来减缓IPv4地址空间耗尽的速度,但由于因特网用户数目的激增,特别是大量小型办公室网络和家庭网络接入因特网的需求不断增加,IPv4地址空间即将面临耗尽的危险仍然没有解除。

1994年提出了一种网络地址转换NAT的方法再次缓解了IPv4地址空间即将耗尽的问题。NAT能使大量使用内部专用地址的专用网络用户共享少量外部全球地址来访问因特网上的主机和资源。

例如使用私有地址的主机要给因特网上使用全球IP地址的主机发送IP数据报:

因特网上的全球IP地址主机给源主机发回数据报:

NAT路由器接收到数据报后,根据首部的目的地址,查找NAT转换表后进行转换,转换成目的主机本地地址后进行传输。

当专用网中的这两台使用私有地址的主机都要给因特网使用全球地址的另一台主机发送数据报时,在NAT路由器的NAT转换表中就会产生两条记录,分别记录两个私有地址与全球地址的对应关系。

该转换方法存在一个问题:如果NAT路由器具有N个全球IP地址,那么至多只能有N个内网主机能够同时和因特网上的主机通信。

解决方法:由于绝大多数的网络应用都是使用运输层协议TCP或UDP来传送数据,因此可以利用运输层的端口号和IP地址一起进行转换。这样,用一个全球IP地址就可以使多个拥有本地地址的主机同时和因特网上的主机进行通信。这种将端口号和IP地址一起进行转换的技术叫作网络地址与端口号转换NAPT(Network Address and Port Translation)。

对于一些P2P网络应用,需要外网主机主动与内网主机进行通信,在通过NAT时会遇到问题,需要网络应用自己使用一些特殊的NAT穿越技术来解决问题。另外,由于NAT对外网屏蔽了内网主机的网络地址,能为内网的主机提供一定的安全保护。

5. 运输层

5.1 运输层概述

假设进程1与进程4之间进行基于网络的通信,它们通信的简单过程如下:

  1. 根据不同的进程,在运输层选择使用不同的端口
  2. 通过网络层及其下层来传输应用层报文
  3. 将收到的应用层报文到达接收方的运输层后,通过不同的端口,交付给应用层中相应的应用进程

ps:这里端口并不是指看得见、摸得着的物理端口,而是指用来区分不同应用进程的标识符。

运输层向高层用户屏蔽了下面网络核心的细节(如网络拓扑、所采用的路由选择协议等),它使应用进程看见的就好像是在两个运输层实体之间有一条端到端的逻辑通信信道。

根据应用需求的不同,因特网的运输层为应用层提供了两种不同的运输协议,即面向连接的TCP和无连接的UDP。

5.2 运输层端口号、复用和分用的概念

  • 在操作系统中,运行在计算机上的进程使用进程标识符PID来标志,但是因特网上的计算机并不是使用统一的操作系统,不同的操作系统使用不同格式的进程标识符。
  • 为了使运行不同系统的计算机的应用进程之间能够进行网络通信,就必须使用统一的方法来对TCP/IP体系的应用进程进行标识。
  • TCP/IP体系的运输层使用端口号来区分应用层的不同应用进程。
  • 端口号使用16比特表示,取值范围0~65535
    • 熟知端口号:0~1023,IANA把这些端口号指派给了TCP/IP体系中最重要的一些应用协议,例如:FTP使用21/20,HTTP使用80,DNS使用53,HTTPS使用443
    • 登记端口号:1024~49151,为没有熟知端口号的应用程序使用。使用这类端口号必须在IANA按照规定的手续登记,以防止重复。例如:Microsoft RDP微软远程桌面使用的端口是3389
    • 短暂端口号:49152~65535,留给客户进程选择暂时使用。当服务器进程收到客户进程的报文时,就知道了客户进程所使用的动态端口号。通信结束后,这个端口号可供其它客户进程以后使用
  • 端口号只具有本地意义,即端口号只是为了标识本计算机应用层中的各进程,在因特网中,不同计算机中的相同端口号是没有联系的。

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

发送方的某些应用进程所发送的不同应用报文,在运输层使用UDP协议进行封装,称为UDP复用;而另一些应用进程所发送的不同应用报文,在运输层使用TCP协议进行封装,称为TCP复用。

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

举例:运输层端口号

DNS服务器:记录有某域名所对应的IP地址,在输入网页域名后,在hosts中找不到网页对应的IP地址时,就要通过DNS服务器获取域名对应的IP地址。

Web服务器:某域名的服务器,也就是前面几章所说的目的主机,在访问域名时IP数据报最终到达Web服务器,服务器进行响应。

假如我们在浏览器中输入某域名访问,若此时在本地hosts缓存中有该域名的IP地址,直接发送带有目的地址的IP数据报;若计算机中没有该域名对应的IP地址,进行以下操作:

  1. 构建DNS请求报文,将该UDP请求封装成IP数据报通过以太网发送给DNS服务器。DNS服务器将UDP用户响应数据报封装在IP数据报中发送给用户。此时会将数据载荷,也就是DNS响应报文交给DNS进程进行处理,DNS进程将其响应报文进行解析,就可知道自己之前所请求的Web服务器的IP地址。

  2. 知道域名对应的IP地址后,可以开始构建HTTP请求,构建该请求需要TCP首部,封装在IP数据报中并发送该请求到Web服务器。Web服务器在接收到报文后会对其进行解析,在知道其端口为80后,会将数据载荷部分传输给本服务器中的HTTP服务器端进程进行解析。解析到内容后按照其要求查找首页内容,查找到后会给用户PC发送HTTP响应报文。

  3. 用户PC接收到报文后进行解封,解封后发现目的端口是49152,也就是用户PC内的HTTP进程。因此将数据载荷(HTTP报文)传输给HTTP进程进行处理。HTTP进程解析到其内容后,在网页浏览器中进行展示。

5.3 UDP与TCP的对比

  1. 连接方式上:

  2. 传播方式上:

  3. 报文传输处理上:

  4. 给上层提供服务上:

  5. 协议首部对比上:

UDP(User Datagram Protocol) TCP(Transmission Control Protocol)
无连接 面向连接
支持一对一、一对多、多对一、多对多交互通信 每一条TCP连接只能有两个端点,只能一对一通信
对应用层交付的报文直接打包 面向字节流
尽最大努力交付,也就是不可靠;不使用流量控制和拥塞控制 可靠传输,使用流量控制和拥塞控制
首部开销小,仅8个字节 首部最小20字节,最大60字节

5.4 TCP流量控制

  • 对于数据传输,我们希望传输得越快越好,但是若传输过快会导致接收方不够时间接收数据,造成数据丢失。
  • 流量控制(flow control)就是为了让发送方速率不要太快,要让接收方来得及接收。
  • 利用滑动窗口机制可以很方便地在TCP连接上实现对发送方的流量控制。

ACK = 1:表示是一个TCP确认字段
ack = 201:201编号以前的数据全部确认收到
rwnd = 300:将接收窗口大小调整为300

此时由于窗口为0,不再发送数据。

为了解决这个问题,TCP为每一个连接设有一个持续计时器。在连接的一方接收到对方的零窗口通知后一段时间后,超时计时器到时,就会发送一个1字节的零窗口发送报文,在接收方接收到该信号后,就会通告自己的窗口大小。当知道窗口可以传输数据后,就会开始通信。

上图如果零窗口探测报文在发送过程中如果丢失,还是能打破死锁局面。因为零窗口探测报文段也有重传计时器,重传计时器超时后,零窗口探测报文段会被重传。

值得注意的是,TCP中规定不论接收方有没有空间,都必须接收发送方的3种报文:零窗口检测报文段、确认报文段、携带有紧急数据的报文段。

5.5 TCP拥塞控制

  • 拥塞指的是某段时间内,若对网络中的某一资源的需求超过了该资源所能提供的可用部分,网络性能就要变坏。

    • 在计算机网络中的资源包括链路容量(即带宽)、交换节点中的缓存和处理机等。
  • 若出现拥塞而不进行控制,整个网络的吞吐量将随输入负载的增大而下降。

在图中,绿色指的是理想情况下不发生拥塞的情况,此时吞吐量与输入负载相等。当网络资源数被全部利用时,吞吐量不再增长。

红色线指的是出现拥塞不进行处理,会导致吞吐量下降,直到吞吐量为零,产生死锁现象。

蓝色线是实际的拥塞控制曲线,在出现拥塞后采用拥塞控制措施,使吞吐量保持在一定水平。

拥塞控制的4种算法:慢开始(slow-start)、拥塞避免(congestion avoidance)、快重传(fast retransmit)、快恢复(fast recovery)。

在讨论4种算法前,假定如下条件:

  1. 数据是单方向传送,而另一个方向只传送确认
  2. 接收方总是有足够大的缓存空间,因而发送方发送窗口的大小由网络的拥塞程度来决定
  3. 以最大报文段(MSS)的个数为讨论问题的单位,而不是以字节为单位

5.5.1 慢开始与拥塞避免

  • 慢开始算法是用来确定网络的负载能力或拥塞程度。
  • 算法是实现是由小到大逐渐增大(以倍数增长)拥塞窗口数值。
    以一次数据报文传输过程学习慢开始算法
  • 慢开始指的是一开始网络注入的报文段少,并不是指拥塞窗口cwnd的增长速度慢。

拥塞窗口达到慢开始门限ssthresh后,慢开始算法使用阶段结束,开始拥塞避免算法阶段。

  • 拥塞避免算法让拥塞窗口 cwnd 缓慢地增大(每轮窗口大小+1),避免出现拥塞。
  • 在拥塞避免阶段,具有 “加法增大” (Additive Increase) 的特点。
  • 拥塞避免算法并不能完全避免拥塞,只是在拥塞避免阶段将容易拥塞的窗口控制为按线性规律增长,使网络比较不容易出现拥塞。

循环重复此传输过程,若传输过程中部分报文段丢失,在重传计时器时间内没有收到确认报文(即重传计时器超时),则判断网络很可能出现了拥塞。进行以下工作:

  1. 将ssthresh值更新为拥塞时cwnd值的一半
  2. 将cwnd值减少为1,重新开始执行慢开始算法

5.5.2 快重传与快恢复

  • 采用快重传算法可以让发送方尽早知道发生了个别报文段的丢失。
  • 所谓快重传,就是使发送方尽快进行重传,而不是等超过重传计时器超时再重传。
    • 要求接收方不要等待自己发送数据时才进行捎带确认,而是要立即发送确认。
    • 即使收到了失序的报文段也要立即发出对已收到的报文段的重复确认。
    • 发送方一旦收到了3个连续的重复确认,就将相应的报文段立即重传,而不是等该报文段的超时重传计时器超时再重传。
    • 对于个别丢失的报文段,发送方不会出现超时重传,也就不会误认为出现了拥塞(进而降低拥塞窗口cwnd为1)。使用快重传可以使整个网络的吞吐量提高约20%。
  • 发送方一旦收到3个重复确认,就知道现在只是丢失了个别的报文段。于是不启动慢开始算法,而执行快恢复算法。
    • 发送方将慢开始门限ssthresh值和拥塞窗口cwnd值调整为当前窗口的一半,开始执行拥塞避免算法。
    • 也有的快恢复实现是把快恢复开始时的拥塞窗口cwnd值再增大一些,即等于新的ssthresh+3。
      • 既然发送方收到了3个重复的确认,就表明有3个数据报文段已经离开了网络;
      • 这3个报文段不再消耗网络资源而是停留在接收方的接收缓存中;
      • 可见现在网络中不是堆积了报文段而是减少了3个报文段,因此可以适当把拥塞窗口扩大些。

5.6 TCP超时重传时间的选择

TCP超时重传时间的选择是TCP最复杂的问题之一,若超时重传时间(RTO)比往返时间(RTT)短会导致不必要的重传,使网络负荷增大;若RTO比RTT过长会导致网络的空闲时间增大,降低了传输效率。因此,RTO的设置应该略大于往返时间(RTT)。但是此时又会出现一个问题,由于网络传输环境的不同,导致接下来的RTT是不确定的,如此应该如何认定RTO?

举例:

5.7 TCP可靠传输的实现

TCP基于以字节为单位的滑动窗口来实现可靠传输。

例如:接收方告诉发送方它的接收窗口为20字节,确认号字段的值为31,这表明接收方希望收到下一个数据的序号为31,序号为31前的数据已被正确接收。

若接收方收到未按序到达的数据,如本例收到32、33编号字节数据,由于TCP的确认方式是只能发送按序收到的最高序号确认,因此发送一个ack = 31的确认信号,也就是表示现在需要发送方发送31号数据。

发送方收到ack = 31报文后,知道31号数据未按序到达,但是根据上面所学的知识,只有3次接收到同一个ack信号才会进行重传,此时不做处理,继续发送往下的数据。

此时若成功接收到31号数据,此时31到33号数据按序到达,此时接收方会择机将数据交给应用层,并且将窗口向后滑动3字节,同时发送确认报文。

在接收方发送的确认报文被发送方收到后,会将发送窗口向后滑动若干字节(此处为3字节)。发送方此时会将31、32、33字节数据从缓存中删除。此时若发送方又发送了3个未按序到达的数据,接收方接受数据后不做处理。

若发送方发送完全部的发送窗口数据,此时不能再发送数据。若迟迟等不到接收方确认信号,重传计时器超时,此时会重新发送发送窗口内已发送的数据,并重启重传计时器。

5.8 TCP的运输连接管理

5.8.1 TCP的连接建立(三次握手)

TCP的连接建立要解决以下三个问题:

  1. 使TCP双方都能确知对方的存在
  2. 使TCP双方能够协商一些参数(如窗口最大值、是否使用窗口扩大选项和时间戳选项和服务质量等等)
  3. 使TCP双方能够对运输实体资源(如缓存大小、连接表中的项目等)进行分配

使用三报文握手建立连接的具体过程:

在最开始,客户端和服务器都是处于关闭状态,此时双方的TCP进程都是关闭的。服务器在连接之前要进行准备,创建传输控制块,在块中有TCP连接表等一些TCP连接的重要信息。创建后便开始监听,准备接收来自客户端的连接请求。与服务器类似,客户端进程也需要进行准备,其准备过程只有创建传输数据块。准备完毕后开始“握手”。

在打算建立TCP连接时,客户端向服务器进程发送TCP连接请求报文段,并进入同步已发送状态。TCP连接请求报文段首部中,有两个关键数据位:

  • 同步位SYN:被设置为1,表明这是一个TCP连接请求报文段
  • 序号字段seq:被设置了一个初始值x,作为TCP客户端进程所选择的初始序号

注意:TCP规定SYN被设置为1的报文段不能携带数据,但要消耗掉一个序号。

TCP服务器进程收到客户端发送的TCP连接请求报文段后,如果同意建立连接,则向TCP客户进程发送TCP连接请求确认报文段,并进入同步已接收状态。TCP连接请求确认报文段首部中有几个关键数据位:

  • 同步位SYN和确认位ACK:都设置为1,表明这是一个TCP连接请求确认报文段
  • 序号字段seq:设置了一个初始值y,作为TCP服务器进程所选择的初始序号
  • 确认号字段ack:值被设置成了x+1,这是对TCP客户进程所选择的初始序号(seq)的确认

注意:这个报文段也不能携带数据,因为它是SYN被设置为1的报文段,但同样要消耗掉一个序号。

TCP客户进程收到TCP连接请求确认报文段后,还要向TCP服务器进程发送一个普通的TCP确认报文段,并进入连接已建立状态。普通的TCP确认报文段首部中有以下重点数据位:

  • 确认位ACK:设置为1,由于没有SYN同步字段,表明这是一个普通的TCP确认报文段,表示已确认收到建立连接报文
  • 序号字段seq:设置为x+1,因为TCP客户进程发送的第一个TCP报文段的序号为x,所以TCP客户进程发送的第二个报文段的序号为x+1(SYN字段报文需要消耗一个序号)
  • 确认号字段ack:设置为y+1,这是对TCP服务器进程所选择的初始序号的确认

注意:TCP规定普通的TCP确认报文段(只有ACK没有SYN)可以携带数据,但如果不携带数据,则不消耗序号。

三次握手完毕后,服务器也进入连接已建立状态,此时双方连接已建立,可以开始进行数据传输。

为什么TCP客户进程最后还要发送一个普通的TCP确认报文段呢?是否多余?

三次握手并不多余,三次握手建立连接是为了防止已经失效的连接请求报文段突然又传到服务端,产生错误。

5.8.2 TCP的连接释放(四次挥手)

TCP通过四报文挥手来释放连接:

在双方连接已建立后,此时客户端主动发出关闭信号。

TCP客户进程会发送TCP连接释放报文段,并进入终止等待1状态。TCP连接释放报文段首部中有以下关键数据位:

  • 终止位FIN和确认位ACK:值都被设置为1,表明这是一个TCP连接释放报文段,同时也对之前收到的报文段进行确认
  • 序号字段seq:值设置为u,表示TCP客户进程之前已传送过的、数据的最后一个字节的序号加1
  • 确认号字段ack:值设置为v,表示TCP服务器进程之前已传送过的、数据的最后一个字节的序号加1

注意:TCP规定终止位FIN等于1的报文段即使不携带数据,也要消耗掉一个序号。

接收方在接收到连接释放报文后,会发送一个普通的TCP确认报文段并且进入关闭等待状态。普通的TCP确认报文段首部中有以下关键数据位:

  • 确认位ACK:值被设置为1,表明这是一个普通的TCP确认报文段
  • 序号字段seq:值设置为v,v等于TCP服务器进程之前已传送过的、数据的最后一个字节的序号加1,与之前收到的TCP连接释放报文段中的确认号ack值匹配
  • 确认号字段ack:值为u+1,这是对TCP连接释放报文段的确认,也就是为发送方连接释放报文中的seq的值+1

在进行第二次挥手后,会产生以下过程:

TCP服务器进程通知高层应用进程,TCP客户进程要断开与自己的TCP连接,此时的TCP连接进入半关闭状态。

所谓半关闭状态可以认为,此时客户端与服务器的连接不再传输数据,也就是客户端没有数据发送。而此时服务器若有剩余数据要发送会继续发送。客户端到服务器的数据传输信道关闭了,而服务器到客户端这一半没有关闭,因此称为半关闭状态。这个半关闭状态可能会持续一段时间,直到发送方没有数据进行发送。

在以上等待过程中,客户端会进入终止等待2状态:

当服务器没有数据要传输后,进行第三次挥手:

此时TCP服务器进程会发送TCP连接释放报文段并进入最后确认状态。在该报文段中有以下关键数据段:

  • 终止位FIN和确认位ACK:值都被设置为1,表明这是一个TCP连接释放报文段,同时也对之前收到的报文段进行确认
  • 序号seq:值为w,因为在半关闭状态下,TCP服务器进程可能又发送一段数据,因此w就是该段数据最后的序号
  • 确认号ack:值为u+1,这是对之前收到的TCP连接释放报文段的重复确认,因此值为发送方第一次挥手发送的seq值+1

TCP客户进程收到TCP连接释放报文段后开始第四次挥手:

此时针对第三次挥手的报文段发送普通的TCP确认报文段,之后进入时间等待状态。该报文段首部中有以下关键数据位:

  • 确认位ACK:值被设置为1,表明这是一个普通的TCP确认报文段
  • 序号字段seq:值设置为u+1,用来表示最后一个发送的字节序号,这是因为TCP客户进程之前发送的TCP连接释放报文段(带有FIN)虽然不携带数据,但要消耗掉一个序号
  • 确认号ack:值设置为w+1,这是对所收到的TCP连接释放报文段的确认

TCP服务器进程收到该报文段后就进入关闭状态,而TCP客户进程还要经过2倍的MSL后才能进入关闭状态:

MSL具体的值可以根据TCP协议的不同实现进行设置。

为什么不发送报文段后直接关闭,而是要等待2MSL个时间后才关闭?是否有必要?

若客户端发送完最后一次报文后,也就是第四次挥手后就直接进入关闭状态,此时若第四次挥手报文丢失,会导致服务器的超时重传。

此时客户端又已经关闭,导致不接受该报文,因此服务器会一直不断重传,并一直处于最后确认状态无法进入关闭状态。

因此,有以下结论:客户端进入时间等待状态以及处于该状态2MSL时长,可以确保TCP服务器进程可以收到最后一个TCP确认报文段而进入关闭状态。

TCP客户进程在发送完最后一个TCP确认报文段后,再经过2MSL时长,就可以使本次连接持续时间内所产生的所有报文段都从网络中消失,这样就可以使下一个新的TCP连接中,不会出现旧连接中的报文段。

若出现这样一种情况:

TCP双方已经建立了连接,但是传输过程中TCP客户进程所在的主机出现了故障,此时TCP服务器进程以后就不能再收到TCP客户进程发来的数据,这时服务器进程会一直处于等待状态。为了使TCP服务器进程不要再白白等待下去,出现了TCP保活计时器:

5.9 TCP报文的首部格式

  • 为了实现可靠传输,TCP采用了面向字节流的方式。
  • TCP在发送数据时,从发送缓存中取出一部分或者全部字节,并给其添加一个首部使之成为TCP报文段后进行发送。
    • 一个TCP报文段由首部和数据载荷两部分构成;
    • TCP的全部功能都体现在它首部中各字段的作用。

TCP首部和IP地址的首部类似,都由固定部分和扩展部分构成。

相关字段功能解释

  • 源端口和目的端口:各占16比特。
  • 序号:占32比特,取值范围,序号增加到最后一个后,下一个序号又从0开始。用来指出本TCP报文段数据载荷的第一个字节的序号。
  • 确认号:占32比特,取值范围,确认号增加到最后一个后,下一个确认号又从0开始。用来指出期望收到对方下一个TCP报文段的数据载荷的第一个字节的序号,同时也是对之前收到的所有数据的确认。若确认号=n,则表明到序号n-1为止的所有数据都已被正确接收,期望接受序号为n的数据。
  • 数据偏移:占4比特,并以4字节为单位。用来指出TCP报文段的数据载荷部分的起始处距离TCP报文段的起始处有多远。这个字段实际上指出了TCP报文段的首部长度,最小为20字节,最大为60字节。
  • 保留:占6比特,保留为今后使用,但目前应置为0。
  • 紧急标志位URG:1表示紧急指针字段有效;0表示无效。
  • 确认标志位ACK:1表示确认号字段有效;0表示无效。TCP规定在连接建立后所有传送的TCP报文段都必须把ACK置1。
  • 推送标志位PSH:接收方的TCP收到该标志位为1的报文段会尽快上交应用进程,而不必等到接收缓存都填满后再向上交付。
  • 复位标志位RST:用来复位TCP连接。当RST=1时,表示TCP连接出现了异常,必须释放连接,然后再重新建立连接。RST置1还用来拒绝一个非法的报文段或拒绝打开一个TCP连接。
  • 同步标志位SYN:在TCP连接建立时用来同步序号。
  • 终止标志位FIN:用来释放TCP连接。
  • 窗口:占16比特,以字节为单位。指出发送本报文段的一方的接收窗口。窗口值作为接收方让发送方设置其发送窗口的依据。这是以接收方的接受能力来控制发送方的发送能力,称为流量控制。
  • 校验和:占16比特,检查范围包括TCP报文段的首部和数据载荷两部分。在计算校验和时,要在TCP报文段的前面加上12字节的伪首部。
  • 紧急指针:占16比特,以字节为单位,用来指明紧急数据的长度。当发送方有紧急数据时,可将紧急数据插队到发送缓存的最前面,并立刻封装到一个TCP报文段中进行发送。紧急指针会指出本报文段数据载荷部分包含了多长的紧急数据,紧急数据之后是普通数据。
  • 选项:
    • 最大报文段长度MSS选项:TCP报文段数据载荷部分的最大长度。
    • 窗口扩大选项:为了扩大窗口(提高吞吐率)。
    • 时间戳选项:①用来计算往返时间(RTT);②用于处理序号超范围的情况,又称为防止序号绕回(PAWS)。
    • 选择确认选项
  • 填充:由于选项的长度可变,因此使用填充来确保报文段首部是4的整数倍。

5.9.1 序号、确认号、ACK字段

6. 应用层

6.1 应用层概述

应用层解决通过应用进程的交互来实现特定网络应用的问题。

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

  • 早期基于文本的应用(电子邮件、远程登录、文件传输、新闻组)
  • 20世纪90年代将因特网带入千家万户的万维网(WWW)
  • 当今流行的即时通信、P2P文件共享及各种音视频应用
  • 计算设备的小型化和“无处不在”,宽带住宅接入和无线接入的日益普及和迅速发展,为未来更多的新型应用提供了广阔的舞台

6.2 客户/服务器(C/S)方式和对等(P2P)方式

  • 网络应用程序运行在处于网络边缘的不同的端系统上,通过彼此间的通信来完成某项任务。

  • 开发一种新的网络应用给首先要考虑的问题就是网络应用程序在各种端系统上的组织方式和他们之间的关系。

    目前流行的主要有以下两种:

    客户/服务器(Client/Server,C/S)方式
    对等方式(Peer-to-Peer,P2P)方式

6.2.1 客户/服务器方式

6.2.2 对等方式

6.3 动态主机配置协议(DHCP)

互联网广泛使用的动态主机配置协议 DHCP (Dynamic Host Configuration Protocol) ,它提供了即插即用连网 (plug-and-play networking) 的机制。这种机制允许一台计算机加入新的网络和自动获取 IP 地址,而不用手工配置。

在没有DHCP时,我们需要手动给每台主机设计IP地址、子网掩码、默认网关等数据。

当在网络中设置DHCP服务器后:

6.3.1 DHCP工作过程

  • DHCP 使用客户/服务器方式

  • DHCP在运输层使用UDP协议,DHCP 服务器运行在 67 号端口, DHCP客户运行在 68 号端口

1.客户端广播DHCP发送报文:

由于此时客户端还没有设置地址,所以将源地址设置为0.0.0.0,目的地址设置为广播地址255.255.255.255,目的端口设置为67(DHCP服务器端口)。除了DHCP服务器外,其他进程不能接收该UDP报文(其他接收端口不是67)。

在DHCP发送报文中格式比较复杂,只需要知道其内部有事务ID和DHCP客户端的MAC地址。

DHCP服务器进程是一直运行的,当收到DHCP发送报文后,会根据其MAC地址在自己的数据库查找,若数据库中有该MAC地址的配置信息,则用这些配置信息来构建发送报文。若没有,则采用默认信息来构建并发送DHCP报文。

2.DHCP服务器接收报文后返回DHCP提供报文:

源地址设置为服务器地址,由于客户端还没有设置地址,所以将目的地址设置为广播地址255.255.255.255(只有广播地址能使其接收到),目的端口设置为68(DHCP客户端端口)。除了DHCP客户端外,其他进程不能接收该UDP报文(其他接收端口不是68)。

3.客户端发送选择服务器的发送请求报文:

为了避免向网络中的每一个DHCP服务器单播发送DHCP请求报文,选择广播发送报文,来告知他们是不是自己选择的DHCP服务器。DPCH服务器根据报文中的内容,若发现其选择是本服务器,便将其接收,并给该客户端发送DHCP确认报文。

4.DHCP服务器发送确认报文:

当到达租用期的一半时,会发送续约请求给服务器,根据服务器情况进行相应反馈。若没收到服务器反馈,会在0.875个租用期后再次发送并等待回应。若还是没有反应,会在租用期过期后立即放弃使用该IP地址。

注意:客户端可以随时终止使用该IP地址。

6.3.2 DHCP中继代理

有路由器进行隔离的网络能使用DHCP吗?

由于路由器隔离广播域,因此其DHCP请求报文不能发送到DHCP服务器中,所以其不能使用DHCP服务。解决方法是给路由器配置DHCP服务器的IP地址使其成为DHCP代理中继:

这样做的原因是可以减少DHCP服务器的数量。通过中继代理进行转发来获取DHCP,而不用新增加一个DHCP服务器。

6.4 域名系统(DNS)

域名系统(Domain Name System,DNS)的作用是将请求的域名转换为IP地址,给相关程序进行发送IP请求。DNS报文使用运输层的UDP协议进行封装,运输层端口号为53。

6.4.1 域名空间

6.4.2 域名服务器

6.4.3 域名解析过程

6.4.4 高速缓存

6.5 文件传送协议(FTP)

  • 文件传送是将某台计算机中的文件通过网络传送到可能相距很远的一台计算机中,是一项基本的网络应用。

  • 文件传输协议(File Transfer Protocol,FTP)是因特网上使用的最广泛的文件传送协议。

    • FTP提供交互式的访问,允许客户指明文件的类型和格式(如指明是否使用ASCII码),并允许文件具有存取权限(如访问文件必须经过授权,并输入有效的口令)。

    • FTP屏蔽了各计算机系统的细节,因而适合于在异构网络中任意计算机之间传输文件。

  • 在因特网发展早期阶段,用FTP传输占整个因特网通信量的三分之一,而电子邮件和域名系统所产生的通信量还要小于FTP所产生的通信量。到了1995年,万维网(WWW)的通信量才首次超过了FTP。

6.5.1 FTP的应用

FTP使用C/S方式(用户/服务器方式),端口号为21/20。

FTP客户计算机可将各种类型的文件上传到FTP服务器计算机:

FTP客户计算机可以从FTP服务器计算机下载文件:

FTP服务器可以有专用的高速服务器组成,也可以是普通的个人计算机。在Windows中就可以使用自带的FTP服务创建FTP 服务器,或者使用第三方FTP软件创建客户端。

FTP的常见用途是在计算机之间传输文件,尤其是用于批量传输文件。FTP的另一个常见用途是让网站设计者将构成网站内容的大量文件批量上传到他们的Web服务器。

6.5.2 FTP的基本工作原理

默认情况下,FTP使用TCP 21端口进行控制连接,TCP 20端口进行数据连接。

控制连接在整个会话期间一直保持打开,用于传送FTP相关的控制命令。

传输连接用于文件传输,每次文件传输时才建立,传输结束后就关闭。

6.6 电子邮件

  • 电子邮件(E-mail)是因特网上最早流行的一种应用,并且仍是当今因特网上最重要、最实用的应用之一。
  • 传统的电话通信属于实时通信,具有以下两个缺点:
    • 电话通信的主叫和被叫方必须同时在场
    • 一些不是十分紧迫的电话也常常不必要地打断人们的工作或休息
  • 电子邮件和邮件系统的寄信相似,其工作过程如下:
    1. 发件人将邮件发送到自己使用的邮件服务器
    2. 发件人的邮件服务器将收到的邮件按其目的地址转发到收件人邮件服务器中的收件人邮箱
    3. 收件人在方便的时候访问收件人邮件服务器中自己的邮箱,获取收到的电子邮件
  • 电子邮件使用方便、传递迅速而且费用低廉。它不仅可以传送文字信息,而且还可附上声音和图像。
  • 由于电子邮件的广泛应用,现在许多国家已经正式取消了电报业务。在我国,电信局的电报业务也因电子邮件的普及而濒临消失。

6.6.1 SMTP基本工作原理

简单邮件传送协议(Simple Mail Transfer Protocol, SMTP)

SMTP发送方的邮件服务器会周期性对邮件进行缓存扫描,若发现有邮件,会通过TCP协议,端口号25与接收方的邮件服务器建立连接。

建立这条连接后,STMP客户基于这条连接给SMTP服务器发送SMTP命令,共14条。SMTP服务器会给SMTP客户端发送相应的应答,共21种。

双方通过这种命令和应答的方式最终实现客户端发送邮件给SMTP服务器。

6.6.2 电子邮件格式

电子邮件的信息格式并不是由SMTP定义的,而是在RFC 822中单独定义的。这个RFC文档已在2008年更新为RFC 5322。一个电子邮件有信封和内容两部分。而内容又由首部和主体两部分构成。

6.6.3 多用途因特网邮件扩展MIME

多用途因特网邮件扩展(Multipurpose Internet Mail Extension,MIME)增加了5个新的邮件首部字段,这些字段提供了有关邮件主体的信息。定义了许多邮件内容的格式,对多媒体电子邮件的表示方法进行了标准化。定义了传统编码,可对任何内容格式进行转换,而不会被邮件系统改变。

实际上,MIME不仅仅用于SMTP,也用于同样面向ASCII字符的HTTP。

6.6.4 邮件读取协议

6.6.5 基于万维网的电子邮件

6.7 万维网(WWW)

  • 万维网WWW(World Wide Web)并非某种特殊的计算机网络。它是一个规模很大、联机式的信息储藏所,是运行在因特网上的一个分布式应用。
  • 万维网利用网页之间的超链接将不同网站的网页链接成一张逻辑上的信息网。万维网用链接的方法能非常方便地从互联网上的一个站点访问另一个站点,从而主动地按需获取丰富的信息。

客户端向目的IP地址发送请求,服务器收到后会通过因特网发送响应报文,解析成万维网文档,显示在客户端上。

为了方便地访问在世界范围的文档,万维网使用统一资源定位符URL来指明因特网上任何种类“资源”的位置。

URL的一般格式由以下四个部分组成:

6.7.1 万维网文档

我们对浏览器的页面进行另存为到本地,其文件就是万维网的文档。

6.7.2 超文本传输协议(HTTP)

HTTP定义了浏览器(万维网进行)怎样向万维网服务器请求万维网文档,以及万维网服务器怎么样把万维网文档传送给浏览器。

首先客户进程会利用80端口和服务器建立TCP请求,然后通过该连接发送HTTP请求报文。服务器收到请求报文后也会通过该连接发送HTTP响应报文。

6.7.3 HTTP报文格式

响应报文中常见的状态行:

1
2
3
HTTP/1.1 202 Accepted		接受请求
HTTP/1.1 400 Bad Request 错误的请求
HTTP/1.1 404 Not Found 找不到页面

6.7.5 万维网缓存与代理服务器

  • 在万维网中还可以使用缓存机制以提高万维网的效率。
  • 万维网缓存又称为Web缓存(Web Cache),可位于客户机,也可位于中间系统上。位于中间系统上的Web缓存又称为代理服务器(Proxy Server)。
  • Web缓存把最近的一些请求和响应暂存在本地磁盘中。当新请求到达时,若发现这个请求与暂时存放的请求相同,就返回暂存的响应,而不需要按URL的地址再次去因特网访问该资源。

当校园网中的某台主机要访问因特网上的原始服务器时,会先请求代理服务器,若代理服务器存放有所请求的对象,则代理服务器会向该主机发回所包含的请求对象的响应。

当校园网中的某台主机要访问因特网上的原始服务器时,请求代理服务器,若代理服务器没有所请求的对象,则代理服务器会向原始服务器发送请求。服务器响应后,代理服务器会将其放入自己的Web缓存,再将其发给用户主机。

有这样一种情况:若代理服务器存放该请求的缓存后,原始服务器该请求响应有所修改,此时若用户再次请求,在代理服务器的缓存中就是旧的响应报文了。所以原始服务器通常会为每个响应的对象设定一个修改时间字段和一个有效日期字段。

若修改时间字段未过期,则会之间将缓存中报文封装在响应报文中发回给主机。

若修改时间已过期,此时会向原始服务器发送一个if-modified-since信号,意思是询问是否发生响应文档改变。若没有改变,则原始服务器回送一个Not Modified信号,代理服务器接收到后会将修改时间改为当前时间,不修改缓存中的文档,并且将缓存中的文档包装在响应报文中发送给用户主机。

若修改时间已过期,此时会向原始服务器发送一个if-modified-since信号,意思是询问是否发生响应文档改变。若改变,则原始服务器会在响应报文中附带修改后的文档,代理服务器接收到后会将修改时间改为当前时间,并且缓存中的文档进行更新,更新后,将缓存中新的文档包装在响应报文中发送给用户主机。