2019-05-12 16:12:43 qq_36982160 阅读数 107

计算机网络第四弹——网络层

彩蛋

计算机网络谢希仁第七版原版ppt获取方式:公众号后台回复”N3“即可获取。

由于公众号不支持显示LaTeX公式且公众号排版混乱,建议大家关注微信公众号"IT工匠",后台回复"N4-3"获取xmind源文件以及本文原文pdf文件获取更佳阅读体验。

本文主要内容:

计算机网络第四弹——网络层

网络层主要负责把运输层产生的报文段(TCP)用户数据报(UDP)封装成分组进行传送。

在TCP/IP体系中,由于网络层使用IP协议,因此分组也叫做IP数据报,或简称为数据报

网络层提供的两种服务

在计算机网络领域,网络层应该向运输层提供怎样的服务(“面向连接”还是“无连接”)曾引起了长期的争论。 争论焦点的实质就是:在计算机通信中,可靠交付应当由谁来负责?是网络还是端系统?针对这一点,有两种观点:

1:让网络负责可靠交付

2:网络提供数据报服务

让网络负责可靠交付——虚电路服务

这种观点认为,应借助于电信网的成功经验,让网络负责可靠交付,计算机网络应模仿电信网络,使用面向连接的通信方式。 通信之前先建立虚电路 (Virtual Circuit),以保证双方通信所需的一切网络资源。 如果再使用可靠传输的网络协议,就可使所发送的分组无差错按序到达终点,不丢失、不重复,如图1-1所示:

image-20190511163727019

图1-1:H1 发送给 H2 的所有分组都沿着同一条虚电路传送

虚电路表示这只是一条逻辑上的连接,分组都沿着这条逻辑连接按照存储转发方式传送,而并不是真正建立了一条物理连接。 请注意,电路交换的电话通信是先建立了一条真正的连接。 因此分组交换的虚连接和电路交换的连接只是类似,但并不完全一样。

网络提供数据报服务——数据报服务

互联网的先驱者提出了一种崭新的网络设计思路。 网络层向上只提供简单灵活的、无连接的尽最大努力交付的数据报服务。 网络在发送分组时不需要先建立连接每一个分组(即 IP 数据报)独立发送,与其前后的分组无关(不进行编号)。 网络层不提供服务质量的承诺。即所传送的分组可能出错、丢失、重复和失序(不按序到达终点),当然也不保证分组传送的时限,如图1-2所示:

image-20190511164039937

图1-2:H1 发送给 H2 的分组可能沿着不同路径传送

由于传输网络不提供端到端的可靠传输服务,这就使网络中的路由器可以做得比较简单,而且价格低廉(与电信网的交换机相比较)。 如果主机(即端系统)中的进程之间的通信需要是可靠的,那么就由网络的主机中的运输层负责可靠交付(包括差错处理、流量控制等) 。 采用这种设计思路的好处是:网络的造价大大降低,运行方式灵活,能够适应多种应用。 互连网能够发展到今日的规模,充分证明了当初采用这种设计思路的正确性。

虚电路服务与数据报服务的对比

对比的方面 虚电路服务 数据报服务
思路 可靠通信应当由网络来保证 可靠通信应当由用户主机来保证
连接的建立 必须有 不需要
终点地址 仅在连接建立阶段使用,每个分组使用短的虚电路号 每个分组都有终点的完整地址
分组的转发 属于同一条虚电路的分组均按照同一路由进行转发 每个分组独立选择路由进行转发
当结点出故障时 所有通过出故障的结点的虚电路均不能工作 出故障的结点可能会丢失分组,一些路由可能会发生变化
分组的顺序 总是按发送顺序到达终点 到达终点时不一定按发送顺序
端到端的差错处理和流量控制 可以由网络负责,也可以由用户主机负责 由用户主机负责

网际协议IP

网际协议 IP 是 TCP/IP 体系中两个最主要的协议之一。 与 IP 协议配套使用的还有三个协议:

  1. 地址解析协议 ARP (Address Resolution Protocol)
  2. 网际控制报文协议 ICMP (Internet Control Message Protocol)
  3. 网际组管理协议 IGMP (Internet Group Management Protocol)

图2-1画出了这三种协议与网际协议IP的关系:

image-20190511165034613

图2-1:网际协议IP及其配套协议

可以看到,在网络层中,ARP画在最下面,因为IP经常要使用这个协议,ICMP和IGMP画在这一层的上部,因为他们要使用IP协议。这三个协议在后面会做介绍。由于网际协议IP是用来使互联起来的许多计算机网络能够进行通信的,因此TCP/IP体系中的网络层常常被称为网际层IP层。使用网际层是为了强调这是由很多网络构成的互联网络。

在介绍网际协议IP之前,必须先了解一下什么是虚拟互联网络

虚拟互联网络

将网络互连并能够互相通信,会遇到许多问题需要解决,如:

  1. 不同的寻址方案
  2. 不同的最大分组长度
  3. 不同的网络接入机制
  4. 不同的超时控制
  5. 不同的差错恢复方法
  6. 不同的状态报告方法
  7. 不同的路由选择技术
  8. 不同的用户接入控制
  9. 不同的服务(面向连接服务和无连接服务)
  10. 不同的管理与控制方式等

没有一种单一的网络能够适应所有用户的需求,要将异构的网络互相连接起来,需要使用一些中间设备。 中间设备又称为中间系统中继 (relay)系统。 有以下五种不同的中间设备:

  1. 物理层中继系统:转发器 (repeater)
  2. 数据链路层中继系统:网桥桥接器 (bridge)
  3. 网络层中继系统:路由器 (router)
  4. 网桥路由器的混合物:桥路器 (brouter)
  5. 网络层以上的中继系统:网关 (gateway)

当中继系统是转发器网桥时,一般并不称之为网络互连,因为这仅仅是把一个网络扩大了,而这仍然是一个网络。 网关由于比较复杂,目前使用得较少。 网络互连都是指用路由器进行网络互连和路由选择,路由器其实就是一台专用计算机,用来在互联网中进行路由选择。由于历史的原因,许多有关 TCP/IP 的文献将网络层使用的路由器称为网关。

可能很多读者觉得这里的**“网络互连""网络扩大”**很抽象,我们来举个例子:

image-20190511180457961

图2-2:IP网的概念

如图2-2(a)表示有许多计算机网络通过一些路由器进行互连。由于参加互连的计算机网络都是用相应的网际协议IP,因此可以把互连以后的计算机网络看成如图2-2(b)所示的一个虚拟互联网络。所谓虚拟互联网络也就是逻辑互联网络,他的意思就是互连起来的各种物理网络的异构性本来是客观存在的,但是我们利用IP协议就可以使这些性能各异的网络在网络层上看起来好像是一个统一的网络,这种使用IP协议的互联网络可简称为IP网。使用IP网的好处是当IP网上的主机进行通信时,就好像在一个单个网络上通信一样,它们看不见互连的各网络的具体异构细节(如具体的编址方案路由选择协议,等等)。如果在这种覆盖全球的Ip网的上层使用Tcp协议,那么就是现在的互联网(Internet)

image-20190511181509897

图2-3:分组在互联网中的传送

当很多异构网络通过路由器互连起来时,如果所有的网络都使用相同的IP协议,那在网络层讨论问题就显得很方便。现在用一个例子来说明。

在图4-4所示的互联网中的源主机H1,要把一个IP数据报发送给目的主机H2。根据分组交换的存储转发概念,主机H1,先要查找自己的路由表,看目的主机是否在本网络上。如是,则不需要经过任何路由器而是直接交付,任务就完成了。如不是,则须把IP数据报发送给某个路由器(图中的R1)。R1在査找自己的路由表后,知道应当数据报转发给R2进行间接交付。这样一直转发下去,最后由路由器R5知道自己是和H2 接在同一个网络上,不需要再使用别的路由器转发了,于是就把数据报直接交付目的主机H2。图中画出了源主机目的主机以及各路由器的协议栈。我们注意到,主机的协议栈有五层,但路由器的协议栈只有下三层。图中还画出了数据在各协议栈中流动的方向(用红色线表示)。我们还可注意到,在R4和R5之间使用了卫星链路,而R5所连接的是个无局域网。在R1到R4之间的三个网络则可以是任意类型的网络。总之,这里强调的是互联网可以由多种异构网络互连组成。如果我们只从网络层考虑问题,那么IP数据报就可以想象是在网络层中传送,其传送的路径就如图2-4所示:

image-20190511182004486

图2-4:只从网络层考虑IP数据报的传送路径

这样就不必画出许多完整的协议栈,使问题的描述更加简单。有了虚拟互连网络的概念后,我们再讨论在这样的虚拟网络上如何寻址。

分类的IP地址

在 TCP/IP 体系中,IP 地址是一个最基本的概念。

IP地址及其表示方法

我们把整个互联网看成为一个单一的、抽象的网络, IP 地址就是给每个连接在互联网上的主机(或路由器)分配一个在全世界范围是唯一的 32 位的标识符。 IP 地址现在由**互联网名字和数字分配机构ICANN (Internet Corporation for Assigned Names and Numbers)**进行分配。

IP地址的编址方法共经历过了三个历史阶段:

  1. 分类的 IP 地址。这是最基本的编址方法,在1981年就通过了相应的标准协议。
  2. 子网的划分。这是对最基本的编址方法的改进,其标准[RFC 950]在1985年通过。
  3. 构成超网。这是比较新的无分类编址方法。1993年提出后很快就得到推广应用。

本节只讨论最基本的分类的IP地址,后两种将在下一节"划分子网和构造超网"讨论。

所谓的"分类的IP地址"就是将IP地址划分为若干个固定类。 每一类地址都由两个固定长度的字段组成,其中一个字段是网络号 net-id,它标志主机(或路由器)所连接到的网络,而另一个字段则是主机号 host-id,它标志该主机(或路由器)。 主机号在它前面的网络号所指明的网络范围内必须是唯一的。 由此可见,一个 IP 地址在整个互联网范围内是唯一的,这种两级的IP地址可以记为:
IP::={<>,<>} IP地址::=\{<网络号>,<主机号>\}
式(1)中的::=::=表示**“定义为”,图2-5给出了各种IP地址的网络号字段和主机号字段,这里的A类、B类、C类地址都是单播地址(一对一通信)**,是最常用的。

image-20190511182958179

图2-5:IP地址中的网络号字段和主机号字段

从上图可以看到:

  1. A类、B类和C类地址的网络号字段(在图中这个字段是灰色的)分别为1个、2个和3个字节长,而在网络号字段的最前面有1~3位的类别位,其数值分别规定为0, 10 和 110.
  2. A类、B类和C类地址的主机号字段分别为3个、2个和1个字节长。
  3. D类地址(前4位是1110)用于多播(一对多通信)。我们将在IPV6节讨论IP多播。
  4. E类地址(前4位是1111)保留为以后用。

点分十进制记法:

image-20190511183618645

图2-6:点分十进制法能够提高可读性

易知A、B、C、D、E类地址的高8位分别为:

  1. A类:0xxxxxxx,表示的十进制范围为0——127
  2. B类:10xxxxxx,表示的十进制范围为128——191
  3. C类:110xxxxx,表示的十进制范围为192——223
  4. D类:1110xxxx,表示的十进制范围为224——239
  5. E类:1111xxxx,表示的十进制范围为240——255

把Ip地址分为A、B、C三个类别的原因:

各种网络的差异很大,有的网络拥有很多主机,而有的网络的主机则很少,把IP地址划分为A、B、C类是为了更好地满足不同用户的要求,当某个单位申请到一个IP地址时,实际上是获得了具有同样网络号的一块地址,其中具体的各台主机号则由该单位自行分配,只要做到在该单位管辖的范围内无重复的主机号即可

常用的3种IP地址

网络 类别 最大可指派 的网络数 第一个可指派的 网络号 最后一个可指派的 网络号 每个网络中 最大主机数
A $126 (2^7– 2) $ 1 126 16777214
B 16383(2141)16383 (2^{14} – 1) 128.1 191.255 65534
C $ 2097151 (2^{21}– 1)$ 192.0.1 223.255.255 254

一般不适用的特殊IP地址:

网络号 主机号 源地址 使用 目的地址 使用 代表的意思
0 0 可以 不可 在本网络上的本主机(见 6.6 DHCP 协议)
0 host-id 可以 不可 在本网络上的某台主机 host-id
1 1 不可 可以 只在本网络上进行广播(各路由器均不转发)
net-id 1 不可 可以 net-id 上的所有主机进行广播
127 非全 0 或全 1 的任何数 可以 可以 用于本地软件环回测试

IP地址的一些重要特点:

  1. IP 地址是一种分等级的地址结构。分两个等级的好处是:

    第一,IP 地址管理机构在分配 IP 地址时只分配网络号,而剩下的主机号则由得到该网络号的单位自行分配。这样就方便了 IP 地址的管理。

    第二,路由器仅根据目的主机所连接的网络号来转发分组(而不考虑目的主机号),这样就可以使路由表中的项目数大幅度减少,从而减小了路由表所占的存储空间。

  2. 实际上 IP 地址是标志一个主机(或路由器)一条链路的接口。 当一个主机同时连接到两个网络上时,该主机就必须同时具有两个相应的 IP 地址,其网络号 net-id 必须是不同的。这种主机称为多归属主机 (multihomed host)。 由于一个路由器至少应当连接到两个网络(这样它才能将 IP 数据报从一个网络转发到另一个网络),因此一个路由器至少应当有两个不同的 IP 地址

  3. 转发器网桥连接起来的若干个局域网仍为一个网络,因此这些局域网都具有同样的网络号 net-id

  4. 所有分配到网络号 net-id 的网络,无论是范围很小的局域网,还是可能覆盖很大地理范围的广域网,都是平等的。

互联网中的IP地址:

image-20190511203852409

图2-7:互联网中的IP地址1

在同一个局域网上的主机或路由器的 IP 地址中的网络号必须是一样的。 图2-7中的网络号就是 IP 地址中的 net-id。

image-20190511204102243

图2-8:互联网中的IP地址2

如图2-8所示,路由器总是具有两个或两个以上的IP地址,路由器的每一个接口都有一个不同网络号的IP地址。

两个路由器直接相连的接口处,可指明也可不指明IP地址,如指明IP地址,则这一段连线就构成了一种只包含一段线路的特殊“网络” ,现在常不指明IP地址。

IP地址与硬件地址

IP 地址与硬件地址是不同的地址。 从层次的角度看, 硬件地址(或物理地址)数据链路层物理层使用的地址。 IP 地址网络层以上各层使用的地址,是一种逻辑地址(称 IP 地址是逻辑地址是因为 IP 地址是用软件实现的),IP 地址放在 IP 数据报的首部,而硬件地址则放在 MAC 帧的首部。如图2-9所示。

image-20190511204608395

图2-9:IP地址与硬件地址的区别

这里需要注意这几点:

  1. 在IP层抽象的互联网上只能看到IP数据报
  2. 虽然在IP数据报首部有源站IP地址,但是路由器只根据目的站的IP地址的网络号进行路由选择
  3. 在局域网的链路层,只能看到MAC帧
  4. IP 层抽象的互联网屏蔽了下层很复杂的细节。 在抽象的网络层上讨论问题,就能够使用 统一的、抽象的 IP 地址 研究主机和主机或主机和路由器之间的通信 。

地址解析协议ARP

通信时我们主要使用了两个地址: IP 地址(网络层地址)和 MAC 地址(数据链路层地址),那么当我们知道 IP地址,如何知道器MAC地址呢?ARP协议就是为了解决这个问题而存在的。

image-20190511205346624

图2-10:ARP协议的作用

如图2-10,ARP协议的作用是从网络层使用的 IP 地址,解析出在数据链路层使用的硬件地址

ARP协议的要点

不管网络层使用的是什么协议,在实际网络的链路上传送数据帧时,最终还是必须使用硬件地址。 每一个主机都设有一个 ARP 高速缓存 (ARP cache),里面有所在的局域网上的各主机和路由器的 IP 地址到硬件地址的映射表,这个映射表的每一行格式如下:
<IPaddressMACaddressTTL> < IP address;MAC address;TTL >
其中TTL (Time To Live)地址映射有效时间

image-20190511210235228

图2-11:ARP请求的过程

ARP请求的过程如图2-11所示,当主机 A 欲向本局域网上的某个主机 B 发送 IP 数据报时,就先在其 ARP 高速缓存中查看有无主机 B 的 IP 地址:

  1. 如有,就可查出其对应的硬件地址,再将此硬件地址写入 MAC 帧,然后通过局域网将该 MAC 帧发往此硬件地址。

  2. 如没有, ARP 进程在本局域网上广播发送一个 ARP 请求分组收到 ARP 响应分组后,将得到的 IP 地址到硬件地址的映射写入 ARP 高速缓存。

ARP请求分组:包含发送方硬件地址 - 发送方 IP 地址 - 目标方硬件地址(未知时填 0) -目标方 IP 地址

本地广播 ARP 请求(路由器不转发ARP请求)。

ARP 响应分组:包含发送方硬件地址 - 发送方 IP地址 - 目标方硬件地址 - 目标方 IP 地址

ARP 分组封装在物理网络的帧中传输。

ARP高速缓存的作用

  1. 存放最近获得的 IP 地址到 MAC 地址的绑定,以减少 ARP 广播的数量
  2. 为了减少网络上的通信量,主机 A 在发送其 ARP 请求分组时,就将自己的 IP 地址到硬件地址的映射写入 ARP 请求分组。
  3. 当主机 B 收到 A 的 ARP 请求分组时,就将主机 A 的这一地址映射写入主机 B 自己的 ARP 高速缓存中。这对主机 B 以后向 A 发送数据报时就更方便了。

注意:

  1. ARP 用于解决同一个局域网上的主机或路由器的 IP 地址和硬件地址的映射问题。
  2. 如果所要找的主机和源主机不在同一个局域网上,那么就要通过 ARP 找到一个位于本局域网上的某个路由器的硬件地址,然后把分组发送给这个路由器,让这个路由器把分组转发给下一个网络。剩下的工作就由下一个网络来做。
  3. IP 地址到硬件地址的解析是自动进行的,主机的用户对这种地址解析过程是不知道的。
  4. 只要主机或路由器要和本网络上的另一个已知 IP 地址的主机或路由器进行通信,ARP 协议就会自动地将该 IP 地址解析为链路层所需要的硬件地址

ARP请求的四种常见场景

  1. 发送方是主机,要把 IP 数据报发送到本网络上的另一个主机。这时用 ARP 找到目的主机的硬件地址。
  2. 发送方是主机,要把 IP 数据报发送到另一个网络上的一个主机。这时用 ARP 找到本网络上的一个路由器的硬件地址。剩下的工作由这个路由器来完成。
  3. 发送方是路由器,要把 IP 数据报转发到本网络上的一个主机。这时用 ARP 找到目的主机的硬件地址。
  4. 发送方是路由器,要把 IP 数据报转发到另一个网络上的一个主机。这时用 ARP 找到本网络上另一个路由器的硬件地址。剩下的工作由这个路由器来完成。

既然我们最终通信还是要使用硬件地址,为什么要引入IP地址,为什么不能直接使用硬件地址进行网络通信呢?

由于全世界存在着各式各样的网络,它们使用不同的硬件地址。要使这些异构网络能够互相通信就必须进行非常复杂的硬件地址转换工作,因此几乎是不可能的事。 IP 编址把这个复杂问题解决了。连接到互联网的主机只需各自拥有一个唯一的 IP 地址,它们之间的通信就像连接在同一个网络上那样简单方便,因为上述的调用 ARP 的复杂过程都是由计算机软件自动进行的,对用户来说是看不见这种调用过程的。 因此,在虚拟的 IP 网络上用 IP 地址进行通信给广大的计算机用户带来了很大的方便。

IP数据报的格式

image-20190511211107272

图2-11:IP数据报的格式

如图2-11,一个 IP 数据报由首部数据两部分组成。 首部的前一部分是固定长度,共 20 字节,是所有 IP 数据报必须具有的,首部的固定部分的后面是一些可选字段,其长度是可变的。

IP数据报首部的固定部分

IP 数据报首部的固定部分中的各字段:

  1. 版本——占 4 位,指 IP 协议的版本。 目前的 IP 协议版本号为 4 (即 IPv4)。

  2. 首部长度——占 4 位,可表示的最大十进制数值是15 个单位(一个单位为 4 字节), 因此 IP 的首部长度的最大值是 60 字节。

  3. 区分服务——占 8 位,用来获得更好的服务。 在旧标准中叫做服务类型,但实际上一直未被使用过。 1998 年这个字段改名为区分服务。 只有在使用区分服务(DiffServ)时,这个字段才起作用。 在一般的情况下都不使用这个字段

  4. 总长度——占 16 位,指首部和数据之和的长度, 单位为字节,因此数据报的最大长度为 65535 字节。 总长度必须不超过最大传送单元MTU

  5. 标识(identification) ——占 16 位, 它是一个计数器,用来产生 IP 数据报的标识,相同的标识使分片后的各数据报片最后能正确地重装为原来的数据报。

  6. 标志(flag) ——占 3 位,目前只有前两位有意义。

    • 标志字段的最低位是 MF (More Fragment)。 MF=1 表示后面“还有分片”。MF=0 表示最后一个分片。
    • 标志字段中间的一位是 DF (Don’t Fragment) 。 只有当 DF=0 时才允许分片
  7. 片偏移——占13 位,指出:较长的分组分片后某片在原分组中的相对位置。 片偏移以 8 个字节为偏移单位

    例题:一数据报的总长度为 3820 字节,其数据部分的长度为 3800 字节(使用固定首部),需要分片为长度不超过 1420 字节的数据报片。 因固定首部长度为 20 字节,因此每个数据报片的数据部分长度不能超过 1400 字节。 于是分为 3 个数据报片,其数据部分的长度分别为 1400、1400 和 1000 字节。 原始数据报首部被复制为各数据报片的首部,但必须修改有关字段的值

    image-20190511212141145

    IP 数据报首部中与分片有关的字段中的数值:

    总长度 标识 MF DF 片偏移
    原始数据报 3820 12345 0 0 0
    数据报片1 1420 12345 1 0 0
    数据报片2 1420 12345 1 0 175
    数据报片3 1020 12345 0 0 350
  8. 生存时间——占8位,生存时间的英文缩写是TTL(Time to line),目的是为了防止无法提交的数据报无限制地在互联网中兜圈子(例如从路由器R1到路由器R2,再有路由器R2到路由器R1),从而浪费计算机资源。刚开始TTL的单位是时间,每经历一个路由器就将TTL的值减去在路由器中所消耗的一段时间,后来由于网络越来越快,就将TTL的单位设为跳数,每经过一个路由器就减1.

  9. 协议——占8 位,指出此数据报携带的数据使用何种协议, 以便目的主机的 IP 层将数据部分上交给上层的对应协议进行处理。协议字段指出应将数据部分交给哪一个进程

    image-20190511212956260

    如上图所示,IP 协议支持多种协议,IP 数据报可以封装多种协议 PDU**。

  10. 首部检验和——占16 位,只检验数据报的首部, 不检验数据部分。这里不采用 CRC 检验码而采用简单的计算方法:

    image-20190511213445160

    如上图所示,检验过程为:

    在发送方,先把IP数据报首部划分为许多16位字的序列,并把检验和字段置零。用反码算术运算把所有16位字相加后,将得到的和的反码写入检验和字段。

    接收方收到数据报后,将首部的所有16位字再使用反码算术运算相加一次。将得到的和取反码,即得出接收方检验和的计算结果。若首部未发生任何变化,则此结果必为0,于是就保留这个数据报。否则即认为出差错,并将此数据报丢弃。

    注意这里提到的**"反码求和"的过程是:从低位到高位逐列进行计算。0和0相加是0,0和1相加是1,1和1相加是0,但要产生一个进位1**,加到下一列。若最高位相加后产生进位,则最后得到的结果要加1.请注意,**反码(onc’scomplement)补码(two’scomplement)**是不一样的,

  11. 源地址目的地址都各占 4 字节

IP数据报首部的可变部分

IP 首部的可变部分就是一个选项字段(可选),用来支持排错、测量以及安全等措施,内容很丰富。 选项字段的长度可变,从 1 个字节到 40 个字节不等,取决于所选择的项目。 增加首部的可变部分是为了增加 IP 数据报的功能,但这同时也使得 IP 数据报的首部长度成为可变的。这就增加了每一个路由器处理数据报的开销。 实际上这些选项很少被使用

IP层转发分组的流程

注意:互联网所有的分组转发都是基于目的主机所在的网络

假设:有四个 A 类网络通过三个路由器连接在一起,每一个网络上都可能有成千上万个主机。 可以想象,若按目的主机号来制作路由表,每一个路由表就有 4 万个项目,即 4 万行(每一行对应于一台主机),则所得出的路由表就会过于庞大。 若按主机所在的网络地址来制作路由表,那么每一个路由器中的路由表就只包含 4 个项目(每一行对应于一个网络),这样就可使路由表大大简化。

在路由表中,对每一条路由,最主要的是**(目的网络地址,下一跳地址)**

image-20190511214332252

图2-12:路由表举例

根据目的网络地址就能确定下一跳路由器,这样做的结果是:

  1. IP 数据报最终一定可以找到目的主机所在目的网络上的路由器(可能要通过多次的间接交付)。
  2. 只有到达最后一个路由器时,才试图向目的主机进行直接交付。

特定主机路由

虽然互联网所有的分组转发都是基于目的主机所在的网络,但在大多数情况下都允许有这样的特例,即为特定的目的主机指明一个路由,这种路由叫做特定主机路由。 采用特定主机路由可使网络管理人员能更方便地控制网络和测试网络,同时也可在需要考虑某种安全问题时采用这种特定主机路由,在对网络的连接或路由表进行排错时,指明到某一台主机的特殊路由就十分有用。

默认路由 (default route)

路由器还可采用默认路由以减少路由表所占用的空间搜索路由表所用的时间。 这种转发方式在一个网络只有很少的对外连接时是很有用的。 默认路由在主机发送 IP 数据报时往往更能显示出它的好处。 如果一个主机连接在一个小网络上,而这个网络只用一个路由器和互联网连接,那么在这种情况下使用默认路由是非常合适的。

image-20190512102904396

图2-13:路由器R1充当网络N1的默认路由器

例如,在图2-13的互联网中,连接在网络N1上的任何一台路主机中的路由表中只需要3个项目即可:

  1. 本网络主机的路由,目的网络为本身,不需要路由器转发,直接交付
  2. 到网络N2的路由,对应下一跳是R2
  3. 默认路由,只要目的网络是其他网络(不是N1也不是N2),就一律使用默认路由

像上图中路由表中的**“直接""默认"字符在实际的路由表中是用"0.0.0.0”**表示的。

必须注意:

IP 数据报的首部中没有地方可以用来指明**“下一跳路由器的 IP 地址”。 当路由器收到待转发的数据报,不是将下一跳路由器的 IP 地址填入 IP 数据报,而是送交下层的网络接口软件**。 网络接口软件使用 ARP 负责将下一跳路由器的 IP 地址转换成硬件地址,并将此硬件地址放在链路层的 MAC 帧的首部,然后根据这个硬件地址找到下一跳路由器。

分组转发完整流程

  1. 从数据报的首部提取目的主机的 IP 地址 D, 得出目的网络地址为 N(IP地址包含网络地址和主机地址,分组转发只需要知道网络地址即可)。
  2. 若网络 N 与此路由器直接相连,则把数据报直接交付目的主机 D;否则是间接交付,执行 (3)。
  3. 若路由表中有目的地址为 D 的特定主机路由,则把数据报传送给路由表中所指明的下一跳路由器;否则,执行 (4)。
  4. 若路由表中有到达网络 N 的路由,则把数据报传送给路由表指明的下一跳路由器;否则,执行 (5)。
  5. 若路由表中有一个默认路由,则把数据报传送给路由表中所指明的默认路由器;否则,执行 (6)。
  6. 报告转发分组出错。

关于路由表

路由表没有给分组指明到某个网络的完整路径。路由表指出,到某个网络应当先到某个路由器(即下一跳路由器)。在到达下一跳路由器后,再继续查找其路由表,知道再下一步应当到哪一个路由器。这样一步一步地查找下去,直到最后到达目的网络。

划分子网和构造超网

从两级IP地址到三级IP地址(构造子网)

两级IP地址的缺点

在 ARPANET 的早期,IP 地址的设计确实不够合理:

  1. IP 地址空间的利用率有时很低

    有的单位申请到一个B类地址网络,但是所连接的主机并不多,但是又不愿意申请一个足够用的C类地址网络,理由是考虑到今后可能的发展,这样就造成了IP地址的浪费。

  2. 给每一个物理网络分配一个网络号会使路由表变得太大因而使网络性能变坏。

  3. 两级的 IP 地址不够灵活

    有时一个单位需要紧急在新的地点马上开通一个新的网络,但是在申请到一个新的IP地址之前,新增加的网是不可能连接到互联网上工作的。所以我们希望有一种办法可以使一个单位灵活地增加本单位的网络,而不必实现到互联网管理机构去申请新的网络号。原先的2级IP地址无法做到这一点。

从 1985 年起在 IP 地址中又增加了一个**“子网号字段”,使两级的 IP 地址变成为三级的 IP 地址**。 这种做法叫做划分子网 (subnetting) 。 划分子网已成为互联网的正式标准协议。

划分子网的基本思路

划分子网纯属一个单位内部的事情。单位对外仍然表现为没有划分子网的网络。 从主机号借用若干个位作为子网号 subnet-id,而主机号 host-id 也就相应减少了若干个位,如图3-1所示:

image-20190512105001192

图3-1:划分子网后的IP组成

所以这样IP地址的格式就变为了:
IP::=<>,<>,<> IP地址 ::= {<网络号>, <子网号>, <主机号>}
凡是从其他网络发送给本单位某个主机的 IP 数据报,仍然是根据 IP 数据报的目的网络号 net-id,先找到连接在本单位网络上的路由器。 然后此路由器在收到 IP 数据报后,再按目的网络号 net-id 和子网号 subnet-id 找到目的子网,最后就将 IP 数据报直接交付目的主机。

image-20190512105622058

图3-2:划分子网前后对比

如图3-2所示,划分子网知识把IP地址的主机号部分再进行划分,而不改变IP地址原来的网络号,划分子网纯属一个单位内部的事情,对外部网络透明,对外仍然表现为没有划分子网的一个网络

子网掩码

划分子网之后有个问题就是,如图3-2,假定现在有一个数据报,其目的地址是145.13.3.10,已经达到了路由器R1,那么这个路由器如何把它转发到子网145.13.3.0呢?

我们知道,从一个 IP 数据报的首部并无法判断源主机或目的主机所连接的网络是否进行了子网划分。 因此需要使用子网掩码,使用子网掩码 (subnet mask) 可以找出 IP 地址中的子网部分。

规则:

子网掩码长度 = 32 位

子网掩码左边部分的一连串 1,对应于网络号子网号

子网掩码右边部分的一连串 0,对应于主机号

image-20190512110614081

图3-2:子网掩码示意图

如图3-3所示,子网掩码要解决的就是找到网络号,对于两级IP地址,其网络号为前16位(如图3-2(a)所示),对于三级IP地址,其网络号为前24位(如图3-2©所示),子网掩码和IP地址一样一共有32位,原理就是,如果是两级IP地址,子网掩码的前16位为1,后16位为0,如果是三级IP地址,子网掩码前24位为1,后8位为0,这样做的好处是, 拿到一个IP地址之后,只需要将IP地址与本路由器的子网掩码**“按位向与”**,得到的结果一定是网络号(因为主机号与的对象是0,与完之后的结果一定也是0),这样就得到了网络号。

那么还有一个问题就是,在不划分子网的时候是否还需要子网掩码?答案是肯定的,因为路由器并不能自动判断当前IP是否划分子网了啊,他只能对所有来的IP都用子网掩码进行按位向与,这样其实也利于查找网络号,如果是两级IP,路由器不再需要查找改地址的类别位,直接使用子网掩码就能提取出来网络号,所以,如果一个网络没有进行子网划分,那么该网络的子网掩码就使用默认子网掩码,很明显,各类IP的默认子网掩码为:

image-20190512111420135

3-3:各类IP地址的默认子网掩码

子网掩码是一个网络或一个子网的重要属性,路由器在和相邻路由器交换路由信息时,必须把自己所在网络(或子网)的子网掩码告诉相邻路由器。路由器的路由表中的每一个项目,除了要给出目的网络地址外,还必须同时给出该网络的子网掩码若一个路由器连接在两个子网上,就拥有两个网络地址和两个子网掩码

子网划分有固定长度子网变长子网两种子网划分方法。 在采用固定长度子网时,所划分的所有子网的子网掩码都是相同的。 虽然根据已成为互联网标准协议的 RFC 950 文档,子网号不能为全 1 或全 0,但随着无分类域间路由选择 CIDR 的广泛使用,现在全 1 和全 0 的子网号也可以使用了,但一定要谨慎使用,确认你的路由器所用的路由选择软件是否支持全 0 或全 1 的子网号这种较新的用法。 划分子网增加了灵活性,但却减少了能够连接在网络上的主机总数

需要注意的是同一个IP和不同的子网掩码计算后得出的网络号可能是相同的,因为如果IP地址的某一位是0,那么不管子网号的对应为是0还是1,计算的结果的对应为都是0,也就是说两个子网掩码计算得到的网络号是一样的。

但是两个可以计算得到同样网络号的子网掩码也只是针对特定IP来说的,两个子网掩码的实际效果并不同

使用子网时分组的转发

在不划分子网的两级 IP 地址下,从 IP 地址得出网络地址是个很简单的事。 但在划分子网的情况下,从 IP 地址却不能唯一地得出网络地址来,这是因为网络地址取决于那个网络所采用的子网掩码,但数据报的首部并没有提供子网掩码的信息。 因此分组转发的算法也必须做相应的改动,步骤如下:

  1. 从收到的分组的首部提取目的 IP 地址 D。
  2. 先用各网络的子网掩码和 D 逐位相“与”,看是否和相应的网络地址匹配。若匹配,则将分组直接交付。否则就是间接交付,执行(3)。
  3. 若路由表中有目的地址为 D 的特定主机路由,则将分组传送给指明的下一跳路由器;否则,执行 (4)。
  4. 对路由表中的每一行,将子网掩码和 D 逐位相“与”。若结果与该行的目的网络地址匹配,则将分组传送给该行指明的下一跳路由器;否则,执行 (5)。
  5. 若路由表中有一个默认路由,则将分组传送给路由表中所指明的默认路由器;否则,执行 (6)。
  6. 报告转发分组出错。

例题:

如图3-4,有三个子网,两个路由器,以及路由器R1中的部分路由表,现在源主机H1向目的主机H2发送分组,试讨论分组转发过程。

image-20190512120526235

图3-4:主机H1向主机H2发送分组

【解】

  1. 源主机H1向目的主机H2发送的分组的目的地址是H2的IP地址128.30.33.138。源主机H1首先要进行的操作是要判断发送的这个分组是在本子网上进行直接交付还是要通过本子网上的路由器进行间接交付,源主机H1把本子网的"子网掩码“255.255.255.128与目的主机H2的IP地址128.30.33.138逐位相与(即逐位进行AND操作),得出128.30.33.128,它不等于H1的网络地址(128.30.33.0)。这说明H2与H1不在同一个子网上,因此H1不能把分组直接交付H2,而必须交给子网上的默认路由器R1,由R1来转发。
  2. 路由器R1在收到一个分组后,就在其路由表中逐行寻找有无匹配的网络地址。先看R1路由表中的第一行。用这一行的"子网掩码”255.255.255.128和收到的分组的"目的地址“128.30.33.138逐位相与(即逐位进行AND操作),得出128.30.33.128,然后和这一行给出的目的网络地址128.30.33.0进行比较,比较的结果不一致(即不匹配)。用同样方法继续往下找第二行。用第二行的子网掩码255.255.255.128和该分组的"目的地址”128.30.33.138逐位相"与"(即逐位进行AND操作),结果也是128.30.33.128,这个结果和第二行的目的网络地址128.30.33.128相匹配,说明这个网络(子网2)就是收到的分组所要寻找的目的网络。于是不需要再继续查找下去,R1把分组从接口1直接交付主机H2(它们都在一个子网上)。

无分类编址CIDR(构造超网)

网络前缀

划分子网在一定程度上缓解了互联网在发展中遇到的困难。然而在 1992 年互联网仍然面临三个必须尽早解决的问题:

  1. B 类地址在 1992 年已分配了近一半,眼看就要在 1994 年 3 月全部分配完毕!
  2. 互联网主干网上的路由表中的项目数急剧增长(从几千个增长到几万个)。
  3. 整个 IPv4 的地址空间最终将全部耗尽。

1987 年,RFC 1009 就指明了在一个划分子网的网络中可同时使用几个不同的子网掩码,使用变长子网掩码 VLSM (Variable Length Subnet Mask)可进一步提高 IP 地址资源的利用率, 在 VLSM 的基础上又进一步研究出无分类编址方法,它的正式名字是无分类域间路由选择 CIDR (Classless Inter-Domain Routing)

CIDR的主要特点
  1. CIDR 消除了传统的 A 类、B 类和 C 类地址以及划分子网的概念,因而可以更加有效地分配 IPv4 的地址空间。
  2. CIDR使用各种长度的**“网络前缀”(network-prefix)**来代替分类地址中的网络号和子网号。
  3. IP 地址从三级编址(使用子网掩码)又回到了两级编址

无分类的两级编址的记法是:

image-20190512121654071

即:
IP::={<>,<>} IP地址 ::= \{<网络前缀>, <主机号>\}
CIDR 使用**“斜线记法”(slash notation),它又称为 CIDR 记法,即在 IP 地址后面加上一个斜线“/”,然后写上网络前缀所占的位数(这个数值对应于三级编址中子网掩码中 1 的个数**),例如: 220.78.168.0/24。

CIDR 把网络前缀都相同的连续的 IP 地址组成**“CIDR 地址块”**。

128.14.32.0/20 表示的地址块共有$ 2^{12}$ 个地址(因为斜线后面的 20 是网络前缀的位数,所以这个地址的主机号是 12 位)。 这个地址块的起始地址是 128.14.32.0, 在不需要指出地址块的起始地址时,也可将这样的地址块简称为“/20 地址块”。

128.14.32.0/20 地址块的最小地址:128.14.32.0, 128.14.32.0/20 地址块的最大地址:128.14.47.255 ,即主机号从全0到全1.

全 0 和全 1 的主机号地址一般不使用。

路由聚合

一个 CIDR 地址块可以表示很多地址,这种地址的聚合常称为路由聚合,它使得路由表中的一个项目可以表示很多个(例如上千个)原来传统分类地址的路由,路由聚合有利于减少路由器之间的路由选择信息的交换,从而提高了整个互联网的性能,路由聚合也称为构成超网 (supernetting)。 CIDR 虽然不使用子网了,但仍然使用**“掩码”这一名词(但不叫子网掩码**), 对于 /20 地址块,它的掩码是 20 个连续的 1, 斜线记法中的数字就是掩码中1的个数。

CIDR记法的多种形式
  1. 10.0.0.0/10 可简写为 10/10,也就是把点分十进制中低位连续的 0 省略。

  2. 10.0.0.0/10 隐含地指出 IP 地址 10.0.0.0 的掩码是 255.192.0.0。此掩码可表示为:

image-20190512122638804

  1. 网络前缀的后面加一个星号 * 的表示方法,如 00001010 00*,在星号 * 之前是网络前缀,而星号 * 表示 IP 地址中的主机号,可以是任意值
构成超网

前缀长度不超过 23 位的 CIDR 地址块都包含了多个 C 类地址,这些 C 类地址合起来就构成了超网。 CIDR 地址块中的地址数一定是 2 的整数次幂,网络前缀越短,其地址块所包含的地址数就越多。而在三级结构的IP地址中,划分子网是使网络前缀变长。

CIDR 的一个好处是:可以更加有效地分配 IPv4 的地址空间,可根据客户的需要分配适当大小的 CIDR 地址块

最长前缀匹配

使用 CIDR 时,路由表中的每个项目由**“网络前缀”“下一跳地址”组成,在查找路由表时可能会得到不止一个匹配结果,应当从匹配结果中选择具有最长网络前缀的路由:最长前缀匹配 (longest-prefix matching)。 网络前缀越长,其地址块就越小,因而路由就越具体 (more specific)** 。

最长前缀匹配又称为最长匹配最佳匹配

举例:

某个上属ISP地址块为206.0.64.0/18的大学,该大学分到地址块为:206.0.68.0/22,这个大学里的计算机系分到的地址块为:206.0.71.128/25,假定计算机系希望ISP收到属于自己的数据报后直接发送给自己而不要经过大学的路由器,那么在ISP的路由器的路由表中就至少要有以下两个项目:206.0.68.0/22(大学)、206.0.71.128/25(计算机系),现在假定ISP收到一个数据报,其目的IP地址D=206.0.71.130,把D和其路由表中的两个项目的掩码逐位相与:

  1. D和11111111111111111111110000000000相与,结果为206.0.68.0/22,匹配
  2. D和11111111111111111111111110000000相与,结果为206.0.71.128/25,匹配

那么根据最长前缀匹配原则,就算206.0.68.0/22匹配成功,最终ISP的路由器也会将本数据报转发给206.0.71.128/25,因为206.0.71.128/25匹配器到的地址更加具体。

使用二叉线索查找路由表

当路由表的项目数很大时,怎样设法减小路由表的查找时间就成为一个非常重要的问题。 为了进行更加有效的查找,通常是将无分类编址的路由表存放在一种层次的数据结构中,然后自上而下地按层次进行查找。这里最常用的就是二叉线索 (binary trie)。 IP 地址中从左到右的比特值决定了从根结点逐层向下层延伸的路径,而二叉线索中的各个路径就代表路由表中存放的各个地址, 为了提高二叉线索的查找速度,广泛使用了各种压缩技术。

从二叉线索的根节点自顶向下的深度最多有 32 层,每一层对应于IP地址中的一位。

一个IP地址存入二叉线索的规则很简单,先检查IP地址左边的第一位,如为 0,则第一层的节点就在根节点的左下方,如为 1,则在右下方,然后再检查地址的第二位,构造出第二层的节点,依此类推,直到唯一前缀的最后一位。

网际控制报文协议ICMP

为了更有效地转发 IP 数据报提高交付成功的机会,在网际层使用了网际控制报文协议 ICMP (Internet Control Message Protocol), ICMP 是互联网的标准协议, ICMP 允许主机或路由器报告差错情况提供有关异常情况的报告。 但 ICMP 不是高层协议(看起来好像是高层协议,因为 ICMP 报文是装在 IP 数据报中,作为其中的数据部分),而是 IP 层的协议。

ICMP报文作为IP层数据报的数据,加上数据报的首部,组成IP数据报发送出去,ICMP报文格式如图3-5所示:

image-20190512125451554

图3-5:ICMP报文格式

ICMP报文的种类

ICMP 报文的种类有两种:

  1. ICMP 差错报告报文
  2. ICMP 询问报文

ICMP 报文的前 4 个字节是统一的格式,共有三个字段:即类型代码检验和。接着的 4 个字节的内容与 ICMP 的类型有关。

ICMP差错报告报文

ICMP差错报告报文有4种:

  1. 终点不可达

    当路由器或主机不能交付数据报时就向源主点发送终点不可达报文

  2. 时间超过

    • 当路由器收到生存时间为零的报文时,除了丢弃该报文,还要向源点发送时间超过报文
    • 当终点在预先规定的时间内不能收到一个数据报的全部数据时,就把收到的数据报片都丢弃,并向源点发送时间超过报文
  3. 参数问题

    当路路由器或目的主机收到的数据报的首部中有的字段的值不正确时,就丢弃该报文,并向源点发送参数问题报文

  4. 改变路由(重定向)(Redirect)

    路由器把改变路由报文发给主机,让主机知道下次应该直接把数据报发送给另外的路由器(可通过更好的路由)

所有的ICMP差错报文中的数据字段都具有相同的格式,如图3-6所示,把收到的进行差错报告的IP数据报首部和数据字段的前8个字节提取出来,作为ICMP报文的数据字段。再加上相应的ICMP差错报告报文的前8个字节,就构成了ICMP差错报告报文。提取收到的数据报的数据字段前8个字节是为了得到运输层的端口号(对于TCP和UDP)以及运输层报文的发送序号(对于TCP)。这些信息对源点通知高层协议是有用的(端口的作用将在写一篇运输层讲解)。整个ICMP报文作为IP数据报的数据字段发送给源点。

image-20190512130716058

图3-6:ICMP差错报文的数据字段的内容

不应发送ICMP 差错报告报文的几种情况:

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

有2种:

  1. 回送请求和回答报文
  2. 时间戳请求和回答报文

ICMP的应用举例

Ping

PING (Packet InterNet Groper) 用来测试两个主机之间的连通性。 PING 使用了 ICMP 回送请求回送回答报文。 PING 是应用层直接使用网络层 ICMP 的例子,它没有通过运输层的 TCP 或UDP

Traceroute

在 Windows 操作系统中这个命令是 tracert。 用来跟踪一个分组从源点到终点的路径。 它利用 IP 数据报中的 TTL 字段和 ICMP 时间超过差错报告报文实现对从源点到终点的路径的跟踪。

互联网的路由选择协议

有关路由选择协议的几个基本概念

理想的路由算法

  1. 算法必须是正确的和完整的。

  2. 算法在计算上应简单。

  3. 算法应能适应通信量和网络拓扑的变化,这就是说,要有自适应性。

  4. 算法应具有稳定性。

  5. 算法应是公平的。

  6. 算法应是最佳的。

    不存在一种绝对的最佳路由算法。 所谓“最佳”只能是相对于某一种特定要求下得出的较为合理的选择而已。 实际的路由选择算法,应尽可能接近于理想的算法。 路由选择是个非常复杂的问题 它是网络中的所有结点共同协调工作的结果。 路由选择的环境往往是不断变化的,而这种变化有时无法事先知道。

倘若从路由算法能否随网络的通信量或拓扑自适应地进行调整变化来划分,则路由算法只有两大类:

  1. 静态路由选择策略——即非自适应路由选择,其特点是简单和开销较小,但不能及时适应网络状态的变化。
  2. 动态路由选择策略——即自适应路由选择,其特点是能较好地适应网络状态的变化,但实现起来较为复杂,开销也比较大。

分层次的路由选择协议

互联网采用分层次的路由选择协议。这是因为:

  1. 互联网的规模非常大。如果让所有的路由器知道所有的网络应怎样到达,则这种路由表将非常大,处理起来也太花时间。而所有这些路由器之间交换路由信息所需的带宽就会使互联网的通信链路饱和。
  2. 许多单位不愿意外界了解自己单位网络的布局细节和本部门所采用的路由选择协议(这属于本部门内部的事情),但同时还希望连接到互联网上。

为此,可以把整个互联网划分成许多较小的自治系统(autonomous system),一般记为AS。

自治系统 AS 的定义:在单一的技术管理下的一组路由器,而这些路由器使用一种 AS 内部的路由选择协议和共同的度量以确定分组在该 AS 内的路由,同时还使用一种 AS 之间的路由选择协议用以确定分组在 AS之间的路由。 现在对自治系统 AS 的定义是强调下面的事实:尽管一个 AS 使用了多种内部路由选择协议和度量,但重要的是一个 AS 对其他 AS 表现出的是一个单一的和一致的路由选择策略。

互联网的两大类路由选择协议:

  1. 内部网关协议 IGP (Interior Gateway Protocol) 在一个自治系统内部使用的路由选择协议。 目前这类路由选择协议使用得最多,如 RIPOSPF 协议。
  2. 外部网关协议 EGP (External Gateway Protocol) 若源站和目的站处在不同的自治系统中,当数据报传到一个自治系统的边界时,就需要使用一种协议将路由选择信息传递到另一个自治系统中。这样的协议就是外部网关协议 EGP。 在外部网关协议中目前使用最多的是 BGP-4

image-20190512131940450

图4-1:自制系统和内部网关协议、外部网关协议

自治系统之间的路由选择也叫做域间路由选择 (interdomain routing),在自治系统内部的路由选择叫做域内路由选择 (intradomain routing)

互联网的早期 RFC 文档中未使用**“路由器”而是使用“网关”这一名词。但是在新的 RFC 文档中又使用了“路由器”这一名词。应当把这两个术语当作同义词**。

内部网关协议RIP

工作原理

路由信息协议 RIP (Routing Information Protocol) 是内部网关协议 IGP 中最先得到广泛使用的协议。 RIP 是一种分布式的、基于距离向量的路由选择协议。 RIP 协议要求网络中的每一个路由器都要维护从它自己到其他每一个目的网络的距离记录。

"距离"的定义:

从一个路由器到直接连接的网络的距离定义为 1, 从一个路由器到非直接连接的网络的距离定义为所经过的路由器数加 1。 RIP 协议中的**“距离”也称为“跳数”(hop count),因为每经过一个路由器**,跳数就加 1。 这里的**“距离”实际上指的是“最短距离”**。

RIP 认为一个好的路由就是它通过的路由器的数目少,即“距离短”, RIP 允许一条路径最多只能包含 15 个路由器“距离”最大值为 16 时即相当于不可达,可见 RIP 只适用于小型互联网。 RIP 不能在两个网络之间同时使用多条路由,RIP 选择一个具有最少路由器的路由(即最短路由),哪怕还存在另一条高速(低时延)但路由器较多的路由,即选择最短的,不一定是最快的

RIP协议的特点
  1. 仅和相邻路由器交换信息。 交换的信息是当前本路由器所知道的全部信息,即自己的路由表
  2. 固定的时间间隔交换路由信息,例如,每隔 30 秒。
  3. 网络拓扑发生变化时,路由器也及时向相邻路由器通告拓扑变化后的路由信息
路由表的建立方法

路由器在刚刚开始工作时,只知道到直接连接的网络的距离(此距离定义为 1),它的路由表是空的,接着,每一个路由器也只和数目非常有限的相邻路由器交换并更新路由信息,但经过若干次更新后,所有的路由器最终都会知道到达本自治系统中任何一个网络的最短距离下一跳路由器的地址

RIP 协议的收敛 (convergence) 过程较快。“收敛”就是在自治系统中所有的结点都得到正确的路由选择信息的过程

路由表中最主要的信息是:到某个网络的距离(即最短距离),以及经过的下一跳地址。路由表更新的原则是找出每个目的网络的最短距离,这种更新算法又称为距离向量算法

距离向量算法

路由器收到**相邻路由器(相邻路由器的地址为 X)**的一个 RIP 报文

  1. 先修改此 RIP 报文中的所有项目:把**“下一跳”字段中的地址都改为 X,并把所有的“距离”字段的值加 1,每一个项目都有三个关键数据:到目的网络N**,距离是d,下一跳路由器是X
  2. 对修改后的 RIP 报文中的每一个项目,重复以下步骤:
  • 若原来的路由表没有目的网络N,则把该项目加到路由表中。
  • 否则(即在路由表中有目的网络N,这时就再查看下一跳路由器地址)
    • 若下一跳字段给出的路由器地址是X,则把收到的项目替换原路由表中的项目。
    • 否则(即这个项目是:到目的网络N,但下一跳路由器不是X)
      • 若收到项目中的距离小于路由表中的距离,则进行更新
      • 否则,什么也不做。
  1. 若 3 分钟还没有收到相邻路由器的更新路由表,则把此相邻路由器记为不可达路由器,即将距离置为 16(表示不可达)。
  2. 返回。

距离向量算法的基础就是 Bellman-Ford 算法(或 Ford-Fulkerson 算法)。 这种算法的要点是这样的: 设X是结点 A 到 B 的最短路径上的一个结点,若把路径 A→B 拆成两段路径 A→X 和 X→B,则每一段路径 A→X 和 X→B 也都分别是结点 A 到 X 和结点 X 到 B 的最短路径。

光看概念困死了,需要一个栗子清醒一下:

已知路由器 R6 有表4-1所示的路由表。现在收到相邻路由器 R4 发来的路由更新信息,如表4-2所示。试更新路由器 R6 的路由表。

目的网络 距离 下一跳路由器
Net2 3 R4
Net3 4 R5
表4-1,R6
目的网络 距离 下一跳路由器
Net1 3 R1
Net2 4 R2
Net3 1 直接交付
表4-2,R4

首先将收到的报文中的所有项目(R4的路由表)的下一跳字段改为R4,距离字段加1,修改后如下表:

目的网络 距离 下一跳路由器
Net1 4 R4
Net2 5 R4
Net3 2 R4

然后:

第一行在表4-1中没有,因此将这一行添加到表4-1中。

第二行在表4-1中有,且下一跳路由器也是R4,因此要更新(距离增大了,应该将3更新为5).

第三行在表4-1中有,但下一跳路由器不同,于是就要比较距离,新的路由信息中的距离是2,比原来的4小,所以更新原路由表的这一行的下一跳路由器为R4,距离为2。

至此,路由表更新完毕,更新之后的R6的路由表如下表所示:

目的网络 距离 下一跳路由器
Net1 4 R4
Net2 5 R4
Net3 2 R4
RIP协议的报文格式

现在比较新的RIP版本是1998年公布的RIP2,RIP2 报文由首部路由部分组成。

RIP2 报文中的路由部分由若干个路由信息组成,每个路由信息需要用 20 个字节,地址族标识符(又称为地址类别)字段用来标志所使用的地址协议

路由标记填入自治系统的号码,这是考虑使 RIP 有可能收到本自治系统以外的路由选择信息, 再后面指出某个网络地址该网络的子网掩码下一跳路由器地址以及到此网络的距离

一个 RIP 报文最多可包括 25 个路由,因而 RIP 报文的最大长度是 4+20 x25=504 字节。如超过,必须再用一个 RIP 报文来传送。

RIP2 具有简单的鉴别功能,若使用鉴别功能,则将原来写入第一个路由信息(20 个字节)的位置用作鉴别。 在鉴别数据之后才写入路由信息,但这时最多只能再放入 24 个路由信息。

image-20190512135712501

图4-2:RIP2报文的格式
好消息传播的快、坏消息传播的慢

RIP 协议特点:好消息传播得快,坏消息传播得慢,即当网络出现故障时,要经过比较长的时间 (例如数分钟) 才能将此信息传送到所有的路由器。

举个栗子说明:

image-20190512140310745

图4-3:好消息传播的快、坏消息传播的慢

如图4-3,设三个网络通过两个路由器互连起来,并且都已建立了各自的路由表。图中路由器交换的信息只给出了我们感兴趣的一行内容。路由器R1中的“1,1,直接"表示"到网1的距离是1,直接交付",路由器R2中的“1,2,R1”表示"到网1的距离是2,下一跳经过R1“。现在假定路由器R1到网1的链路出了故障,R1无法到达网1,于是路由器R1把到网的距离改为16(表示到网1不可达),因而在R1的路由表中的相应项目变为”1,16,直接",但是,很可能要经过30秒钟后R1才把更新信息发送给R2,然而R2可能已经先把自己的路由表发送给了R1其中有”1, 2,R1“这一项,R1收到R2的更新报文后,误认为可经过R2到达网1,于是把收到的路由信息”1,2,R1“修改为”1,3,R2“,表明我到网1的距离是3,下一跳经过R2,并把更新后的信息发送给R2。同理,R2接着又更新自己的路由表为”114,R1“,以为"我到网1距离是4,下一跳经过R1,这样的更新一直继续下去,直到R1和R2到网1的距离都增大到16时,R1和R2才知道原来网1是不可达的。RIP协议的这一特点叫做好消息传播得快,而坏消息传播得慢网络出故障的传播时间往往需要较长的时间(例如数分钟),这是RIP的一个主要缺点。

RIP协议的优缺点

优点:

实现简单,开销较小。

缺点:

  1. RIP 限制了网络的规模,它能使用的最大距离为 15(16 表示不可达)

  2. 路由器之间交换的路由信息是路由器中的完整路由表,因而随着网络规模的扩大,开销也就增加。

  3. “坏消息传播得慢”,使更新过程的收敛时间过长。

内部网关协议OSPF

**开放最短路径优先 OSPF (Open Shortest Path First)**是为克服 RIP 的缺点在 1989 年开发出来的。 OSPF 的原理很简单,但实现起来却较复杂。

OSPF 协议的基本特点

“开放”表明 OSPF 协议不是受某一家厂商控制,而是公开发表的, “最短路径优先”是因为使用了 Dijkstra 提出的最短路径算法 SPF ,采用分布式的链路状态协议 (link state protocol)

注意:OSPF 只是一个协议的名字,它并不表示其他的路由选择协议不是“最短路径优先”

OSPF的3个要点:

  1. 本自治系统所有路由器发送信息,这里使用的方法是洪泛法
  2. 发送的信息就是与本路由器相邻的所有路由器的链路状态,但这只是路由器所知道的部分信息
    1. “链路状态”就是说明本路由器都和哪些路由器相邻,以及该链路的**“度量”(metric)**。
  3. 只有当链路状态发生变化时,路由器才用洪泛法向所有路由器发送此信息。

链路状态数据库 (link-state database):

由于各路由器之间频繁地交换链路状态信息,因此所有的路由器最终都能建立一个链路状态数据库。 这个数据库实际上就是全网的拓扑结构图,它在全网范围内是一致的(这称为链路状态数据库的同步)。 OSPF 的链路状态数据库能较快地进行更新,使各个路由器能及时更新其路由表。 OSPF 的更新过程收敛得快是其重要优点。

OSPF 的区域 (area):

为了使 OSPF 能够用于规模很大的网络,OSPF 将一个自治系统再划分为若干个更小的范围,叫做区域。 每一个区域都有一个 32 位的区域标识符(用点分十进制表示)。 区域也不能太大,在一个区域内的路由器最好不超过 200 个。划分区域的好处就是将利用洪泛法交换链路状态信息的范围局限于每一个区域而不是整个的自治系统,这就减少了整个网络上的通信量。 在一个区域内部的路由器只知道本区域的完整网络拓扑,而不知道其他区域的网络拓扑的情况。 OSPF 使用层次结构的区域划分。在上层的区域叫做主干区域 (backbone area),主干区域的路由器称为主干路由器, 非主干区域的路由器叫区域边界路由器,主干区域的标识符规定为0.0.0.0。主干区域的作用是用来连通其他在下层的区域

image-20190512150717900

图4-4:OSPF划分为两种不同的区域

如图4-4所示,R6为连接本自治系统与其他自治系统的路由器,而其所属的区域随之称为主干区域

OSPF 不用 UDP 而是直接用 IP 数据报传送, OSPF 构成的数据报很短,这样做可减少路由信息的通信量。 数据报很短的另一好处是可以不必将长的数据报分片传送,因为分片传送的数据报只要丢失一个,就无法组装成原来的数据报,而整个数据报就必须重传

OSPF的特点:

  1. OSPF 允许管理员对不同的链路可根据 IP 分组的不同服务类型 TOS 而设置成不同的代价。因此,OSPF 对于不同类型的业务计算出不同的路由
  2. 如果到同一个目的网络有多条相同代价的路径,那么可以将通信量分配给这几条路径,这叫做多路径间的负载平衡
  3. 所有在 OSPF 路由器之间交换的分组都具有鉴别的功能。
  4. 支持可变长度的子网划分无分类编址 CIDR
  5. 每一个链路状态都带上一个 32 位的序号序号越大状态就越新

OSPF的5种分组类型

  1. 类型1,问候 (Hello) 分组,用来发现和维持邻站的可达性
  2. 类型2,数据库描述 (Database Description) 分组,向邻站给出自己的链路状态数据库中的所有链路状态项目的摘要信息
  3. 类型3,链路状态请求 (Link State Request) 分组,向对方请求发送某些链路状态项目的详细信息
  4. 类型4,链路状态更新 (Link State Update) 分组,用洪泛法对全网更新链路状态
  5. 类型5,**链路状态确认 (Link State Acknowledgment)**分组,对链路更新分组的确认

OSPF让每一个路由器用数据库描述分组和相邻路由器交换本数据库中已有的链路状态摘要信息。摘要信息主要就是指出有哪些路由器的链路状态信息(以及其序号)已经写入了数据库。经过与相邻路由器交换数据库描述分组后,路由器就使用链路状态请求分组,向对方请求发送自己所缺少的某些链路状态项目的详细信息。通过一系列的这种分组交换,全网同步的链路数据库就建立了。图4-5给出了OSPF的基本操作,说明了两个路由器需要交换各种类型的分组。

image-20190512152037462

图4-5:OSPF的基本操作

在网络运行的过程中,只要一个路由器的链路状态发生变化,该路由器就要使用链路状态更新分组,用洪泛法向全网更新链路状态,OSPF使用的是可靠的洪泛法,其要点见图4-6所示。设路由器R用洪泛法发出链路状态更新分组,图中用一些小的箭头表示更新分组。第一次先发给相邻的三个路由器,这三个路由器将收到的分组再进行转发时,要将其上游路由器除外。可靠的洪泛法是在收到更新分组后要发送确认(收到重复的更新分组只需要发送一次确认),图中的空心箭头表示确认分组。

image-20190512152833269

图4-6:用可靠的洪泛法发送更新分组

OSPF的其他特点:

  1. 为了确保链路状态数据库与全网的状态保持一致,OSPF还规定每隔一段时间,如30分钟,要刷新一次数据库中的链路状态
  2. 由于一个路由器的链路状态只涉及到与相邻路由器的连通状态,因而与整个互联网的规模并无直接关系。因此当互联网规模很大时,OSPF协议要比距离向量协议RIP好得多
  3. 由于OSPF没有"坏消息传播得慢的问题,据统计,其响应网络变化的时间小于100 ms 。
  4. 若干个路由器连接在一个以太网上,则每个路由器要向其他**(N-1)个路由器发送链路状态信息,因而共有N(N一1)个链路状态要在这个以太网上传送。OSPF协议对这种多点接入的局域网采用了指定的路由器(designMed router)的方法,使广播的信息量大大减少。指定的路由器代表该局域网上所有的链路向连接到该网络上的各路由器发送状态信息。指定的路由器代表该局域网上所有的链路向连接到该网络上的各路由器发送状态信息**。

外部网关协议BGP

BGP 是不同自治系统的路由器之间交换路由信息的协议。

互联网的规模太大,使得自治系统之间路由选择非常困难,对于自治系统之间的路由选择,要寻找最佳路由是很不现实的。 当一条路径通过几个不同 AS 时,要想对这样的路径计算出有意义的代价是不太可能的。 比较合理的做法是在 AS 之间交换**“可达性”**信息。 自

治系统之间的路由选择必须考虑有关策略。 因此,边界网关协议 BGP 只能是力求寻找一条能够到达目的网络且比较好的路由(不能兜圈子),而并非要寻找一条最佳路由

BGP 发言人:

每一个自治系统的管理员要选择至少一个路由器作为该自治系统的**“ BGP 发言人” (BGP speaker)** 。 一般说来,两个 BGP 发言人都是通过一个共享网络连接在一起的,而 BGP 发言人往往就是 BGP 边界路由器,但也可以不是 BGP 边界路由器。每一个BGP发言人除了必须运行BGP协议之外,还必须运行该自治系统的内部网关协议,如OSPF或RIP。

一个 BGP 发言人与其他自治系统中的 BGP 发言人要交换路由信息,就要先建立 TCP 连接,然后在此连接上交换 BGP 报文以建立 BGP 会话(session),利用 BGP 会话交换路由信息。 使用 TCP 连接能提供可靠的服务,也简化了路由选择协议。 使用 TCP 连接交换路由信息的两个 BGP 发言人,彼此成为对方的邻站(neighbor)对等站(peer)。

image-20190512153505189

图4-7:BGP发言人和自治系统AS的关系

BGP 所交换的网络可达性的信息就是要到达某个网络所要经过的一系列 AS。 当 BGP 发言人互相交换了网络可达性的信息后,各 BGP 发言人就根据所采用的策略从收到的路由信息中找出到达各 AS 的较好路由

image-20190512153908625

图4-8:BGP发言人交换路径向量的例子

图4-8给出了一个BGP发言人交换路径向量的例子,自治系统 AS2 的 BGP 发言人通知主干网 AS1 的 BGP 发言人:“要到达网络 N1、 N2、N3 和 N4 可经过 AS2。”,主干网在收到这个通知后,就发出通知:"要到达网络 N1、 N2、N3 和 N4 可沿路径(AS1,AS2) ",主干网还可发出通知:“要到达网络 N5、N6 和 N7 可沿路径(AS1, AS3)。”

从上面的讨论可以看出,BGP 协议交换路由信息的结点数量级自治系统数的量级,这要比这些自治系统中的网络数少很多,每一个自治系统中 BGP 发言人(或边界路由器)的数目是很少的,这样就使得自治系统之间的路由选择不致过分复杂。

BGP协议的特点:

  1. BGP 支持 CIDR,因此 BGP 的路由表也就应当包括目的网络前缀下一跳路由器,以及到达该目的网络所要经过的各个自治系统序列
  2. 在 BGP 刚刚运行时,BGP 的邻站是交换整个的 BGP 路由表,但以后只需要在发生变化时更新有变化的部分,这样做对节省网络带宽和减少路由器的处理开销都有好处。

BGP的4种报文:

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

若两个邻站属于两个不同AS,而其中一个邻站打算和另一个邻站定期地交换路由信息,这就应当有一个商谈的过程(因为很可能对方路由器的负荷已很重因而不愿意再加重负担)。因此,一开始向邻站进行商谈时就必须发送OPEN报文。如果邻站接受这种邻站关系,就用KEEPALTVE报文响应。这样,两个BGP发言人的邻站关系就建立了。一旦邻站关系建立了,就要继续维持这种关系。双方中的每一方都需要确信对方是存在的,且一直在保持这种邻站关系。为此,这两个BGP发言人彼此要周期性地交换KEEPALIVE报文(一般每隔30秒)。KEEPALIVE报文只有19字节长(只用BGP报文的通用首部),因此不会造成网络上太大的开销UPDATE报文BGP协议的核心内容。BGP发言人可以用UPDATE报文撤销它以前曾经通知过的路由,也可以宣布增加新的路由撤销路由可以一次撤销许多条,但增加新路由时,毎个更新报文只能增加一条

BGP可以很容易地解决距离向量路由选择算法中的"坏消息传播得慢"这一问题。当某个路由器或链路出故障时,由于BGP发言人可以从不止一个邻站获得路由信息,因此很容易选择出新的路由。距离向量算法往往不能给出正确的选择,是因为这些算法不能指出哪些邻站到目的站的路由是独立的

image-20190512155134798

图4-9:BGP报文具有的通用首部

图4-9给出了BGP报文的格式。四种类型的BGP报文具有同样的通用首部,其长度为19字节。通用首部分为三个字段。**标记(marker)**字段为16字节长,用来鉴别收到的BGP报文(这是假定将来有人会发明出合理的鉴别方案)。当不使用鉴别时,标记字段要置为全1。长度字段指出包括通用首部在内的整个BGP报文以字节为单位的长度,最小值是19,最大值是4096。类型字段的值为1到4,分别对应于上述四种BGP报文中的一种。

OPEN报文共有6个字段,即版本(1字节,现在的值是4)本自治系统号(2字节,使用全球唯一的16位自治系统号,由ICANN地区登记机构分配)保持时间(2字节,以秒计算的保持为邻站关系的时间)BGP标识符(4字节,通常就是该路由器的IP地址)可选参数长度(1字节)可选参数

UPDATE报文共有5个字段,即不可行路由长度(2字节,指明下一个字段的长度)撤销的路由(列出所有要撤销的路由)路径属性总长度(2字节,指明下一个字段的长度)路径属性(定义在这个报文中增加的路径的属性)网络层可达性信息NLRI(Network Layer Reachability Information)。最后这个字段定义发出此报文的网络,包括网络前缀的位数、IP地址前缀。KEEPALIVE报文只有BGP的19字节长的通用首部。

NOTIFICATION报文有3个字段,即差错代码(1字节)差错子代码(1字节)差错数据(给出有关差错的诊断信息)

在讨论完路由选择之后,我们再来介绍路由器的构成。

路由器的组成

路由器是一种典型的网络层设备,是互联网中的关键设备。

路由器的主要作用是:

  1. 连通不同的网络。
  2. 选择信息传送的线路,选择通畅快捷的近路,能大大提高通信速度,减轻网络系统通信负荷,节约网络系统资源,提高网络系统畅通率,从而让网络系统发挥出更大的效益来。

路由器的结构

路由器是一种具有多个输入端口多个输出端口的专用计算机,其任务是转发分组。也就是说,将路由器某个输入端口收到的分组,按照分组要去的目的地(即目的网络),把该分组从路由器的某个合适的输出端口转发给下一跳路由器。 下一跳路由器也按照这种方法处理分组,直到该分组到达终点为止。 路由器的转发分组正是网络层的主要工作。

image-20190512155320758

图4-10:典型路由器的结构

如图4-10,整个的路由器结构可划分为两大部分:

  1. 路由选择部分

    也叫做控制部分,其核心构件是路由选择处理机。

    路由选择部分路由选择处理机的任务是根据所选定的路由选择协议构造出路由表,同时经常或定期地和相邻路由器交换路由信息而不断地更新和维护路由表。

  2. 分组转发部分

    由三部分组成:

    • 交换结构 (switching fabric):又称为交换组织,其作用是根据转发表 (forwarding table) 对分组进行处理。
    • 一组输入端口
    • 一组输出端口

    (请注意:这里的端口就是硬件接口)

“转发”和“路由选择”的区别

“转发”(forwarding) 就是路由器根据转发表将用户的 IP 数据报从合适的端口转发出去。

“路由选择”(routing) 则是按照分布式算法,根据从各相邻路由器得到的关于网络拓扑的变化情况,动态地改变所选择的路由路由表是根据路由选择算法得出的,而转发表是从路由表得出的。 在讨论路由选择的原理时,往往不去区分转发表和路由表的区别。

输入端口对线路上收到的分组的处理

如图4-11所示,路由器的输入端口里面装有物理层、数据链路层和网络层的处理模块。 数据链路层剥去帧首部和尾部后,将分组送到网络层的队列中排队等待处理,这会产生一定的时延。 输入端口中的查找和转发功能在路由器的交换功能中是最重要的。

image-20190512155706959

图4-11
输出端口将交换结构传送来的分组发送到线路

如图4-12所示,输出端口里面装有物理层、数据链路层和网络层的处理模块。 输出端口从交换结构接收分组,然后把它们发送到路由器外面的线路上。 在网络层的处理模块中设有一个缓冲区(队列)。当交换结构传送过来的分组的速率超过输出链路的发送速率时,来不及发送的分组就必须暂时存放在这个队列中。 数据链路层处理模块将分组加上链路层的首部和尾部,交给物理层后发送到外部线路。

图4-12
分组丢弃

若路由器处理分组的速率赶不上分组进入队列的速率,则队列的存储空间最终必定减少到零,这就使后面再进入队列的分组由于没有存储空间而只能被丢弃。路由器中的输入或输出队列产生溢出是造成分组丢失的重要原因。

交换结构

image-20190512160037273

图4-13

交换结构是路由器的关键构件, 正是这个交换结构把分组从一个输入端口转移到某个合适的输出端口。 实现交换有多种方法,如图4-13所示,常用交换方法有三种:

  1. 通过存储器

  2. 通过总线

  3. 通过纵横交换结构

通过存储器

(1) 当路由器的某个输入端口收到一个分组时,就用中断方式通知路由选择处理机。然后分组就从输入端口复制到存储器中。

(2) 路由器处理机从分组首部提取目的地址,查找路由表,再将分组复制到合适的输出端口的缓存中。

(3) 若存储器的带宽(读或写)为每秒 M 个分组,那么路由器的交换速率(即分组从输入端口传送到输出端口的速率)一定小于 M/2。

通过总线

(1) 数据报从输入端口通过共享的总线直接传送到合适的输出端口,而不需要路由选择处理机的干预。

(2) 因为每一个要转发的分组都要通过这一条总线,因此路由器的转发带宽就受总线速率的限制。

(3) 现代的技术已经可以将总线的带宽提高到每秒吉比特的速率,因此许多的路由器产品都采用这种通过总线的交换方式。

通过纵横交换结构 (crossbar switch fabric)

(1) 这种交换结构常称为互连网络 (interconnection network)。

(2) 它有 2N 条总线,可以使 N 个输入端口和 N 个输出端口相连接。

(3) 当输入端口收到一个分组时,就将它发送到与该输入端口相连的水平总线上。

(4) 若通向所要转发的输出端口的垂直总线是空闲的,则在这个结点将垂直总线与水平总线接通,然后将该分组转发到这个输出端口。

(5) 但若该垂直总线已被占用(有另一个分组正在转发到同一个输出端口),则后到达的分组就被阻塞,必须在输入端口排队。

IPv6

IP 是互联网的核心协议, 互联网经过几十年的飞速发展,到 2011 年 2 月,IPv4 的 32 位地址已经耗尽。 ISP 已经不能再申请到新的 IP 地址块了。 我国在 2014 – 2015 年也逐步停止了向新用户和应用分配 IPv4 地址, 解决 IP 地址耗尽的根本措施就是采用具有更大地址空间的新版本的 IP,即 IPv6。

IPv6的基本首部

IPv6 仍支持无连接的传送,但将协议数据单元 PDU 称为分组。为方便起见,本文仍采用数据报这一名词。 所引进的主要变化如下:

  1. 更大的地址空间,IPv6 将地址从 IPv4 的 32 位 增大到了 128 位,使地址空间增大了2962^{96}倍,这样大的地址空间在可预见的将来是不会用完的。
  2. 扩展的地址层次结构,IPv6由于地址空间很大,因此可以划分为更多的层次。
  3. 灵活的首部格式
  4. 改进的选项, IPv6 允许数据报包含有选项的控制信息,其选项放在有效载荷中。
  5. 允许协议继续扩充。
  6. 支持即插即用(即自动配置)。因此 IPv6 不需要使用 DHCP。
  7. 支持资源的预分配。 IPv6 支持实时视像等要求,保证一定的带宽和时延的应用。
  8. IPv6 首部改为 8 字节对齐。首部长度必须是 8 字节的整数倍。原来的 IPv4 首部是 4 字节对齐。

IPv6数据报的一般形式:

IPv6 数据报由两大部分组成:

  1. 基本首部 (base header)
  2. 有效载荷 (payload)。有效载荷也称为净负荷,有效载荷允许有零个或多个扩展首部 (extension header),再后面是数据部分

![image-20190512192432652](/Users/dmrfcoder/Library/Application Support/typora-user-images/image-20190512192432652.png)

图5-1:具有多个拓展首部的IPv6数据报的基本形式

IPv6 将首部长度变为固定的 40 字节,称为基本首部。 把首部中不必要的功能取消了,使得 IPv6 首部的字段数减少到只有 8 个。 IPv6 对首部中的某些字段进行了如下的更改:

  1. 取消了首部长度字段,因为首部长度是固定的 40 字节;
  2. 取消了服务类型字段;
  3. 取消了总长度字段,改用有效载荷长度字段;
  4. 把 TTL 字段改称为跳数限制字段;
  5. 取消了协议字段,改用下一个首部字段;
  6. 取消了检验和字段;
  7. 取消了选项字段,而用扩展首部来实现选项功能。

image-20190512192642613

图5-2:40字节的IPv6基本首部

如图5-2所示,IPv6的基本首部又以下部分组成:

  • 版本(version)—— 4 位。它指明了协议的版本,对 IPv6 该字段总是 6。

  • 通信量类(traffic class)—— 8 位。这是为了区分不同的 IPv6 数据报的类别或优先级。目前正在进行不同的通信量类性能的实验。

  • 流标号(flow label)—— 20 位。 “流”是互联网络上从特定源点到特定终点的一系列数据报, “流”所经过的路径上的路由器都保证指明的服务质量。所有属于同一个流的数据报都具有同样的流标号。

  • 有效载荷长度(payload length)—— 16 位。它指明 IPv6 数据报除基本首部以外的字节数(所有扩展首部都算在有效载荷之内),其最大值是 64 KB。

  • 下一个首部(next header)—— 8 位。它相当于 IPv4 的协议字段或可选字段。

  • 跳数限制(hop limit)—— 8 位。源站在数据报发出时即设定跳数限制。路由器在转发数据报时将跳数限制字段中的值减 1。当跳数限制的值为零时,就要将此数据报丢弃。

  • 源地址—— 128 位。是数据报的发送站的 IP 地址。

  • 目的地址—— 128 位。是数据报的接收站的 IP 地址。

IPv6 把原来 IPv4 首部中选项的功能都放在扩展首部中,并将扩展首部留给路径两端的源站和目的站的主机来处理。 数据报途中经过的路由器都不处理这些扩展首部(只有一个首部例外,即逐跳选项扩展首部)。 这样就大大提高了路由器的处理效率。

在 RFC 2460 中定义了六种扩展首部

  • 逐跳选项
  • 路由选择
  • 分片
  • 鉴别
  • 封装安全有效载荷
  • 目的站选项

Ipv6的地址

IPv6 数据报的目的地址可以是以下三种基本类型地址之一:

  1. **单播 (unicast):**传统的点对点通信。
  2. **多播 (multicast):**一点对多点的通信。
  3. **任播 (anycast):**这是 IPv6 增加的一种类型。任播的目的站是一组计算机,但数据报在交付时只交付其中的一个,通常是距离最近的一个。

IPv6 将实现 IPv6 的主机和路由器均称为结点, 一个结点就可能有多个与链路相连的接口。 IPv6 地址是分配给结点上面的接口的, 一个接口可以有多个单播地址, 其中的任何一个地址都可以当作到达该结点的目的地址,即一个结点接口的单播地址可用来唯一地标志该结点

冒号十六进制记法

在 IPv6 中,每个地址占 128 位,地址空间大于 3.4 × 1038 。 为了使地址再稍简洁些,IPv6 使用冒号十六进制记法(colon hexadecimal notation, 简写为 colon hex)。 每个 16 位的值用十六进制值表示,各值之间用冒号分隔。例如: 68E6:8C64:FFFF:FFFF:0:1180:960A:FFFF, 在十六进制记法中,允许把数字前面的 0 省略。例如把 0000 中的前三个 0 省略,写成 1 个 0。

零压缩:

冒号十六进制记法可以允许零压缩 (zero compression),即一连串连续的零可以为一对冒号所取代FF05:0:0:0:0:0:0:B3 可压缩为: FF05::B3

注意:在任一地址中只能使用一次零压缩。

冒号十六进制记法可结合使用点分十进制记法的后缀,这种结合在 IPv4 向 IPv6 的转换阶段特别有用。 例如:0:0:0:0:0:0:128.10.2.1 再使用零压缩即可得出: ::128.10.2.1

CIDR 的斜线表示法仍然可用。 例如:60 位的前缀 12AB00000000CD3 可记为: 12AB:0000:0000:CD30:0000:0000:0000:0000/6012AB::CD30:0:0:0:0/60 (零压缩)12AB:0:0:CD30::/60 (零压缩)

IPv6地址分类

地址类型 二进制前缀
未指明地址 00…0(128位),可记为::/128
环回地址 00…1(128位),可记为 ::1/128
多播地址 11111111(8位),可记为FF00::/8
本地链路单播地址 1111111010(10位),可记为 **FE80::/10
全球单播地址 (除上述四种外,所有其他的二进制前缀)
  1. 未指明地址

    这是 16 字节的全 0 地址,可缩写为两个冒号“::”。 这个地址只能为还没有配置到一个标准的 IP 地址的主机当作源地址使用。 这类地址仅此一个。

  2. 环回地址

    即 0:0:0:0:0:0:0:1(记为 ::1)。 作用和 IPv4 的环回地址一样。 这类地址也是仅此一个。

  3. 多播地址

    功能和 IPv4 的一样。 这类地址占 IPv6 地址总数的 1/256。

  4. 本地链路单播地址 (Link-Local Unicast Address)

    有些单位的网络使用 TCP/IP 协议,但并没有连接到互联网上。连接在这样的网络上的主机都可以使用这种本地地址进行通信,但不能和互联网上的其他主机通信。 这类地址占 IPv6 地址总数的 1/1024。

  5. 全球单播地址

    IPv6 的这一类单播地址是使用得最多的一类。 曾提出过多种方案来进一步划分这 128 位的单播地址。 根据 2006 年发布的草案标准 RFC 4291 的建议, IPv6 单播地址的划分方法非常灵活。

从IPv4向IPv6过渡

向 IPv6 过渡只能采用逐步演进的办法,同时,还必须使新安装的 IPv6 系统能够向后兼容:IPv6 系统必须能够接收和转发 IPv4 分组,并且能够为 IPv4 分组选择路由。

两种向 IPv6 过渡的策略:

  1. 使用双协议栈
  2. 使用隧道技术

双协议栈

双协议栈 (dual stack) 是指在完全过渡到 IPv6 之前,使一部分主机(或路由器)装有两个协议栈,一个 IPv4 和一个 IPv6。 双协议栈的主机(或路由器)记为 IPv6/IPv4,表明它同时具有两种 IP 地址:一个 IPv6 地址和一个 IPv4 地址。 双协议栈主机在和 IPv6 主机通信时是采用 IPv6 地址,而和 IPv4 主机通信时就采用 IPv4 地址。 根据 DNS 返回的地址类型可以确定使用 IPv4 地址还是 IPv6 地址。

image-20190512194200669

隧道技术

在 IPv6 数据报要进入 IPv4 网络时,把 IPv6 数据报封装成为 IPv4 数据报,整个的 IPv6 数据报变成了 IPv4 数据报的数据部分。 当 IPv4 数据报离开 IPv4 网络中的隧道时,再把数据部分(即原来的 IPv6 数据报)交给主机的 IPv6 协议栈。

image-20190512194151349

ICMPv6

IPv6 也不保证数据报的可靠交付,因为互联网中的路由器可能会丢弃数据报。 因此 IPv6 也需要使用 ICMP 来反馈一些差错信息。新的版本称为 ICMPv6。

地址解析协议 ARP 和网际组管理协议 IGMP 协议的功能都已被合并到 ICMPv6 中。

image-20190512194240148

ICMPv6报文的分类

CMPv6 是面向报文的协议,它利用报文来报告差错,获取信息,探测邻站或管理多播通信。 ICMPv6 还增加了几个定义报文的功能及含义的其他协议。

image-20190512194315230

IP多播

IP多播的概念

IP 多播 (multicast,以前曾译为组播) 已成为互联网的一个热门课题。 目的:更好地支持一对多通信。 一对多通信:一个源点发送到许多个终点。 例如,实时信息的交付(如新闻、股市行情等),软件更新,交互式会议及其他多媒体通信。

在局域网上进行硬件多播

网际组管理协议 IGMP 和多播路由选择协议

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

多协议标记交换MPLS

2019-05-11 15:07:50 qq_36982160 阅读数 325

彩蛋

计算机网络谢希仁第七版原版ppt获取方式:公众号后台回复”N3“即可获取。

由于公众号不支持显示LaTeX公式且公众号排版混乱,建议大家关注微信公众号"IT工匠",后台回复"N4-2"获取xmind源文件以及本文原文pdf文件获取更佳阅读体验。

本文主要内容:

计算机网络第三弹——数据链路层

数据链路层概述

数据链路层是计算机网络五层协议体系结构的第2层(从下往上计数),在整个体系结构中有非常重要的作用:

image-20190510163257245

图1:不同主机之间通信时数据链路层的地位

如图1所示,上半部分表示主机H1与主机H2通信所需经过的结点,下半部分是每一个结点对应拥有的计算机网络体系结构的抽象模型,可以看到网络中的主机、路由器等都必须经过数据链路层。

image-20190510163509740

图2:局域网中数据链路层的地位

如图2所示,局域网中的主机、交换机等都必须实现数据链路层。

综上,数据链路层是实现设备之间通信的非常重要的一层。

数据链路层使用的两种信道

点对点信道

image-20190510164355614

图3:点对点信道示意图

如图3所示,点对点信道是使用一对一的点对点通信方式。

广播信道

image-20190510164447038

图4:广播信道示意图

如图4所示,广播信道使用的是一对多的广播通信方式,因此必须使用专用的共享信道协议来协调这些主机的数据发送。

使用点对点信道的数据链路层

几个概念的明确:

链路

链路(link):也称物理链路**,从一个结点到相邻结点的一段物理线路(有线或无线),中间没有任何交换结点。一条链路只是一条通路的一个组成部分

数据链路

数据链路(data link):也称逻辑链路,当需要在一条线路上传送数据时,除了必须有一条物理线路之外,还必须有一些必要的通信协议来控制这些数据的传输,若把实现这些协议的硬件软件加到链路上,就构成了数据链路

现在最常用的方法是使用网络适配器(即网卡)来实现这些协议的硬件和软件。

一般的适配器都包括了数据链路层和物理层这两层的功能。

image-20190510165201270

图5:使用点对点信道的数据链路层

数据链路层把网络层交付下来的数据构成帧发送到链路上,以及把接收到的帧中的数据取出并交付给网络层。如图5所示,点对点信道的数据链路层在进行通信时的主要步骤如下:

1:结点A的数据链路层将网络层传下来的IP数据报添加首部和尾部封装成帧

2:结点A将封装好的帧发送给结点B的帧;

3:若结点B的数据链路层受到的帧无差错,则从受到的帧中提取出IP数据报交付至网络层,否则丢弃这个帧。

image-20190510165724541

图6

注意,数据链路层不需要考虑物理层如何实现比特传输的细节。甚至还可以更简单地设想好像是沿着两个数据链路层之间的水平方向把帧直接发送到对方,如图6所示,这也是我们把计算机网络体系结构分层的目的之一。

三个基本问题

上一节的最后描述了点对点信道的数据链路层在进行通信时的主要步骤,那么为了完成数据链路层的工作,我们需要解决三个问题:封装成帧透明传输差错检测,虽然数据链路层协议有很多种,但是上述三个基本问题是共同需要解决的

封装成帧

封装成帧 (framing) 就是在一段数据的前后分别添加首部尾部,然后就构成了一个帧。 首部和尾部的一个重要作用就是进行帧定界,即确定帧的界限,进而识别出帧的开始和结束。

image-20190510170341838

图7:帧的组成部分

如图7所示,一个完整的帧包括首部数据部分尾部三个部分,发送帧的时候是从首部开始发送,尾部最后发送,很明显为了提高帧的传输效率,我们应该尽量使帧的数据部分尽可能地大于首部和尾部的长度。但是数据链路层的每一种协议都规定了所能传送的帧的数据部分长度上限——最大传送单元(MTU,Maximum Transfer Unit),图7展示了帧的各个部分以及数据部分与MTU部分的关系。

用控制字符进行帧定界的方法举例

image-20190510170955860

图8:用控制字符进行帧定界

如图8所示,当数据是由可打印的 ASCII 码组成的文本文件时,帧定界可以使用特殊的帧定界符。 控制字符 SOH (Start Of Header) 放在一帧的最前面,表示帧的首部开始。另一个控制字符 EOT (End Of Transmission) 表示帧的结束。

当数据在传输中出现差错时,帧定界的作用更加明显。假定发送端在、尚未发送完一帧 时突然出现故障中断了传送,但随后又很快恢复正常,于是重新从头开始发送刚才的帧,由于使用了帧定界符,接收端就知道前面接收到的帧是个不完整的帧(因为它只有首部SOH而没有尾部EOT),应该丢弃,而后面受到的数据有明确的首部和尾部,因此这是一个完整的帧,应该收下。

透明传输

由于帧的开始和结束的标记使用专门指明的控制字符,因此所传输的数据中的任何8比特的组合一定不允许和用作帧定界的控制字符的比特编码一样,否则就会出现帧定界的错误,如图9所示:

image-20190510171541099

图9:数据部分恰好出现与EOT一样的代码

如图9所示,当数据部分出现了和SOH或EOT一样的代码时,数据链路层就会错误地"找到帧的边界"。

透明传输的定义是:某一个实际存在的事物看起来却好像不存在一样。在数据链路层透明传输表示无论什么样的比特组合的数据,都能够按照原样没有差错地通过这个数据链路层。很明显,上面提到的图9中帧的传输很明显就不是**“透明传输”**。

为了实现透明传输,我们可以使用字节填充 (byte stuffing)字符填充 (character stuffing),具体的做法是:

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

image-20190510172227072

图10:字节填充解决透明传输问题图示

差错检测

现实的通信链路都不会是理想的,这也就是说,比特在传输过程中可能会产生差错:1可能会变成0、0可能会变成1.这就叫比特差错,如不加特殊说明,本文所说的**"差错"就是指比特差错**。

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

误码率与信噪比有很大的关系。 为了保证数据传输的可靠性,在计算机网络传输数据时,必须采用各种差错检测措施。 在数据链路层传送的帧中,广泛使用了循环冗余检验 CRC 的检错技术,具体原理入下:

循环冗余检验

循环冗余检验的流程如下:

  • 发送端

    1:在发送端,先把数据划分为组,假定每组k个比特。

    2:在每组数据M后面添加供差错检测用的n位冗余码,然后一起发送出去。

    冗余码的计算方法:

    1:用二进制的模 2 运算进行2n2^n 乘 M 的运算,这相当于在 M 后面添加 n 个 0。

    2:得到的 (k + n) 位的数除以事先选定好的长度为 (n + 1) 位的除数 P,得出商是 Q 而余数是 R,余数 R 比除数 P 少 1 位,即 R 是 n 位。

    3:将余数 R 作为冗余码拼接在数据 M 后面,一起发送出去。

  • 接收端

    接收端对收到的每一帧进行CRC检验,检验的方法是使用接收到的数据除以接收端与发送端事先约定好的除数P(模2运算),然后:

    (1) 若得出的余数 R = 0,则判定这个帧没有差错,就接受 (accept)。

    (2) 若余数 R ≠ 0,则判定这个帧有差错,就丢弃。

    但这种检测方法并不能确定究竟是哪一个或哪几个比特出现了差错。 只要经过严格的挑选,并使用位数足够多的除数 P,那么出现检测不到的差错的概率就很小很小。

  • 举例

    比如要发送的数据M=101001,即k=6,事先约定好的除数P=1101,由于P为n+1=4位,所以n=3,冗余码的计算流程如下:

    1:在M后面添加n个0,得到k+n位数:101001000

    2:给得到的k+n位数初以P:

    image-20190510174536621

    得到余数R=001

    3:将余数R=001作为冗余码拼接在数据M后面,即M=101001001。

    接收端接收到101001001后的检验流程如下:

    使用101001001除以P(1101),得到余数0,说明无差错,接受。

在数据后面添加上的冗余码称为帧检验序列 FCS (Frame Check Sequence)。 循环冗余检验 CRC 和帧检验序列 FCS 并不等同。 CRC 是一种常用的检错方法,而 FCS 是添加在数据后面的冗余码。 FCS 可以用 CRC 这种方法得出,但 CRC 并非用来获得 FCS 的唯一方法

一种较为方便的方法是使用多项式来表示循环冗余检验过程,我们可以用多项式:
P(X)=X3+X2+1 P(X)=X^3+X^2+1
来表示上述例子中的除数P=1101.

从以上讨论不难看出,如果数据链路层 不以帧为单位进行数据传送,就无法加入冗余码来进行差错检验。因此,如果要在数据链路层进行差错检测,就必须把数据划分为帧,每一帧都加上冗余码,一帧一帧地传送,然后在接收方逐帧进行差错检验。

注意:

1:仅用循环冗余检验 CRC 差错检测技术只能做到无差错接受 (accept)

2:“无差错接受”是指:“凡是接受的帧(即不包括丢弃的帧),我们都能以非常接近于 1 的概率认为这些帧在传输过程中没有产生差错”。接收端丢弃的帧虽然曾经收到了,但最终还是因为有差错被丢弃,即没有被接受。 也就是说:“凡是接收端数据链路层接受的帧都没有传输差错”(有差错的帧就丢弃而不接受)。

3:单纯使用 CRC 差错检测技术不能实现“无差错传输”或“可靠传输”。因为可靠传输指的是发送端发送什么、接收端就接收什么,而传输差错可以分为两类,一类是比特差错,数据链路层使用CRC检验可以解决这个问题,还有一类是帧丢失、帧重复、帧失序的错误,这类错误中并没有出现比特错误,而是以为单位出错的,所以CRC并没有解决这个问题.

5: 要做到“无差错传输”(即发送什么就收到什么)就必须再加上确认和重传机制。 本章介绍的数据链路层协议都不是可靠传输的协议。

6:现在互联网对于数据链路层采取了区别对待的策略:

  • 对于通信质量好的有线传输链路:数据链路层不适用确认和重传机制,即不要求数据链路层向上提供可开传输的服务。
  • 对于通信质量差的无线传输链路:数据链路层使用确认和重传机制,向上提供可靠运输的服务。

点对点协议PPP

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

我们知道,互联网用户通常都要接入到某个ISP才能接入到互联网。PPP协议就是用户计算机和ISP进行通信时所使用的数据链路层协议,如图11所示:

image-20190510184320611

图11:用户到ISP的链路使用PPP协议

PPP协议应满足的要求:

  • 简单 —— 这是首要的要求。
  • 封装成帧 —— 必须规定特殊的字符作为帧定界符。
  • 透明性 —— 必须保证数据传输的透明性。
  • 多种网络层协议 —— 能够在同一条物理链路上同时支持多种网络层协议。
  • 多种类型链路 —— 能够在多种类型的链路上运行。
  • 差错检测 —— 能够对接收端收到的帧进行检测,并立即丢弃有差错的帧。
  • 检测连接状态 —— 能够及时自动检测出链路是否处于正常工作状态。
  • 最大传送单元 —— 必须对每一种类型的点对点链路设置最大传送单元 MTU 的标准默认值,促进各种实现之间的互操作性。
  • 网络层地址协商 —— 必须提供一种机制使通信的两个网络层实体能够通过协商知道或能够配置彼此的网络层地址。
  • 数据压缩协商 —— 必须提供一种方法来协商使用数据压缩算法。

PPP协议不需要的功能:

  • 纠错
  • 流量控制
  • 序号
  • 多点线路
  • 半双工或单工链路

PPP协议的帧格式

image-20190510194344201

图12:PPP协议的帧格式

如图12所示,PPP 帧的首部和尾部分别为 4 个字段和 2 个字段。

  • 标志字段 F = 0x7E (符号“0x”表示后面的字符是用十六进制表示。十六进制的 7E 的二进制表示是 01111110)。
  • 地址字段 A 只置为 0xFF。地址字段实际上并不起作用
  • 控制字段 C 通常置为 0x03。
  • 协议字段,占用2个字节:
    • 0x0021时表示PPP帧的信息字段为IP数据报
    • 0xC021时表示PPP帧的信息字段为PPP链路控制协议LCP的数据
    • 0x8012时表示信息字段是网络控制数据
  • 信息字段(IP数据报)的长度是可变的,不超过1500字节
  • PPP 是面向字节的,所有的 PPP 帧的长度都是整数字节

字节填充(异步传输时使用)

当信息字段出现和标志字段一样的比特(0x7E,01111110)组合时,必须采取一些措施使这种形式上和标志字段一样的比特组合不出现在信息字段中,PPP异步传输时将转义符定义为0x7D(即01111101),并使用字节填充,方法如下:

image-20190510195921873

图13:字节填充示意图

1:将信息字段中出现的每一个0x7E替换为2字节序列0x7D,0x5E

2:若信息字段出现一个0x7D字节,则把0x7D转变为0x7D,0x5E

3:若信息字段出现ASCII码的控制字符,则在该字符前面加入一个0x7D字节,例如出现0x30(在控制字符中是"传输结束"ETX),就要把他转变为2字节序列0x7D,0x23.

由于在发送端进行了字节填充,因此链路上传送的信息字节数就超过了原来的信息字节数。但接收端在收到数据后再进行与发送端字节填充相反的变换,就可以正确地恢复原来的信息。

零比特填充(同步传输时使用)

PPP 协议用在 SONET/SDH 链路时,使用同步传输(一连串的比特连续传送)。这时 PPP 协议为了避免出现信息字段出现和标志字段(0x7E,01111110)一样的比特组合的问题,采用零比特填充方法来实现透明传输。

image-20190510200330165

图14:零比特填充示意图

其原理如图14所示,在发送端,只要发现有 5 个连续 1,则立即填入一个 0。 接收端对帧中的比特流进行扫描。每当发现 5 个连续1时,就把这 5 个连续 1 后的一个 0 删除。

PPP协议不提供使用序号和确认的可靠传输服务

PPP 协议之所以不使用序号和确认机制是出于以下的考虑:

  • 在数据链路层出现差错的概率不大时,使用比较简单的 PPP 协议较为合理。
  • 在因特网环境下,PPP 的信息字段放入的数据是 IP 数据报。数据链路层的可靠传输并不能够保证网络层的传输也是可靠的。
  • 帧检验序列 FCS 字段可保证无差错接受

PPP协议的工作状态

PPP协议的组成:

  • 一个将 IP 数据报封装到串行链路的方法。

  • 链路控制协议 LCP (Link Control Protocol)。

  • 网络控制协议 NCP (Network Control Protocol)。

PPP协议的工作状态:

image-20190510201146843

图15:PPP协议的工作状态

如图15所示,PPP协议的工作状态主要分为:

  • 用户拨号接入 ISP 时,路由器的调制解调器对拨号做出确认,并建立一条物理连接(对应于链路静止\to链路建立)。
  • PC 机向路由器发送一系列的 LCP 分组(封装成多个 PPP 帧)。
  • 这些分组及其响应选择一些 PPP 参数,并进行网络层配置,NCP 给新接入的 PC 机分配一个临时的 IP 地址,使 PC 机成为因特网上的一个主机。
  • 通信完毕时,NCP 释放网络层连接,收回原来分配出去的 IP 地址。接着,LCP 释放数据链路层连接。最后释放的是物理层的连接。

可见,PPP 协议已不是纯粹的数据链路层的协议,它还包含了物理层网络层的内容。

使用广播信道的数据链路层

局域网的数据链路层

局域网最主要的特点是:

  • 网络为一个单位所拥有;
  • 地理范围和站点数目均有限。

局域网具有如下主要优点

  • 具有广播功能,从一个站点可很方便地访问全网。局域网上的主机可共享连接在局域网上的各种硬件和软件资源。 便
  • 于系统的扩展和逐渐地演变,各设备的位置可灵活调整和改变。 提高了系统的可靠性、可用性和残存性。

image-20190510202636666

图16:局域网的拓扑结构

如图16所示为局域网的几种常见的拓扑结构。

image-20190510202850799

图17:共享的广播信道

如图17所示,使用广播信道的数据链路层使用的是共享的信道,这种机制的问题是若多个设备在共享的广播信道上同时发送数据,则会造成彼此干扰,导致发送失败。要解决这一问题在技术上主要有两种方法:

1:静态划分信道(在物理层时已经介绍过)

  • 频分复用
  • 时分复用
  • 波分复用
  • 码分复用

2:动态媒体接入控制(多点接入)

  • 随机接入

    所有用户可随机发送信息,如果恰巧两个或更多用户同一时刻发送信息,那么在共享媒体上就要产生碰撞(即发生了冲突),使得这些用户的发送都失败。因此,必须要有解决碰撞冲突的网络协议。

  • 受控接入

    用户不能随机地发送信息,必须服从一定的控制。这类典型代表有分散控制的令牌环局域网集中控制的多点线路探寻(polling),或称轮询

适配器的作用

  • 网络接口板又称为通信适配器 (adapter)网络接口卡 NIC (Network Interface Card),或“网卡”。
  • 适配器功能如图18所示:
    • 进行串行/并行转换
    • 对数据进行缓存
    • 在计算机的操作系统安装设备驱动程序。
    • 实现以太网协议。

image-20190510203929066

图18:网卡的作用

CSMA/CD协议

image-20190510204209754

图19:最初的以太网结构

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

为了实现一对一通信,将接收站的硬件地址写入帧首部中的目的地址字段中。仅当数据帧中的目的地址与适配器的硬件地址一致时,才能接收这个数据帧,如图20所示。

image-20190510204350828

图20

这种方法的缺点就是若多台计算机或多个站点同时发送时 ,会产生发送碰撞或冲突,导致发送失败。

为了通信的简便,以太网采取了两种重要的措施:

1:采用较为灵活的无连接的工作方式

  • 不必先建立连接就可以直接发送数据。
  • 对发送的数据帧不进行编号,也不要求对方发回确认。这样做的理由是局域网信道的质量很好,因信道质量产生差错的概率是很小的
  • 以太网提供的服务是不可靠的交付,即尽最大努力的交付。
  • 当目的站收到有差错的数据帧时就丢弃此帧,其他什么也不做。差错的纠正由高层(TCP或UDP)来决定。
  • 如果高层发现丢失了一些数据而进行重传,但以太网并不知道这是一个重传的帧,而是当作一个新的数据帧来发送

2:以太网发送的数据都使用曼彻斯特 (Manchester) 编码,如图21所示:

image-20190510204909832

图21:曼彻斯特编码示意图

曼彻斯特编码缺点是:它所占的频带宽度比原始的基带信号增加了一倍(因为每秒传送的码元数加倍了)。

下面介绍CSMA/CD:

CSMA/CD 含义载波监听多点接入 / 碰撞检测 (Carrier Sense Multiple Access with Collision Detection) 。

**“多点接入”**表示许多计算机以多点接入的方式连接在一根总线上。

“载波监听”是指每一个站在发送数据之前先要检测一下总线上是否有其他计算机在发送数据,如果有,则暂时不要发送数据,以免发生碰撞

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

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

检测到碰撞之后:

在发生碰撞时,总线上传输的信号产生了严重的失真,无法从中恢复出有用的信息来。每一个正在发送数据的站,一旦发现总线上出现了碰撞,就要立即停止发送,免得继续浪费网络资源,然后等待一段随机时间后再次发送。

CSMA/CD协议的工作流程如图22所示:

image-20190510205416402

图22:CSMA/CD协议工作流程

这里就有一个问题了,**既然已经进行了"载波监听",理论上来说不可能再出现碰撞了啊,为什么还需要进行碰撞检测呢?**这是因为信号传播实验会对载波监听产生影响,如图23所示,在局域网的分析中,通常把单程端到端的传播时延记为τ\tau

  • t=0t=0时,A发送数据,B检测到信道为空闲
  • t=τδt=\tau-\delta时(τ>δ>0\tau>\delta>0),A发送的数据还没有到达B,由于B检测到信道是空闲的,B发送数据
  • 经过时间δ/2\delta/2之后,即在t=τδ/2t=\tau-\delta/2时,A发送的数据和B发送的数据产生碰撞,但是A和B都不知道发生了碰撞
  • t=τt=\tau时,B检测到发生了碰撞,停止发送数据
  • t=2τδt=2\tau-\delta时,A检测到发生了碰撞,因而也停止发送数据

结果是A和B均发送数据失败,二者都要推迟一段时间后发送数据

image-20190510223125399

图23

由此可见,每一个站在自己发送数据之后的一小段时间内,存在着遭遇碰撞的可能性。这一小段时间是不确定的,它取决于另一个发送数据的站到本站的距离。因此,以太网不能保证某一时间之内一定能够把自己的数据成功地发送出去(因为存在产生碰撞的可能)。以太网的这一特点称为发送的不确定性。如果希望在以太网上发生碰撞的机会很小,必须使整个以太网的平均通信量小于以太网的最高数据率

从图22可以看出,最先发送数据帧的A站,在发送数据后至多经过2τ2\tau就可以知道所发送的数据是否遭受了碰撞,这个至多成立的条件就是δ0\delta \to 0的情况。因此以太网的端到端往返时间2τ2\tau称为争用期,争用期又称碰撞窗口(collision window)。一个站点发送完数据之后只有经过争用期这端时间之后还没有检测到碰撞,才能肯定这次发送不会产生碰撞。

二进制指数类型退避算法(truncated binary exponential type)

发生碰撞的站在停止发送数据后,要推迟(退避)一个随机时间才能再发送数据。以太网使用**二进制指数类型退避算法(truncated binary exponential type)**来确定碰撞重传的时机,具体算法如下:

  • 基本退避时间取为争用期 2τ 。

  • 从整数集合$ [0, 1, … , (2^k- 1)]$ 中随机地取出一个数,记为 r。重传所需的时延就是 r 倍的基本退避时间

  • 参数 k 按下面的公式计算:
    k=Min[,10] k = Min[重传次数, 10]

    即当 k ≤10 时,参数 k 等于重传次数。

  • 当重传达 16 次仍不能成功时即丢弃该帧,并向高层报告

例如:

  • 第 1 次冲突重传时: k = 1,r 为 {0,1} 集合中的任何一个数。
  • 第 2 次冲突重传时: k = 2,r 为 {0,1,2,3} 集合中的任何一个数。
  • 第 3 次冲突重传时: k = 3,r 为 {0,1,2,3,4,5,6,7} 集合中的任何一个数。

最短有效帧长:

现在考虑一种情况。某个站发送了一个很短的帧,但在发送完毕之前并没有检测出碰撞。假定这个帧在继续向前传播到达目的站之前和别的站发送的帧发生了碰撞,因而目的站将收到有差错的帧(当然会把它丢弃)。可是发送站却不知道这个帧发生了碰撞,因而不会重传这个帧。这种情况显然是我们所不希望的。为了避免发生这种情况,以太网规定了一个最短帧长64字节,即512 bit。如果要发送的数据非常少,那么必须加入一些填充字节,使帧长不小于64字节。对于10Mbit/s以太网,发送512 bit需要51.2 μs\mu s,也就是上面提到的争用期。由此可见,以太网在发送数据时,如果在争用期(共发送了64字节)没有发生碰撞,那么后续发送的数据就一定不会发生冲突。换句话说,如果发生碰撞,就一定是在发送的前64字节之内。由于一检测到冲突就立即中止发送,这时已经发送出去的数据一定小于64宇节,因此凡长度小于64字节的帧都是由于冲突而异常中止的无效帧。只要收到了这种无效帧,就应当立即将其丢弃。

覆盖范围:

考虑这样一个问题:在 10 Mbit/s 以太网 51.2 μs 的争用期内,信号能传输多远的距离

以太网上最大的端到端单程时延必须小于争用期的一半(即 25.6 μs),这相当于以太网的最大端到端长度约为 5 km。事实上,实用的以太网的覆盖范围远没有这样大。因此,实用的以太网都能在争用期51.2 μs 内检测到可能发生的碰撞。

实际上,以太网的争用期之所以定位51.2 μs ,除了考虑以太网的端到端时延,还考虑到了许多其他因素,如存在的转发器所增加的时延,以及下面要介绍的干扰信号的持续时间等。

强化碰撞:

当发送数据的站一旦发生了碰撞时,除了立即停止发送数据外,还要继续发送32bit或者48bit的人为干扰信号(jamming signal),以便让所有用户都知道已经发生了碰撞,如图24所示,对于10Mbit/s以太网,发送32bit只需要3.2μs\mu s,发送48bit只需要4.8μs\mu s.

image-20190511102425762

图24:干扰信号的发送

注意:B也能够检测到冲突,并立即停止发送数据帧,接着就发送干扰信号,这里为了简单起见,只画出 A 发送干扰信号的情况。

CSMA/CD 协议的重要特性

  • 使用 CSMA/CD 协议的以太网不能进行全双工通信而只能进行双向交替通信(半双工通信)
  • 每个站在发送数据之后的一小段时间内,存在着遭遇碰撞的可能性
  • 这种发送的不确定性使整个以太网的平均通信量远小于以太网的最高数据率

CSMA/CD 协议的要点:

image-20190510224509544

图25:CSMA/CD协议流程

使用集线器的星形拓扑

传统以太网最初是使用粗同轴电缆,后来演进到使用比较便宜的细同轴电缆,最后发展为使用更便宜和更灵活的双绞线。 采用双绞线的以太网采用星形拓扑,在星形的中心则增加了一种可靠性非常高的设备,叫做集线器 (hub)

传统以太网使用的是同轴电缆,采用的是总线型拓扑结构,如图26所示:

image-20190511102835046

图26:使用同轴电缆对应的总线型拓扑结构

采用双绞线的以太网对应的是包含集线器的星形拓扑结构,如图27所示:

image-20190511103034621

图27:使用同轴电缆和集线器的星形拓扑结构

如图27所示,双绞线以太网总是和集线器配合使用,每个站需要用两根无屏蔽双绞线(放在一根电缆内),一根负责发送、另一个根负责接收,双绞线的两端使用RJ-45插头,由于集线器使用了大规模的集成电路芯片,因此集线器的可靠性得到了大大的提高。。

1990年,IEEE制定出了采用双绞线的星形以太网10BASE-T的标准802.3i,10BASE-T的通信距离稍短,每个站到集线器的距离不超过100m

10BASE-T的代表意义如下:

  • 10:速率为10Mbit/s
  • BASE:基带
  • T:双绞线

10BASE-T 以太网在局域网中的统治地位:

这种 10 Mbit/s 速率的无屏蔽双绞线星形网的出现,既降低了成本,又提高了可靠性。 具有很高的性价比。 10BASE-T 双绞线以太网的出现,是局域网发展史上的一个非常重要的里程碑,它为以太网在局域网中的统治地位奠定了牢固的基础。 从此以太网的拓扑就从总线形变为更加方便的星形网络,而以太网也就在局域网中占据了统治地位

集线器的一些特点:

集线器是使用电子器件来模拟实际电缆线的工作,因此整个系统仍然像一个传统的以太网那样运行。 使用集线器的以太网在逻辑上仍是一个总线网,各工作站使用的还是 CSMA/CD 协议,并共享逻辑上的总线。 集线器很像一个多接口的转发器,工作在物理层。 集线器采用了专门的芯片,进行自适应串音回波抵消,减少了近端串音

以太网的信道利用率

多个站在以太网上同时工作就可能会发生碰撞。 当发生碰撞时,信道资源实际上是被浪费了。因此,当扣除碰撞所造成的信道损失后,以太网总的信道利用率并不能达到 100%

假设τ 是以太网单程端到端传播时延。则争用期长度为 2τ ,即端到端传播时延的两倍。检测到碰撞后不发送干扰信号。 设帧长为 L (bit),数据发送速率为 C (bit/s),则帧的发送时间为 T0 = L/C (s)

一个站在发送帧时出现了碰撞。经过一个争用期 2τ 后,可能又出现了碰撞。这样经过若干个争用期后,一个站发送成功了。假定发送帧需要的时间是 T0,如图28所示:

image-20190511104117307

图28

注意到,成功发送一个帧需要占用信道的时间T0 + τ ,比这个帧的发送时间要多一个单程端到端时延 τ 。 这是因为当一个站发送完最后一个比特时,这个比特还要在以太网上传播。 在最极端的情况下,发送站在传输媒体的一端,而比特在媒体上传输到另一端所需的时间是 τ 。

要提高以太网的信道利用率,就必须减小 τ 与 T0 之比。 在以太网中定义了参数 a ,它是以太网单程端到端时延 τ 与帧的发送时间 T0 之比:
a=τ/To a=\tau /T_o
a → 0,表示一发生碰撞就立即可以检测出来, 并立即停止发送,因而信道利用率很高a 越大,表明争用期所占的比例增大,每发生一次碰撞就浪费许多信道资源,使得信道利用率明显降低

对以太网参数 a 的要求:

为提高利用率,以太网的参数 a 的值应当尽可能小些。

对以太网参数 a 的要求是:

  • 当数据率一定时,以太网的连线的长度受到限制,否则 τ 的数值会太大。
  • 以太网的帧长不能太短,否则 T0 的值会太小,使 a 值太大。

信道利用率的最大值 SmaxS_{max}

理想化的情况下,以太网上的各站发送数据都不会产生碰撞(这显然已经不是 CSMA/CD,而是需要使用一种特殊的调度方法),即总线一旦空闲就有某一个站立即发送数据。 发送一帧占用线路的时间是 T0 + τ ,而帧本身的发送时间是 T0。于是,我们可计算出理想情况下的极限信道利用率 SmaxS_{max} 为:
Smax=T0T0+τ=11+a S_{max}=\frac{T_0}{T_0+\tau}=\frac{1}{1+a}
只有当参数 a 远小于 1 才能得到尽可能高的极限信道利用率。 据统计,当以太网的利用率达到 30% 时就已经处于重载的情况。很多的网络容量被网上的碰撞消耗掉了。

以太网的MAC层

在局域网中,硬件地址又称为物理地址,或 MAC 地址(因为这种地址用在MAC帧中)

请注意,如果连接在局域网上的主机或路由器安装有多个适配器,那么这样的主机或路由器就有多个“地址”。更准确些说,这种 48 位“地址”应当是某个接口的标识符

48位的MAC地址

IEEE 802 标准规定 MAC 地址字段可采用 6 字节 ( 48位)2 字节 ( 16 位) 这两种中的一种。 IEEE 的注册管理机构 RA 负责向厂家分配地址字段 6 个字节中的前三个字节 (即高位 24 位),称为组织唯一标识符。 地址字段 6 个字节中的后三个字节 (即低位 24 位) 由厂家自行指派,称为扩展唯一标识符,必须保证生产出的适配器没有重复地址,如图29所示:

image-20190511105232391

图29:48位MAC地址的组成

一个地址块可以生成 2242^{24} 个不同的地址。这种 48 位地址称为 MAC-48,它的通用名称是 EUI-48。 生产适配器时,6 字节的 MAC 地址已被固化在适配器的 ROM,因此,MAC 地址也叫做硬件地址 (hardware address)物理地址。 “MAC 地址”实际上就是适配器地址适配器标识符 EUI-48

单站地址、组地址、广播地址

IEEE 规定地址字段的第一字节的最低位为 I/G 位。I/G 表示 Individual / Group。

  • 当 I/G 位 = 0 时,地址字段表示一个单站地址
  • 当 I/G 位 = 1 时,表示组地址,用来进行多播(以前曾译为组播)。此时,IEEE 只分配地址字段前三个字节中的 23 位

当 I/G 位分别为 0 和 1 时,一个地址块可分别生成 2232^{23}单个站地址和$ 2^{23}$ 个组地址所有 48 位都为 1 时,为广播地址,只能作为目的地址使用。

全球化管理、本地管理

IEEE 把地址字段第一字节的最低第 2 位规定为 G/L 位,表示 Global / Local。

  • 当 G/L 位 = 0 时,是全球管理保证在全球没有相同的地址),厂商向 IEEE 购买的 OUI 都属于全球管理。
  • 当 G/L 位 = 1 时, 是本地管理,这时用户可任意分配网络上的地址

适配器检查MAC地址

我们知道适配器有过滤功能,但适配器从网络上每收到一个MAC帧就先用硬件检查MAC帧中的目的地址。如果是本站的帧则收下,然后再进行其他处理(过滤),否则就将此帧丢弃,不再进行其他的处理。这样做就不浪费主机的处理器和内存资源,这里**“发往本站的帧”**包括以下三种:

  • **单播(unicast)**帧:一对一,即受到的帧的MAC地址与本站的硬件地址相同
  • **广播(broadcast)**帧:一对全体,即发送给本局域网上所有站点的帧(全1地址)
  • **多播(multicast)**帧:一对多,即发送给本局域网上一部分站点的帧

所有的适配器都至少能够识别前两种帧,即能够识别单播地址广播地址。 有的适配器可用编程方法识别多播地址,当操作系统启动时,它就把适配器初始化,使适配器能够识别某些多播地址,显然, 只有目的地址才能使用广播地址和多播地址

以太网适配器还可设置为一种特殊的工作方式,即混杂方式 (promiscuous mode) ,此方式工作的以太网适配器只要**“听到”有帧在以太网上传输就都接收下来,而不管这些帧时发往哪个站的**。请注意,这种方式实际上是**"窃听"其他站点的通信但并不中断其他站点的通信**,网络上的黑客常利用这种方法非法获取网上用户的口令。

当然,混杂方式有时也是非常有用的,比如网络维护人员和管理人员需要这种方式来监视和分析以太网上的流量。一种很有用的网络工具叫**嗅探器(sniffer)**就设置为混杂方式的网络适配器。

MAC帧的格式

常用的以太网 MAC 帧格式有两种标准:

  • DIX Ethernet V2 标准
  • IEEE 的 802.3 标准

最常用的 MAC 帧是以太网 V2 的格式,这里主要介绍这个V2格式:

image-20190511111242782

图30:以太网V2的MAC帧格式

如图30所示,V2的MAC帧由以下几个部分组成:

  • 目的地址,占6字节
  • 源地址,占6字节
  • 类型,占2字节,作用是标识上一层(网络层)用的什么协议,以便把收到的MAC帧上交给上一层相应的协议
  • 数据,长度在46到1500字节之间,1500很好理解,它是数据链路层规定的数据部分最长字节数,46是这么得出的:最小长度64字节减去18字节的首部和尾部。
  • 帧检验序列FCS:用作CRC检验

这里有个问题,MAC帧中并没有表示数据字段长度的字段,这样接收方的MAC子层怎么知道应该从接收到的以太网帧中取出多少字节的数据交付给上一层协议呢

答案:我们在发送数据的时候使用的是曼彻斯特编码,曼彻斯特编码的特点是其每一个码元的正中间一定又一次电压的转换(从高到低或者从低到高),当发送方把一个以太网帧发送完成后,就不再发送其他码原了,因此,接收方很容易可以找到以太网帧结束的位置,然后从结束的位置向前找4个字节(FSC的长度),就能找到数据字段结束的位置。

与以太网 V2 MAC 帧格式相似,区别在于:

  • IEEE 802.3 规定的 MAC 帧的第三个字段是“长度 / 类型”。
    • 当这个字段值大于 0x0600 时(相当于十进制的 1536),就表示“类型”。这样的帧和以太网 V2 MAC 帧完全一样。
    • 当这个字段值小于 0x0600 时才表示“长度”。
  • 当“长度/类型”字段值小于 0x0600 时,数据字段必须装入上面的逻辑链路控制 LLC 子层的 LLC 帧。

现在市场上流行的都是以太网 V2 MAC 帧,但大家也常常把它称为 IEEE 802.3 标准的 MAC 帧。

无效的MAC帧
  • 数据字段的长度与长度字段的值不一致,这里的长度字段实际上是上面所讲的类型字段,当这个字段的值大于0x600时,就表示类型,小于0x600时表示长度,实际上这个字段表示长度时并没有什么实际意义,因为我们前面讲了,以太网使用曼彻斯特编码,长度字段可以自己判断。
  • 帧的长度不是整数个字节;
  • 用收到的帧检验序列 FCS 查出有差错;
  • 数据字段的长度不在 46 ~ 1500 字节之间。
  • 有效的 MAC 帧长度为 64 ~ 1518 字节之间。

对于检查出的无效 MAC 帧就简单地丢弃。以太网不负责重传丢弃的帧。

拓展的以太网

在许多情况下,我们希望对以太网的覆盖范围进行拓展,本节主要介绍以太网的拓展方法,这种拓展的以太网在网络层看来仍然是一个网络

在物理层拓展以太网

使用光纤拓展

主机使用光纤(通常是一对光纤)和一对光纤调制解调器连接到集线器。 很容易使主机和几公里以外的集线器相连接,如图31所示:

image-20190511113537425

图31:主机使用光纤和一对光纤调制解调器连接到集线器<

使用集线器拓展

将多个以太网段连成更大的、多级星形结构的以太网,如图32所示:

image-20190511113647614

图32:使用集线器拓展以太网

优点 :

  • 使原来属于不同碰撞域的以太网上的计算机能够进行跨碰撞域的通信。
  • 扩大了以太网覆盖的地理范围。

缺点:

  • 碰撞域增大了,但总的吞吐量并未提高
  • 如果不同的碰撞域使用不同的数据率,那么就不能用集线器将它们互连起来

这里提到了一个碰撞域的概念,我们来看看什么是碰撞域

碰撞域(collision domain)又称为冲突域,是指网络中一个站点发出的帧会与其他站点发出的帧产生碰撞或冲突的那部分网络碰撞域越大,发生碰撞的概率越高

在数据链路层拓展以太网

扩展以太网更常用的方法是在数据链路层进行。早期使用网桥,现在使用以太网交换机,如图33所示:

image-20190511114029465

图33:网桥和交换机拓展以太网的示意图

什么是网桥:

网桥工作在数据链路层。 它根据 MAC 帧的目的地址对收到的帧进行转发过滤。 当网桥收到一个帧时,并不是向所有的接口转发此帧,而是先检查此帧的目的 MAC 地址,然后再确定将该帧转发到哪一个接口,或把它丢弃。

什么是交换机:

以太网交换机实质上就是一个多接口的网桥,通常都有十几个或更多的接口。每个接口都直接与一个单台主机或另一个以太网交换机相连,并且一般都工作在全双工方式。以太网交换机具有并行性,能同时连通多对接口,使多对主机能同时通信

交换机的特点
  • 相互通信的主机都是独占传输媒体,无碰撞地传输数据,如图34所示:

image-20190511114329921

图34:以太网交换机的每一个接口都是一个碰撞域
  • 以太网交换机的接口有存储器,能在输出端口繁忙时把到来的帧进行缓存

  • 以太网交换机是一种即插即用设备,其内部的帧交换表(又称为地址表)是通过自学习算法自动地逐渐建立起来的。

  • 以太网交换机使用了专用的交换结构芯片,用硬件转发,其转发速率要比使用软件转发的网桥快很多

  • 以太网交换机的性能远远超过普通的集线器,而且价格并不贵

交换机的优点:

  • 用户独享带宽,增加了总容量,如图35所示:

    image-20190511114622176

    图35
  • 共享总线以太网转到交换式以太网时,所有接入设备的软件和硬件、适配器等都不需要做任何改动。

  • 以太网交换机一般都具有多种速率的接口,方便了各种不同情况的用户。

以太网交换机的交换方式:

  • 存储转发方式

    把整个数据帧先缓存后再进行处理。

  • 直通 (cut-through) 方式

    接收数据帧的同时就立即按数据帧的目的 MAC 地址决定该帧的转发接口,因而提高了帧的转发速度。

    缺点是它不检查差错就直接将帧转发出去,因此有可能也将一些无效帧转发给其他的站。

在某些情况下,仍需要采用基于软件的存储转发方式进行交换,例如,当需要进行线路速率匹配、协议转换或差错检测时。

以太网交换机的自学习功能

image-20190511132304145

图36:以太网交换机中的交换表

如图36-a所示,我们假设当前交换机有4个接口,各连接一台计算机,其MAC地址分别是A、B、C、D,一开始以太网交换机中的交换表示空的,然后:

  • A向B发送一帧,交换机在交换表中根据帧的目的地址查找对应的接口,由于当前交换表是空的,所以没有找到,所以使用将当前帧广播给出了接口1之外的所有接口(因为当前帧是从接口1发送出来的,广播的时候自然就不用再广播给接口1了),由于可以从当前帧中找到源地址即A,所以将A-1加入到交换表中,当B、C、D收到交换机的广播之后,由于C、D的MAC地址与当前帧的目的地址不一样,所以舍弃收到的当前帧,而B的MAC地址与当前帧的目的地址一样,所以收下当前帧。
  • B要向A发送一帧,由于经历了上一步,这时交换机的交换表中有了A-1这一行,所以交换机直接将B发送给A的帧发送到接口1,而不用再广播给C、D,同时由于当前帧的源地址是B,所以将B-3这一行添加到交换表中

经历了以上两步之后,交换机的交换表如图36-所示,同理可将C、D也更新至交换表。

以上就是以太网交换机的自学习过程。

考虑到可能有时要在交换机的接口更换主机,或者主机要更换其网络适配器,这就需要更改交换表中的项目。为此,在交换表中每个项目都设有一定的有效时间。过期的项目就自动被删除

以太网交换机的这种自学习方法使得以太网交换机能够即插即用,不必人工进行配置,因此非常方便。

交换机的自学习和转发帧的流程如图37所示:

image-20190511133308369

图37:交换机自学习和转发帧的步骤

有时为了增加网络的可靠性,在使用以太网交换机组网时,往往会增加一些冗余的链路,在这种情况下,自学习的过程就可能导致以太网帧在网络的某个环路中无限制地兜圈子,我们以图38为例说明:

image-20190511133530208

图38

假定一开始主机A通过交换机#1向主机B发送一帧,那么就会存在这么一条路径:

A -> #1.1 ->#1.3->#2.1->#2.2->#1.4->#1.3,这样就会无限制地循环下去,白白浪费了网络资源。

为了解决这种兜圈子的问题,IEEE802.1D标准制定了一个生成树协议STP(Spanning Tree Protocol),思路是不改变网络的实际拓扑,但在逻辑上则切断某些链路,使得从一台主机到所有其他主机的路径是无环路的树状结构,从而消除了兜圈子现象,如图39所示:

image-20190511133940342

图39

上图中,左边是原始的拓扑结构,存在回路,右边去切断了某些链路(虚线部分),这样没有影响整个网络的拓扑结构(该连通的还是能连通),但是解决了回路循环问题

从总线以太网到星形以太网

早期,以太网采用无源的总线结构。 现在,采用以太网交换机的星形结构成为以太网的首选拓扑。 总线以太网使用 CSMA/CD 协议,以半双工方式工作。 以太网交换机不使用共享总线,没有碰撞问题,因此不使用 CSMA/CD 协议(相关的"争用期”也没有了),以全双工方式工作。但仍然采用以太网的帧结构

image-20190511134256932

图40:总线结构的以太网(左)、星形结构的以太网(右)

虚拟局域网

局域网存在以下几个问题:

  • 扩展性
  • 安全性
  • 可管理性 等

image-20190511135314548

图41

总线以太网和10Base-T星形以太网的所有计算机都处于同一个碰撞域(冲突域)、同一个广播域中,如图41所示。

广播域(broadcast domain):指这样一部分网络,其中任何一台设备发出的广播通信都能被该部分网络中的所有其他设备所接收。

采用以太网交换机的星形以太网每一个接口都处于一个独立的碰撞域中,但所有计算机都处于同一个广播域中,如图42所示:

image-20190511135454707

图42

利用以太网交换机可以很方便地实现虚拟局域网 VLAN (Virtual LAN)。 IEEE 802.1Q 对虚拟局域网 VLAN 的定义: 虚拟局域网 VLAN 是由一些局域网网段构成的与物理位置无关逻辑组,而这些网段具有某些共同的需求。每一个 VLAN 的帧都有一个明确的标识符指明发送这个帧的计算机是属于哪一个 VLAN

虚拟局域网其实只是局域网给用户提供的一种服务,而并不是一种新型局域网。由于虚拟局域网是用户网络资源逻辑组合,因此可按照需要将有关设备和资源非常方便地重新组合,使用户从不同的服务器或数据库中存取所需的资源。

image-20190511135931360

图43

如图43所示,设有10台计算分别处于3个楼层中,使用以太网交换机可以很轻松地将这10台计算机划分为3个虚拟局域网VLAN1、VLAN2、VLAN3,每一个虚拟局域网都是一个广播域,VLAN1、VLAN2、VLAN3是3个不同的广播域,当 B1 向 VLAN2 工作组内成员发送数据时, 工作站 B2 和 B3 将会收到其广播的信息。VLAN1 和 VLAN3 中的工作站 A1,A2 和 C1 等都不会收到 B1 发出的广播信息。

虚拟局域网限制了接收广播信息的工作站数,使得网络不会因传播过多的广播信息 (即**“广播风暴”)** 而引起性能恶化。

虚拟局域网的帧格式:

IEEE 批准了 802.3ac 标准,该标准定义了以太网的帧格式的扩展,以支持虚拟局域网。 虚拟局域网协议允许在以太网的帧格式中插入一个4字节的标识符,称为 VLAN 标记 (tag),用来指明该帧属于哪一个虚拟局域网。 插入VLAN标记得出的帧称为 802.1Q 帧或带标记的以太网帧,如图44所示:

image-20190511141058140

图44:虚拟局域网的帧格式

那么在整个以太网上,各个站点的帧是这么传送的:

image-20190511141156668

图45

如图45所示,在计算机与交换机之间采用的还是标准的以太网帧,但是在交换机与交换机之间采用的是具有VLAN标记的802.1Q帧。

虚拟局域网的优点:

  • 改善了性能
  • 简化了管理
  • 降低了成本
  • 改善了安全性

高速以太网

随着电子技术的发展,以太网的速率也不断提升,从传统的10Mbit/s以太网一直发展到现在常用的1Gbit/s的吉比特以太网,甚至更快的以太网,本节简单介绍几种高速以太网技术。

100BASE-T以太网

速率达到或超过 100 Mbit/s 的以太网称为高速以太网。 100BASE-T 在双绞线上传送 100 Mbit/s 基带信号的星形拓扑以太网,仍使用 IEEE 802.3 的 CSMA/CD 协议。 100BASE-T 以太网又称为快速以太网 (Fast Ethernet)。 1995 年IEEE已把 100BASE-T 的快速以太网定为正式标准,其代号为 IEEE 802.3u。

100BASE-T以太网的特点:

  • 可在全双工方式下工作而无冲突发生。在全双工方式下工作时**,不使用 CSMA/CD 协议**。
  • MAC 帧格式仍然是 802.3 标准规定的。
  • 保持最短帧长不变,但将一个网段的最大电缆长度减小到 100 米。
  • 帧间时间间隔从原来的 9.6 μs 改为现在的 0.96 μs 。

100 Mbit/s 以太网的三种不同的物理层标准:

  • 100BASE-TX

    • 使用 2 对 UTP 5 类线 或 屏蔽双绞线 STP。

    • 网段最大程度:100 米。

  • 100BASE-T4

    • 使用 4 对 UTP 3 类线 或 5 类线。
    • 网段最大程度:100 米。
  • 100BASE-FX

    • 使用 2 对光纤。
    • 网段最大程度:2000 米。

吉比特以太网

允许在 1 Gbit/s 下以全双工和半双工两种方式工作。 使用 IEEE 802.3 协议规定的帧格式。 在半双工方式下使用 CSMA/CD 协议全双工方式不使用 CSMA/CD 协议。 与 10BASE-T 和 100BASE-T 技术向后兼容。

吉比特以太网可用作现有网络的主干网,也可在高带宽(高速率)的应用场合中。

吉比特以太网的物理层

使用两种成熟的技术:一种来自现有的以太网,另一种则是美国国家标准协会 ANSI 制定的光纤通道 FC (Fiber Channel)

使用以太网进行宽带接入

以太网宽带接入具有以下特点:

  • 可以提供双向的宽带通信。
  • 可以根据用户对带宽的需求灵活地进行带宽升级。
  • 可以实现端到端的以太网传输,中间不需要再进行帧格式的转换。这就提高了数据的传输效率且降低了传输的成本。
  • 不支持用户身份鉴别。
PPPoE

PPPoE (PPP over Ethernet) 的意思是“在以太网上运行 PPP”,它把 PPP 协议与以太网协议结合起来 —— 将 PPP 帧再封装到以太网中来传输。 现在的光纤宽带接入 FTTx 都要使用 PPPoE 的方式进行接入。在 PPPoE 弹出的窗口中键入在网络运营商购买的用户名和密码,就可以进行宽带上网了。 利用 ADSL 进行宽带上网时,从用户个人电脑到家中的 ADSL 调制解调器之间,也是使用 RJ-45 和 5 类线(即以太网使用的网线)进行连接 的,并且也是使用 PPPoE 弹出的窗口进行拨号连接的。

总结

  • 链路是从一个结点到相邻结点的一段物理线路,数据链路则是在链路的基础上增加了一些必要的硬件(如网络适配器)和软件(如协议的实现)。
  • 数据链路层使用的信道主要有点对点信道和广播信道两种。
  • 数据链路层传送的协议数据单元是帧。数据链路层的三个基本问题则是封装成帧、透明传输和差错检测。
  • 循环冗余检验CRC是一种检错方法,而帧检验序列FCS是添加在数据后面的冗余码。
  • 点对点协议PPP是数据链路层使用最多的一种协议,它的特点是简单只检测差错,而不是纠正差错不使用序号,也不进行流量控制可同时支持多种网络层协议。
  • PPPoE是为宽带上网的主机使用的链路层协议。
  • 局域网的优点是具有广播功能,从一个站点可很方便地访问全网便于系统的扩展和逐渐演变;提高了系统的可靠性、可用性和生存性。
  • 共享通信媒体资源的方法有二:一是静态划分信道(各种复用技术),二是动态媒体接入控制,又称为多点接入(随机接入或受控接入)。
  • IEEE 802委员会曾把局域网的数据链路层拆成两个子层,即逻辑链路控制(LLC)子层(与传输媒体无关)和媒体接入控制(MAC)子层(与传输媒体有关)。但现在LLC子层已成为历史。计算机与外界局域网的通信要通过通信适配器(或网络适配器),它又称为网络接口卡或网卡。
  • 计算机的硬件地址就在适配器的ROM中。以太网采用无连接的工作方式,对发送的数据帧不进行编号,也不要求对方发回确认。目的站收到有差错帧就把它丢弃,其他什么也不做。
  • 以太网采用的协议是具有冲突检测的载波监听多点接入CSMA/CD.协议的要点是发送前先监听,边发送边监听,一旦发现总线上出现了碰撞,就立即停止发送。然后按照退避算法等待一段随机时间后再次发送。因此,每一个站在自己发送数据之后的一小段时间内,存在着遭遇碰撞的可能性。以太网上各站点都平等地争用以太网信道。
  • 传统的总线以太网基本上都是使用集线器的双绞线以太网。这种以太网在物理上是星形网,但在逻辑上则是总线形网。集线器工作在物理层,它的每个接口仅仅简单地转发比特,不进行碰撞检测。
  • 以太网的硬件地址,即B4AC地址实际上就是适配器地址或适配器标识符,与主机所在的地点无关。源地址和目的地址都是48位长。以太网的适配器有过滤功能,它只接收单播帧、广播帧或多播帧。
  • 使用集线器可以在物理层扩展以太网(扩展后的以太网仍然是一个网络)。
  • 交换式集线器常称为以太网交换机或第二层交换机(工作在数据链路层)。它就是一个多接口的网桥,而每个接口都直接与某台单主机或另一个集线器相连,且工作在全双工方式。以太网交换机能同时连通许多对的接口,使每一对相互通信的主机都能像独占通信媒体那样,无碰撞地传输数据。
  • 高速以太网有100 lvibit/s的快速以太网、吉比特以太网和IO Gbit/s的10吉比特以太网。最近还发展到100吉比特以太网。在宽带接入技术中,也常使用高速以太网进行接入。
2018-09-19 17:47:06 qq_35499060 阅读数 1750

Java语言学习资料。包括了编程思想、入门进阶、网络编程以及数据库。全部电子版PDF经典图书。

关注公众号 进击的代码Amos 回复书名自取

  1. Java编程思想
    Java编程思想
        本书赢得了全球程序员的广泛赞誉,即使是最晦涩的概念,在Bruce Eckel的文字亲和力和小而直接的编程示例面前也会化解于无形。从Java的基础语法到最高级特性(深入的面向对象概念、多线程、自动项目构建、单元测试和调试等),本书都能逐步指导你轻松掌握。
  2. Head First Java
    Head First Java
        《Head First Java》是本完整的面向对象(object-oriented,OO)程序设计和Java的学习指导。此书是根据学习理论所设计的,让你可以从学习程序语言的基础开始一直到包括线程、网络与分布式程序等项目。最重要的,你会学会如何像个面向对象开发者一样去思考。
  3. Java多线程编程核心技术
    Java多线程编程核心技术
        资深Java专家10年经验总结,全程案例式讲解,首本全面介绍Java多线程编程技术的专著结合大量实例,全面讲解Java多线程编程中的并发访问、线程间通信、锁等最难突破的核心技术与应用实践
        Java多线程无处不在,如服务器、数据库、应用。多线程可以有效提升计算和处理效率,大大提升吞吐量和可伸缩性,深得广大程序员和公司的青睐。很多人学习完JavaSE/JavaEE之后想往更深入的技术进行探索,比如对大数据、分布式、高并发类的专题进行攻克时,立即遇到针对java.lang包中线程类的学习,但线程类的学习并不像JDBC一样简单,学习曲线陡峭,多弯路与“坑”。要学习这些热点技术,Java多线程技术避无可避。而本书将引领读者拿下该“技术高地”。
  4. 深入理解Java虚拟机
    深入理解Java虚拟机
        深入理解Java虚拟机:JVM高级特性与最佳实践(第2版)》内容简介:第1版两年内印刷近10次,4家网上书店的评论近4?000条,98%以上的评论全部为5星级的好评,是整个Java图书领域公认的经典著作和超级畅销书,繁体版在台湾也十分受欢迎。第2版在第1版的基础上做了很大的改进:根据最新的JDK 1.7对全书内容进行了全面的升级和补充;增加了大量处理各种常见JVM问题的技巧和最佳实践;增加了若干与生产环境相结合的实战案例;对第1版中的错误和不足之处的修正;等等。第2版不仅技术更新、内容更丰富,而且实战性更强。
  5. 高性能MySQL
    高性能MySQL
        本书荣获2009年Jolt图书大奖,是不可多得的分享MySQL实用经验的图书。它不但可以帮助MySQL初学者提高使用技巧,更为有经验的MySQL DBA指出了开发高性能MySQL应用的途径。全书包含14章和4个附录,内容覆盖MySQL系统架构、设计应用技巧、SQL语句优化、服务器性能调优、系统配置管理和安全设置、监控分析,以及复制、扩展和备份/还原等主题,每一章的内容自成体系,适合各领域技术人员作选择性的阅读。
  6. Hadoop权威指南
    Hadoop权威指南
        本书结合理论和实践,由浅入深,全方位介绍了Hadoop 这一高性能的海量数据处理和分析平台。全书5部分24 章,第Ⅰ部分介绍Hadoop 基础知识,第Ⅱ部分介绍MapReduce,第Ⅲ部分介绍Hadoop 的运维,第Ⅳ部分介绍Hadoop 相关开源项目,第Ⅴ部分提供了三个案例,分别来自医疗卫生信息技术服务商塞纳(Cerner)、微软的人工智能项目ADAM(一种大规模分布式深度学习框架)和开源项目Cascading(一个新的针对MapReduce 的数据处理API)。本书是一本专业、全面的Hadoop 参考书和工具书,阐述了Hadoop 生态圈的新发展和应用,程序员可以从中探索海量数据集的存储和分析,管理员可以从中了解Hadoop 集群的安装和运维。
  7. Spring实战
    Spring实战
        《Spring实战(第3版)》从核心的Spring、Spring应用程序的核心组件、Spring集成3个方面,由浅入深、由易到难地对Spring展开了系统的讲解,包括Spring之旅、装配Bean、最小化Spring XML配置、面向切面的Spring、征服数据库、事务管理、使用Spring MVC构建Web应用程序、使用Spring Web Flow、保护Spring应用、使用远程服务、为Spring添加REST功能、Spring消息、使用JMX管理Spring Bean以及其他Spring技巧等内容。
  8. 分布式Java应用
    分布式Java应用
        本书介绍了编写分布式Java应用涉及的众多知识点,分为了基于Java实现网络通信、RPC;基于SOA实现大型分布式Java应用;编写高性能Java应用;构建高可用、可伸缩的系统四个部分,七章内容来进行介绍,在这一本不算厚的书中,一方面结合作者的经验介绍了这些知识点;另一方面提供了进一步学习这些知识点的参考资料,希望能给想掌握编写分布式Java应用知识点的开发人员提供一定的帮助以及指引,同时也希望书中分享的经验对于目前正在从事分布式Java应用编写的开发人员提供帮助。
  9. Java网络编程
    Java网络编程
        《Java网络编程(第四版)》实用指南全面介绍了如何使用Java开发网络程序。你将学习如何使用Java的网络类库既快速又轻松地完成常见的网络编程任务,如编写多线程服务器、加密通信、广播到本地网络,以及向服务器端程序提交数据。作者提供了真正可实用的程序来讲解他介绍的方法和类。第4版经过全面修订,已经涵盖REST、SPDY、异步I/O和很多其他高级技术。本书主要内容有:研究Internet底层协议,如TCP/IP和UDP/IP;了解Java的核心I/O API如何处理网络输入和输出;发现InetAddress类如何帮助Java程序与DNS交互;用Java的URI和URL类定位、识别和下载网络资源;深入研究HTTP协议,包括REST、HTTP首部和cookie;使用Java的底层Socket类编写服务器和网络客户端;利用非阻塞I/O同时管理多个连接。
  10. Java并发编程实战
    Java并发编程实战
        本书深入浅出地介绍了Java线程和并发,是一本完美的Java并发参考手册。书中从并发性和线程安全性的基本概念出发,介绍了如何使用类库提供的基本并发构建块,用于避免并发危险、构造线程安全的类及验证线程安全的规则,如何将小的线程安全类组合成更大的线程安全类,如何利用线程来提高并发应用程序的吞吐量,如何识别可并行执行的任务,如何提高单线程子系统的响应性,如何确保并发程序执行预期任务,如何提高并发代码的性能和可伸缩性等内容,最后介绍了一些高级主题,如显式锁、原子变量、非阻塞算法以及如何开发自定义的同步工具类。
    在这里插入图片描述

关注公众号 进击的代码Amos 回复书名自取

2019-05-13 18:48:04 qq_36982160 阅读数 93

计算机网络第五弹——运输层

彩蛋

计算机网络谢希仁第七版原版ppt获取方式:公众号后台回复”N3“即可获取。

由于公众号不支持显示LaTeX公式且公众号排版混乱,建议大家关注微信公众号"IT工匠",后台回复"N4-4"获取xmind源文件以及本文原文pdf文件获取更佳阅读体验。

本文主要内容:

计算机网络第五弹——运输层

运输层协议概述

进程之间的通信

从通信和信息处理的角度看,运输层向它上面的应用层提供通信服务,它属于面向通信部分最高层,同时也是用户功能中的最低层,当网络的边缘部分中的两个主机使用网络的核心部分的功能进行端到端的通信时,只有位于网络边缘部分的主机的协议栈才有运输层,而网络核心部分中的路由器在转发分组时都只用到下三层的功能。

“逻辑通信”的意思是“好像是这样通信,但事实上并非真的这样通信”。从IP层来说,通信的两端是两台主机,但**“两台主机之间的通信”这种说法还不够清楚,严格地讲,两台主机进行通信就是两台主机中的应用进程互相通信。从运输层的角度看,通信的真正端点并不是主机而是主机中的进程**,也就是说,端到端的通信是应用进程之间的通信。

即**“主机 A 的某个进程和主机 B 上的另一个进程进行通信”**, 简称为“计算机之间通信”

运输层具有屏蔽作用,即运输层向高层用户屏蔽了下面网络核心的细节,它使应用进程看见的就是好像在两个运输层实体之间有一条端到端的逻辑通信信道。但这条逻辑通信信道对上层的表现却因运输层使用的不同协议而有很大的差别。 当运输层采用面向连接的 TCP 协议时,尽管下面的网络是不可靠的(只提供尽最大努力服务),但这种逻辑通信信道就相当于一条全双工的可靠信道。 当运输层采用无连接的 UDP 协议时,这种逻辑通信信道是一条不可靠信道

运输层和网络层的主要区别

  1. 网络层为主机之间提供逻辑通信,运输层为应用进程之间提供端到端的逻辑通信
  2. 运输层要对报文进行差错检测,在网络层,IP数据报首部中的检验和字段只检验首部是否出现差错而不检查数据部分

复用

发送方在不同的应用进程可以使用同一个运输层协议 传送数据(当然需要加上适当的首部)。

分用

接收方的运输层在剥去报文的首部之后能够把这些数据正确交付给目的进程。

运输层的两个主要协议

如图1-1所示,运输层主要有2个协议:

  1. 用户数据报协议 UDP (User Datagram Protocol)
  2. 传输控制协议 TCP (Transmission Control Protocol)

image-20190513112310121

图1-1:TCP/IP体系中的运输层协议

按照OSI术语,两个对等运输实体在通信时传送的数据单位叫作运输协议数据单元 TPDU (Transport Protocol Data Unit),但是在TCP/IP体系中, TCP 传送的数据单位协议是 TCP 报文段(segment), UDP 传送的数据单位协议是 UDP 报文或用户数据报

TCP与UDP的对比

对比项 TCP UDP
是否面向连接 无连接的协议,提供无连接服务; 面向连接的协议,提供面向连接服务;
传输的TPDU 其传送的运输协议数据单元TPDU是 UDP 报文或用户数据报; 其传送的运输协议数据单元TPDU是 TCP 报文;
是否支持单播、多播、广播 支持单播、多播、广播; 支持点对点单播,不支持多播、广播;
是否可靠 不提供可靠交付; 提供可靠服务;
复杂性 简单。适用于很多应用,如:多媒体应用等。 复杂。用于大多数应用,如:万维网、电子邮件、文件传送等。

使用 UDP 和 TCP 的典型应用和应用层协议

image-20190513112901952

图1-2

需要注意的是:

  1. 运输层UDP 用户数据报网络层IP数据报有很大区别。

    IP 数据报要经过互连网中许多路由器的存储转发UDP 用户数据报是在运输层端到端抽象的逻辑信道中传送的。

  2. TCP 报文段是在运输层抽象的端到端逻辑信道中传送,这种信道是可靠的全双工信道。但这样的信道却不知道究竟经过了哪些路由器,而这些路由器也根本不知道上面的运输层是否建立了 TCP 连接

运输层的端口

运行在计算机中的进程是用进程标识符来标志的, 但运行在应用层的各种应用进程却不应当让计算机操作系统指派它的进程标识符,这是因为在互联网上使用的计算机的操作系统种类很多,而不同的操作系统又使用不同格式的进程标识符,为了使运行不同操作系统的计算机的应用进程能够互相通信,就必须用统一的方法对 TCP/IP 体系的应用进程进行标志

但是,把一个特定及其上运行的特定进程指明为互联网上通信的最后终点还是不可行的。这是因为进程的创建和撤销都是动态的,发送方几乎无法识别其他机器上的进程。另外,我们往往需要利用目的主机提供的功能来识别终点,而不需要知道实现这个功能的进程(例如,要和互联网上的某个邮件服务器联系,并不一定要知道这个服务器功能是由目的主机上的哪个进程创建的)。

解决上述问题的方法就是在运输层使用协议端口号 (protocol port number),或通常简称为端口 (port)。 虽然通信的终点是应用进程,但我们可以把端口想象是通信的终点,因为我们只要把要传送的报文交到目的主机的某一个合适的目的端口,剩下的工作(即最后交付目的进程)就由 TCP 来完成。

注意这种在协议栈层间的抽象的协议端口是软件端口,和路由器或交换机上的硬件端口是完全不同的概念,硬件端口是不同硬件设备进行交互的接口,而软件端口是应用层的各种协议进程与运输实体进行层间交互的一种地址。

TCP/IP 运输层端口

端口用一个 16 位端口号进行标志,允许有65,535个不同的端口号。 端口号只具有本地意义,即端口号只是为了标志本计算机应用层中的各进程,在互联网中,不同计算机的相同端口号是没有联系的

由此可见,两个计算机中的进程要互相通信,必须知道对方的端口号(为了找到对方计算机中的应用进程) 和 对方的 IP 地址(为了找到对方的计算机)。

端口的分类

image-20190513114256169

图1-3:端口的分类

如图1-3,端口分为以下几类:

服务端使用的端口
  1. 熟知端口,数值一般为 0 ~ 1023。
  2. 登记端口号,数值为 1024 ~ 49151,为没有熟知端口号的应用程序使用的。使用这个范围的端口号必须在 IANA 登记,以防止重复。
客户端使用的端口

又称为短暂端口号,数值为 49152 ~ 65535,留给客户进程选择暂时使用。 当服务器进程收到客户进程的报文时,就知道了客户进程所使用的动态端口号,通信结束后,这个端口号可供其他客户进程以后使用

常用的熟知端口

如图1-4所示:

image-20190513114402164

图1-4:常用的熟知端口

用户数据报协议UDP

UDP概述

UDP只在IP的数据报服务之上增加了很少一点的功能:

  1. 复用和分用
  2. 差错检测功能
  3. UDP增加了端口号

UDP的主要特点

  1. UDP 是无连接的,发送数据之前不需要建立连接,因此减少了开销和发送数据之前的时延。

  2. UDP 使用尽最大努力交付,即不保证可靠交付,因此主机不需要维持复杂的连接状态表

  3. UDP 是面向报文的。UDP 对应用层交下来的报文,既不合并,也不拆分,而是保留这些报文的边界。UDP 一次交付一个完整的报文

    发送方 UDP 对应用程序交下来的报文,在添加首部后就向下交付 IP 层,UDP 对应用层交下来的报文,既不合并,也不拆分,而是保留这些报文的边界,应用层交给 UDP 多长的报文,UDP 就照样发送,即一次发送一个报文。因此,应用程序必须选择合适大小的报文:

    • 若报文太长,UDP把它交给IP层之后,IP层传送时可能要进行分片,这会降低IP层的效率。
    • 若报文太短,UDP把它交给IP层后,会使IP数据报的首部的相对长度太大,这也降低了IP层的效率。
  4. UDP 没有拥塞控制,因此网络出现的拥塞不会使源主机的发送速率降低,这对某些实时应用(如IP电话、视频会议)要求源主机以恒定的速率发送数据,并且允许在网络发生拥塞时丢失一些数据,但却不允许数据有太大的时延,UDP正好满足这种需求。

  5. UDP 支持一对一、一对多、多对一和多对多的交互通信。

  6. UDP 的首部开销小,只有 8 个字节,比 TCP 的 20 个字节的首部要短。

UDP首部格式

用户数据报 UDP 有两个字段:数据字段首部字段

首部字段

首部字段有 8 个字节,由 4 个字段组成,每个字段都是 2 个字节。

image-20190513134448728

图2-1:UDP用户数据报的首部和伪首部

如图2-1,UDP的首部主要由以下4个字段组成:

  1. 源端口

    在需要对方回信时选用,不需要时可用全0.

  2. 目的端口

    在终点交付报文的时候必须使用,当运输层从 IP 层收到 UDP 数据报时,就根据首部中的目的端口,把 UDP 数据报通过相应的端口,上交给最后的终点——应用进程。如果接收方UDP发现收到的报文中的目的端口不正确,就是用网际控制报文协议ICMP发送"端口不可达"差错报文给发送放,我们在网络层的文章中提到的traceroute命令就是让发送的UDP用户数据报故意使用一个非法的UDP端口,结果ICMP就返回"端口不可达"报文,因而达到测试的目的。请注意,虽然在 UDP 之间的通信要用到端口号,但由于 UDP 的通信是无连接的,因此不需要使用套接字来建立连接

  3. 长度

    UDP用户数据报的长度,其最小值是8(仅有首部)

  4. 校验和

    检测UDP用户数据报在传输中是否有错,有错就丢弃。

    在计算检验和时,要在UDP用户数据报之前增加12字节的伪首部。所谓"伪首部"是因为这种伪首部并不是UDP用户数据报真正的首部,知识在计算检验和时,临时添加在UDP用户数据报前面,得到一个临时的UDP用户数据报。检验和就是按照这个临时的UDP数据报来计算的,伪首部既不向下传送也不向上递交,仅仅是为了计算检验和。

注意这里有一个伪首部,其组成为:

  1. 源IP地址
  2. 目的IP地址
  3. 全0
  4. IP首部中的协议字段的值,UDP为17
  5. UDP用户数据报的长度

UDP计算检验和的方法和IP数据报的检验和的计算方法类似,不同点是IP数据报的检验和只检验IP数据报的首部,但UDP的检验和是把首部和数据部分一起都检测

检验和的计算方法如图2-2所示:

image-20190513135928608

图2-2:计算UDP检验和的例子

注意:进行反码运算时,最高位如果有进位,应该将进位加到最低位,比如如果是"101"+“100"按照普通二进制加法应该等于"1001”,但是在这里结果就应该是"010"

这里需要注意的是若UDP用户数据报的数据部分不是偶数个字节,则要填入一个全0的字节(但此字节不发送)。

在接收方,把收到的UDP用户数据连同伪首部(以及可能的填充全零字节)一起,按照二进制反码求这些16位字的和,若结果全为1表示无差错,否则说明出现差错,就应该丢弃这个UDP数据报(或者可以上交给上层,但附上有差错的警告)。

传输控制协议TCP概述

TCP最主要的特点

  1. TCP 是面向连接的运输层协议,在无连接的、不可靠的 IP 网络服务基础之上提供可靠交付的服务。为此,在 IP 的数据报服务基础之上,增加了保证可靠性的一系列措施。
  2. 每一条 TCP 连接只能有两个端点 (endpoint),每一条 TCP 连接只能是点对点的(一对一)
  3. TCP 提供可靠交付的服务
  4. TCP 提供全双工通信
  5. 面向字节流: TCP 中的**“流”(stream)** 指的是流入或流出进程的字节序列。 “面向字节流”的含义是:虽然应用程序和 TCP 的交互是一次一个数据块,但 TCP 把应用程序交下来的数据看成仅仅是一连串无结构的字节流。TCP 不保证接收方应用程序所收到的数据块和发送方应用程序所发出的数据块具有对应大小的关系(比如,发送方应用程序交给发送方的TCP共10个数据块,但接收方的TCP可能只用了4个数据块就把接收到的字节流交付给了上层的应用程序),但接收方应用程序收到的字节流必须和发送方应用程序发出的字节流完全一样。

image-20190513141939953

图3-1:TCP面向字节流的概念

注意:

TCP 连接是一条虚连接而不是一条真正的物理连接。

TCP 对应用进程一次把多长的报文发送到 TCP 的缓存中是不关心的

TCP 根据对方给出的窗口值当前网络拥塞的程度来决定一个报文段应包含多少个字节(UDP 发送的报文长度是应用进程给出的)。

TCP 可把太长的数据块划分短一些再传送,TCP 也可等待积累有足够多的字节后再构成报文段发送出去。

TCP的连接

TCP 把连接作为最基本的抽象

每一条 TCP 连接有两个端点,而TCP 连接的端点不是主机,不是主机的IP 地址,不是应用进程,也不是运输层的协议端口,TCP 连接的端点叫做套接字 (socket)插口端口号拼接到 (contatenated with) IP 地址即构成了套接字,即套接字的组成为:
socket=(IP) 套接字socket=(IP地址:端口号)
例如:
socket=(192.168.0.08808) 套接字socket=(192.168.0.0:8808)

每一条 TCP 连接唯一地被通信两端的**两个端点(即两个套接字)**所确定。即:
TCP{socket1,socket2}={(IP1:port1),(IP2:port2)} TCP连接::\{socket1,socket2\}=\{(IP1:port1),(IP2:port2)\}
同一个 IP 地址可以有多个不同的 TCP 连接,同一个端口号也可以出现在多个不同的 TCP 连接中。

注意同一个名词socket可以表示多种不同的意思,比如:

  1. 应用编程接口 API 称为 socket API, 简称为 socket。
  2. socket API 中使用的一个函数名也叫作 socket。 调
  3. 用 socket 函数的端点称为 socket。
  4. 调用 socket 函数时其返回值称为 socket 描述符,可简称为 socket。
  5. 在操作系统内核中连网协议的 Berkeley 实现,称为 socket 实现。

上面这些socket的意思都和本文所说的**socket(端口号拼接到IP地址后)**不同。

可靠传输的工作原理

我们知道,TCP的报文段是交给IP层传送的,但IP层只能尽最大努力提供服务,也就是说,TCP下面的网络所提供的是不可靠的传输,因此,TCP必须采用适当的措施才能使两个运输层之间的通信变得可靠。

我们理想的可靠传输应该满足:

  1. 传输信道不会出错
  2. 不管发送放以什么速度发送,接收端总能来得及接收

在这样的理想传输条件下,不需要采取任何措施就能够实现可靠传输。然而实际的网络都不具备以上两个理想条件。必须使用一些可靠传输协议,在不可靠的传输信道实现可靠传输,只能通过一系列协议来尽力和上述的理想传输效果接近,采用的策略是:

  1. 自动检测差错,如果出现差错就重新传输
  2. 如果接收方来不及接收,就通知发送放发慢点

停止等待协议

“停止等待”就是每发送完一个分组就停止发送,等待对方的确认,在收到确认后再发送下一个分组, 全双工通信的双方既是发送方也是接收方。 为了讨论问题的方便,我们仅考虑 A 发送数据,而 B 接收数据并发送确认,因此 A 叫做发送方,而 B 叫做接收方,这里就需要讨论两种情况:无差错情况出现差错情况

无差错情况

image-20190513143745608

图4-1:无差错情况

无差错情况如图4-1,A 发送分组 M1,发完就暂停发送,等待 B 的确认 (ACK),B 收到了 M1 向 A 发送 ACK,A 在收到了对 M1 的确认后,就再发送下一个分组 M2。

出现差错的情况

在接收方 B 会出现两种情况:

  1. B 接收 M1 时检测出了差错,就丢弃 M1,其他什么也不做(不通知 A 收到有差错的分组)。
  2. M1 在传输过程中丢失了,这时 B 当然什么都不知道,也什么都不做。

在这两种情况下,B 都不会发送任何信息, 但A都必须重发分组直到B正确接收为止,这样才能实现可靠通信。

那么这时有几个问题:

  1. A如何知道 B 是否正确收到了 M1 呢?

    解决方法:超时重传 ,A 为每一个已发送的分组都设置了一个超时计时器,A 只要在超时计时器到期之前收到了相应的确认,就撤销该超时计时器,继续发送下一个分组 M2 ,若A在超时计时器规定时间内没有收到B的确认,就认为分组错误或丢失,就重发该分组

  2. 若分组正确到达B,但B回送的确认丢失或延迟了,A未收到B的确认,会超时重发,B 可能会收到重复的 M1 ,B如何知道收到了重复的分组,需要丢弃呢?

    解决方法:编号 A为每一个发送的分组都进行编号,若B收到了编号相同的分组,则认为收到了重复分组,丢弃重复的分组,并回送确认, B为发送的确认也进行编号,指示该确认是对哪一个分组的确认, A根据确认及其编号,可以确定它是对哪一个分组的确认,避免重复发送,若为重复的确认,则将其丢弃。

确认丢失和确认迟到

确认丢失:

若 B 所发送的对 M1 的确认丢失了,那么 A 在设定的超时重传时间内不能收到确认,但 A 并无法知道:是自己发送的分组出错、丢失了,或者 是 B 发送的确认丢失了。因此 A 在超时计时器到期后就要重传 M1。 假定 B 又收到了重传的分组 M1。这时 B 应采取两个行动:

第一,丢弃这个重复的分组 M1,不向上层交付。

第二,向 A 发送确认,不能认为已经发送过确认就不再发送,因为 A 之所以重传 M1 就表示 A 没有收到对 M1 的确认。

确认迟到:

传输过程中没有出现差错,但 B 对分组 M1 的确认迟到了,A 会收到重复的确认。对重复的确认的处理很简单:收下后就丢弃, B 仍然会收到重复的 M1,并且同样要丢弃重复的 M1,并重传确认分组。

注意:在发送完一个分组后,必须暂时保留已发送的分组的副本,以备重发分组确认分组都必须进行编号,超时计时器的重传时间应当比数据在分组传输的平均往返时间更长一些

自动重传请求ARQ:

通常 A 最终总是可以收到对所有发出的分组的确认。如果 A 不断重传分组但总是收不到确认,就说明通信线路太差,不能进行通信。 使用上述的确认和重传机制,我们就可以在不可靠的传输网络上实现可靠的通信。 像上述的这种可靠传输协议常称为自动重传请求 ARQ (Automatic Repeat reQuest)。意思是重传的请求是自动进行的,接收方不需要请求发送方重传某个出错的分组。

信道利用率

image-20190513145248411

图4-2:停止等待协议的信道利用率太低

如图4-2所示,假设发送放发送分组的时间是TDT_D,接收方发送确认的时间是TAT_A,那么信道利用率为:
U=TDTD+RTT+TA U=\frac{T_D}{T_D+RTT+T_A}
这里的RTTRTT是往返时间,可以看出,当往返时间 RTT 远大于分组发送时间 TD 时,信道的利用率就会非常低, 若出现重传,则对传送有用的数据信息来说,信道的利用率就还要降低。

为了提高传输效率,发送方可以不使用低效率的停止等待协议,而是采用流水线传输。 流水线传输就是发送方可连续发送多个分组,不必每发完一个分组就停顿下来等待对方的确认。这样可使信道上一直有数据不间断地传送。 由于信道上一直有数据不间断地传送,这种传输方式可获得很高的信道利用率,如图4-3所示。

image-20190513145551309

图4-3:流水线传输可显著提高信道利用率

当使用流水线传输时,就要使用下面介绍的ARQ协议滑动窗口协议

连续ARQ协议

基本思想:

发送方一次可以发出多个分组,使用滑动窗口协议控制发送方和接收方所能发送和接收的分组的数量和编号。每收到一个确认,发送方就把发送窗口向前滑动。接收方一般采用累积确认的方式,采用回退N(Go-Back-N)方法进行重传image-20190513150321635

图4-4:连续ARQ协议的工作原理

累计确认:

接收方一般采用累积确认的方式。即不必对收到的分组逐个发送确认,而是对按序到达的最后一个分组发送确认,这样就表示:到这个分组为止的所有分组都已正确收到了。

优点:容易实现,即使确认丢失也不必重传

缺点:不能向发送方反映出接收方已经正确收到的所有分组的信息。

比如:如果发送方发送了前5个分组,而中间的第3个分组丢失了(第4、5个没丢失),这时接收端就对前2个分组发出确认,发送方无法知道后面3个分组的丢失情况,只能将后面的3个分组都全部重发一遍,这叫做Go-Back-N(回退N),表示需要再回退回来重传已经发送的某N个分组。可见当通信线路质量不好的时候,连续ARQ协议会带来负面影响。

在深入讨论TCP的可靠传输之前,我们先来了解一下TCP的报文段首部的格式。

TCP报文段的首部格式

TCP 虽然是面向字节流的,但 TCP 传送的数据单元却是报文段。 一个 TCP 报文段分为首部数据两部分,而 TCP 的全部功能都体现在它首部中各字段的作用。

TCP 报文段首部的前 20 个字节是固定的,后面有 4n 字节是根据需要而增加的选项 (n 是整数),因此 TCP 首部的最小长度是 20 字节

image-20190513151036556

图5-1:TCP报文段的首部格式

如图5-1,TCP报文段的首部主要由以下字段组成:

  1. 源端口目的端口字段——各占 2 字节。端口是运输层与应用层的服务接口,运输层的复用分用功能都要通过端口才能实现。

  2. 序号字段——占 4 字节。TCP 连接中传送的数据流中的每一个字节都编上一个序号,序号字段的值则指的是本报文段所发送的数据的第一个字节的序号

  3. 确认号字段——占 4 字节,是期望收到对方的下一个报文段的数据的第一个字节的序号

  4. 数据偏移(即首部长度)——占 4 位,它指出 TCP 报文段的数据起始处距离 TCP 报文段的起始处有多远。“数据偏移”的单位是 32 位字(以 4 字节为计算单位)

  5. 保留字段——占 6 位,保留为今后使用,但目前应置为 0。

  6. 紧急 URG —— 当 URG = 1 时,表明紧急指针字段有效,它告诉系统此报文段中有紧急数据,应尽快传送(相当于高优先级的数据)。

  7. 确认 ACK —— 只有当 ACK =1 时确认号字段才有效,当 ACK =0 时,确认号无效。

  8. 推送 PSH (PuSH) —— 接收 TCP 收到 PSH = 1 的报文段,就尽快地交付接收应用进程,而不再等到整个缓存都填满了后再向上交付

  9. 复位 RST (ReSeT) —— 当 RST=1 时,表明 TCP 连接中出现严重差错(如由于主机崩溃或其他原因),必须释放连接,然后再重新建立运输连接

  10. 同步 SYN —— 同步 SYN = 1 表示这是一个连接请求连接接受报文。

  11. 终止 FIN (FINish) —— 用来释放一个连接,FIN=1 表明此报文段的发送端的数据已发送完毕,并要求释放运输连接。

  12. 窗口字段 —— 占 2 字节,用来让对方设置发送窗口的依据,单位为字节。

  13. 检验和 —— 占 2 字节。检验和字段检验的范围包括首部数据这两部分,在计算检验和时,要在 TCP 报文段的前面加上 12 字节的伪首部(在计算检验和时,临时把 12 字节的“伪首部”和 TCP 报文段连接在一起,伪首部仅仅是为了计算检验和。)。

  14. 紧急指针字段 —— 占 16 位,指出在本报文段中紧急数据共有多少个字节(紧急数据放在本报文段数据的最前面)

  15. 选项字段 —— 长度可变。

    1. TCP 最初只规定了一种选项,即最大报文段长度 MSSMSS (Maximum Segment Size) 是 TCP 报文段中的数据字段的最大长度,数据字段加上 TCP 首部才等于整个的 TCP 报文段。 所以,MSS是“TCP 报文段长度减去 TCP 首部长度”,MSS 告诉对方 TCP:“我的缓存所能接收的报文段的数据字段的最大长度是 MSS 个字节" 。MSS 与接收窗口值没有关系,若选择较小的 MSS 长度,网络的利用率就降低。 若 TCP 报文段非常长,那么在 IP 层传输时就有可能要分解成多个短数据报片,在终点要把收到的各个短数据报片装配成原来的 TCP 报文段,当传输出错时还要进行重传,这些也都会使开销增大。 因此,MSS 应尽可能大些,只要在 IP 层传输时不需要再分片就行, 但最佳的 MSS 是很难确定的。
    2. 窗口扩大选项 ——占 3 字节,其中有一个字节表示移位值 S,新的窗口值等于 TCP 首部中的窗口位数增大到 (16 + S),相当于把窗口值向左移动 S 位后获得实际的窗口大小。
    3. 时间戳选项——占 10 字节,其中最主要的字段时间戳值字段(4 字节)和时间戳回送回答字段(4 字节)。
    4. 选择确认选项——在后面的"选择确认SACK"节介绍。
  16. 填充字段 —— 这是为了使整个首部长度是 4 字节的整数倍。

TCP可靠传输的实现

本节我们介绍TCP可靠传输的实现,为了讲述可靠传输原理的方便,我们假定数据传输只在一个方向进行,即A发送数据,B给出确认。

以字节为单位的滑动窗口

TCP 使用流水线传输和滑动窗口协议实现高效、可靠的传输, TCP 的滑动窗口是以字节为单位的

发送方 A 和接收方 B 分别维持一个发送窗口和一个接收窗口

发送窗口表示:在没有收到确认的情况下,可以连续把窗口内的数据全部发送出去

接收窗口表示只允许接收落入窗口内的数据

TCP的滑动窗口是以字节为单位的,为了便于说明滑动窗口的工作原理,我们故意把后面图5-2至图5-5中的字节编号都取得很小。现假定A收到了B发来的确认报文段,其中窗口是20字节,而确认号是31(这表明B期望收到的下一个序号是31,而序号30为止的数据已经收到了)。根据这两个数据,A就构造出自己的发送窗口,如图5-2所示。

image-20190513153529311

图5-2:根据B给出的窗口值,A构造自己的发送窗口

我们先讨论发送方A的发送窗口。发送窗口表示在没有收到B的确认的情况下,A可以连续把窗口内的数据都发送出去。凡是已经发送过的数据,在未收到确认之前都必须暂时保留,以便在超时重传时使用。发送窗口里面的序号表示允许发送的序号。显然,窗口越大,发送方就可以在收到对方确认之前连续发送更多的数据,因而可能获得更高的传输效率。在上面的TCP报文段的首部格式一节我们已经讲过,接收方会把自己的接收窗口数值放在窗口字段中发送给对方,因此,A的发送窗口定不能超过B的接收窗口数值。在后面的TCP的拥塞控制一节我们将要讨论,发送方的发送窗口大小还要受到当时网络拥塞程度的制约,但在目前,我们暂不考虑网络拥塞的影响。发送窗口后沿的后面部分表示己发送且已收到确认,这些数据显然不需要再保留了。而发送窗口前沿的前面部分表示不允许发送的,因为接收方都没有为这部分数据保留临时存放的缓存空间。发送窗口的位置由窗口前沿和后沿的位置共同确定。发送窗口后沿的变化情况有两种可能,即不动(没有收到新的确认)前移(收到了新的确认)。发送窗口后沿不可能向后移动,因为不能撤销掉己收到的确认。发送窗口前沿通常是不断向前移动,但也有可能不动,这对应于两种情况:一是没有收到新的确认,对方通知的窗口大小也不变;一是收到了新的确认但对方通知的窗口缩小了,使得发送窗口前沿正好不动。发送窗口前沿也有可能向后收缩,这发生在对方通知的窗口缩小了,但TCP的标准强烈不赞成这样做。因为很可能发送方在收到这个通知以前已经发送了窗口中的许多数据,现在又要收缩窗口,不让发送这些数据,这样就会产生一些错误。

image-20190513154641268

图5-3:A发送了11个字节的数据

现在假定A发送了序号为31~41的数据。这时,发送窗口位置并未改变(图5-3),但发送窗口内靠后面有11个字节(灰色小方框表示)表示己发送但未收到确认,而发送窗口内靠前面的9个字节(42~50)是允许发送但尚未发送的

从以上所述可以看出,要描述一个发送窗口的状态需要三个指针P1,P2和P3(图5-3)。指针都指向字节的序号,这三个指针指向的几个部分的意义如下:

小于P1的是已发送并已收到确认的部分,而大于P3的是不允许发送的部分。

P3-P1=A的发送窗口

P2-P1=已发送但尚未收到确认的字节数

P3-P1=允许发送但当前尚未发送的字节数(又称为可用窗口有效窗口)

再看一下B的接收窗口,B的接收窗口大小是20。在接收窗口外面,到30号为止的数据是已经发送过确认,并且已经交付主机了。因此在B可以不再保留这些数据。接收窗口内的序号(31~50)是允许接收的,在图5-3中,B收到了序号为32和33的数据,这些数据没有按序到达,因为序号为31的数据没有收到(也许丢失了,也许滞留在网络中的某处)。请注意,B只能对按序收到的数据中的最高序号给出确认,因此B发送的确认报文段中的确认号仍然是31(即期望收到的序号),而不能是32或33。

image-20190513155227629

图5-4:A收到新的确认号,发送窗口向前滑动

现在假定B收到了序号为31的数据,并把序号为31~33的数据交付主机,然后B删除这些数据。接着把接收窗口向前移动3个序号(图5-4),同时给A发送确认,其中窗口值仍为20,但确认号是34。这表明B已经收到了到序号33为止的数据。我们注意到,B还收到了序号为37,38和40的数据,但这些都没有按序到达,只能先暂存在接收窗口中。A收到B的确认后,就可以把发送窗口向前滑动3个序号,但指针P2不动。可以看出,现在A的可用窗口增大了,可发送的序号范围是42~53.

image-20190513155500658

图5-5:发送窗口内的序号都属于已发送但未收到确认

A在继续发送完序号42~53的数据后,指针P2向前移动和P3重合,发送窗口内的序号都已用完,但还没有再收到确认(图5-5)。由于A的发送窗口已满,可用窗口已减小到零,因此必须停止发送。请注意,存在下面这种可能性,就是发送窗口内所有的数据都已正确到达B,B也早已发出了确认。但不幸的是,所有这些确认都滞留在网络中。在没有收到B的确认时,A不能猜测,或许B收到了吧!为了保证可靠传输,A只能认为B还没有收到这些数据。于是,A在经过一段时间后(由超时计时器控制)就重传这部分数据,重新设置超时计时器,直到收到B的确认为止。如果A收到确认号落在发送窗口内,那么A就可以使发送窗口继续向前滑动,并发送新的数据。

发送缓存

发送方的应用进程把字节流写入 TCP 的发送缓存,发送窗口通常只是发送缓存的一部分。

发送缓存用来暂时存放:

  1. 发送应用程序传送给发送方 TCP 准备发送的数据;
  2. TCP 已发送出但尚未收到确认的数据。

image-20190513155904506

接收缓存

接收方的应用进程从 TCP 的接收缓存中读取字节流。

接收缓存用来暂时存放:

  1. 按序到达的、但尚未被接收应用程序读取的数据;
  2. 不按序到达的数据。

image-20190513160002978

注意:

  1. A 的发送窗口并不总是和 B 的接收窗口一样大(因为有一定的时间滞后)。
  2. TCP 标准没有规定对不按序到达的数据应如何处理。通常是先临时存放在接收窗口中,等到字节流中所缺少的字节收到后,再按序交付上层的应用进程
  3. TCP 要求接收方必须有累积确认的功能,这样可以减小传输开销。

接收方发送确认:

接收方可以在合适的时候发送确认,也可以在自己有数据要发送时把确认信息顺便捎带上。 但请注意两点:

  1. 接收方不应过分推迟发送确认,否则会导致发送方不必要的重传,这反而浪费了网络的资源
  2. 捎带确认实际上并不经常发生,因为大多数应用程序很少同时在两个方向上发送数据。

超时重传时间的选择

重传机制是 TCP 中最重要最复杂的问题之一。 TCP 每发送一个报文段,就对这个报文段设置一次计时器, 只要计时器设置的重传时间到但还没有收到确认,就要重传这一报文段,重传时间的选择是 TCP 最复杂的问题之一。

由于TCP的下层是互联网环境,发送的报文段可能只经过一个高速率的局域网,也可能经过多个低速率的网络,并且每个IP数据报所选择的路由还可能不同。如果把超时重传时间设置得太短,就会引起很多报文段的不必要的重传,使网络负荷增大。但若把超时重传时间设置得过长,则又使网络的空闲时间增大,降低了传输效率。

那么,运输层的超时计时器的超时重传时间究竟应设置为多大呢?

TCP采用了一种自适应算法,它记录一个报文段发出的时间,以及收到相应的确认的时间。这两个时间之差就是报文段的往返时间RTT。TCP保留了RTT的一个**加权平均往返时间RTTs(这又称为平滑的往返时间,S表示Smoothed。因为进行的是加权平均,因此得出的结果更加平滑)。

当第一次测量到RTT样本时,RTTs值就取为所测量到的RTT样本值。但以后每测量到一个新的RTT样本,就按下式重新计算一次RTTs:
RTTs=(1α)×(RTTs)+α×(RTT) 新的RTTs=(1-\alpha)\times (旧的RTTs)+\alpha \times(新的RTT样本)

在上式中,0&lt;α&lt;10&lt; \alpha &lt;1。若a很接近于零,表示新的RTTs值和旧的RTTs值相比变化不大,而对新的RTT样本影响不大(RTT值更新较慢)。若选择a接近于1,则表示新的RTTs值受新的RTT样本的影响较大(RTT值更新较快)。

推荐的a值为1/8,即0.125,用这种方法得出的加权平均往返时间RTTs就比测量出的RTT值更加平滑。

显然,超时计时器设置的超时重传时间RTO(RetransmissionTime-Out)略大于上面得出的加权平均往返时间RTTs。

RFC 6298建议使用下式计算RTO:
RTO=RTTs+4×RTTD RTO=RTTs+4\times RTT_D

而RTTD是RTT的偏差的加权平均值,它与RTTs和新的RTT样本之差有关。RFC6298建议这样计算RTTDRTT_D:当第一次测量时,RTTDRTT_D 值取为测量到的RTT样本值的一半,在以后的测量中,则使用下式计算加权平均的RTTDRTT_D
RTTD=(1β)×(RTTD)+β×RTTsRTT 新的RTT_D=(1-\beta)\times(旧的RTT_D)+\beta \times |RTT_s-新的RTT样本|

这里的β\beta是个小于1的系数,它的推荐值是I/4,即0.25。

image-20190513161905217

图5-6

上面所说的往返时间的测量,实现起来相当复杂。试看下面的例子,如图5-6所示,发送出一个报文段,设定的重传时间到了,还没有收到确认。于是重传报文段。经过了一段时间后,收到了确认报文段。现在的问题是如何判定此确认报文段是对先发送的报文段的确认,还是对后来重传的报文段的确认?由于重传的报文段和原来的报文段完全一样,因此源主机在收到确认后,就无法做出正确的判断,而正确的判断对确定加权平均RTTs的值关系很大。若收到的确认是对重传报文段的确认,但却被源主机当成是对原来的报文段的确认,则这样计算出的RTTs和超时重传时间RTO就会偏大。若后面再发送的报文段又是经过重传后才收到确认报文段,则按此方法得出的超时重传时间RTO就越来越长。

根据以上所述,Kam提出了一个算法,在计算加权平均RTTS时,只要报文段重传了,就不采用其往返时间样本。这样得出的加权平均RTTS和RTO就较准确,但是,这又引起新的问题。设想出现这样的情况报文段的时延突然增大了很多,因此在原来得出的重传时间内,不会收到确认报文段,于是就重传报文段,但根据Kam算法,不考虑重传的报文段的往返时间样本,这样,超时重传时间就无法更新

因此要对Kam算法进行修正。方法是报文段每重传一次,就把超时重传时间RTO增大一些。典型的做法是取新的重传时间为旧的重传时间的2倍。当**不再发生报文段的重传时,才根据上面给出的(6)式计算超时重传时间。**实践证明,这种策略较为合理。总之,Kam算法能够使运输层区分开有效的和无效的往返时间样本,从而改进了往返时间的估测,使计算结果更加合理。

选择确认SACK

问题:若收到的报文段无差错,只是未按序号,中间还缺少一些序号的数据,那么能否设法只传送缺少的数据而不重传已经正确到达接收方的数据? 答案是可以的,选择确认 SACK (Selective ACK) 就是一种可行的处理方法。

image-20190513162452515

图5-7:接收到的字节流信号不连续

如图5-7所示,TCP 的接收方在接收对方发送过来的数据字节流的序号不连续,结果就形成了一些不连续的字节块。

和前后字节不连续的每一个字节块都有两个边界:左边界右边界

第一个字节块的左边界 L1 = 1501,但右边界 R1 = 3001。左边界指出字节块的第一个字节的序号,但右边界减 1 才是字节块中的最后一个序号

第二个字节块的左边界 L2 = 3501,而右边界 R2 = 4501。

如果要使用选择确认,那么在建立 TCP 连接时,就要在 TCP 首部的选项中加上**“允许 SACK”的选项,而双方必须都事先商定好。 如果使用选择确认,那么原来首部中的“确认号字段”的用法仍然不变**。只是以后在 TCP 报文段的首部中都增加了 SACK 选项,以便报告收到的不连续的字节块的边界。 由于首部选项的长度最多只有 40 字节,而指明一个边界就要用掉 4 字节,因此在选项中最多只能指明 4 个字节块的边界信息。

TCP的流量控制

利用滑动窗口的流量控制

一般说来,我们总是希望数据传输得更快一些,但如果发送方把数据发送得过快,接收方就可能来不及接收,这就会造成数据的丢失流量控制 (flow control) 就是让发送方的发送速率不要太快,既要让接收方来得及接收,也不要使网络发生拥塞

利用滑动窗口机制可以很方便地在 TCP 连接上实现流量控制。

我们来看一个例子:

image-20190513162923408

图6-1:利用可变窗口进行流量控制举例

设A向B发送数据。

在连接建立时,B告诉了A:"我的接收窗口rwnd=400“,(这里rwnd表示receiver window)。因此,发送方的发送窗口不能超过接收方给出的接收窗口的数值。请注意,TCP的窗口单位是字节,不是报文段,TCP连接建立时的窗口协商过程在图中没有显示出来。再设每一个报文段为100字节长,而数据报文段序号的初始值设为1(见图中第一个箭头上面的序号seq=1,图中右边的注释可帮助理解整个过程)。

请注意,图中箭头上面大写ACK表示首部中的确认位ACK,小写ack表示确认字段的值。我们应注意到,接收方的主机B进行了三次流量控制。第一次把窗口减小到rwnd=300,第二次又减到rwnd=100,最后减到rwnd=0,即不允许发送方再发送数据了,这种使发送方暂停发送的状态将持续到主机B重新发出一个新的窗口值为止。我们还应注意到,B向A发送的三个报文段都设置了ACK=1,只有在ACK=1时确认号字段才有意义

死锁问题:

现在我们考虑1种情况。在图6-1中,B向A发送了零窗口的报文段后不久,B的接收缓存又有了一些存储空间于,是B向A发送了rwnd=400的报文段,然而这个报文段在传送过程中丢失了。A一直等待收到B发送的非零窗口的通知,而B也一直等待A发送的数据,如果没有其他措施,这种互相等待的死锁局面将一直延续下去。为了解决这个问题,TCP为每一个连接设有一个持续计时器(persistence timer)。只要TCP连接的一方收到对方的零窗口通知,就启动持续计时器,若持续计时器设置的时间到期,就发送一个零窗口探测报文段(仅携带1字节的数据),而对方就在确认这个探测报文段时给出了现在的窗口值,如果窗口仍然是零,那么收到这个报文段的一方就重新设置持续计时器,如果窗口不是零,那么死锁的僵局就可以打破了。

TCP的传输效率

应用进程把数据传送到TCP的发送缓存后,剩下的发送任务就由TCP来控制了,可以用不同的机制来控制 TCP 报文段的发送时机:

  1. 第一种机制是 TCP 维持一个变量,它等于最大报文段长度 MSS。只要缓存中存放的数据达到 MSS 字节时,就组装成一个 TCP 报文段发送出去。
  2. 第二种机制是由发送方的应用进程指明要求发送报文段,即 TCP 支持的推送 (push) 操作。
  3. 第三种机制是发送方的一个计时器期限到了,这时就把当前已有的缓存数据装入报文段(但长度不能超过 MSS)发送出去。

如何控制 TCP 发送报文段的时机仍然是一个较为复杂的问题。

发送方糊涂窗口综合症

发送方 TCP 每次接收到一字节的数据后就发送。 这样,发送一个字节需要形成 41 字节长的 IP 数据报。效率很低。 解决方法:使用 Nagle 算法

Nagle 算法:

若发送应用进程把要发送的数据逐个字节地送到 TCP 的发送缓存,则发送方就把第一个数据字节先发送出去把后面到达的数据字节都缓存起来

当发送方收到对第一个数据字符的确认后,再把发送缓存中的所有数据组装成一个报文段发送出去,同时继续对随后到达的数据进行缓存。

只有在收到对前一个报文段的确认后才继续发送下一个报文段

到达的数据已达到发送窗口大小的一半或已达到报文段的最大长度时,就立即发送一个报文段

接收方糊涂窗口综合症

当接收方的 TCP 缓冲区已满,接收方会向发送方发送窗口大小为 0 的报文。 若此时接收方的应用进程以交互方式每次只读取一个字节,于是接收方又发送窗口大小为一个字节的更新报文,发送方应邀发送一个字节的数据(发送的 IP 数据报是 41 字节长),于是接收窗口又满了,如此循环往复。

解决方法:

让接收方等待一段时间,使得或者接收缓存已有足够空间容纳一个最长的报文段,或者等到接收缓存已有一半空闲的空间。只要出现这两种情况之一,接收方就发出确认报文,并向发送方通知当前的窗口大小。

TCP的拥塞控制

拥塞控制的一般原理

在某段时间,若对网络中某资源的需求超过了该资源所能提供的可用部分,网络的性能就要变坏。这种现象称为拥塞 (congestion), 最坏结果:系统崩溃

网络拥塞往往是由许多因素引起的。例如:

  1. 点缓存的容量太小;
  2. 链路的容量不足;
  3. 处理机处理的速率太慢;
  4. 拥塞本身会进一步加剧拥塞;

出现拥塞的原因:
&gt; \sum对资源的需求&gt;可用资源

增加资源能解决拥塞问题 吗?

**不能。**这是因为网络拥塞是一个非常复杂的问题。简单地采用上述做法,在许多情况下,不但不能解决拥塞问题,而且还可能使网络的性能更坏。

网络拥塞往往是由许多因素引起的,例如:

  1. 增大缓存,但未提高输出链路的容量和处理机的速度,排队等待时间将会大大增加,引起大量超时重传,解决不了网络拥塞;
  2. 提高处理机处理的速率会会将瓶颈转移到其他地方;

拥塞控制与流量控制的区别

拥塞控制 流量控制
防止过多的数据注入到网络中,使网络中的路由器或链路不致过载 抑制发送端发送数据的速率,以使接收端来得及接收;
是一个全局性的过程,涉及到与降低网络传输性能有关的所有因素。 是点对点通信量的控制,是端到端的问题;

拥塞控制的前提:网络能够承受现有的网络负荷。实践证明,拥塞控制是很难设计的,因为它是一个动态问题。分组的丢失是网络发生拥塞的征兆而不是原因。在许多情况下,甚至正是拥塞控制本身成为引起网络性能恶化、甚至发生死锁的原因。

开环控制和闭环控制

开环控制 闭环控制
在设计网络时,事先考虑周全,力求工作时不发生拥塞; 基于反馈环路的概念;
根据网络当前的运行状态采取相应控制措施;
思路:力争避免发生拥塞。 思路:在发生拥塞后,采取措施进行控制,消除拥塞。

TCP的拥塞控制方法

TCP 采用基于窗口的方法进行拥塞控制,该方法属于闭环控制方法

TCP发送方维持一个拥塞窗口 cwnd (Congestion Window)发送端利用拥塞窗口根据网络的拥塞情况调整发送的数据量。 发送窗口大小不仅取决于接收方窗口,还取决于网络的拥塞状况
=Min() 真正的发送窗口值 = Min (接收方窗口值,拥塞窗口值)

控制拥塞窗口的原则

  1. 只要网络没有出现拥塞,拥塞窗口就可以再增大一些,以便把更多的分组发送出去,这样就可以提高网络的利用率。
  2. 只要网络出现拥塞有可能出现拥塞,就必须把拥塞窗口减小一些,以减少注入到网络中的分组数,以便缓解网络出现的拥塞。

拥塞的判断

重传定时器超时:网络已经发生了拥塞。

收到三个重复的 ACK:预示网络可能会出现拥塞(实际可能还未发生拥塞)。

TCP拥塞控制算法

四种拥塞控制算法( RFC 5681) :

  1. 慢开始 (slow-start)
  2. 拥塞避免 (congestion avoidance)
  3. 快重传 (fast retransmit)
  4. 快恢复 (fast recovery)
慢开始

拥塞窗口 cwnd 控制方法:在每收到一个对新的报文段的确认后,可以把拥塞窗口增加最多一个 SMSS 的数值
cwnd=min(N,SMSS) 拥塞窗口 cwnd 每次的增加量 = min (N, SMSS)
其中 N 是原先未被确认的、但现在被刚收到的确认报文段所确认的字节数。 不难看出,当 N < SMSS 时,拥塞窗口每次的增加量要小于 SMSS(最大报文段)。 用这样的方法逐步增大发送方的拥塞窗口 cwnd,可以使分组注入到网络的速率更加合理。

image-20190513165852021

图7-1:发送方每次收到一个确认就把窗口cwnd加1

如图7-1,发送方每次收到一个确认就把窗口cwnd加1,这样,第一轮发送1个报文,第二轮可以发送2个报文,第三轮发送4个报文,在超时之前,每经过一个传输轮次,拥塞窗口就加倍,窗口大小会按指数增加,不慢!

使用慢开始算法后,每经过一个传输轮次 (transmission round),拥塞窗口 cwnd 就加倍。 一个传输轮次所经历的时间其实就是往返时间 RTT。 “传输轮次”更加强调:把拥塞窗口 cwnd 所允许发送的报文段都连续发送出去,并收到了对已发送的最后一个字节的确认。 例如,拥塞窗口 cwnd = 4,这时的往返时间 RTT 就是发送方连续发送 4 个报文段,并收到这 4 个报文段的确认,总共经历的时间

设置慢开始门限状态变量 ssthresh:

慢开始门限 ssthresh 的用法如下:

  1. 当 cwnd < ssthresh 时,使用慢开始算法。
  2. 当 cwnd > ssthresh 时,停止使用慢开始算法而改用拥塞避免算法
  3. 当 cwnd = ssthresh 时,既可使用慢开始算法,也可使用拥塞避免算法。
拥塞避免

思路:让拥塞窗口 cwnd 缓慢地增大,避免出现拥塞。 每经过一个传输轮次,拥塞窗口 cwnd = cwnd + 1, 使拥塞窗口 cwnd 按线性规律缓慢增长, 在拥塞避免阶段,具有 “加法增大” (Additive Increase) 的特点。

image-20190513170259141

图7-2:发送方每经过一个传输轮次就把窗口cwnd加1

重点:无论在慢开始阶段还是在拥塞避免阶段,只要发送方判断网络出现拥塞(重传定时器超时)ssthresh = max (cwnd/2,2) , cwnd = 1,执行慢开始算法

**目的:**迅速减少主机发送到网络中的分组数,使得发生拥塞的路由器有足够时间把队列中积压的分组处理完毕。

image-20190513170623243

图7-3:TCP拥塞窗口cwnd在拥塞控制时的变化情况

当 TCP 连接进行初始化时,将拥塞窗口置为 1,图中的窗口单位不使用字节而使用报文段,慢开始门限的初始值设置为 16 个报文段,即 ssthresh = 16。

“拥塞避免”并非指完全能够避免了拥塞,利用以上的措施要完全避免网络拥塞还是不可能的, “拥塞避免”是说在拥塞避免阶段把拥塞窗口控制为按线性规律增长,使网络比较不容易出现拥塞。

快重传

发送方只要一连收到三个重复确认,就知道接收方确实没有收到报文段,因而应当立即进行重传(即“快重传”),这样就不会出现超时,发送方也不就会误认为出现了网络拥塞。 使用快重传可以使整个网络的吞吐量提高约20%。

不难看出,快重传并非取消重传计时器,而是在某些情况下可以更早地(更快地)重传丢失的报文段。

采用快重传 FR (Fast Retransmission) 算法可以让发送方尽早知道发生了个别报文段的丢失。 快重传算法首先要求接收方不要等待自己发送数据时才进行捎带确认,而是要立即发送确认,即使收到了失序的报文段也要立即发出对已收到的报文段的重复确认。

举例:

image-20190513171014132

图7-4

如图7-4,接收方收到三个连续的 对 M2 的重复确认,立即重传 M3

快恢复

当发送端收到连续三个重复的确认时,由于发送方现在认为网络很可能没有发生拥塞,因此现在不执行慢开始算法,而是执行快恢复算法 FR (Fast Recovery) 算法:

  1. 慢开始门限 ssthresh = 当前拥塞窗口 cwnd / 2 ;
  2. 新拥塞窗口 cwnd = 慢开始门限 ssthresh ;
  3. 开始执行拥塞避免算法,使拥塞窗口缓慢地线性增大。

加法增大,乘法减小 (AIMD):

可以看出,在拥塞避免阶段,拥塞窗口是按照线性规律增大的。这常称为**“加法增大” AI (Additive Increase)**。

当出现超时或3个重复的确认时,就要把门限值设置为当前拥塞窗口值的一半,并大大减小拥塞窗口的数值。这常称为**“乘法减小”MD (Multiplicative Decrease)。**

二者合在一起就是所谓的 AIMD 算法

TCP拥塞控制流程图

image-20190513171311661

主动队列管理AQM

TCP 拥塞控制网络层采取的策略有密切联系, 若路由器对某些分组的处理时间特别长,那么这就可能使这些分组中的TCP报文段经过很长时间才能到达终点,结果引起发送方超时,对这些报文段进行重传。,重传会使 TCP 连接的发送端认为在网络中发生了拥塞,但实际上网络并没有发生拥塞, 对 TCP 拥塞控制影响最大的就是路由器的分组丢弃策略。

“先进先出”FIFO 处理规则

路由器的队列通常都是按照**“先进先出”FIFO (First In First Out)** 的规则处理到来的分组。 当队列已满时,以后再到达的所有分组(如果能够继续排队,这些分组都将排在队列的尾部)将都被丢弃,这就叫做尾部丢弃策略 (tail-drop policy)。 路由器的尾部丢弃往往会导致一连串分组的丢失,这就使发送方出现超时重传使 TCP 进入拥塞控制的慢开始状态,结果使 TCP 连接的发送方突然把数据的发送速率降低到很小的数值

更为严重的是,在网络中通常有很多的 TCP 连接,这些连接中的报文段通常是复用在网络层的 IP 数据报中传送的。 在这种情况下,若发生了路由器中的尾部丢弃,就可能会同时影响到很多条 TCP 连接,结果使这许多 TCP 连接在同一时间突然都进入到慢开始状态,这在 TCP 的术语中称为全局同步 (global syncronization)。,全局同步使得全网的通信量突然下降了很多,而在网络恢复正常后,其通信量又突然增大很多

主动队列管理AQM

1998 年提出了主动队列管理 AQM (Active Queue Management)。 所谓“主动”就是不要等到路由器的队列长度已经达到最大值时才不得不丢弃后面到达的分组,而是在队列长度达到某个值得警惕的数值时(即当网络拥塞有了某些拥塞征兆时),就主动丢弃到达的分组, AQM 可以有不同实现方法,其中曾流行多年的就是随机早期检测 RED (Random Early Detection)。

随机早期检测RED

使路由器的队列维持两个参数:队列长度最小门限 THmin最大门限 Thmax 。 RED 对每一个到达的分组都先计算平均队列长度 LAV

  1. 若平均队列长度小于最小门限 THmin,则将新到达的分组放入队列进行排队
  2. 若平均队列长度超过最大门限 Thmax ,则将新到达的分组丢弃
  3. 若平均队列长度在最小门限 THmin 和最大门限 Thmax 之间,则按照某一概率 p 将新到达的分组丢弃

TCP的运输连接管理

TCP 是面向连接的协议, TCP 连接有三个阶段:

  1. 连接建立
  2. 数据传送
  3. 连接释放

TCP 连接的管理就是使 TCP 连接的建立和释放都能正常地进行

TCP 连接建立过程中要解决的三个问题:

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

TCP 连接的建立采用客户服务器方式, 主动发起连接建立的应用进程叫做客户 (client), 被动等待连接建立的应用进程叫做服务器 (server)

TCP的连接

TCP 建立连接的过程叫做握手, 握手需要在客户和服务器之间交换三个 TCP 报文段,称之为三报文握手, 采用三报文握手主要是为了防止已失效的连接请求报文段突然又传送到了,因而产生错误。

image-20190513172229316

图8-1:用三报文握手建立TCP连接

如图8-1所示,假定主机A是客户机,主机B是服务器,初始两端的TCP进程都处于CLOSED(关闭)状态。图中在主机下面的方框分别是TCP进程所处的状态,请注意,在本例中,A主动打开连接,而B被动打开连接。

一开始,B的TCP服务器进程先创建传输控制块TCB,准备接受客户进程的连接请求,然后服务器进程就处于LISTEN(收听)状态,等待客户的连接请求,如有,即作出响应。

  1. A的TCP客户进程也是首先创建传输控制模块TCB,然后,在打算建立TCP连接时,向B发出连接请求报文段,这时首部中的同步位SYN=1,同时选择一个初始序号seq=x。 TCP规定,SYN报文段(即SYN=1的报文段)不能携带数据,但要消耗掉一个序号。这时,TCP客户进程进入SYN-SENT(同步已发送)状态。

  2. B收到连接请求报文段后,如同意建立连接,则向A发送确认。在确认报文段中应把SYN位和ACK位都置1,确认号是ack=x+1,同时也为自己选择一个初始序号seq=y。请注意,这个报文段也不能携带数据,但同样要消耗掉一个序号。这时TCP服务器进程进入SYN-RCVD(同步收到)状态。

  3. TCP客户进程收到B的确认后,还要向B给出确认。确认报文段的ACK置1,确认号ack=y+1,而自己的序号seq=x+1。TCP的标准规定,ACK报文段可以携带数据,但如果不携带数据则不消耗序号,在这种情况下,下一个数据报文段的序号仍是seq=x+1。

这时,TCP连接已经建立,A进入ESTABLISHED(已建立连接)状态。当B收到A的确认后,也进入ESTABLISHED状态。

上面给出的连接建立过程叫做三报文握手。请注意,在图8-1中B发送给A的报文段,也可拆成两个报文段。可以先发送一个确认报文段(ACK=1,ack=x+1),然后再发送一个同步报文段(SYN=1,seq=y)。这样的过程就变成了四报文握手,但效果是一样的。

为什么A最后还要发送一次确认呢?

这主要是为防止已失效的连接请求报文段突然又传送到了B,因而产生错误。所谓**"己失效的连接请求报文段"是这样产生的:考虑一种正常情况,A发出连接请求,但因连接请求报文丢失而未收到确认**。于是A再重传一次连接请求,后来收到了确认,建立了连接,数据传输完毕后,就释放了连接。A共发送了两个连接请求报文段,其中第一个丢失,第二个到达了B,没有"己失效的连接请求报文段“

现假定出现一种异常情况,即A发出的第一个连接请求报文段并没有丢失,而是在某些网络结点长时间滞留了,以致延误到连接释放以后的某个时间才到达B。本来这是一个早已失效的报文段,但B收到此失效的连接请求报文段后,就误认为是A又发出一次新的连接请求,于是就向A发出确认报文段,同意建立连接。假定不采用报文握手,那么只要B发出确认,新的连接就建立了。由于现在A并没有发出建立连接的请求,因此不会理睬B的确认,也不会向B发送数据。但B却以为新的运输连接已经建立了,并1直等待A发来数据,B的许多资源就这样白白浪费了。

TCP连接的释放

image-20190513173103174

图8-2:TCP连接释放的过程

TCP连接释放过程比较复杂,我们仍结合双方状态的改变来阐明连接释放的过程。

数据传输结束后,通信的双方都可释放连接,现在A和B都处于ES丁人BLISHED状态(图8-2)。

  1. A的应用进程先向其TCP发出连接释放报文段,并停止再发送数据,主动关闭TCP连接。A把连接释放报文段首部的终止控制位FIN置1,其序号seq=u,它等于前面已传送过的数据的最后一个字节的序号加1。这时A进入FIN-WAIT-1(终止等待1)状态,等待B的确认。请注意,TCP规定,FIN报文段即使不携带数据,它也消耗掉1个序号。

  2. B收到连接释放报文段后即发出确认,确认号是ack=u+1,而这个报文段自己的序号是v,等于B前面已传送过的数据的最后一个字节的序号加1。然后B就进入CLOSE-WAIT(关闭等待)状态。TCP服务器进程这时应通知高层应用进程,因而从A到B这个方向的连接就释放了,这时的TCP连接处于半关闭(half-close)状态,即A已经没有数据要发送了,但B若发送数据,A仍要接收。也就是说,从B到A这个方向的连接并未关闭,这个状态可能会持续一段时间。

  3. A收到来自B的确认后,就进入FIN-WAIT-2(终止等待2)状态,等待B发出的连接释放报文段。若B已经没有要向A发送的数据,其应用进程就通知TCP释放连接。这时B发出的连接释放报文段必须使FIN=1。现假定B的序号为w(在半关闭状态B可能又发送了一些数据)。B还必须重复上次已发送过的确认号ack=u+1。这时B就进入LAST-ACK(最后确认)状态,等待A的确认。

  4. A在收到B的连接释放报文段后,必须对此发出确认。在确认报文段中把ACK置1,确认号ack.=w+1,而自己的序号是seq=u+1(根据TCP标准,前面发送过的FIN报文段要消耗一个序号)。然后进入到TIME-WAIT(时间等待)状态。

请注意,现在TCP连接还没有释放掉。必须经过时间等待计时器(TIME-WAITtimer)设置的时间2MSL后,A才进入到CLOSED状态。时间MSL叫做最长报文段寿命(Maximum Segment Lifetime),RFC 793建议设为2分钟。但这完全是从工程上来考虑的,对于现在的网络,MSL=2分钟可能太长了一些。因此TCP允许不同的实现可根据具体情况使用更小的MSL值。因此,从A进入到TIME-WWT状态后,要经过4分钟才能进入到CLOSED状态,才能开始建立下一个新的连接。当A撤销相应的传输控制块TCB后,就结束了这次的TCP连接。

为什么A在TIME-WAIT状态必须等待2MSL的时间呢?

第一,为了保证A发送的最后一个ACK报文段能够到达B,这个ACK报文段有可能丢失,因而使处在LAST-ACK状态的B收不到对已发送的FIN+ACK报文段的确认。B会超时重传这个FIN+ACK报文段,而A就能在2MSL时间内收到这个重传的FIN+ACK报文段。接着A重传一次确认,重新启动2MSL计时器。最后,A和B都正常进入到CLOSED状态。如果A在TIME-WAIT状态不等待一段时间,而是在发送完ACK报文段后立即释放连接,那么就无法收到B重传的FIN+ACK报文段,因而也不会再发送一次确认报文段。这样,B就无法按照正常步骤进入CLOSED状态

第二,防止上一节提到的。**“已失效的连接请求报文段”**出现在本连接中。A在发送完最后一个ACK报文段后,再经过时间2MSL,就可以使本连接持续的时间内所产生的所有报文段都从网络中消失。这样就可以使下一个新的连接中不会出现这种旧的连接请求报文段。B只要收到了A发出的确认,就进入CLOSED状态。同样,B在撤销相应的传输控制块TCB后,就结束了这次的TCP连接。我们注意到,B结束TCP连接的时间要比A早一些。

上述的TCP连接释放过程是四报文握手。除时间等待计时器外,TCP还设有一个保活计时器(keepalive timer),设想有这样的情况:客户已主动与服务器建立了TCP连接,但后来客户端的主机突然出故障。显然,服务器以后就不能再收到客户发来的数据,因此,应当有措施使服务器不要再白白等待下去,这就是使用保活计时器。服务器每收到一次客户的数据,就重新设置保活计时器,时间的设置通常是两小时。若两小时没有收到客户的数据,服务器就发送一个探测报文段,以后则每隔75秒钟发送一次。若一连发送10个探测报文段后仍无客户的响应,服务器就认为客户端出了故障,接着就关闭这个连接。

总结

  • 运输层提供应用进程间的逻辑通信,也就是说,运输层之间的通信并不是真正在两个运输层之间直接传送数据。运输层向应用层屏蔽了下面网络的细节(如网络拓扑、所采用的路由选择协议等),它使应用进程看见的就是好像在两个运输层实体之间有一条端到端的逻辑通信信道。
  • 网络层为主机之间提供逻辑通信,而运输层为应用进程之间提供端到端的逻辑通信。
  • 运输层有两个主要的协议TCP和UDP,它们都有复用和分用,以及检错的功能。当运输层采用面向连接的TCP协议时,尽管下面的网络是不可靠的(只提供尽最大努力服务),但这种逻辑通信信道就相当于一条全双工通信的可靠信道。当运输层采用无连接的UDP协议时,这种逻辑通信信道仍然是一条不可靠信道。
  • 运输层用一个16位端口号来标志一个端口。端口号只具有本地意义,它只是为了标志本计算机应用层中的各个进程在和运输层交互时的层间接口。在互联网的不同计算机中,相同的端口号是没有关联的。
  • 两台计算机中的进程要互相通信,不仅要知道对方的IP地址(为了找到对方的计算机),而且还要知道对方的端口号(为了找到对方计算机中的应用进程)。
  • 运输层的端口号分为服务器端使用的端口号(0~1023)指派给熟知端口号,(1024~49151)是登记端口号和客户端暂时使用的端口号(49152~65535)。
  • UDP的主要特点是(1)无连接;(2)尽最大努力交付;(3)面向报文;(4)无拥塞控制;(5)支持一对一、一对多、多对一和多对多的交互通信忙;(6)首部开销小(只有四个字段源端口、目的端口、长度、检验和)。
  • TCP的主要特点是(1)面向连接;(2)每一条TCP连接只能是点对点的(一对一);(3)提供可靠交付的服务;(4)提供全双工通信;(5)面向字节流。
  • TCP用主机的IP地址加上主机上的端口号作为TCP连接的端点。这样的端点就叫做套接字(socket)或插口。套接字用(IP地址端口号)来表示。
  • 停止等待协议能够在不可靠的传输网络上实现可靠的通信。每发送完一个分组就停止发送,等待对方的确认。在收到确认后再发送下一个分组。分组需要进行编号。
  • 超时重传是指只要超过了一段时间仍然没有收到确认,就重传前面发送过的分组(认为刚才发送的分组丢失了)。因此每发送完一个分组需要设置一个超时计时器,其重传时间应比数据在分组传输的平均往返时间更长一些。这种自动重传方式常称为自动重传请求ARQ。
  • 在停止等待协议中,若接收方收到重复分组,就丢弃该分组,但同时还要发送确认。
  • 连续ARQ协议可提高信道利用率。发送方维持一个发送窗口,凡位于发送窗口内的分组都可连续发送出去,而不需要等待对方的确认。接收方一般采用累积确认,对按序到达的最后一个分组发送确认,表明到这个分组为止的所有分组都已正确收到了。
  • TCP报文段首部的前20个字节是固定的,后面有4N字节是根据需要而增加的选项(N是整数)。在一个TCP连接中传送的字节流中的每一个字节都按顺序编号。首部中的序号字段值则指的是本报文段所发送的数据的第一个字节的序号。
  • TCP首部中的确认号是期望收到对方下一个报文段的第一个数据字节的序号。若确认号为N则表明到序号N-1为止的所有数据都已正确收到。
  • TCP首部中的窗口字段指出了现在允许对方发送的数据量。窗口值是经常在动态变化着的。
  • TCP使用滑动窗口机制。发送窗口里面的序号表示允许发送的序号。发送窗口后沿的后面部分表示已发送且己收到了确认,而发送窗口前沿的前面部分表示不允许发送。发送窗口后沿的变化情况有两种可能,即不动(没有收到新的确认)和前移(收到了新的确认)。发送窗口前沿通常是不断向前移动的。
  • 流量控制就是让发送方的发送速率不要太快,要让接收方来得及接收。在某段时间,若对网络中某一资源的需求超过了该资源所能提供的可用部分,网络的性能就要变坏,这种情况就叫做拥塞。拥塞控制就是防止过多的数据注入到网络中,这样可以使网络中的路由器或链路不致过载。
  • 流量控制是一个端到端的问题,是接收端抑制发送端发送数据的速率,以便使接收端来得及接收。拥塞控制是一个全局性的过程,涉及到所有的主机、所有的路由器,以及与降低网络传输性能有关的所有因素。
  • 为了进行拥塞控制,TCP的发送方要维持一个拥塞窗口cwnd的状态变量。拥塞窗口的大小取决于网络的拥塞程度,并且动态地在变化。发送方让自己的发送窗口取为拥塞窗口和接收方的接收窗口中较小的一个。
  • TCP的拥塞控制采用了四种算法,即慢开始、拥塞避免、快重传和快恢复。在网络层,也可以使路由器采用适当的分组丢弃策略(如主动队列管理AQM),以减少网络拥塞的发生。
  • 运输连接有三个阶段,即连接建立、数据传送和连接释放。主动发起TCP连接建立的应用进程叫做客户,而被动等待连接建立的应用进程叫做服务器。TCP的连接建立采用三报文握手机制。服务器要确认客户的连接请求,然后客户要对服务器的确认进行确认。TCP的连接释放采用四报文握手机制。任何一方都可以在数据传送结束后发出连接释放的通知,待对方确认后就进入半关闭状态。当另一方也没有数据再发送时,则发送连接释放通知,对方确认后就完全关闭了TCP连接。
2019-05-14 21:14:07 qq_36982160 阅读数 146

计算机网络第六弹——应用层

彩蛋

计算机网络谢希仁第七版原版ppt获取方式:公众号后台回复”N3“即可获取。

由于公众号不支持显示LaTeX公式且公众号排版混乱,建议大家关注微信公众号"IT工匠",后台回复"N4-5"获取xmind源文件以及本文原文pdf文件获取更佳阅读体验。

本文主要内容:

计算机网络第六弹——应用层

每个应用层协议都是为了解决某一类应用问题,而问题的解决又往往是通过位于不同主机中的多个应用进程之间的通信和协同工作来完成的。应用层的具体内容就是规定应用进程在通信时所遵循的协议,应用层的许多协议都是基于客户服务器方式,客户 (client) 和服务器 (server) 都是指通信中所涉及的两个应用进程。

客户服务器方式所描述的是进程之间服务和被服务的关系,客户是服务请求方,服务器是服务提供方。

域名系统DNS

DNS概述

许多应用层软件经常直接使用域名系统 DNS (Domain Name System),但计算机的用户只是间接而不是直接使用域名系统。

互联网采用层次结构的命名树作为主机的名字,并使用分布式的域名系统 DNS, 名字到 IP 地址的解析是由若干个域名服务器程序完成的,域名服务器程序在专设的结点上运行,运行该程序的机器称为域名服务器

互联网的域名结构

互联网采用了层次树状结构的命名方法,任何一个连接在互联网上的主机或路由器,都有一个唯一的层次结构的名字,即域名,域名的结构由标号序列组成,各标号之间用点隔开:
..... ...三级域名.二级域名.顶级域名
各标号分别代表不同级别的域名。

注意域名只是个逻辑概念,并不代表计算机所在的物理地点。 变长的域名和使用有助记忆的字符串,是为了便于人来使用,而 IP 地址是定长的 32 位二进制数字则非常便于机器进行处理。 域名中的“点”和点分十进制 IP 地址中的“点”并无一一对应的关系。点分十进制 IP 地址中一定是包含三个“点”,但每一个域名中“点”的数目则不一定正好是三个。

互联网的域名空间

image-20190514135938095

图2-1

域名服务器

一个服务器所负责管辖的(或有权限的)范围叫做区 (zone),各单位根据具体情况来划分自己管辖范围的区。但在一个区中的所有节点必须是能够连通的。 每一个区设置相应的权限域名服务器,用来保存该区中的所有主机的域名到 IP 地址的映射,DNS 服务器的管辖范围不是以“域”为单位,而是以**“区”**为单位。

域名服务器的种类

根域名服务器

根域名服务器最高层次的域名服务器,也是最重要的域名服务器,所有的根域名服务器都知道所有的顶级域名服务器域名IP 地址。 不管是哪一个本地域名服务器,若要对互联网上任何一个域名进行解析,只要自己无法解析,就首先求助于根域名服务器。 在互联网上共有 13 个不同 IP 地址的根域名服务器,它们的名字是用一个英文字母命名,从 a 一直到 m(前 13 个字母)。

根域名服务器共有 13 套装置,不是 13 个机器。 这些根域名服务器相应的域名分别是:

  1. a.rootservers.net
  2. b.rootservers.net
  3. m.rootservers.net

到2016年2月,全世界已经在 588 个地点安装了根域名服务器,使世界上大部分 DNS 域名服务器都能就近找到一个根域名服务器。

根域名服务器并不直接把域名转换成 IP 地址。 在使用迭代查询时,根域名服务器把下一步应当找的顶级域名服务器的 IP 地址告诉本地域名服务器

顶级域名服务器

顶级域名服务器(即 TLD 服务器)负责管理在该顶级域名服务器注册的所有二级域名。 当收到 DNS 查询请求时,就给出相应的回答(可能是最后的结果,也可能是下一步应当找的域名服务器的 IP 地址)。

权限域名服务器

负责一个的域名服务器。 当一个权限域名服务器还不能给出最后的查询回答时,就会告诉发出查询请求的 DNS 客户,下一步应当找哪一个权限域名服务器。

本地域名服务器

本地域名服务器对域名系统非常重要, 当一个主机发出 DNS 查询请求时,这个查询请求报文就发送给本地域名服务器。 每一个互联网服务提供者 ISP,或一个大学,甚至一个大学里的系,都可以拥有一个本地域名服务器, 这种域名服务器有时也称为默认域名服务器

树状结构的 DNS 域名服务器

image-20190514140146944

图2-2

DNS 域名服务器都把数据复制到几个域名服务器来保存,其中的一个是主域名服务器,其他的是辅助域名服务器。 当主域名服务器出故障时,辅助域名服务器可以保证 DNS 的查询工作不会中断,主域名服务器定期把数据复制到辅助域名服务器中,而更改数据只能在主域名服务器中进行,这样就保证了数据的一致性

域名的解析过程

这里首先要注意两点:

  1. 主机本地域名服务器的查询一般都是采用递归查询。如果主机所询问的本地域名服务器不知道被查询域名的 IP 地址,那么本地域名服务器就以 DNS 客户的身份,向其他根域名服务器继续发出查询请求报文(一次得到结果)。
  2. 本地域名服务器向根域名服务器的查询通常是采用迭代查询。当根域名服务器收到本地域名服务器的迭代查询请求报文时,要么给出所要查询的 IP 地址,要么告诉本地域名服务器:“你下一步应当向哪一个域名服务器进行查询”,然后让本地域名服务器进行后续的查询(可能需要多次查询)。

这里用一个例子进行说明:

image-20190514141453176

图2-3:DNS查询举例

假定域名为m.xyz.com的主机想知道另一台主机(域名为y.abc.com)的IP地址。例
如,主机m.xyz.com打算发送邮件给主机y.abc.com,这时就必须知道主机y.abc.com的IP
地址。下面是图2-3的几个查询步骤:

  1. 主机m.xyz.com先向其本地域名服务器dns.xyz.com进行递归查询
  2. 本地域名服务器采用迭代查询。它先向一个根域名服务器查询。
  3. 根域名服务器告诉本地域名服务器,下一次应查询的顶级域名服务器dns.com的IP
    地址。
  4. 本地域名服务器顶级域名服务器dns.com进行查询。
  5. 顶级域名服务器dns.com告诉本地域名服务器,下一次应查询的权限域名服务器
    dns.abc.com的IP地址。
  6. 本地域名服务器权限域名服务器dns.abc.com进行查询。
  7. 权限域名服务器dns.abc.com告诉本地域名服务器,所查询的主机的IP地址。
  8. 本地域名服务器最后把查询结果告诉主机m.xyz.como

我们注意到,这8个步骤总共要使用8个UDP用户数据报的报文。本地域名服务器经
过三次迭代查询后,从权限域名服务器dns.abc.com得到了主机y.abc.com的IP地址,最后
把结果返回给发起查询的主机m.xyz.como
图2-3(b)是本地域名服务器采用递归查询的情况,在这种情况下,本地域名服务器只
需向根域名服务器查询一次,后面的几次查询都是在其他几个域名服务器之间进行的(步
骤3至6)。只是在步骤7,本地域名服务器从根域名服务器得到了所需的IP地址。最后
在步骤9,本地域名服务器把查询结果告诉主机m.xyz.com。整个的查询也是使用8个UDP
报文。

为了提高DNS的查询效率,并减轻根域名服务器的负荷和减少互联网上的DNS查询报文数量,每个域名服务器都维护一个高速缓存,存放最近用过的名字以及从何处获得名字映射信息的记录,为保持高速缓存中的内容正确,域名服务器应为每项内容设置计时 器,并处理超过合理时间的项(例如,每个项目只存放两天)。 当权限域名服务器回答一个查询请求时,在响应中都指明绑定有效存在的时间值,增加此时间值可减少网络开销,而减少此时间值可提高域名转换的准确性。

文件传送协议

FTP概述

文件传送协议 FTP (File Transfer Protocol) 是互联网上使用得最广泛的文件传送协议。 FTP 提供交互式的访问,允许客户指明文件的类型格式(如指明是否使用ASCII码),并允许文件具有存取权限(如访问文件的用户必须经过授权,并输入有效的口令)。 FTP 屏蔽了各计算机系统的细节,因而适合于在异构网络中任意计算机之间传送文件

在下面两节分别介绍基于TCF的FTP和基于UDP的简单文件传送协议TFTP,它们都是文件共享协议中的一大类,即复制整个文件,其特点是若要存取一个文件,就必须先获得一个本地的文件副本,如果要修改文件,只能对文件的副本进行修改,然后再将修改后的文件副本传回到原节点。

文件共享协议中的另一大类是联机访问(on-line access),联机访问意味着允许多个程序同时对一个文件进行存取。和数据库系统的不同之处是用户不需要调用一个特殊的客户进程,而是由操作系统提供对远地共享文件进行访问的服务,就如同对本地文件的访问一样,这就使用户可以用远地文件作为输入和输出来运行任何应用程序,而操作系统中的文件系统则提供对共享文件的透明存取。透明存取的优点是将原来用于处理本地文件的应用程序用来处理远地文件时,不需要对该应用程序作明显的改动。属于文件共享协议的有网络文件系统NFS(Network File System)

FTP原理

网络环境中的一项基本应用就是将文件从一台计算机中复制到另一台可能相距很远的计算机中, 初看起来,在两个主机之间传送文件是很简单的事情,其实这往往非常困难,原因是众多的计算机厂商研制出的文件系统多达数百种,且差别很大,经常遇到的问题是:

  1. 计算机存储数据的格式不同。
  2. 文件的目录结构文件命名的规定不同。
  3. 对于相同的文件存取功能,操作系统使用的命令不同。
  4. 访问控制方法不同。

FTP特点:

  1. 文件传送协议 FTP 只提供文件传送的一些基本的服务,它使用 TCP 可靠的运输服务
  2. FTP 的主要功能是减少或消除在不同操作系统下处理文件的不兼容性
  3. FTP 使用客户-服务器方式。
  4. 一个 FTP 服务器进程可同时为多个客户进程提供服务。
  5. FTP 的服务器进程由两大部分组成:一个主进程,负责接受新的请求;另外有若干个从属进程,负责处理单个请求

主进程的工作步骤:

  1. 打开熟知端口(端口号为 21),使客户进程能够连接上。
  2. 等待客户进程发出连接请求。
  3. 启动从属进程处理客户进程发来的请求
  4. 从属进程对客户进程的请求处理完毕后即终止,但从属进程在运行期间根据需要还可能创建其他一些子进程。
  5. 回到等待状态,继续接受其他客户进程发来的请求。主进程与从属进程的处理是并发地进行。

FTP的工作情况如图3-1所示,途中的椭圆圈表示在系统中运行的进程,图中的服务器端有两个从属进程:控制进程数据传送进程,为简单起见,服务端的主进程没有画上。

控制连接在整个会话期间一直保持打开,FTP 客户发出的传送请求通过控制连接发送给服务器端的控制进程,但控制连接不用来传送文件。 实际用于传输文件的是**“数据连接”,服务器端的控制进程在接收到 FTP 客户发送来的文件传输请求后就创建“数据传送进程”“数据连接”,用来连接客户端和服务器端的数据传送进程, 数据传送进程实际完成文件的传送**,在传送完毕后关闭**“数据传送连接”**并结束运行。

image-20190514143950840

图3-1:FTP使用的2个TCP连接

当客户进程向服务器进程发出建立连接请求时,要寻找连接服务器进程的熟知端口 (21),同时还要告诉服务器进程自己的另一个端口号码,用于建立数据传送连接。 接着,服务器进程用自己传送数据的熟知端口 (20) 与客户进程所提供的端口号码建立数据传送连接。 由于 FTP 使用了两个不同的端口号,所以数据连接与控制连接不会发生混乱。

使用两个端口(两个连接)的好处是可以使协议更加简单和更容易实现,而且在传输文件时还可以利用控制连接对文件的传输进行控制(例如,客户发送请求终止传输)

FTP并非对于所有的数据传送都是最佳的,比如计算机A上有一个很大的文件,计算机B想在A的那个大文件的最后添加一行,如果使用FTP就必须B先把A的那个大文件整个拿到,最最后一行的修改后再回传给A,这样做其实很浪费时间,而且这种传送时不必要的,因为B并没有使用该文件的其他内容。

然而网络文件系统NFS则采用另一种思路:

NFS 允许应用进程打开一个远地文件,并能在该文件的某一个特定的位置上开始读写数据,这样, NFS 可使用户只复制一个大文件中的一个很小的片段,而不需要复制整个大文件。 例如,计算机 A 的 NFS 客户软件,把要添加的数据和在文件后面写数据的请求一起发送到远地的计算机 B 的 NFS 服务器,NFS 服务器更新文件后返回应答信息,这样在网络上传送的只是少量的修改数据

简单文件传送协议TFTP

TFTP (Trivial File Transfer Protocol) 是一个很小且易于实现的文件传送协议, TFTP 使用客户服务器方式和使用 UDP 数据报,因此 TFTP 需要有自己的差错改正措施, TFTP 只支持文件传输而不支持交互, TFTP 没有一个庞大的命令集,没有列目录的功能,也不能对用户进行身份鉴别

TFTP的主要优点有两个:

  1. TFTP采用UDP环境

    例如,当文件或者程序需要面向许多及其下载时往往就需要TFTP。

  2. TFTP所占的内存较小

    这对较小的计算机或某些特殊用途的设备是很重要的。这些设备不需要硬盘,只需要固化了TFTP、UDP和IP的小容量只读存储器即可,当接通电源后,设备执行只读存储器中的代码,在网络上广播一个TFTP请求,网络上的TFTP服务器就发送响应,其中包括可执行二禁止程序。设备收到此文件后将其放入内存,然后开始运行程序。这种方式增加了灵活性,也减少了开销。

TFTP的主要特点:

  1. 每次传送的数据 PDU 中有 512 字节的数据,但最后一次可不足 512 字节。
  2. 数据 PDU 也称为文件块 (block),每个块按序编号,从 1 开始。
  3. 支持 ASCII 码或二进制传送。
  4. 可对文件进行读或写。
  5. 使用很简单的首部。

TFTP 的工作很像停止等待协议,发送完一个文件块后就等待对方的确认,确认时应指明所确认的块编号。 发完数据后在规定时间内收不到确认就要重发数据 PDU。 发送确认 PDU 的一方若在规定时间内收不到下一个文件块,也要重发确认 PDU。这样就可保证文件的传送不致因某一个数据报的丢失而告失败。开始工作时,TFTP 客户进程发送一个读请求 PDU 或写请求 PDU 给 TFTP 服务器进程,其熟知端口号码为 69。 TFTP 服务器进程要选择一个新的端口和 TFTP 客户进程进行通信。 若文件长度恰好为 512 字节的整数倍,则在文件传送完毕后,还必须在最后发送一个只含首部而无数据的数据 PDU。 若文件长度不是 512 字节的整数倍,则最后传送数据 PDU 的数据字段一定不满 512 字节,这正好可作为文件结束的标志。

远程终端协议TELNET

TELNET 是一个简单的远程终端协议,也是互联网的正式标准。 用户用 TELNET 就可在其所在地通过 TCP 连接注册(即登录)到远地的另一个主机上(使用主机名或 IP 地址)。 TELNET 能将用户的击键传到远地主机,同时也能将远地主机的输出通过 TCP 连接返回到用户屏幕,这种服务是透明的,因为用户感觉到好像键盘和显示器是直接连在远地主机上,因此,TELNET又称为终端仿真协议

现在由于 PC 的功能越来越强,用户已较少使用 TELNET 了。

TELNET 也使用客户服务器方式:

在本地系统运行 TELNET 客户进程,而在远地主机则运行 TELNET 服务器进程。 和 FTP 的情况相似,服务器中的主进程等待新的请求,并产生从属进程来处理每一个连接。

image-20190514193100398

图4-1:TELNET使用网络虚拟终端NVT格式

如图4-1所示,客户软件把用户的击键和命令转换成 NVT 格式,并送交服务器。 服务器软件把收到的数据和命令,从 NVT 格式转换成远地系统所需的格式。 向用户返回数据时,服务器把远地系统的格式转换为 NVT 格式,本地客户再从 NVT 格式转换到本地系统所需的格式。

这一机制的原因是不同计算机或操作系统具有很大的差异性,同一个命令可能在不同的操作系统对应不同的字符,所以使用NAT消除这种差别性。

万维网www

万维网概述

万维网 WWW (World Wide Web) 并非某种特殊的计算机网络,而是一个大规模的、联机式的信息储藏所。 万维网用链接的方法能非常方便地从互联网上的一个站点访问另一个站点,从而主动地按需获取丰富的信息, 这种访问方式称为**“链接”**,图5-1说明了万维网提供分布式服务的特点。

image-20190514193634463

图5-1:万维网提供分布式服务

万维网是分布式超媒体 (hypermedia) 系统,它是超文本 (hypertext) 系统的扩充。

一个超文本由多个信息源链接成,利用一个链接可使用户找到另一个文档,这些文档可以位于世界上任何一个接在互联网上的超文本系统中。

超文本是万维网的基础, 超媒体与超文本的区别是文档内容不同,超文本文档仅包含文本信 息,而超媒体文档还包含其他表示方式的信息,如图形、图像、声 音、动画,甚至活动视频图像。

万维网以客户 - 服务器方式工作, 浏览器就是在用户计算机上的万维网客户程序,万维网文档所驻留的计算机则运行服务器程序,因此这个计算机也称为万维网服务器。 客户程序向服务器程序发出请求,服务器程序向客户程序送回客户所要的万维网文档, 在一个客户程序主窗口上显示出的万维网文档称为页面 (page)

万维网必须解决的问题:

  1. 怎样标志分布在整个互联网上的万维网文档?

    使用统一资源定位符 URL (Uniform Resource Locator) 来标志万维网上的各种文档, 使每一个文档在整个互联网的范围内具有唯一的标识符 URL

  2. 用何协议实现万维网上各种超链的链接?

    在万维网客户程序与万维网服务器程序之间进行交互所使用的协议,是超文本传送协议 HTTP (HyperText Transfer Protocol)。 HTTP 是一个应用层协议,它使用 TCP 连接进行可靠的传送。

  3. 怎样使各种万维网文档都能在互联网上的各种计算机上显示出来,同时使用户清楚地知道在什么地方存在着超链?

    超文本标记语言 HTML (HyperText Markup Language) 使得万维网页面的设计者可以很方便地用一个超链从本页面的某处链接到互联网上的任何一个万维网页面,并且能够在自己的计算机屏幕上将这些页面显示出来。

  4. 怎样使用户能够很方便地找到所需的信息?

  5. 为了在万维网上方便地查找信息,用户可使用各种的搜索工具(即搜索引擎)

统一资源定位符URL

资源定位符 URL 是对可以从互联网上得到的资源的位置和访问方法的一种简洁表示。 URL 给资源的位置提供一种抽象的识别方法,并用这种方法给资源定位。 只要能够对资源定位,系统就可以对资源进行各种操作,如存取、更新、替换和查找其属性。 URL 相当于一个文件名在网络范围的扩展,因此 URL 是与互联网相连的机器上的任何可访问对象的一个指针

URL格式

URL由以冒号隔开的两大部分组成,并且在 URL 中的字符对大写或小写没有要求。 URL 的一般形式:
&lt;&gt;//&lt;&gt;:&lt;&gt;/&lt;&gt; &lt;协议&gt;://&lt;主机&gt;:&lt;端口&gt;/&lt;路径&gt;

  • URL的第一部分是<协议>,指使用什么协议来获取万维网文档,现在最常用的是http(超文本传输协议),其次是ftp(文件传送协议FTP)
  • 在<协议>后面的//是规定的格式

现在有些浏览器为了方便用户,在输入 URL 时,可以把最前面的“http://”甚至把主机名最前面的“www”省略,然后浏览器替用户把省略的字符添上。 例如,用户只要键入 ctrip.com,浏览器就自动把未键入的字符补齐,变成http://www.ctrip.com

使用HTTP的URL

对于万维网的网点的访问要使用HTTP协议,HTTP协议的URL的一般形式是:
http://&lt;&gt;:&lt;&gt;/ http://&lt;主机&gt;:&lt;端口&gt;/路径
HTTP默认的端口号是80,通常可以省略,若再省略文件的路径项,则URL就指到互联网上的某个主页(home page)

超文本传输协议HTTP

HTTP的操作过程

为了使超文本的链接能够高效率地完成,需要用 HTTP 协议来传送一切必须的信息。 从层次的角度看,HTTP 是面向事务 (transaction-oriented) 的应用层协议,它是万维网上能够可靠地交换文件(包括文本、声音、图像等各种多媒体文件)的重要基础。

万维网的大致工作过程如图5-2所示:

image-20190514195437248

图5-2:万维网的工作过程

大致分为以下几步:

  1. 每个万维网网点都有一个服务器进程,它不断地监听 TCP 的端口 80,以便发现是否有浏览器向它发出连接建立请求。
  2. 一旦监听到连接建立请求并建立了 TCP 连接之后,浏览器就向万维网服务器发出浏览某个页面的请求,服务器接着就返回所请求的页面作为响应。
  3. 最后,TCP 连接就被释放了。

在浏览器和服务器之间的请求和响应的交互,必须按照规定的格式和遵循一定的规则。这些格式和规则就是超文本传送协议 HTTP。 HTTP 规定在 HTTP 客户与 HTTP 服务器之间的每次交互,都由一个 ASCII 码串构成的请求和一个类似的通用互联网扩充,即**“类 MIME (MIME-like)”**的响应组成。 HTTP 报文通常都使用 TCP 连接传送。

HTTP的主要特点:

HTTP 使用了面向连接的 TCP 作为运输层协议,保证了数据的可靠传输

HTTP 协议本身也是无连接的,虽然它使用了面向连接的 TCP 向上提供的服务,但是通信双方在交换HTTP报文之前不需要先建立HTTP连接。

HTTP协议是无状态的,也就是说,同一个客户第二次访问同一个服务器上的页面时,服务器的响应与第一次访问时的相同,因为服务器并不记得曾经访问过的这个用户,也不记得为该客户服务过多少次。HTTP的无状态特性简化了服务器的设计,使服务器更容易支持大量并发的HTTP请求。

HTTP 是面向事务的客户服务器协议。

事物:指一系列信息的交换,而这一系列的信息交换是一个不可分割的整体,也就是说,要么所有的信息交换都完成,要么一次交换都不进行。

下面我们来估算一下,从浏览器请求一个万维网文档到收到整个文档所需的时间,如图5-3所示:

image-20190514200325107

图5-3:请求一个万维网文档所需的时间

HTTP协议首先要和服务器建立TCP连接,这需要三次握手,当建立TCP连接的三次握手的前两部分完成后(即经过一个RTT时间后),万维网客户就把HTTP请求报文作为建立连接的三报文握手中的第三个报文中的数据发送给万维网服务器,服务器收到HTTP请求报文后,就把请求的文档作为响应报文返回客户。

从图5-3可看出,请求一个万维网文档所需的时间是该文档的传输时间(与文档大小成正比)加上两倍往返时间RTT(一个RTT用于连接TCP连接,另一个RTT用于请求和接收万维网文档)。TCP建立连接的三报文握手的第三个报文段中的数据,就是客户对万维网文档的请求报文)。

HTTP 1.0的主要缺点,就是每请求一个文档就要有两倍RTT的开销。若一个主页上有很多链接的对象(如图片等)需要依次进行链接,那么每一次链接下载都导致2 ×RTT的开销。另一种开销就是万维网客户和服务器每一次建立新的TCP连接都要分配缓存和变量,特别是万维网服务器往往要同时服务于大量客户的请求,所以这种非持续连接会使万维网服务器的负担很重。好在浏览器都能够打开5~10个并行的TCP连接,而每一个TCP连接处理客户的一个请求。因此,使用并行TCP连接可以缩短响应时间。

HTTP/1.1协议较好地解决了这个问题,它使用了持续连接(persistent connection)。所谓持续连接就是万维网服务器在发送响应后仍然在一段时间内保持这条连接,使同一个客户(浏览器)和该服务器可以继续在这条连接上传送后续的HTTP请求报文和响应报文,这并不局限于传送同一个页面上链接的文档,而是只要这些文档都在同一个服务器上就行。目前一些流行的浏览器(如IE 11.0)的默认设置就使用了HTTP/1.1。如果用户不愿意使用持续连接的浏览器,可以选择IE浏览器上面的"工具->Internet选项->高级"等项目,把"HTTP 1.1设置"的选择取消即可。

HTTP/1.1协议的持续连接有两种工作方式,即非流水线方式(without pipelining)流水线方式(with pipelining):

  1. 非流水线方式的特点,是客户在收到前一个响应后才能发出下一个请求。因此,在TCP连接已建立后,客户每访问一次对象都要用去一个往返时间RTT,这比非持续连接要用去两倍RTT的开销节省了建立TCP连接所需的一个RTT时间。但非流水线方式还是有缺点的,因为服务器在发送完一个对象后,其TCP连接就处于空闲状态,浪费了服务器资源。
  2. 流水线方式的特点,是客户在收到HTTP的响应报文之前就能够接着发送新的请求报文。于是一个接一个的请求报文到达服务器后,服务器就可连续发回响应报文。因此,使用流水线方式时,客户访问所有的对象只需花费一个RTT时间。流水线工作方式使TCP连接中的空闲时间减少,提高了下载文档效率。

代理服务器

代理服务器 (proxy server) 又称为万维网高速缓存 (Web cache),它代表浏览器发出 HTTP 请求。 万维网高速缓存把最近的一些请求和响应暂存在本地磁盘中, 当与暂时存放的请求相同的新请求到达时,万维网高速缓存就把暂存的响应发送出去,而不需要按 URL 的地址再去互联网访问该资源。代理服务器可在客户端或服务端工作,也可在中间系统上工作,下面我们用例子来说明他的作用:

image-20190514202452437

图5-4:代理服务器的作用

设图5-4(a)是校园网不使用代理服务器的情况。这时,校园网中所有的计算机都通过2Mbit/s专线链路(R1,R2)与互联网上的源点服务器建立TCP连接。因而校园网各计算机访问互联网的通信量往往会使这条2 Mbit/s的链路过载,使得时延大大增加。

图5-4(b)是校园网使用代理服务器的情况。这时,访问互联网的过程是这样的:

  1. 校园网的计算机中的浏览器向互联网的服务器请求服务时,就先和校园网的代理服务器建立Tcp连接,并向代理服务器发出HTTP请求报文(见图5-4(b)中的1。
  2. 若代理服务器已经存放了所请求的对象,代理服务器就把这个对象放入HTTP响应报文中返回给计算机的浏览器。
  3. 否则,代理服务器就代表发出请求的用户浏览器,与互联网上的源点服务器(originserver)建立TCP连接(如图6-11(b)中的2所示),并发送HTTP请求报文。
  4. 源点服务器把所请求的对象放在HTTP响应报文中返回给校园网的代理服务器
  5. 代理服务器收到这个对象后,先复制在自己的本地存储器中(留待以后使用),然后再把这个对象放在HTTP相应报文中,通过已经建立的TCP连接(见图5-4(b)中的1),返回给请求该对象的浏览器。

HTTP的报文结构

HTTP 有两类报文:

  1. 请求报文——从客户向服务器发送请求报文。
  2. 响应报文——从服务器到客户的回答。

由于 HTTP 是面向正文 (text-oriented)的,因此在报文中的每一个字段都是一些 ASCII 码串,因而每个字段的长度都是不确定的

image-20190514202958894

图5-5:HTTP的报文结构

HTTP的请求报文和响应报文都是由三个部分组成的,可以看出,这两种报文的区别就是开始行不同。

  1. 开始行,用于区分是请求报文还是响应报文。在请求报文中的开始行叫做请求行(Request-Line),而在响应报文中的开始行叫做状态行(Status-Line)。在开始行的三个字段之间都以空格分隔开,最后的“CR”和“LF”分别代表**"回车""换行“**。
  2. 首部行,用来说明浏览器、服务器或报文主体的一些信息。首部可以有好几行,但也可以不使用。在每一个首部行中都有首部字段名和它的值,每一行在结束的地方都要有"回车"和"换行”。整个首部行结束时,还有一空行将首部行和后面的实体主体分开。
  3. 实体主体(entity body),在请求报文中一般都不用这个字段,而在响应报文中也可能没有这个字段。

我们来看一下请求报文的组成:

  1. 方法

    “方法”是面向对象技术中使用的专门名词。所谓“方法”就是对所请求的对象进行的操作,因此这些方法实际上也就是一些命令,因此,请求报文的类型是由它所采用的方法决定的,HTTP请求报文的一些常见方法如下表所示:

    image-20190514203345657

  2. URL:所请求的资源的 URL。

  3. 版本:HTTP 的版本。

对于响应报文,开始行是状态行。 状态行包括三项内容,即 HTTP 的版本状态码,以及解释状态码的简单短语

状态码都是三位数字:

  • 1xx 表示通知信息的,如请求收到了或正在进行处理。

  • 2xx 表示成功,如接受或知道了。

  • 3xx 表示重定向,表示要完成请求还必须采取进一步的行动。

  • 4xx 表示客户的差错,如请求中有错误的语法或不能完成。

  • 5xx 表示服务器的差错,如服务器失效无法完成请求。

在服务器上存放用户信息

万维网站点可以使用 Cookie 来跟踪用户。 Cookie 表示在 HTTP 服务器和客户之间传递的状态信息。 使用 Cookie 的网站服务器为用户产生一个唯一的识别码,利用此识别码,网站就能够跟踪该用户在该网站的活动

电子邮件

电子邮件概述

电子邮件 (e-mail):指使用电子设备交换的邮件及其方法。 电子邮件是互联网上使用得最多的和最受用户欢迎的一种应用。 优点:使用方便,传递迅速,费用低廉,可以传送多种类型的信息(包括:文字信息,声音和图像等)。

电子邮件的重要标准

  1. 简单邮件发送协议:SMTP
  2. 互联网文本报文格式
  3. 通用互联网邮件扩充 MIME
  4. 邮件读取协议:POP3 和 IMAP

image-20190514204840833

图6-1:电子邮件的最主要的组成构建

电子邮件的最主要的组成构建如图6-1所示:用户代理邮件服务器邮件发送和读取协议

用户代理 UA (User Agent)

用户代理 UA 就是用户与电子邮件系统的接口,是电子邮件客户端软件。 用户代理的功能:撰写、显示、处理和通信。 邮件服务器的功能是发送接收邮件,同时还要向发信人报告邮件传送的情况(已交付、被拒绝、丢失等), 邮件服务器按照客户 - 服务器方式工作,邮件服务器需要使用**发送(SMTP)读取(POP3)**两个不同的协议。

邮件发送和读取使用不同的协议协议:

  • 简单邮件发送协议 SMTP:用于在用户代理向邮件服务器或邮件服务器之间发送邮件
  • 邮局协议 POP3:用于用户代理从邮件服务器读取邮件

SMTP和POP3(或IMAP)都是使用TCP连接来传送邮件的,目的是为了可靠地传送邮件

注意:一个邮件服务器既可以作为客户,也可以作为服务器。 例如,当邮件服务器 A 向另一个邮件服务器 B 发送邮件时,邮件服务器 A 就作为 SMTP 客户,而 B 是 SMTP 服务器。 当邮件服务器 A 从另一个邮件服务器 B 接收邮件时,邮件服务器 A 就作为 SMTP 服务器,而 B 是 SMTP 客户。

发送和接收电子邮件的几个重要步骤

  1. 发件人调用 PC 中的用户代理撰写和编辑要发送的邮件。
  2. 发件人的用户代理把邮件用 SMTP 协议发给发送方邮件服务器。
  3. SMTP 服务器把邮件临时存放在邮件缓存队列中,等待发送。
  4. 发送方邮件服务器的 SMTP 客户与接收方邮件服务器的 SMTP 服务器建立 TCP 连接,然后就把邮件缓存队列中的邮件依次发送出去。
  5. 运行在接收方邮件服务器中的SMTP服务器进程收到邮件后,把邮件放入收件人的用户邮箱中,等待收件人进行读取。
  6. 收件人在打算收信时,就运行PC机中的用户代理,使用POP3(或 IMAP)协议读取发送给自己的邮件。

电子邮件的组成

电子邮件由信封 (envelope)内容 (content) 两部分组成。 电子邮件的传输程序根据邮件信封上的信息来传送邮件。用户在从自己的邮箱中读取邮件时才能见到邮件的内容。 在邮件的信封上,最重要的就是收件人的地址。

TCP/IP 体系的电子邮件系统规定电子邮件地址的格式如下:
@ 收件人邮箱名@邮箱所在主机的域名
符号**“@”读作“at”,表示“在”**的意思。

简单邮件传送协议SMTP

SMTP 规定了在两个相互通信的 SMTP 进程交换信息的方法,使用客户–服务器方式,基于 TCP 实现客户与服务器的通信。

SMTP 是一个基于文本的 (即 ASCII 码) 的协议,SMTP 客户与服务器之间采用命令-响应方式进行交互。

SMTP 通信的三个阶段

  1. 连接建立:连接是在发送主机的 SMTP 客户接收主机的 SMTP 服务器之间建立的,SMTP不使用中间的邮件服务器。

  2. 邮件传送

  3. 连接释放:邮件发送完毕后,SMTP 应释放 TCP 连接

写不动了,不写了哼

没有更多推荐了,返回首页