《计算机网络自顶向下方法》学习笔记(前六章)

第一章、计算机网络和因特网

1.1什么是因特网

回答这个问题可以从两方面入手,一个方面是它的具体构成(即构成因特网的基本硬件和软件组件;另一个方面是服务描述。

具体构成描述

因特网是一个互联了遍及全世界数十亿计算设备的网络。像传统的PC、服务器以及“新的物品”——智能手机、平板、电视等这些与因特网相连的设备都称为主机(host)或端系统(end system) 

端系统通过通信链路(communication link)和分组交换机(packet switch)连接到一起。

通信链路?

通信链路由不同类型的物理媒体组成,包括同轴电缆、铜线、光纤和无线电频谱。不同的链路能以不同的速率传输数据。链路的传输速率(transmission rate)以比特/秒(bit/s或bps)度量。当一台端系统要向另一台端系统发送数据时,发送端将数据分段,并为每段加上首部字节,由此形成的信息包被称为分组(packet)

分组交换机?

分组交换机从它的一条入通信链路接收到达的分组,并从它的一条出通信链路转发该分组。 两种常见的分组交换机是——路由器(router)和链路层交换机(link-layer switch)。链路层交换机通常用于接入网中,而路由器通常用于网络核心中

端系统通过因特网服务提供商(Internet Service Provider,ISP)接入因特网。

端系统、分组交换机和其他因特网部件都要运行一系列协议(protocol),这些协议控制因特网中信息的接收和发送。TCP(Transmission Control Protocol,传输控制协议)和IP(Internet Protocol,网际协议)是因特网中两个最重要的协议。IP协议定义了在路由器和端系统之间发送和接收的分组格式。

服务描述

为应用程序提供服务的基础设施的角度来描述因特网。应用程序涉及了多个相互交换数据的端系统,因此被称为分布式应用程序(distributed application)。重要的是应用程序运行在端系统上,并不运行在网络核心中的分组交换机中。

与因特网相连的端系统提供了一个套接字接口(socket interface),该接口规定了运行在一个端系统上的程序请求因特网基础设施向运行在另一个端系统上的特定目的地程序交付数据的方式。因特网套接字接口是一套发送程序必须遵循的规则集合,因此因特网能够将数据交付给目的地。

什么是协议?

协议(protocol)定义了在两个或多个通信实体之间交换的报文的格式和顺序,以及报文发送和/或接收一条报文或其他事件所采取的动作。 

 1.2网络边缘

通常把与因特网相连的计算机和其他设备称为端系统(因为它们位于因特网的边缘),因特网的端系统包括了桌面计算机 、服务器、和移动计算机

 端系统也称为主机(host)(主机=端系统),因为它们运行应用程序。主机有时又被进一步划分为两类:客户(client)和服务器(server)

接入网

接入网,是指将端系统物理连接到其边缘路由器(edge router)的网络。边缘路由器是端系统到任何其他远程端系统的路径上的第一台路由器。

1.3网络核心

即由互联因特网端系统的分组交换机和链路构成的网状网络。

分组交换 

在各种网络应用中,端系统彼此交换报文(message) 。为了从源端系统向目的端系统发送一个报文,源将长报文划分为较小的数据块,称之为分组(packet)。在源和目的地之间,每个分组都通过通信链路和分组交换机(packet switch)传送。(交换机主要有两类:路由器链路层交换机

存储转发传输

多数分组交换机在链路的输入端使用存储转发传输(store-and-forward transmission)机制。存储转发传输是指在交换机能够开始向输出链路传输该分组的第一个比特之前,必须接收到整个分组

 【如上图,源已经传输了分组1的一部分,分组1的前沿已经到达了路由器。因为该路由器应用了存储转发机制,所以此时它还不能传输已经接收的比特,而是必须先缓存(即存储)该分组的比特,仅当路由器已经接收完了该分组的所有比特后,它才能开始向出链路传输(即转发)该分组】

排队时延和分组丢失

每台分组交换机有多条链路与之相连。对于每条相连的链路,该分组交换机具有一个输出缓存(output buffer,也称为输出队列(output queue)),它用于存储路由器准备发往那条链路的分组【如果到达的分组需要传输到某条链路,但发现该链路正忙于传输其他分组,则该到达分组必须在输出缓存中等待】,因此除了存储转发时延,分组还要承受输出缓存的排队时延(queueing delay),这些时延是变化的,变化的程度取决于网络的拥塞程度

因为缓存空间的大小是有限的,一个到达的分组可能发现该缓存已被其他等待传输的分组完全充满了,在此情况下将出现分组丢失(丢包)(packet loss),到达的分组或已经排队的分组之一将被丢弃。

 转发表和路由选择协议

路由器从与它相连的一条通信链路得到分组,然后向与它相连的另一条通信链路转发该分组。路由器是如何决定向哪条链路转发呢?

不同的计算机网络以不同的方式完成分组转发的。

在因特网中,每个端系统具有一个称为IP地址的地址。当源主机要向目的端系统发送一个分组时,源在该分组的首部包含了目的地的IP地址。当一个分组到达网络中的路由器时,路由器检查该分组的目的地址的一部分,并向一台相邻路由器转发该分组。每台路由器具有一个转发表, 用于将目的地址(或目的地址的一部分)映射成为输出链路。当某分组到达一台路由器时,路由器检查该地址,并用这个目的地址搜索其转发表,以发现适当的出链路,路由器则将该分组导向该出链路

转发表是如何进行设置的?

因特网具有一些特殊的路由选择协议,用于自动地设置这些转发表。

电路交换

通过网络链路和交换机移动数据有两种基本方法:电路交换(circuit switch)和分组交换(packet switching) 

在电路交换网络中,在端系统间通信会话期间,预留了端系统间沿路径通信所需要的资源(缓存,链路传输率)。在分组交换网络中,这些资源不是预留的,

电路交换中的连接是名副其实的连接,会在两台主机之间创建专用的端到端连接(end-to-end connection)

 电路交换网络中的复用

链路中的电路是通过频分复用(Frequency-Division Multiplexing,FDM) 或时分复用(Time-Division Multiplexing,TDM)来实现的。

对于FDM,链路的频谱由跨越链路的所有连接共享。特别是,在连接期间链路为每条连接专用一个频段,该频段的宽度称为带宽(band-width)

对于TDM,时间被划分为固定期间的帧,并且每个帧又被划分为固定数量的时隙。当网络跨越一条链路创建一条连接时,网络在每个帧中为该连接指定一个时隙。这些时隙专门由该连接单独使用,一个时隙(在每个帧内)可用于传输该连接的数据

下图是一个支持多达4条电路的特定网络链路的FDM和TDM。

对于FDM,其频率域被分割为4个频段,每个频段的带宽是4kHz.

对于TDM,其时域被划分为帧,每个帧具有4个时隙,在循环的TDM帧中每条电路被分配相同的专用时隙

 分组交换与电路交换的对比

 分组交换不适合实时服务,因为它的端到端时延是可变的和不可预测的(主要是排队时延导致)

电路交换不考虑需求,而预先分配了传输链路的使用,这使得已分配而并不需要的链路时间未被利用

1.4分组交换网中的时延、丢包和吞吐量

分组交换网中的时延

当分组从一个节点(主机或路由器)沿着这条路径到后继节点(主机或路由器),该分组在沿途每个节点经受了几种不同类型的时延。其中最重要的是节点处理时延排队时延传输时延、和传播时延 。这些时延总体累加起来是节点总时延

时延的类型 

一个分组从上游节点通过路由器A向路由器B发送

  

(1)处理时延。检查分组首部和决定将该分组导向何处所需要的时延是处理时延的一部分,当然处理时延也包括其他因素

(2)排队时延。在队列中,当分组在链路上等待传输时,它经受排队时延。一个特定分组的排队时延长度将取决于先期到达的正在排队等待向链路传输的分组数量

(3)传输时延。假定分组以先到先服务方式传输——这在分组交换网中是最常见的方式,仅当所有已经到达的分组被传输后,才能传输刚到达的分组。

(4)传播时延。一旦一个比特被推向链路,该比特需要向路由器B传播。从该链路的起点到路由器B传播所需要的时间是传播时延。

(5)传输时延和传播时延的比较 。传输时延是路由器推出分组所需要的时间,它是分组长度和链路传输速率的函数,而与两台路由器之间的距离无关;传播时延是一个比特从一台路由器传播到另一台路由器所需要的时间,它是两台路由器之间距离的函数,而与分组长度或链路传输速率无关。

排队时延和丢包

 在现实中,一条链路前的队列只有有限的容量,尽管排队容量极大地依赖于路由器设计和成本。因为该排队容量是有限的,随着流量强度接近1,排队时延并不真正趋向无穷大,相反到达的分组将发现一个满的队列,由于没有地方存储这个分组,路由器将丢弃该分组

因此一个节点的性能不仅根据时延来度量,而且根据丢包的概率来度量。

 1.5协议层次及其服务模型

协议分层

为了给网络协议的设计提供一个结构,网络设计者以分层的方式组织协议以及实现这些协议的网络硬件和软件 。一个协议层能够用软件、硬件或两者的结合来实现。各层的所有协议被称为协议栈(protocol stack)。因特网的协议栈由5个层次组成:物理层、链路层、网络层、运输层和应用层

(1)应用层。应用层是网络应用程序及它们的应用层协议存留的地方。因特网的应用层包括许多协议,如HTTP(它提供了Web文档的请求和传送)、SMTP(它提供了电子邮件报文的传输)和FTP(它提供两个端系统之间的文件传送)

应用层协议分布在多个端系统上,而一个端系统中的应用程序使用协议与另一个端系统中的应用程序交换信息分组。

把这种位于应用层的信息分组称为报文(message)。 

(2)运输层。因特网的运输层在应用程序端点之间传送应用层报文。在因特网中有两种运输协议,TCP和UDP

TCP向它的应用程序提供了面向连接的服务,这种服务包括了应用层报文向目的地的确保传递和流量控制,TCP也将长报文划分为短报文,并提供拥塞控制机制,因此当网络拥塞时,源抑制其传输速率。

UDP协议向它的应用程序提供无连接服务,这是一种不提供不必要服务的服务,没有可靠性,没有流量控制,也没有拥塞控制。

把运输层的分组称为报文段(segment)

(3)网络层。因特网的网络层负责将称为数据报(datagram)的网络层分组从一台主机移动到另一台主机。在一台源主机中的因特网运输层协议(TCP或UDP)向网络层递交运输层报文段和目的地址,就像寄快递时提供一个目的地址一样。

网络层包括著名的网际协议IP,该协议定义了在数据报中的各个字段以及端系统和路由器如何作用于这些字段。IP仅有一个,所有具有网络层的因特网组件必须运行IP。

(4)链路层。因特网的网络层通过源和目的地之间的一系列路由器路由数据报。为了将分组从一个节点移动到路径上的下一个节点,网络层必须依靠该链路层的服务。特别是在每个节点,网络层将数据报下传给链路层,链路层沿着路径将数据报传递给下一个节点,在下一个节点,链路层将数据报上传给网络层。

由链路层提供的服务取决于应用于该链路的特定链路协议

链路层分组称为(frame)

(5)物理层。虽然链路层的任务是将整个帧从一个网络元素移动到相邻的网络元素,而物理层的任务是将该帧中的一个个比特从一个节点移动到下一个节点。在这一层中的协议仍然是链路相关的,并且进一步与该链路的实际传输媒体相关。

OSI模型 

OSI参考模型的7层是:应用层、表示层、会话层、运输层、网络层、数据链路层和物理层

表示层的作用是使通信的应用程序能够解释交换数据的含义

会话层提供了数据交换的定界和同步功能,包括了建立检查点和恢复方案的方法 

封装

下图显示了这样一条物理路径:数据从发送端系统的协议栈向下,沿着中间的链路层交换机和路由器的协议栈上上下下,然后向上到达接收端系统的协议栈。

 上图也说明了一个重要概念:封装(encapsulation)。在发送主机端,一个应用层报文(application-layer message)(图中的M)被传送给运输层。在最简单的情况下,运输层收取到报文并附上附加信息(运输层首部信息,图中Ht),该首部将被接收端的运输层使用。应用层报文和运输层首部信息一道构成了运输层报文段(transport-layer segment)。运输层报文段因此封装了应用层报文。网络层增加了如源和目的端系统地址等网络层首部信息,生成了网络层数据报(network-layer datagram)。该数据报接下来被传递给链路层,链路层增加它自己的链路层首部信息并生成链路层帧(link-layer frame)。

所以在每一层,一个分组具有两种类型的字段:首部字段和有效载荷字段(payload field),有效载荷通常是来自上一层的分组

第二章、应用层

 网络应用是计算机网络存在的理由。

2.1应用层协议原理

网络应用程序体系结构 

应用程序体系结构(application architecture)由应用程序研发者设计,规定了如何在各种端系统上组织该应用程序。目前有两种主流体系结构:客户-服务器体系结构或对等(P2P)体系结构 

客户-服务器体系结构(client-server architecture)中, 有一个总是打开的主机称为服务器,它服务来自许多其他称为客户的主机的请求。

在该体系结构中,客户相互之间不直接通信;另外该服务器具有固定的、周知的地址(该地址称为IP地址);

在一个客户-服务器应用中,常常会出现一台单独的服务器主机跟不上它所有客户请求的情况,为此配备大量主机的数据中心(data center )常被用于创建强大的虚拟服务器

P2P体系结构(P2P architecture)中,对位于数据中心的专用服务器有最小的(或者没有)依赖。应用程序在间断连接的主机对之间使用直接通信,这些主机对被称为对等方。因为这种对等方通信不必通过专门的服务器,该体系结构被称为对等方到对等方的。

P2P体系结构特性之一是它们的自扩展性。在一个P2P文件共享应用中,尽管每个对等方都由于请求文件产生工作负载,但每个对等方通过向其他对等方分发文件也为系统增加服务能力。通常P2P结构通常不需要庞大的服务器基础设施和服务器带宽(与客户-服务器设计形成鲜明对比)

进程通信 

用操作系统的术语来说,进行通信的实际上是进程(process)而不是程序 。一个进程可以被认为是运行在端系统中的一个程序。当多个进程运行在相同的端系统上时,它们使用进程间通信机制相互通信。

在两个不同端系统上的进程,通过跨越计算机网络交换报文(message)而相互通信。

客户和服务器进程

网络应用程序由成对的进程组成,这些进程通过网络相互发送报文。

在一对进程之间的通信会话场景中,发起通信的进程被标识为客户, 在会话开始时等待联系的进程是服务器

比如在Web中,一个浏览器进程向一台Web服务器进程发起联系,因此该浏览器进程是客户,而该Web服务器进程是服务器。在P2P文件共享中,当对等方A请求对等方B发送一个特定文件时,在这个特定的通信会话中对等方A是客户,而对等方B是服务器。

进程与计算机网络之间的接口

多数应用程序是由通信进程对组成,每对中两个进程互相发送报文。从一个进程向另一个进程发送的报文必须通过下面的网络。进程通过一个称为套接字(socket)的软件接口向网络发送报文和从网络接收报文

下图显示了两个经过因特网通信的进程之间的套接字通信。如图套接字是同一台主机内应用层与运输层之间的接口。由于该套接字是建立网络应用程序的可编程接口,因此套接字也称为应用程序和网络之间的应用程序编程接口(Appliaction Programming Interface,API)

 进程寻址

在一台主机上运行的进程为了向在另一台主机上运行的进程发送分组,接收进程需要有一个地址。为了标识该接收进程,需要定义两种信息:①主机的地址②在目的主机中指定接收进程的标识符

在因特网中,主机由其IP地址标识 。IP地址是一个32比特的量而且它能够唯一地标识该主机

除了知道报文发送目的地的主机地址外,发送进程还必须指定运行在接收主机上的接收进程,目的地端口号(port number)用于这个目的

因特网提供的运输服务

 前面介绍过套接字是应用程序进程和运输层协议之间的接口。在该套接字的另一侧,运输层协议负责从接收进程的套接字得到该报文。

因特网为应用程序提供了两个运输层协议,即UDP和TCP

 TCP服务

TCP 服务模型包括面向连接服务和可靠数据传输服务,

  • 面向连接的服务。在应用层数据报文开始流动之前,TCP让客户和服务器互相交换运输层控制信息。这个所谓的握手过程提醒客户和服务器,让它们为大量分组的到来做好准备。在握手阶段后,一个TCP连接就在两个进程的套接字之间建立了,这条连接是全双工的,即连接双方的进程可以在此连接上同时进行报文收发。当应用程序结束报文发送时,必须拆除该连接
  • 可靠的数据传输服务。通信进程能够依靠TCP,无差错、按适当顺序交付所有发送的数据。当应用程序的一端将字节流传进套接字时,它能够依靠TCP将相同的字节流交付给接收方的套接字,从而没有字节的丢失和冗余

TCP协议还具有拥塞控制机制,当发送方和接收方之间的网络出现拥塞时,TCP的拥塞控制机制会抑制发送进程。

UDP服务

UDP是一种不提供不必要服务的轻量级运输协议,它仅提供最小服务。UDP是无连接的,因此在两个进程通信前没有握手过程。UDP协议提供一种不可靠数据传送服务,即UDP协议不保证报文到达接收进程,而且到达的报文也有可能是乱序的。

UDP没有包括拥塞控制机制,所以UDP的发送端可以用它选定的任何速率向下层(网络层)注入数据

 应用层协议

应用层协议(application-layer protocol)定义了运行在不同端系统上的应用程序进程如何相互传递报文。特别是定义了

  • 交换的报文类型。例如请求报文和响应报文
  • 各种报文类型的语法。如报文中的各个字段及这些字段是如何描述的
  • 字段的语义。即这些字段中的信息的含义
  • 确定一个进程何时以及如何发送报文,对报文进行响应的规则

 2.2 Web和HTTP

 HTTP概况

Web的应用层协议是超文本传输协议(HyperText Transfer Ptotocol,HTTP),它是Web的核心。HTTP由两个程序实现:一个客户程序和一个服务器程序。客户程序和服务器程序运行在不同的端系统中,通过交换HTTP报文进行会话。HTTP定义了这些报文的结构以及客户和服务器进行报文交换的方式。

Web页面是由对象组成的。 一个对象(object)只是一个文件(一个HTML文件、一个JEPG图形、一个Java小程序或一个视频片段这样的文件,且它们可通过一个URL地址寻址)

 服务器向客户端发送被请求的文件,而不存储任何关于该客户的状态信息。所以称HTTP是一个无状态协议。

非持续连接和持续连接

 在许多因特网程序中,客户和服务器在一个相当长的时间范围内通信,其中客户发出一系列请求并且服务器对每个请求进行响应,这一系列请求可以以规则的间隔周期性地或间断性地一个接一个发出。当这种客户-服务器的交互式经TCP进行的,则会有每个请求/响应对式经一个单独的TCP连接发送,还是所有的请求及响应经相同的TCP连接发送?

采用前一种方法,该程序被称为使用非持续连接,后一种方法被称为持续连接

 采用非持续连接的HTTP

每个TCP连接在服务器发送一个对象后关闭,即该连接并不为其他的对象而持续下来。每个TCP连接只传输一个请求报文和响应报文

往返时间(Round -Trip Time,RTT)。该时间是指一个短分组从客户到服务器然后再返回客户所花费的时间。RTT包括分组传播时延、分组在中间路由器和交换机上的排队时延以及分组处理时延。

当用户点击超链接时会引起浏览器在它和Web服务器之间发起一个TCP连接;这涉及一次“三次握手”过程,即客户向服务器发送一个小TCP报文段,服务器用一个小TCP报文段做出确认和响应,最后,客户向服务器返回确认。三次握手中前两部分所耗费的时间占用了一个RTT。完成三次握手的前两个部分后,客户结合三次握手的第三部分(确认)向该TCP连接发送一个HTTP请求报文。一旦该请求报文到达服务器,服务器就在该TCP连接上发送HTML文件。该HTTP请求/响应用去一个RTT。因此总的响应时间就是两个RTT加上服务器传输HTML文件的时间。

采用持续连接的HTTP 

非持续连接有一些缺点。第一,必须为每一个请求的对象建立和维护一个全新的连接。对于每个这样的连接,在客户和服务器中都要分配TCP的缓冲区和保持TCP变量,这样给Web服务器带来严重负担。第二,每一个对象经受两倍RTT的交付时延,即一个RTT用于创建TCP,另一个RTT用于请求和接收一个对象。

在HTTP1.1持续连接情况下,服务器在发送响应后保持该TCP连接打开,在相同的客户与服务器之间,后续的请求和响应报文能够通过相同的连接进行传送。 

HTTP报文格式

HTTP报文格式有两种:请求报文和响应报文 

HTTP请求报文 

下面是一个典型的HTTP请求报文:

GET /somedir/page.html HTTP/1.1
Host:www.someschool.edu
Connection: close
User-agent: Mozilla/5.0
Accept-language: fr

该报文是用普通的ASCII文本书写的。HTTP请求报文的第一行叫做请求行(request line) ,其后继的行叫首部行(header line)

请求行有3个字段:方法字段、URL字段和HTTP版本字段。方法字段可以取几种不同的值:GET、POST、HEAD、PUT、DELETE

URL字段带有请求对象的标识

版本字段是自解释的(本例中是HTTP/1.1)

再来看首部行

首部行Host:www.someschool.edu指明了对象所在的主机。

通过包含Connection:close首部行,该浏览器告诉服务器不要麻烦地使用持续连接,它要求服务器在发送完被请求的对象后就关闭这条连接。

User-agent:用来指明用户代理,即向服务器发送请求的浏览器的类型。这里的类型是Mozilla/5.0

(这个首部行是有用的,因为服务器可以有效地为不同类型的用户代理实际发送相同对象的不同版本)

Accept-language:表示用户想得到该对象的语法版本

下图是一个请求报文的通用格式

HTTP 请求报文由请求行、请求头部、空行 和 请求包体 4 个部分组成

 更清晰一点 

 HTTP响应报文

下面是一条HTTP响应报文 

HTTP/1.1 200 OK
Connection: close
Date: Tue,18 Aug 2015 15:44:04 GMT
Server: Apache/2.2.3 (CentOS)
Last-Modified: Tue,18 Aug 2015 15:11:03 GMT
Content-Length: 6821
Content-Type: text/html

(data data data.......)

 该响应报文有三个部分:一个初始状态行(status line),6个首部行(header line),然后是实体体(entity body)。

实体体部分是报文的主要部分,即它包含了所请求的对象本身(data、data......)

状态行有3个字段:协议版本字段、状态码、和相应状态信息

首部行:

  • 服务器用Connection:close首部行告诉客户,发送完报文后将关闭该TCP连接;
  • Date:首部行指示服务器产生并发送该响应报文的日期和时间(这个时间不是指对象创建或最后修改的时间,而是服务器从它的文件系统中检索到该对象,将该对象插入响应报文并发送该响应报文的时间)
  • Server:指示该报文是由一台Apache Web服务器产生的
  • Last-Modified:指示了对象创建或最后修改的时间
  • Content-Length:被发送对象中的字节数
  • Content-Type:指示了实体体中的对象是HTML文本

响应报文的通用格式

 一些常见的状态码:

  • 200 OK:请求成功,信息在返回的响应报文中
  • 301 Moved Permanently:请求的对象已经被永久转移了,新的URL定义在响应报文的Location:首部行中。客户软件将自动获取新的URL
  • 400 Bad Request:一个通用差错代码,指示该请求不能被服务器理解
  • 404 Not Found:被请求的文档不在服务器上
  • 505 HTTP Version Not Supported:服务器不支持请求报文使用的HTTP协议
 用户与服务器的交互:cookie

前面提到的HTTP服务器是无状态的,这样简化了服务器的设计。然而一个Web站点通常希望能够识别用户,为此HTTP使用了cookie,允许站点对用户进行跟踪

如下图:cookie技术有4个组件:①在HTTP响应报文中的一个cookie首部行②在HTTP请求报文中的一个cookie首部行③在用户端系统中保留有一个cookie文件,并由用户的浏览器进行管理④位于Web站点的一个后端数据库

cookie可以用于标识一个用户。用户首次访问一个站点时,可能需要提供一个用户标识,在后继会话中,浏览器向服务器传递一个cookie首部,从而向该服务器 标识了用户。因此cookie可以在无状态的HTTP之上建立一个用户会话层。

Web缓存

 Web缓存器(Web cache)也叫代理服务器(proxy server),它能够代表初始Web服务器来满足HTTP请求的网络实体。

Web缓存器有自己的磁盘存储空间,并在存储空间中保存最近请求过的对象的副本

可以配置用户的浏览器,使得用户的所有HTTP请求首先指向Web缓存器,一旦浏览器被配置,每个请求首先被定向到该Web缓存器。

 在因特网上部署Web缓存器有两个原因。

首先Web缓存器可以大大减少对客户请求的响应时间,特别是当客户与初始服务器之间的瓶颈带宽低于客户与Web缓存器之间的瓶颈带宽更是如此。如果在客户与Web缓存器之间有一个高速连接,并且用户请求的对象在Web缓存器上,则Web缓存器可以迅速将该对象交付给用户

其次Web缓存器能够大大减少一个机构的接入链路到因特网的通信量,此外Web缓存器能从整体上大大降低因特网上的Web流量,从而改善了所有应用的性能

2.3因特网中的电子邮件

 下图给出了因特网电子邮件系统的总体情况

从图中可以看出它有3个主要组成部分:用户代理(user agent)、邮件服务器(mail server)、简单邮件传输协议(Simple Mail Transfer Protocol,SMTP) 

邮件服务器形成了电子邮件体系结构的核心。每个接收方在其中的某个邮件服务器上有一个邮箱(mailbox)。一个典型的邮件发送过程是:从发送方的用户代理开始,传输到发送方的邮件服务器,然后在这里被分发到接收方的邮箱中。当Bob要在他的邮箱中读取该报文时,包含他邮箱的邮件服务器(使用用户名和口令)来鉴别Bob,Alice的邮箱也必须能处理Bob的邮件服务器的故障。如果Alice的服务器不能将邮件交付给Bob的服务器,Alice的邮件服务器在一个报文队列(message queue)中保持该报文并在以后尝试再次发送。通常每30分钟左右进行一次尝试;如果几天后仍不能成功,服务器就删除该报文并以电子邮件的形式通知发送方(Alice)

SMTP是因特网电子邮件中主要的应用层协议。它使用TCP可靠数据传输服务,从发送方的邮件服务器向接收方的邮件服务器发送邮件。像大多数应用层协议一样,SMTP也有两个部分:运行在发送方邮件服务器的客户端和运行在接收方邮件服务器的服务器端。

SMTP

SMTP是因特网电子邮件的核心。它限制所有邮件报文的体部分(不只是其首部)只能采用简单的7比特ASCII表示

假设Alice想给Bob发送一封邮件

(1)Alice调用她的邮件代理程序并提供Bob的邮件地址,撰写报文,然后指示用户代理发送该报文

(2)Alice的用户代理把报文发给她的邮件服务器,在那里该报文被放在报文队列中

(3)运行在Alice的邮件服务器上的SMTP客户端发现了报文队列中的这个报文,它就创建一个到运行在Bob的邮件服务器上的SMTP服务器的TCP连接 

(4)经过一些初始SMTP握手后,SMTP客户通过该TCP连接发送Alice的报文

(5)在Bob的邮件服务器上,SMTP的服务器端接收该报文。Bob的邮件服务器然后将该报文放入Bob的邮箱中

(6)在Bob方便的时候,他调用用户代理阅读该报文。

 SMTP一般不使用中间邮件服务器发送邮件,即使这两个邮件服务器位于地球的两端也是这样。

 与HTTP的对比

简要比较一下SMTP和HTTP。

这两个协议都用于从一台主机向另一台主机传送文件:HTTP从Web服务器向Web客户(通常是一个浏览器)传送文件;SMTP从一个邮件服务器向另一个邮件服务器传送文件(即电子邮件报文)。

当进行文件传送时,持续的HTTP和SMTP都适用持续连接。然而,这两个协议也有一些重要区别

首先,HTTP主要是一个拉协议(pull protocol),即在方便的时候,某些人在Web服务器上装载信息,用户使用HTTP从该服务器拉取这些信息。而SMTP基本上是一个推协议(push protocol),即发送邮件服务器把文件推向接收邮件服务器。

第二个区别是,SMTP要求每个报文(包括它们的体)采用7比特ASCII码格式。如果某报文包含了非7比特ASCII字符或二进制数据,则该报文必须按照7比特ASCII码进行编码。HTTP数据则不受这种限制

第三个区别是,如何处理一个既包含文本又包含图形的文档。HTTP把每个对象封装到它自己的HTTP响应报文中,而SMTP则把所有报文对象放在一个报文之中

邮件报文格式

每个首部必须含有一个From:首部行和一个To:首部行;一个首部也许包含一个Subject:首部行以及其他可选的首部行。

一个典型的报文首部看起来如下:

From: alice@crepes.fr
To: bob@hamburger.edu
Subject: Searching for the meaning of life

 在报文首部之后,紧接着一个空白行,然后是以ASCII格式表示的报文体。

 邮件访问协议

 第三版的邮局协议(Post Office Protocol——Version3,POP3)、因特网访问协议(Internet Mail Access Protocol,IMAP)以及HTTP

 上图总结了应用于因特网电子邮件的一些协议:SMTP用来将邮件从发送方的邮件服务器传输到接收方的邮件服务器;SMTP也用来将邮件从发送方的用户代理传送到发送方的邮件服务器;如POP3这样的邮件访问协议用来将邮件从接收方的邮件服务器传送到接收方的用户代理

POP3

 POP3是一个极为简单的邮件访问协议。当用户代理(客户)打开一个到邮件服务器(服务器)端口110上的TCP连接后,POP3就开始工作了,随着TCP建立,POP3按照三个阶段进行工作:特许、事务处理以及更新。

在第一个阶段即特许阶段,用户代理发送(以明文形式)用户名和口令以鉴别用户。

在第二阶段即事务处理阶段,用户代理取回报文,同时用户代理还可以对报文做删除标记、取消报文删除标记、以及获取邮件的统计信息

在第三阶段即更新阶段,它出现在客户发出了quit命令之后,目的是结束该POP3会话

2.4DNS:因特网的目录服务

人类能以很多方式来标识,同样因特网的主机也可以使用多种方式进行标识。主机的一种标识方法是用它的主机名(hostname) {www.facebook.com、www.google.com等},也可以使用IP地址(IP address)进行标识

DNS提供的服务

识别主机有两种方式,通过主机名或IP地址。人们喜欢便于记忆的主机名标识方式,而路由器则喜欢定长的、有着层次结构的IP地址。为了折衷,我们需要一种能进行主机名到IP地址转换的目录服务——这就是域名系统 (Domain Name System,DNS )的主要任务。DNS是:①一个由分层的DNS服务器(DNS server)实现的分布式数据库;②一个使得主机能够查询分布式数据库的应用层协议。

DNS协议运行在UDP上,使用53号端口

DNS通常是由其他应用层协议所使用的,包括HTTP、SMTP和FTP,将用户提供的主机名解析为IP地址

除了进行主机名到IP地址的转换外,DNS还提供了一些重要的服务:

  • 主机别名。有着复杂主机名的主机能拥有一个或多个别名。此时原本的复杂主机名也称为规范主机名。主机别名(存在时)比主机名更容易记忆,应用程序可以调用DNS来获得主机别名对应的规范主机名以及主机的IP地址
  • 邮件服务器别名。电子邮件应用程序可以调用DNS,对提供的主机名别名进行解析,以获得该主机的规范主机名及其IP地址
  • 负载分配。DNS也用于在冗余的服务器之间进行负载分配。
DNS工作机理概述 

DNS的一种简单设计是在因特网上只使用一个DNS服务器,该服务器包含所有的映射。这种集中式设计的问题包括:

  • 单点故障。如果该DNS服务器崩溃,整个因特网随之瘫痪
  • 通信容量。单个DNS服务器不得不处理所有的DNS查询(用于为上亿台主机产生的所有HTTP请求报文和电子邮件报文服务)
  • 远距离的集中式数据库。单个DNS不可能“邻近”所有查询客户
  • 维护。单个DNS服务器不得不为所有的因特网主机保留记录。使得这个中央数据库庞大,而且还不得不为解决每个新添加的主机而频繁更新 

总的来说,在单一DNS服务器上运行集中式数据库完全没有可扩展能力。因此,DNS采用了分布式的设计方案

分布式、层次数据库

 为了处理扩展性问题,DNS使用了大量的DNS服务器,它们以层次方式组织,并且分布在全世界范围内。没有一台DNS服务器拥有因特网上所有主机的映射,相反这些映射分布在所有的DNS服务器上。大致来说,有3种类型的DNS服务器:根DNS服务器、顶级域(Top-Level Domain,TLD)DNS服务器和权威DNS服务器

  •  根DNS服务器。有400多个根名字服务器遍及全世界。这些根名字服务器由13个不同的组织管理。根名字服务器提供TLD服务器的IP地址
  • 顶级域(DNS)服务器。对于每个顶级域(如com、org、net、edu和gov)和所有国家的顶级域(如uk、fr、ca和jp),都有TLD服务器。TLD服务器提供了权威DNS服务器的IP地址
  • 权威DNS服务器。在因特网上具有公共可访问主机的每个组织机构必须提供公共可访问的DNS记录,这些记录将这些主机的名字映射为IP地址

 根、TLD和权威DNS服务器都处在该DNS服务器的层次结构中。还有另外一类重要的DNS服务器,称为本地DNS服务器。严格来说一个本地DNS服务器并不属于该服务器的层次结构,但它对DNS层次结构是至关重要的。每个ISP都有一台本地DNS服务器。

DNS缓存 

 DNS缓存(DNS caching),实际上为了改善时延性能并减少因特网上到处传输的DNS报文数量,DNS广泛使用了缓存技术

DNS缓存的原理非常简单。在一个请求链中,当某DNS服务器接收一个DNS回答时,它能将映射缓存在本地存储器中

DNS记录和报文

共同实现DNS分布式数据库的所有DNS服务器存储了资源记录(Resource Record,RR),RR提供了主机名到IP地址的映射。每个DNS回答报文包含了一条或多条资源记录

资源记录是一个包含了下列字段的4元组:

(Name,Value,Type,TTL)

TTL是该记录的生存时间,它决定了资源记录应当从缓存中删除的时间。

Name和Value取决于Type: 

  • 如果Type=A,则Name是主机名,Value是该主机名对应的IP地址。因此一条类型为A的资源记录提供了标准的主机名到IP地址的映射
  • 如果Type=NS,则Name是个域,而Value是个知道如何获得该域中主机IP地址的权威DNS服务器的主机名
  • 如果Type=CNAME,则Value是别名为Name的主机对应的规范主机名。该记录能向查询的主机提供一个主机名对应的规范主机名
  • 如果Type=MX,则Value是个别名为Name的邮件服务器的规范主机名。

DNS只有查询和回答报文这两种,并且两种有着相同的格式:

  

 2.5 P2P文件分发

到目前为止前面描述的应用(包括Web、电子邮件和DNS)都采用了客户-服务器体系结构,极大地依赖于总是打开的基础设施服务器。前面也已经提到过,使用P2P体系结构,对总是打开的基础设施服务器有最小的(或者没有)依赖,成对间歇连接的主机(称为对等方)彼此直接通信。这些对等方并不为服务提供商所拥有,而是受用户控制的桌面计算机。

 P2P体系结构的扩展性

 具有P2P体系结构的应用程序能够是自扩展的。这种扩展性的直接成因是:对等方除了是比特的消费者外还是它们的重新分发者

 第三章、运输层

 运输层位于应用层和网络层之间,是分层的网络体系结构的重要部分,该层为运行在不同主机上的应用进程提供直接的通信服务起着至关重要的作用。

3.1运输层服务

运输层协议为运行在不同主机上的应用进程之间提供了逻辑通信(logic communication)功能 

从应用程序的角度看,通过逻辑通信,运行不同进程的主机好像直接相连一样,实际上这些主机通过很多路由器及多种不同类型的链路相连。应用进程使用运输层提供的逻辑通信功能彼此发送报文,而无需考虑承载这些报文的物理基础设施的细节。

 如图,运输层协议是在端系统中而不是在路由器中实现的。在发送端,运输层将从发送应用程序进程接收到的报文转换成运输层分组——运输层报文段(segment)。实现的方法(可能)是将应用报文划分为较小的块,并为每块加上一个运输层首部以生成运输层报文段。然后,在发送端系统中,运输层将这些报文段传递给网络层,网络层将其封装成网络层分组(即数据报)并向目的地发送。

运输层和网络层的关系

 在协议栈中,运输层刚好位于网络层之上。网络层提供了主机之间的逻辑通信,而运输层为运行在不同主机上的进程之间提供了逻辑通信。

考虑有两个家庭,每个家庭有12个孩子(一家是另一家的堂兄弟姐妹),每人每星期要互写一封信,每封信用单独的信封通过传统的邮政服务传送,因此每个家庭每星期向另一家发送144封信。每个家庭分别有个孩子负责收发邮件,一家是Anna,一家是Bobby。

在这个例子中,邮政服务为两个家庭间提供逻辑通信,邮政服务将信封从一家送往另一家,而不是从一个人送往另一个人。另一方面,Anna和Bobby为堂兄弟姐妹之间提供了逻辑通信,他们从兄弟姐妹那里收取信件或交付信件

可以这样解释运输层和网络层的关系:

  • 应用层报文=信封上的字符 
  • 进程=堂兄弟姐妹
  • 主机(端系统)=家庭
  • 运输层协议=Anna和Bobby
  • 网络层协议=邮政服务(包括邮车)

1、Anna和Bobby都是在各自家里进行工作的,他们没有参与任何一个中间邮件中心对邮件的分拣,或者将邮件从一个邮件中心送到另一个邮件中心之类的工作。类似地,运输层协议只工作在端系统中。在端系统中,运输层协议将来自应用进程的报文移动到网络边缘(即网络层),但对有关这些报文在网络核心如何移动并不作任何规定。

2、假定Anna和Booby外出,另一对堂兄妹(A和B)接替他们的工作。由于年龄小,A和B收发邮件的次数更少,有时可能还会丢失邮件。因此A和B并没有提供于Anna和Booby一样的服务集合(即相同的服务模型)。类似地,计算机网络中可以安排多种运输层协议,每种协议为应用程序提供不同的服务模型

3、Anna和Bobby所能提供的服务明显受限于邮政服务所提供的服务。与此类似,运输协议能提供的服务常常受制于底层网络协议的服务模型。如果网络层协议无法为主机之间发送的运输层报文段提供时延或带宽保证,运输层协议也就无法为进程之间发送的应用程序报文提供时延或带宽保证

4、即使底层网络协议不能在网络层提供相应的服务,运输层协议也能提供某些服务(比如即使底层网络协议是不可靠的,运输协议也能为应用程序提供可靠的数据传输服务)

因特网运输层概述

因特网为应用层提供了两种截然不同的运输层协议。一种是UDP(用户数据报协议),它为调用它的程序提供一种不可靠无连接的服务;另一种是TCP(传输控制协议),它为调用它的应用程序提供了一种可靠的、面向连接的服务。

将运输层分组称为报文段(segment)。

简单介绍一下因特网的网络层:因特网网络层协议有一个名字叫IP,即网际协议。IP为主机之间提供了逻辑通信。IP的服务模型是尽力而为交付服务(best-effort delivery service)。这意味着IP尽它“最大的努力”在通信的主机之间交付报文段,但它并不做任何确保,特别是他不确保报文段的交付,不保证报文段的按序交付,不保证报文段中数据的完整性。由于这些原因,IP被称为不可靠服务(unreliable service)。每台主机至少有一个网络层地址,即IP地址

UDP和TCP所提供的服务模型:UDP和TCP的最基本的责任是,将两个端系统间IP的交付服务扩展为运行在端系统上的两个进程之间的交付服务。将主机间交付扩展到进程间交付被称为运输层的多路复用与多路分解。UDP和TCP还可以通过在其报文段首部中包括差错检查字段而提供完整性检查。

进程到进程的数据交付和差错检查是两种最低限度的运输层服务,也是UDP所能提供的仅有的两种服务。特别地,与IP一样,UDP也是一种不可靠的服务

TCP为应用程序提供了几种附加服务。首先它提供可靠数据传输,通过使用流量控制、序号、确认和定时器,TCP确保正确地、按序地将数据从发送方进程交付给接收方进程。这样TCP就将两个端系统间的不可靠IP服务转换成了一种进程间的可靠数据传输服务。 TCP还提供拥塞控制。TCP力求为每个通过一条拥塞网络链路的连接平等地共享网络链路带宽,这可以通过调节TCP连接的发送端发送进网络的流量速率来做到。

3.2多路复用与多路分解

运输层的多路复用与多路分解,也就是将由网络层提供的主机到主机交付服务延伸到为运行在主机上的应用程序提供进程到进程的交付服务。

一个进程(作为网络应用的一部分)有一个或多个套接字(socket),它相当于从网络向进程传递数据和从进程向网络传递数据的门户。

如下图,在接收主机中的运输层实际上并没有直接将数据交付给进程,而是将数据交付给了一个中间的套接字 ,每个套接字都有唯一的标识符

 接收主机怎样将一个到达的运输层报文段定向到适当的套接字?

每个运输层报文段中具有几个字段。在接收端,运输层检查这些字段,标识出接收套接字进而将报文段定向到该套接字。将运输层报文段中的数据交付到正确的套接字接口的工作称为多路分解。在源主机从不同套接字中收集数据块,并为每个数据块封装上首部信息(用于以后分解)从而生成报文段,然后将报文段传递到网络层,所有的这些工作称为多路复用

运输层多路复用要求:①套接字有唯一标识符;②每个报文段有特殊字段来指示该报文段所要交付到的套接字

这些特殊字段是源端口号字段目的端口号字段。 

运输层是怎样能够实现分解服务:在主机上的每个套接字能够分配到一个端口号,当报文段到达主机时,运输层检查报文段中的目的端口号,并将其定向到相应的套接字。然后报文段中的数据通过套接字进入其所连接的进程。

无连接的多路复用与多路分解 

 一个UDP套接字是由一个二元组全面标识的,该二元组包含一个目的IP地址和一个目的端口号。因此如果两个UDP报文段有不同的源IP地址和/或源端口号,但具有相同的目的IP地址和目的端口号,那么这两个报文段将通过相同的目的套接字被定向到相同的目的进程。

源端口号的用途是什么?在A到B的报文段中,源端口号用作“返回地址”的一部分,即当B需要回发一个报文段给A时,B到A的报文段中的目的端口号便从A到B的报文段中的源端口号中取值。

 面向连接的多路复用与多路分解

TCP套接字和UDP套接字之间的一个细微差别是,TCP套接字是由一个四元组(源IP地址,源端口号,目的IP地址,目的端口号)来标识的。因此,当一个TCP报文段从网络到达一台主机时,该主机使用全部4个值来将报文段定向(分解)到相应的套接字。特别与UDP不同的是,两个具有不同源IP地址或源端口号的到达TCP报文段将被定向到两个不同的套接字,除非TCP报文段携带了初始创建连接的请求。

服务器主机可以支持很多并行的TCP套接字,每个套接字与一个进程相联系,并由其四元组来标识每个套接字。当一个TCP报文段到达主机时,所有4个字段(源IP地址,源端口,目的IP地址,目的端口)被用来将报文段定向(分解)到相应的套接字。

下图显示了这种情况,图中主机C向服务器B发起了两个HTTP会话,主机A向服务器B发起了一个HTTP会话。主机A与主机C及服务器B都有自己唯一的IP地址,主机C为其两个HTTP连接分配了两个不同的源端口号(26145和7532)。因为主机A选择端口号时与主机C互不相干,因此它也可以将源端口号26145分配给其HTTP连接。此时服务器B仍然能够正确地分解这两个具有相同源端口号的连接,因为这两条连接有不同的源IP地址

 3.3无连接传输:UDP

UDP从应用进程得到数据,附加上用于多路复用/分解服务的源和目的端口号字段,以及两个其他的小字段,然后将形成的报文段交给网络层。网络层将该运输层报文段封装到一个IP数据报中,然后尽力而为地尝试将 此报文段交付给接收主机。如果该报文段到达接收主机,UDP使用目的端口号将报文段中的数据交付给正确的应用进程。 

使用UDP时,在发送报文段之前,发送方和接收方的运输层实体之间没有握手,正因为如此,UDP被称为是无连接的。

有许多应用更适合用UDP,原因如下:

  • 关于发送什么数据以及何时发送的应用层控制更为精细。采用UDP时,只要应用进程将数据传递给UDP,UDP就会将此数据打包进UDP报文段并立即将其传递给网络层。另一方面,TCP有一个拥塞控制机制,以便当源和目的主机的一条或多条链路变得极度拥塞时来遏制运输层TCP发送方,TCP仍将继续重新发送数据报直到目的主机收到此报文并加以确认,而不管可靠交付需要多少时间。因为实时应用通常要求较小的发送速率,不希望过分地延迟报文段的传送,且能容忍一些数据丢失,TCP服务模型并不是特别适合这些应用的需要
  • 无需建立连接。TCP在开始传输数据之前要经过三次握手。UDP却不需要任何准备即可进行数据传输。因此UDP不会引入建立连接的时延
  • 无连接状态。TCP需要在端系统中维护连接状态。此连接状态包括接收和发送缓存、拥塞控制参数以及序号与确认号的参数
  • 分组首部开销小。每个TCP报文段都有20字节的首部开销,而UDP仅有8字节的开销

  

UDP报文段结构 

 UDP报文段结构如下

应用层数据占用UDP报文段的数据字段,UDP首部只有4个字段,每个字段由两个字节组成。长度字段指示了在UDP报文段中的字节数(首部加数据)

 UDP检验和

UDP检验和提供了差错检测功能,即检验和用于确定当UDP报文段从源到达目的地移动时,其中的比特是否发生了改变。 

发送方的UDP对报文段中的所有16比特字的和进行反码运算,求和时遇到的任何溢出都被回卷,得到的结果被放在UDP报文段中的检验和字段

假设有下面3个16比特的字:

0110011001100000

0101010101010101

1000111100001100

这些16比特字的前两个之和是:

0110011001100000

0101010101010101

——————————

1011101110110101

再将上面的和与第三个字相加:

1011101110110101

1000111100001100

——————————

10100101011000001

(这里位数溢出,总共17位,于是被回卷,把首位的1拿到最低位并与其相加)

得到0100101011000010

按位取反得到:1011010100111101

 上面按位取反得到的结果就是检验和。

在接收方,全部的4个16比特字(包括检验和)加在一起。如果该分组中没有引入差错,则显然在接收方处该和为11111111111111111,如果这些比特之一是0,则分组中出现差错。

虽然UDP提供差错检测,但它对差错恢复无能为力,UDP的某种实现只是丢弃受损的报文段。

 3.4可靠数据传输原理

 下图说明了学习可靠数据传输的框架。为上层实体提供的服务抽象是:数据可以通过一条可靠的信道进行传输。借助可靠信道,传输数据比特就不会受到损坏或丢失,而且所有数据都是按照其发送顺序进行交付。

实现这种服务抽象是可靠数据传输协议(reliable data transfer protocol)的责任。

构造可靠数据传输协议
1.经完全可靠信道的可靠数据传输:rdt1.0 

首先考虑最简单的情况 ,即底层信道是完全可靠的。称该协议为rdt1.0,下图显示了rdt1.0发送方和接收方的有限状态机的定义。

发送方和接收方的FSM每个都只有一个状态,FSM描述图中的箭头指示了协议从一个状态变迁到另一个状态

 rdt的发送端只通过rdt_send(data)事件接受来自较高层的数据,产生一个包含该数据的分组(经由make_ptr(data)动作),并将分组发送到信道中。实际上,rdt_send(data)事件是由较高层应用的过程产生的

在接收端,rdt通过rdt_rcv(packet)事件从底层信道接收一个分组,从分组中取出数据,并将数据上传给较高层。实际上,rdt_rcv(packet)事件是由较低层协议的过程调用产生的

2.经具有比特差错信道的可靠数据传输:rdt2.0

 底层信道更为实际的模型是分组中的比特可能受损的模型。在分组的传输、传播或缓存的过程中,这种比特差错通常会出现在网络的物理部件中。

 怎样通过电话口述一条长报文?报文接收者在听到、理解并几下每句话后可能会说“OK”,如果没听清,他可能要求你重复刚才的话。这种口述报文协议使用了肯定确认(“OK”)与否定确认(“请重复一遍”),这些控制报文使得接收方可以让发送方知道哪些内容被正确接收,哪些内容接收有误并因此需要重复。在计算机网络环境中,基于这样重传机制的可靠数据传输协议称为自动重传请求(Automatic Repeat reQuest,ARQ)协议

ARQ协议还需要另外三种协议功能来处理存在比特差错的情况:

  • 差错检测。首先需要一种机制以使接收方检测到何时出现了比特差错。前一节的UDP使用因特网检验和字段正是为了这个目的
  • 接收方反馈。因为发送方和接收方通常在不同端系统上执行,发送方要了解接收方情况(分组是否被正确接收)的唯一途径就是让接收方提供明确的反馈信息给发送方。rdt2.0协议将从接收方向发送方回送ACK与NAK分组
  • 重传。接收方收到有差错的分组时,发送方将重传该分组文

rdt2.0的发送端有两个状态。最左边的状态,发送端协议正等待来自上层传下来的数据;最右端的状态,发送方协议等待来自接收方的ACK或NAK分组;

如果收到ACK分组,则发送方知道最近发送的分组已被正确接收,协议返回到等待上层的数据的状态。如果收到NAK分组,该协议重传上一个分组并等待接收方为响应重传分组而回送的ACK和NAK。

注意:当发送方处于等待ACK或NAK的状态时,它不能从上层获得更多地数据;仅当接收到ACK并离开该状态时才能接收数据。因此发送方将不会发送一块新数据,除非发送方确信接收方已正确接收当前分组。rdt2.0这样的协议被称为停等协议。

rdt2.0接收方的FSM仍然只有单一状态。当分组到达时,接收方要么回答一个ACK,要么回答一个NAK,这取决于收到的分组是否受损。

但是rdt2.0协议 有一个致命缺陷。没有考虑到ACK或NAK分组受损的可能性!如果一个ACK或NAK分组受损,发送方无法知道接收方是否正确接收了上一块发送的数据

在数据分组中添加一新字段,让发送方对其数据分组编号,即将发送数据分组的序号放在该字段

于是接收方只需要检查序号即可确定收到的分组是否一次重传

下图时对rdt2.0的修订版rdt2.1,它的发送方和接收方FSM的状态数都是以前的两倍。这是因为协议状态此时必须反映出目前(由发送方)正发送的分组或(在接收方)希望接收的分组的序号是0还是1

该协议使用了从接收方到发送方的肯定确认和否定确认。当接收到失序的分组时,接收方对所接收的分组发送一个肯定确认。如果收到受损的分组,则接收方将发送一个否定确认,如果不发NAK,而是对上次正确接收的分组发送一个ACK,发送方接收到对同一个分组的两个ACK(即接收冗余ACK)后,就知道接收方没有正确接收到分组。

 rdt2.2是在有比特差错信道上实现的一个无NAK的可靠数据传输协议。rdt2.1和rdt2.2之间的细微变化在于,接收方此时必须包括由一个ACK报文所确认的分组序号,发送方此时必须检查接收到的ACK报文中被确认的分组序号。

3.经具有比特差错的丢包信道的可靠数据传输:rdt3.0

 假定除了比特受损外,底层信道还会丢包。假定发送方传输一个数据分组,该分组或者接收者对该分组的ACK发生了丢失,在这两种情况下,发送方都收不到应当到来的接收方的响应

从发送方的观点来看,重传是一种万能灵药。发送方不知道是一个数据分组丢失,还是一个ACK丢失,或者只是该分组或ACK过度延时,在所有这些情况下都是进行重传。为了实现基于时间的重传机制,需要一个倒计时定时器(countdown time),在一个给定的时间量过期后,可中断发送方。发送方要能做到:①每次发送一个分组(包括第一次分组和重传分组)时,便启动一个定时器②响应定时器中断(采取适当的动作)③终止定时器

下图显示了各种情况下协议运作的情况,

 流水线可靠数据传输协议

rdt3.0是一个功能正确的协议,但是它的性能问题的核心在于它是一个停等协议。考虑到各种时延,导致性能糟糕

一个简单解决方法是:不以停等方式运行,允许发送方发送多个分组而无需等待确认。许多从发送方向接收方输送的分组可以被看成是填充到一条流水线中,故这种技术被称为流水线

  • 必须增加序号范围,因为每个输送中的分组(不计算重传的)必须有一个唯一的序号,而且也许有多个在输送中的未确认报文
  • 协议的发送方和接收方两端也许不得不缓存多个分组。发送方最低限度应当能缓存那些已发送但没有确认的分组
  • 所需序号范围和对缓冲的要求取决于数据传输协议如何处理丢失、损坏及延时过大的分组 。两种方法:回退N步(Go-Back-N,GBN)和选择重传(Selective Repeat,SR) 
回退N步 

 在回退N步(GBN)协议中,允许发送方发送多个分组(当有多个分组可用时)而不需等待确认,但它也受限于在流水线中未确认的分组数不能超过某个最大允许数N,

如上图,那些已被发送但还未被确认的分组的许可序号范围可以被看成是一个在序号范围内长度为N的窗口。随着协议的运行,该窗口在序号空间向前滑动。因此,N常被称为窗口长度(window size) ,GBN协议也常被称为滑动窗口协议

GBN发送方必须响应三种类型的事件:

  • 上层的调用。当上层调用rdt_send()时,发送方首先检查发送窗口是否已满,即是否有N个已发送但未被确认的分组,如果窗口未满,则产生一个分组并将其发送,并相应地更新变量。如果窗口已满,发送方只需将数据返回给上层,隐式地指示上层该窗口已满
  • 收到一个ACK。在GBN协议中,对序号为n的分组确认采用累计确认的方式,表明接收方已正确接收到序号为n的以前且包括n在内的所有分组
  • 超时事件。协议的名字“回退N步”来源于出现丢失和时延过长分组时发送方的行为。就像在停等协议中那样,定时器将再次用于恢复数据或确认分组的丢失。如果出现超时,发送方重传所有已发送但还未被确认过的分组。

下图给出了窗口长度为4个分组的GBN协议的运行情况。因为该窗口长度的限制,发送方发送分组0~3,然后在继续发送之前,必须等待直到一个或多个分组被确认。当接收到每一个连续的ACK(如ACK0和ACK1)时,该窗口便向前滑动,发送方便可以发送新的分组(分组4和分组5)。在接收方,分组2丢失,因此分组3、4、5被发现是失序分组并被丢弃。 

  

选择重传

 GBN协议潜在地允许发送方用多个分组“填充式流水线”,因此避免了停等协议中所提到的信道利用率问题。

然而GBN本身也有一些问题,尤其是当窗口长度和带宽时延积都很大时,在流水线中会有很多分组时更是如此。单个分组的差错就能引起GBN重传大量分组,许多分组根本没必要重传。随着信道差错率的增加,流水线可能会被这些不必要重传的分组所充斥

选择重传(SR)协议通过让发送方仅重传那些它怀疑在接收方出错(丢失或受损)的分组而避免了不必要的重传。这种个别的、按需的重传要求接收方逐个地确认正确接收的分组。

SR接收方将确认一个正确接收的分组而不管其是否按序。失序的分组将被缓存直到所有丢失分组(即序号更小的分组)皆被收到为止,这时才可以将一批分组按序交付给上层。

下图显示了出现丢包时SR的操作,接收方初始时缓存了分组3、4、5,并在最终收到分组2时,才将它们一并交付给上层

 对于SR协议,窗口长度必须小于等于序号空间大小的一半。

可靠数据传输机制及其用途
机制用途与说明
检验和用于检测在一个重传分组中的比特错误
定时器用于超时/重传一个分组,可能因为该分组(或其ACK)在信道中丢失。由于当一个分组延时但未丢失(过早超时),或当一个分组已被接收方收到但从接收方到发送方的ACK丢失时,可能产生超时事件,所以接收方可能会收到一个分组的多个冗余副本
序号用于为从发送方流向接收方的数据分组按顺序编号。所接收分组的序号间的空隙可使接收方检测出丢失的分组。具有相同序号的分组可使接收方检测出一个分组的冗余版本
确认接收方用于告诉发送方一个分组或一组分组已被正确地接收到了。确认报文通常携带着被确认的分组或多个分组的序号。确认可以是逐个的或累积的,这取决于协议
否定确认接收方用于告诉发送方某个分组未被正确地接收。否定确认报文通常携带着未被正确接收的分组序号
窗口、流水线发送方也许被限制仅发送那些序号落在一个指定范围内的分组。通过允许一次发送多个分组但未被确认,发送方的利用率可在停等操作模式的基础上得到增加。窗口长度可根据接收方接收和缓存报文的能力、网络中的拥塞程度或两者情况来进行设置

3.5面向连接的运输:TCP 

 TCP是因特网运输层的面向连接的可靠的运输协议

TCP连接

TCP被称为是面向连接的(connection-oriented), 这是因为在一个应用进程可以开始向另一个应用进程发送数据之前,这两个进程必须先相互“握手”,即它们必须相互发送某些预备报文段,以建立确保数据传输的参数。

这种TCP“连接”不是一条像在电路交换网络中的端到端TDM或FDM电路。相反,该“连接”是一条逻辑连接,其共同状态仅保留在两个通信端系统的TCP程序中。而TCP协议只在端系统中运行,而不在中间的网络元素(路由器和链路层交换机)中运行,所以中间的网络元素不会维持TCP连接状态

TCP连接提供的是全双工服务:如果一台主机上的进程A与另一台主机上的进程B存在一条TCP连接,那么应用层数据就可在从进程B流向进程A的同时,也从进程A流向进程B。TCP连接也总是点对点的,即在单个发送方与单个接收方之间的连接。

TCP是怎样建立连接的?客户首先发送一个特殊的TCP报文段,服务器用另一个特殊的TCP报文段来响应,最后,客户再用第三个特殊报文段作为响应。前两个报文段不承载“有效载荷”,也就是不包含应用层数据,而第三个报文段可以承载有效载荷。由于在两台主机之间发送了3个报文段,所以这种连接建立过程常被称为三次握手(three-way handshake)

TCP 为每块客户数据配上一个TCP首部,从而形成多个TCP报文段(TCP segment)。这些报文段被下传给网络层,网络层将其分别封装在网络层IP数据报中,然后这些IP数据报被发送到网络中。当TCP在另一端接收到一个报文段后,该报文段的数据就被放入该TCP连接的接收缓存中。如下图所示,应用程序从此缓存中读取数据流,该连接的每一端都有各自的发送缓存和接收缓存。

TCP连接的组成包括:一台主机上的缓存、变量和与进程连接的套接字,以及另一台主机上的另一组缓存、变量和与进程连接的套接字。两台主机之间的网络元素(路由器、交换机、中继器)中,没有为该连接分配任何缓存和变量。

TCP报文段结构

 TCP报文段由首部字段和一个数据字段组成。数据字段包含一块应用数据

 TCP的首部一般是20字节(比UDP首部多12字节)

与UDP一样,首部包括源端口号目的端口号,它被用于多路复用/分解来自或送到上层应用的数据。同样首部也包括检验和字段。TCP报文段首部还包含下列字段:

  • 32比特的序号字段和32比特的确认号字段。这些字段被TCP发送方和接收方用来实现可靠数据传输服务
  • 16比特的接收窗口字段。该字段用于流量控制,用于指示接收方愿意接受的字节数量
  • 4比特的首部长度字段,该字段指示了以32比特的字为单位的TCP首部长度,由于TCP选项字段的原因,TCP首部的长度是可变的(通常选项字段为空,所以TCP首部的典型长度是20字节)
  • 可选与变长的选项字段。该字段用于发送方与接收方协商最大报文段长度(MSS)时,或在高速网络环境下用作窗口调节因子时使用
  • 6比特的标志字段。ACK 比特用于指示确认字段中的值是有效的;RST、SYN和FIN比特用于连接建立和拆除;在明确拥塞通告中使用了CWR和ECE比特;当PSH比特被置位时,就指示接收方应立即将数据交给上层;URG比特用来指示报文段里存在着被发送端的上层实体置为“紧急”的数据。紧急数据的最后一个字节由16比特的紧急数据指针字段指出。当紧急数据存在并给出指向紧急数据尾指针的时候,TCP必须通知接收端的上层实体。
 序号和确认号

TCP报文段首部中两个最重要的字段是序号字段和确认号字段。这两个字段是TCP可靠传输服务的关键部分。

一个报文段的序号因此是该报文段首字节的字节流编号。

假定数据流由一个包含500000字节的文件组成,其MSS(最大报文段长度)为1000字节,数据流的首字节编号是0,如下图,该TCP将为该数据流构建500个报文段,给第一个报文段分配序号0,第二个报文段分配序号1000,第三个报文段分配序号2000,以此类推,每一个序号被填入到相应TCP报文段首部的序号字段中

 确认号。由于TCP是全双工的,因此主机A在向主机B发送数据的同时,也许需要接收来自主机B的数据。从主机B到达的每个报文段中都有一个序号用于从B流向A的数据。主机A填充进报文段的确认号是主机A期望从主机B收到的下一字节的序号

可靠数据传输

因特网的网络层服务(IP服务)是不可靠的,TCP在IP不可靠的尽力而为服务之上创建了一种可靠数据传输服务。TCP的可靠数据传输服务确保了接收方收到的字节流与发送方发送的字节流是完全相同的。

现在看下面的三种不同情况:

①主机A向主机B发送一个报文段,假设该报文段的序号是92,而且包含8字节数据。在发出该报文段后,主机A等待一个来自主机B的确认号为100的字段。虽然A发出的报文段被B接收到,但是从B发出的确认报文丢失了,这种情况下,超时事件就会发生,主机A会重传相同的报文段。当B收到该重传的报文段后,通过序号发现该报文段包含了已经收到的数据,因此B中的TCP会丢弃该重传报文段中的这些字节

 ②主机A连续发回了两个报文段。第一个报文段序号92,包含8字节数据;第二个报文段序号是100,包含20字节数据。假设两个报文段数据都完整到达主机B,并且主机B为每一个报文段分别发送一个确认。第一个确认报文的确认号是100,第二个确认报文段的确认号是120。假设在超时之前两个报文段都没有到达A,当超时事件发生时,主机A重传序号92的第一个报文段,并重启定时器。只要第二个报文段的ACK在新的超时发生以前到达,则第二个报文段将不会被重传。

③假设主机A与第二种情况完全一样,发送两个数据报文段,第一个报文段的确认报文在网络中丢失,但在超时事件发生之前主机A收到一个确认号为120的确认报文。主机A因而知道主机B已经收到了序号为119及之前的所有字节。所以主机A不会重传这两个报文中的任何一个。

 快速重传

超时触发重传存在的问题之一是超时周期可能相对较长。当一个报文段丢失时,这种长超时周期迫使发送方延迟重传丢失的分组,因而增加了端到端时延。好在发送方通常可在超时事件发生之前通过注意所谓冗余ACK来较好地检测到丢包情况。冗余ACK就是再次确认某个报文段的ACK,而发送方先前已经收到对该报文段的确认。

产生TCP ACK的建议
事件TCP接收方动作
具有所期望序号的按序报文段到达。所有在期望序号及以前的数据都已经被确认延迟的ACK。对另一个按序报文段的到达最多等待500ms,如果下一个按序报文段在这个时间间隔内没有到达,则发送一个ACK
具有所期望序号的按序报文段到达。另一个按序报文段等待ACK传输立即发送单个累计ACK,以确认两个按序报文段
比期望序号大的失序报文段到达。检测出间隔立即发送冗余ACK,指示下一个期待字节的序号(其为间隔的低端的序号)
能部分或完全填充接收数据间隔的报文段到达倘若该报文段起始于间隔的低端,则立即发送ACK

 因为发送方经常一个接一个地发送大量的报文段,如果一个报文段丢失,就很可能引起许多一个接一个的冗余ACK。如果TCP发送方接收到对相同数据的3个冗余ACK,它把这当作一种指示,说明跟在这个已被确认过3次的报文段已经丢失。一旦收到3个冗余ACK,TCP就执行快速重传,即在该报文段的定时器过期之前重传丢失的报文段。

 流量控制

一条TCP连接的每一侧主机都为该连接设置了接收缓存。当该TCP连接收到正确、按序的字节后,它就将数据放入接收缓存。相关联的应用进程会从该缓存中读取数据,但不必是数据刚一到达就立即读取,可能在过了很长时间后才读取该数据。如果某应用程序读取数据时相对缓慢,而发送方发送的太多、太快,发送的数据就会很容易地使该连接的接收缓存溢出

TCP为它的应用程序提供了流量控制服务以消除发送方使接收方缓存溢出的可能性。流量控制因此是一个速度匹配服务,即发送方的发送速率与接收方应用程序的读取速率相匹配。TCP发送方也可能因为IP网络的拥塞而被遏制;这种形式的发送方的控制被称为拥塞控制

流量控制和拥塞控制采取的动作非常相似,但它们是针对完全不同的原因而采取的措施。

TCP通过让发送方维护一个称为接收窗口的变量来提供流量控制。就是说,接收窗口用于给发送方一个指示——该接收方还有多少可用的缓存空间,因为TCP是全双工通信,在连接两端的发送方都各自维护一个接收窗口。

TCP连接管理

如何建立和拆除一条TCP连接?

假设运行在一台主机(客户)上的一个进程想与另一台主机(服务器)上的一个进程建立连接。

客户应用进程首先会通知客户TCP,它想建立一个与服务器上某个进程之间的连接,客户中的TCP会用以下方式与服务器中的TCP建立一条TCP连接:

  • 第一步:客户端的TCP首先向服务器端的TCP发送一个特殊的TCP报文段。该报文段中不包含应用层数据。但在报文段的首部中的一个标志位(SYN比特)被置为1,因此这个特殊报文段被称为SYN报文段,另外客户会随机地选择一个初始序号(client_isn),并将此编号放置于该起始的TCP SYN报文段的序号字段中。该报文段会被封装在一个IP数据报中,并发送给服务器。
  • 第二步:一旦包含TCP SYN报文段的IP数据报到达服务器主机,服务器会从该数据报中提取出 TCP SYN报文段,为该TCP连接分配TCP缓存和变量,并向该客户TCP发送允许连接的报文段。这个允许连接的报文段也不包含应用层数据。但是其首部却包含了3个重要信息,首先SYN比特被置为1,其次该报文段首部的确认号字段被设置为client_isn+1,最后,服务器选择自己的初始序号(server_isn),并将其放置到TCP报文段首部的序号字段中。该允许连接的报文段被称为SYNACK报文段
  • 第三步:在收到SYNACK报文段后,客户也要给该连接分配缓存和变量。客户主机则向服务器发送另外一个报文段;这最后一个报文段对服务器的允许连接的报文段进行了确认(该客户通过将值server_isn+1放置到TCP报文段首部的确认字段中来完成此项工作)。因为连接已经建立了,所以该SYN比特被置为0。该三次握手的第三个阶段可以在报文段负载中携带客户到服务器的数据

一旦完成这三个步骤,客户和服务器主机就可以相互发送包括数据的报文段了。在以后每一个报文段中,SYN比特都将被置为0。为了创建该连接,在两台主机之间发送了3个分组,故这种连接创建过程通常被称为3次握手。 

两次握手行不行?

是不行的。在第二步中,服务器将自己选择的初始序号发送给客户端,因此客户端要在第三步中向服务器确认此序号,可见两次握手是不够的;三次握手已经达到建立可靠连接的目的,更多次的握手就是多次重复确认,从效率来说无必要。

参与一条TCP连接的两个进程中的任何一个都能终止该进程。

当连接结束后,主机中的“资源”(缓存和变量)都会被释放。

关闭连接:假设某客户打算关闭连接,客户应用进程发出一个关闭连接命令。这会引起客户TCP向服务器进程发送一个特殊的TCP报文段。这个特殊的报文段让其首部中的一个标志位即FIN比特被设置为1,当服务器接收到该报文段后,就向发送方回送一个确认报文段。然后服务器发送它自己的终止报文段,其FIN比特被设置为1,最后该客户对这个服务器的终止报文段进行确认 ,此时,在两台主机上用于该连接的所有资源都被释放了。

 在一个TCP连接的生命周期内,运行在每台主机中的TCP协议在各种TCP状态之间变迁,下图说明了客户TCP会经历的一系列典型TCP状态

 下图是服务器端的TCP通常需要经历的一系列状态

3.6拥塞控制原理

 拥塞控制方法
  • 端到端拥塞控制。在端到端拥塞控制方法中,网络层没有为运输层拥塞控制提供显式支持。即使网络中存在拥塞,端系统也必须通过对网络行为的观察(如分组丢失与时延)来推断之。TCP采用端到端的方法解决拥塞控制,因为IP层不会向端系统提供有关网络拥塞的反馈信息。TCP报文段的丢失被认为是网络拥塞的一个迹象,TCP会相应地减小其窗口长度
  • 网络辅助的拥塞控制。路由器向发送方提供关于网络中拥塞状态的显式反馈信息。这种反馈可以简单地用一个比特来指示链路中的拥塞情况。 

直接反馈信息可以由网络路由器发给发送方,路由器标记或更新从发送方流向接收方的分组中的某个字段来指示拥塞的产生。 

3.7TCP拥塞控制

TCP为运行在不同主机上的两个进程之间提供了可靠传输服务,TCP的另一个关键部分就是其拥塞控制机制,TCP必须使用端到端拥塞控制而不是使用网络辅助的拥塞控制,因为IP层不向端系统提供显式的网络拥塞反馈。

TCP所采用的方法是让每一个发送方根据所感知到的网络拥塞程度来限制其能向连接发送流量的速率。

TCP发送方是如何限制向其连接发送流量的?

 TCP连接的每一端都是由一个接收缓存、一个发送缓存和几个变量组成。运行在发送方的TCP拥塞控制机制跟踪一个额外的变量,即拥塞窗口(congestion window),它对一个TCP发送方能向网络中发送流量的速率进行限制。在一个发送方中未被确认的数据量不会超过cwnd与rwnd中的最小值。

TCP发送方是如何感知它与目的地之间的路径上出现了拥塞的?

将一个TCP发送方的“丢包事件”定义为:要么出现超时,要么收到来自接收方的3个冗余ACK。当出现过度的拥塞时,再沿着这条路径上的一台(或多台)路由器的缓存会溢出,引起一个数据报(包含一个TCP报文段)被丢弃,丢弃的数据报接着会引起发送方的丢包事件,发送方就认为在发送方到接收方的路径上出现了拥塞的指示。

TCP使用确认来触发(或计时)增大它的拥塞窗口长度,TCP被说成是自计时的。

  • 一个丢失的报文段意味着拥塞,因此当丢失报文段时应当降低TCP发送方的速率
  • 一个确认报文段指示该网络正在向接收方交付发送方的报文段,因此,当对先前未确认报文段的确认到达时,能够增加发送方的速率。确认的到达被认为是一切顺利的隐含指示
  • 带宽探测。给定ACK指示源到目的地路径无拥塞,而丢包事件指示路径拥塞,TCP调节其传输速率的策略时增加其速率以相应到达的ACK,除非出现丢包事件,此时才减小传输速率 

TCP拥塞控制算法

该算法包括3个主要部分:①慢启动;②拥塞避免;③ 快速恢复

慢启动和拥塞避免是TCP的强制部分,两者的差异在于对收到的ACK做出反应时增加cwnd长度的方式。(慢启动比拥塞避免能更快地增加cwnd长度)

慢启动

 当一条TCP连接开始时,cwnd的值通常初始置为一个MSS的较小值,这就使得初始发送速率大约为MSS/RTT。对于TCP发送方而言,可用带宽可能比这个值大得多,TCP发送方希望迅速找到可用带宽的数量。因此在慢启动状态,cwnd的值以1个MSS开始并且每当传输的报文段首次被确认就增加一个MSS

如下图所示,TCP向网络发送第一个报文段并等待一个确认,当该确认到达时,TCP发送方将拥塞窗口增加一个MSS,并发送出两个最大长度的报文段。这两个报文段被确认,则发送方对每个确认报文段将拥塞窗口增加一个MSS,使得拥塞窗口变为4个MSS,就这样下去,这一过程每过一个RTT,发送速率就翻番。因此TCP发送速率起始慢,但在慢启动阶段是以指数增长

何时结束这种指数增长?

首先如果存在一个由超时指示的丢包事件(即拥塞),TCP发送方将cwnd设置为1并重新开始慢启动过程,它还将第二个状态变量的值ssthresh(“慢启动阈值”)设置为cwnd/2,即当检测到拥塞时将ssthresh置为拥塞窗口值的一半。慢启动结束的第二种方式是直接与ssthresh的值相关联,因为当检测到拥塞时ssthresh设为cwnd的值的一半,当达到或超过ssthresh的值时,继续使cwnd翻番可能有些鲁莽,因此当cwnd的值等于ssthresh时,结束慢启动并且TCP转移到拥塞避免模式,当进入拥塞避免模式时,TCP更为谨慎地增加cwnd。最后一种结束慢启动的方式是,如果检测到3个冗余ACK,这时TCP执行一种快速重传并进入快速恢复状态。

拥塞避免

一旦进入拥塞避免状态,cwnd的值大约是上次遇到拥塞时的值的一半,即距离拥塞可能不远!因此,TCP无法每过一个RTT再将cwnd的值翻番,而是采用一种较为保守的方法,每个RTT只将cwnd的值增加一个MSS

何时结束拥塞避免的线性增长呢(每RTT 1 MSS)?

当出现超时时,TCP的拥塞避免算法行为相同。与慢启动的情况一样,cwnd的值被设置为1个MSS,当丢包事件出现时,ssthresh的值被更新为cwnd值的一半。

然而前面讲过丢包事件也能由一个三个冗余ACK事件触发。在这种情况下,网络继续从发送方向接收方交付报文段。因此TCP对这种丢包事件的行为,相比于超时指示的丢包,应当不那么剧烈:TCP将cwnd的值减半,并且当收到3个冗余的ACK,将ssthresh的值记录为cwnd的值的一半,接下来进入快速恢复状态。

快速恢复 

 在快速恢复中,对于引起TCP进入快速恢复状态的缺失报文段,对收到的每个冗余的ACK,cwnd的值增加一个MSS。最终,当对丢失报文段的一个ACK到达时,TCP在降低cwnd后进入拥塞避免状态,如果出现超时事件,快速恢复在执行如同在慢启动和拥塞避免中相同的动作后,迁移到慢启动状态:当丢包事件出现时,cwnd的值被设置为1个MSS,并且ssthresh的值设置为cwnd值的一半

快速恢复是TCP推荐的而非必需的构件。

TCP拥塞控制:回顾

 忽略一条连接初始时的慢启动阶段,假定丢包由3个冗余的ACK而不是超时指示,TCP的拥塞控制是:每个RTT内线性(加性)增加1MSS,然后出现3个冗余ACK事件时cwnd减半(乘性减),因此,TCP拥塞控制常常被称为加性增、乘性减(Additive-Increase,Multiplicative-Decrease,AIMD)拥塞控制方式

 上图的“锯齿”行为很好地图示了前面TCP检测带宽时的直觉,即TCP线性地增加它的拥塞窗口长度(因此增加其传输速率),直到出现3个冗余ACK事件。然后以2个因子来减少它的拥塞窗口长度,然后又开始了线性增长,探测是否还有另外的可用带宽。

第四章、网络层:数据平面

本章将学习网络层是怎样实现主机到主机的通信服务的。与运输层和应用层不同的是,在网络中的每一台主机和路由器中都有一个网络层部分。 

网络层能被分解为两个相互作用的部分,即数据平面控制平面。这一章首先学习网络层的数据平面功能,即网络层中每台路由器的功能,该数据平面功能决定到达路由器输入链路之一的数据报(即网络层的分组)如何转发到该路由器的输出链路之一

4.1网络层概述

下图显示了一个简单网络,其中有H1和H2两台主机,在H1和H2之间的路径上有几台路由器。假设H1正在向H2发送信息,H1中的网络层取得来自于H1运输层的报文段,将每个报文段封装成一个数据报,然后向相邻路由器R1发送该数据报。在接收方H2,网络层接收来自相邻路由器R2的数据报,提取出运输层报文段,并将其向上交付给H2的运输层。每台路由器的数据平面的主要作用是从其输入链路向其输出链路 转发数据报;控制平面的主要作用是协调这些本地的每个路由器转发动作,使得数据报沿着源和目的地主机之间的路由器路径最终进行端到端传送

 转发和路由选择:数据平面和控制平面

网络层的作用从表面上看极为简单,即将分组从一台发送主机移动到一台接收主机。为此需要使用两种重要的网络层功能:

  • 转发。当一个分组到达某路由器的一条输入链路时,该路由器必须将该分组移动到适当的输出链路。转发是数据平面实现的唯一功能
  • 路由选择。当分组从发送方流向接收方时,网络层必须决定这些分组所采用的路由或路径。计算这些路径的算法被称为路由选择算法。 

转发是指将分组从一个输入链路接口转移到适当的输出链路接口的路由器本地动作;路由选择时指确定分组从源到目的地所采取的端到端路径的网络范围处理过程。每台网络路由器中有一个关键元素是它的转发表。 路由器检查到达分组首部的一个或多个字段值,进而使用这些首部值在其转发表中索引,通过这种方法来转发分组。这些值对应存储在转发表项中的值,指出了该分组将被转发的路由器的输出链路接口。

 控制平面:传统的方法

如上图所示,路由选择算法决定了插入该路由器转发表的内容,在这个例子中,路由选择算法运行在每台路由器中,并且在每台路由器中都包含转发和路由选择两种功能 (路由器中物理上存在的所有转发表的内容是由人类网络操作员直接配置的)

控制平面:SDN方法

使用上面的方法,每台路由器都有一个与其他路由器的路由选择组件通信的路由选择组件

下图显示了从路由器物理上分离的另一种方法,远程控制器计算和分发转发表以供每台路由器所使用,控制平面路由选择功能与物理的路由器是分离的,即路由选择设备仅执行转发,而远程控制器计算并分发转发表

 路由器和远程控制器是如何通信的?通过交换包含转发表和其他路由选择信息的报文,显示在上图中的控制平面方法是软件定义网络(Software-Defined Networking,SDN)的本质,因为计算转发表并与路由器交互的控制器是用软件实现的,故网络是“软件定义”的。

网络服务模型 

网络服务模型定义了分组在发送和接收端系统之间的端到端运输特性。 

网络层能提供的某些可能的服务:

  • 确保交付。该服务确保分组将最终到达目的地
  • 具有延时上界的确保交付。该服务不仅确保分组的交付,而且在特定的主机到主机时延上界内交付
  • 有序分组交付。该服务确保分组以它们发送的顺序到达目的地
  • 确保最小带宽。这种网络层服务模仿在发送和接收主机之间一条特定比特率的传输链路的行为。只要发送主机以低于特定比特的速率传输比特,则所有分组最终会交付到目的主机
  • 安全性。网络层能够在源加密所有数据报并在目的地解密这些分组,从而对所有运输层报文段提供机密性 

因特网的网络层提供了单一的服务,称为尽力而为服务。 

分组交换机是指一台通用分组交换设备,它根据分组首部字段中的值,从输入链路接口到输出链路接口转移分组。某些分组交换机称为链路层交换机,基于链路层帧中的字段值做出转发决定,这些交换机因此被称为链路层(第2层)设备,其他分组交换机称为路由器,基于网络层数据报中的首部字段值做出转发决定。 路由器因此是网络层(第3层)设备。

 4.2路由器工作原理

下图显示了一个通用路由器体系结构的总体视图,其中标识了一台路由器的4个组件

  • 输入端口。输入端口执行几项重要功能。它在路由器中执行终结入物理链路的物理层功能,它还要与位于入链路远端的数据链路层交互来执行数据链路层功能。在输入端口还要执行查找功能,这显示在输入端口最右侧的方框中,正是在这里,通过查询转发表决定路由器的输出端口,到达的分组通过路由器的交换结构转发到输出端口。这里的“端口”指的是路由器的物理输入和输出接口,不同于前面提到的网络应用程序和套接字相关联的软件端口。 
  • 交换结构。交换结构将路由器的输入端口连接到它的输出端口,这种交换结构完全包含在路由器之中,即它是一个网络路由器中的网络
  • 输出端口。输出端口存储从交换结构接收的分组,并通过执行必要的链路层和物理层功能在输出链路上传输这些分组
  • 路由选择处理器。路由选择处理器执行控制平面功能。在传统的路由器中,它执行路由选择协议,维护路由选择表与关联链路状态信息,并为该路由器计算转发表。在SDN路由器中,路由选择处理器负责与远程控制器通信,目的是接收由远程控制器计算的转发表项,并在该路由器的输入端口安装这些表项。
 输入端口处理和基于目的地转发

下图显示了一个更为详细的输入处理的视图。输入端口的线路端接功能与链路层处理实现了用于各个输入链路的物理层和链路层。在输入端口中执行的查找对于路由器运行是至关重要的,路由器使用转发表来查找输出端口,使得到达的分组能经过交换结构转发到该输出端口。转发表是由路由器选择处理计算和更新的(使用路由选择协议与其他网络路由器中的路由选择处理器进行交互),或者转发表接收来自远程的SDN控制器的内容。转发表从路由选择处理器经过独立总线复制到线路卡

 一个入分组基于该分组的目的地址交换到输出端口。路由器用分组目的地址的前缀与该表中的表项进行匹配,如果存在一个匹配项,则路由器向该匹配项相关联的链路转发分组,当有多个匹配时,该路由器使用最长前缀匹配规则

 交换

交换结构位于一台路由器的核心部位,通过这种交换结构,分组才能实际地从一个输入端口交换(转发)到一个输出端口中,交换可以用许多方式完成

  •  经内存交换。最简单、最早的路由器是传统的计算机,在输入端口与输出端口之间的交换是在CPU(路由选择处理器)的直接控制下完成的。输入与输出端口的功能就像在传统操作系统的I/O设备一样。一个分组到达一个输入端口时,该端口会先通过中断方式向路由选择处理器发出信号,于是该分组从输入端口处被复制到处理器内存中。路由选择处理器则从其首部中提取目的地址,再转发表中找到适当的输出端口,并将该分组复制到输出端口的缓存中。(每个分组穿过两次总线)
  • 经总线交换。输入端口经一根共享总线将分组直接传送到输出端口不需要路由选择处理器的干预。
  • 经互联网络交换。使用一个更复杂的网络克服单一、共享式总线带宽限制。纵横式交换机就是一种由2N条总线组成的互联网络,它连接N个输入端口与N个输出端口,如上图所示,每条垂直的总线在交叉点与每条水平的总线交叉,交叉点通过交换结构控制器能够在任何时候开启和关闭。纵横式交换机是非阻塞的。
输出端口处理 

 何时出现排队?

在输入端口和输出端口处都可以形成分组队列,排队的位置将取决于流量负载、交换结构的相对速率和线路速率。随着这些队列的增长,路由器的缓存空间最终会耗尽,并且当无内存可用于存储到达的分组时将会出现丢包。 

输入排队

如果交换结构不能快得(相对于输入线路速度而言)使所有到达分组无时延地通过它传送,就会在输入端口出现分组排队,因为到达的分组必须加入输入端口队列中,以等待通过交换结构传送到输出端口

下图显示了一个例子,其中在输入队列前端的两个分组(带深色阴影)要发往同一个右上角输出端口。假定该交换结构决定发送左上角队列前端的分组,此时左下角队列中的深色阴影分组必须等待,但不仅该分组要等待,左下角队列中排在该分组后面的浅色阴影分组也要等待,即使右中侧输出端口(浅色阴影分组的目的地)中无竞争。这种现象叫作输入排队交换机中的线路前部阻塞(Head-Of-the-Line,HOL) ,即在一个输入队列中排队的分组必须等待通过交换结构发送(即使输出端口是空闲的),因为它被位于线路前部的另一个分组所阻塞

 输出排队

在交换机的输出端口也会出现排队。

当没有足够的内存来缓存一个入分组时,就必须做出决定:要么丢弃到达的分组(采用一种称为弃尾的策略) ,要么删除一个或多个已排队的分组为新来的分组腾出空间。在某些情况下,在缓存填满之前便丢弃一个分组(或在其首部加上标记)的做法是有利的,这可以向发送方提供一个拥塞信号。已经提出和分析了许多分组丢弃与标记策略,这些策略统称为主动队列管理(Active Queue Management)。随机早期检测是得到最广泛研究和实现的AQM算法之一

下图图示了输出端口的排队情况。

在时刻t,每个入端输入端口都达到了一个分组,每个分组都是发往最上侧的输出端口。假定线路速度相同,交换机以3倍于线路速度的速度运行,一个单位时间(即接收或发送一个分组所需的时间)以后,所有三个初始分组都被传送到输出端口,并排队等待传输。在下一个单位时间中,这三个分组中的一个将通过输出链路发送出去 。在这个例子中,又有两个新分组已到达交换机的入端;这些分组之一要发往最上侧的输出端口。这样的后果是,输出端口的分组调度在这些排队分组中选择一个分组来传输

分组调度

现在讨论排队的分组如何经输出链路传输。

先进先出 

 上图显示了对于先进先出(First-In-First-Out,FIFO)链路规则的排队模型的抽象。

如果链路当前正忙于传输另一个分组,到达链路输出队列的分组要排队等待传输。如果没有足够的缓存空间来容纳到达的分组,队列的分组丢弃策略则确定该分组是否将被丢弃(丢失)或者从队列中去除其他分组以便为到达的分组腾出空间

优先权排队 

 在优先权排队规则下,到达输出链路的分组被分类放入输出队列中的优先权类,如下图所示

网络操作员可以配置一个队列,这样携带网络管理信息的分组获得超过用户流量的优先权。每个优先权类都有自己的队列,当选择一个分组传输时,优先权排队规则将从队列非空的最高优先权类中传输一个分组。在同一优先权类的分组之间的选择通常以FIFO方式完成

下图描述了有两个优先权类的一个优先权队列的操作。分组1,3,4属于高优先权类,分组2,5属于低优先权类。分组1到达并发现链路是空闲的,就开始传输。在分组1的传输过程中,分组2和分组3到达,并分别在低优先权和高优先权队列中排队。在传输完分组1后,分组3(一个高优先级的分组)被选择在分组2(尽管它到达的早,但是它是一个低优先权分组)之前传输。在分组3的传输结束后,分组2开始传输。分组4(一个高优先权分组)在分组2(一个低优先权分组)的传输过程中到达。在非抢占式优先权排队规则下,一旦分组开始传输,就不能打断。在这种情况下,分组4排队等待传输,并在分组2传输完成之后开始传输

循环和加权公平排队 

在循环排队规则下,分组像使用优先权排队那样被分类。然而在类间不存在严格的优先服务权,循环调度器在这些类之间轮流提供服务。

4.3网际协议:IPv4、寻址、IPv6 

IPv4数据报格式 

 网络层分组被称为数据报,IPv4数据报中的关键字段如下:

  • 版本号。这4比特规定了数据报的IP协议版本。通过查看版本号,路由器能够确定如何解释IP数据报的剩余部分。不同IP版本使用不同的数据报格式
  • 首部长度。因为一个IPv4数据报可包含一些可变数量的选项(这些选项包括在IPv4数据报首部中),因此需要这4比特来确定IP数据报中载荷实际开始的地方。大多数IP数据报不包含选项,所以一般的IP数据报具有20字节的首部
  • 服务类型。服务类型(TOS)比特包含在IPv4首部中,以便使不同类型的IP数据报能相互区别开来
  • 数据报长度。这是IP数据报的总长度(首部加上数据),以字节为单位。因为该字段长为16比特,所以IP数据报的理论最大长度为65535字节。
  • 标识、标志、片偏移。这三个字段与所谓IP分片有关,新版本的IPv6不允许在路由器上对分组分片
  • 寿命。寿命(Time-To-Live,TTL)字段用来确保数据报不会永远在网络中循环。每当一台路由器处理数据报时,该字段的值减1。若TTL字段减为0,则该数据报必须丢弃
  • 协议。该字段通常仅当一个IP数据报到达其最终目的地时才会有用。该字段值指示了IP数据报的数据部分应交给哪个特定的运输层协议。IP数据报中的协议号所起的作用类似于运输层报文段中端口号字段所起的作用。协议号是将网络层与运输层绑定在一起的粘合剂,而端口号是将运输层和应用层绑定到一起的粘合剂
  • 首部检验和。首部检验和用于帮助路由器检测收到的IP数据报中的比特错误。
  • 源和目的IP地址。当某源生成一个数据报时,它在源IP字段中插入它的IP地址,在目的IP地址中插入其最终目的地址。通常源主机通过DNS查找来决定目的地址
  • 选项。选项字段允许IP首部被扩展,IPv6去掉了IP选项
  • 数据(有效载荷)。该字段包含要交付给目的地的运输层报文段

一个IP数据报有总长为20字节的首部(假设无选项)。如果数据报承载一个TCP报文段,则每个(无分片的)数据报共承载了总长40字节的首部(20字节的IP首部加上20字节的TCP首部)以及应用层报文 

IPv4数据报分片 

并不是所有链路层协议都能承载相同长度的网络层分组。有的协议能承载大数据报,而有的协议只能承载小分组。一个链路层帧能承载的最大数据量叫做最大传送单元(Maxiumum Transmission Unit,MTU),因为每个IP数据报封装在链路层帧中从一台路由器传输到下一台路由器,故链路层协议的MTU严格地限制着IP数据报的长度

假设你从某条链路收到一个IP数据报,通过检查转发表确定出链路,并且该条出链路的MTU比该IP数据报的长度要小,如何将这个过大的IP分组挤进链路层帧的有效载荷字段?解决该问题的方法是将IP数据报中的数据分片成两个或多个较小的IP数据报,用单独的链路层帧封装这些较小的IP数据报,然后通过输出链路发送这些帧。每个这些较小的数据报都称为(fragment) 

片在其到达目的地运输层以前需要重新组装。TCP与UDP都希望从网络层中收到完整的、未分片的报文,IPv4的设计者决定将数据报的重新组装工作放到端系统中,而不是放到网络层路由器中

当一台目的主机从相同源收到一系列数据报时,它需要确定这些数据报中的某些是否是一些原来较大的数据报的片。如果是片的话,则它必须进一步确定何时收到了最后一片,并且如何将这些收到的片拼接到一起形成初始的数据报。为了让目的主机执行这些重组任务,IPv4的设计者将标识、标志和片偏移字段放在IP数据报首部中。当生成一个数据报时,发送主机在为该数据报设置源和目的地址的同时贴上标识号。发送主机通常将它发送的每个数据报的标识号加1.当某路由器需要对一个数据报分片时,形成的每个数据报(即片)具有初始数据报的源地址、目的地址与标识号。

IPv4编址 

一台主机通常只有一条链路连接到网络;当主机中的IP想发送一个数据报时,它就在该链路上发送。主机与物理链路之间的边界叫做接口。 一台路由器有多个接口,每个接口有其链路,因为每台主机与路由器都能发送和接收IP数据报,IP要求每台主机和路由器接口拥有自己的IP地址。

每个IP地址长度为32比特(4字节),因此总共有2^32个可能的IP地址。这些地址通常按所谓点分十进制记法书写,即地址中的每个字节用它的十进制形式书写,各字节间以句点隔开(如IP地址193.32.216.9,193是该地址的第一个8比特的十进制等价数,32是该地址的第二个8比特的十进制等价数,以此类推,因此193.32.216.9的二进制记法是:11000001 00100000 11011000 00001001),在全球因特网中的每台主机和路由器上的每个接口,都必须有一个全球唯一的IP地址

下图是一个IP编址与接口的例子

 一台路由器(具有3个接口)用于互联7台主机。图中左上侧3台主机以及它们连接的路由器接口,都有一个形如223.1.1.xxx的IP地址,这就是说在它们的IP地址中,最左侧的24比特是相同的。用IP的术语来说,互联这3个主机接口与1个路由器接口的网络形成一个子网(或者叫IP网络或直接叫网络)。IP编址为这个子网分配一个地址223.1.1.0/24,其中的/24记法有时称为子网掩码,指示32比特中的最左侧24比特定义了子网地址。

因此子网223.1.1.0/24由3个主机接口(223.1.1.1,223.1.1.2,223.1.1.3)和一个路由器接口223.1.1.4组成。任何其他要连到223.1.1.0/24网络的主机都要求其地址具有223.1.1.xxx的形式

下图显示了图4-18中的3个IP网络:223.1.1.0/24网络,223.1.2.0/24网络与223.1.3.0/24子网

 为了确定子网,分开主机和路由器的每个接口,产生几个隔离的网络岛,使用接口端接这些隔离的网络的端点。这些隔离的网络中的每一个都叫做一个子网

因特网地址分配策略被称为无类别域间路由选择(Classless Interdomain Routing,CIDR),CIDR 将子网寻址的概念一般化了,当使用子网寻址时,32比特的IP地址被划分为两部分,并且也具有点分十进制数形式a.b.c.d/x,其中x指示了地址的第一部分中的比特数。该形式的地址的x最高比特构成了IP地址的网络部分,并且经常被称为该地址的前缀。一个组织通常被分配一块连续的地址,即具有相同前缀的一段地址,该组织内部的设备的IP地址将共享共同的前缀。剩余的32-x比特可认为是用于区分该组织内部设备的

IP广播地址255.255.255.255。当一台主机发出一个目的地址为255.255.255.255的数据报时,该报文会交付给同一个网络中的所有主机。

 IPv6

 由于新的子网和IP节点增加,32比特的IP地址空间即将被用尽,为了应对这种大IP地址空间的需求,开发了一种新的IP协议,即IPv6

IPv6数据报格式

IPv6数据报格式如下

IPv6中引入的最重要的变化显示在其数据报格式中

  • 扩大的地址容量。IPv6将IP地址长度从32比特增加到128比特,除了单播地址与多播地址外,IPv6还引入了一种称为任播地址的新型地址,这种地址可以使数据报交付给一组主机中的任意一个。
  •  简化高效的40字节首部
  • 流标签。IPv6有一个定义。该字段可用于“给属于特殊流的分组加上标签,这些特殊流是发送方要求进行特殊处理的流,如一种非默认服务质量或需要实时服务的流”

以下是在IPv6中定义的字段

  • 版本。该4比特字段用于标识IP版本号
  • 流量类型。该8比特字段与我们在IPv4中看到的TOS字段的含义相似
  • 流标签。该20比特的字段用于标识一条数据报的流,能够对一条流中的某些数据报给出优先权
  • 有效载荷长度。该16比特值作为一个无符号整数,给出IPv6数据报中跟在定长的40字节数据报首部后面的字节数量
  • 下一个首部。该字段标识数据报中的内容(数据字段)需要交付给哪个协议(如TCP或UDP)
  • 跳限制。转发数据报的每台路由器将对该字段的内容减1.如果跳限制计数达到0,则该数据报将被丢弃
  • 源地址和目的地址。
  • 数据。就是有效载荷部分,当数据报到达目的地时,该有效载荷就从IP数据报中移出,并交给在下一个首部字段中指定的协议处理

IPv4中存在但IPv6中不存在的:

  • 分片/重新组装。IPv6不允许在中间路由器上进行分片与重新组装。这种操作只能在源与目的地执行
  • 首部检验和。
  • 选项。选项字段并没有消失,而是可能出现在IPv6首部中由“下一个首部”指出的位置。

第五章、网络层:控制平面 

控制平面作为一种网络范围的逻辑,不仅控制着从源主机到目的主机的端到端路径间的路由器如何转发数据报,而且控制网络层组件和服务如何配置和管理

5.1概述

转发表(在基于目的地转发的场景中)和流表(在通用转发的场景中)是链接网络层的数据平面和控制平面的首要元素

前面我们已经知道他们是如何计算、维护和安装的

  • 每路由器控制。图5-1显示了在每台路由器中运行一种路由选择算法的情况,每台路由器中都包含转发和路由选择功能。每台路由器有一个路由选择组件,用于与其他路由器中的路由选择组件通信,以计算其转发表的值
  • 逻辑集中式控制。图5-2显示了逻辑集中式控制器计算并分发以供每台路由器使用的情况 

该控制器经一种良好的协议与每台路由器中的一个控制代理(CA)进行交互,以配置和管理该路由器的转发表。CA一般具有最少的功能,其任务是与控制器通信并且按控制器指令行事,与图5-1中的路由选择算法不同,这些CA既不能直接相互交互,也不能主动参与计算转发表。这是每路由器控制和逻辑集中式控制之间的关键差异。 

 5.2路由选择算法

路由选择算法(routing algorithm),其目的是从发送方到接收方的过程中确定一条通过路由器网络的好的路径(等价于路由) ,通常一条好的路径指具有最低开销的路径。

可以用图来形式化描述路由选择问题。(graph)G=(N,E)是一个N个节点和E条边的集合,其中每条边是取自N的一对节点。在网络层路由选择的环境中,图中的节点表示路由器,这是做出分组转发决定的点;连接这些节点的边表示这些路由器之间的物理链路,如下图

一条边还有一个值表示阿德开销。通常,一条边的开销可反映出对应链路的物理长度,它的链路速度等

对于E中的任一条边(x,y),用c(x,y)表示节点x和y之间的开销。如果节点对(x,y)不属于E,则置c(x,y)=正无穷大,同时假设c(x,y)=c(y,x),如果(x,y)属于E,节点y也被称为节点x的邻居 

所谓的最低开销路径就是:找出源和目的地之间具有最低开销的一条路,也就是最短路径

路由选择算法的一种分类方式是根据该算法是集中式还是分散式来划分

  • 集中式路由选择算法用完整的、全局性的网络知识计算出从源到目的地之间的最低开销路径。即该算法以所有节点之间的连通性及所有链路的开销为输入。具有全局状态信息的算法被称作链路状态(Link State,LS)算法,因此该算法必须知道网络中每条链路的开销 
  • 分散式路由选择算法。路由器以迭代、分布式的方式计算出最低开销路径。没有节点拥有关于所有网络链路开销的完整信息,相反每个节点仅有与其直接相连链路的开销知识即可开始工作,然后,通过迭代计算过程以及与相邻节点的信息交换,一个节点逐渐计算出到达某目的节点或一组目的节点的最低开销路径
链路状态路由选择算法 

在链路状态算法中,网络拓扑和所有的链路开销都是已知的,可用作LS算法的输入。实践中这是通过让每个节点向网络中所有其他节点广播链路状态分组来完成的,其中每个链路状态分组包含它所连接的链路的标识和开销,经常由链路状态广播算法来完成。 节点广播的结果是所有节点都具有该网络的统一、完整的视图,于是每个节点都能像其他节点一样,运行LS算法并计算出相同的最低开销路径集合

下面给出的链路状态路由选择算法叫做Dijkstra算法,该算法计算从某节点(源节点,称之为u)到网络中其他节点的最低开销路径,定义下列记号

  • D(v):到算法的本次迭代,从源节点到目的节点v的最低开销路径的开销
  • p(v):从源到v沿着当前最低开销路径的前一节点(v的邻居)
  • N':节点子集;如果从源到v的最低开销路径已确知,v在N'中

当LS算法终止时,对于每个节点,我们都得到从源节点沿着它的最低开销路径的前一节点。对于每个前一节点,我们又有它的前一节点,以此方式我们可以构建从源节点到所有目的节点的完整路径

下图显示了对图5-3的网络产生的最低开销路径和u中的转发表

 距离向量路由选择算法

距离向量(Distance -Vector,DV)算法是一种迭代的、异步的和分布式的算法,而LS算法是一种使用全局信息的算法。 

分布式,是因为每个节点都要从一个或多个直接相连邻居接收某些信息,执行计算,然后将其计算结果分发给邻居;

迭代的,是因为此过程要一直持续到邻居之间无更多信息要交换为止

异步的,是因为它不要求所有节点相互之间步伐一致地操作

 

 下图举例说明DV算法的运行

最左边一列显示这3个节点各自的初始路由选择表。 位于左上角的是节点x的初始路由选择表。在一张特定的路由选择表中每行是一个距离向量——特别是每个节点的路由选择表包括了它的距离向量和它的每个邻居的距离向量。该表的第二和第三行是最近分别从节点y和节点z收到的距离向量,因为在初始化时节点x还没有从节点y和z收到任何东西,所以第二行和第三行表项被初始化为无穷大。

初始化后,每个节点向它的两个邻居发送其距离向量。从邻居接受更新距离向量、重新计算路由选择表项和通知邻居到达目的地的最低开销路径的开销已经变化的过程继续下去。

DV和LS算法采用互补的方法来解决路由选择计算问题。在DV算法中,每个节点仅与它的直接相连的邻居交谈,但它为其邻居提供了从它自己到网络中(它所知道的)所有其他节点的最低开销估计。LS算法需要全局信息。

5.4ISP之间的路由选择:BGP

 自治系统(Autonomous System,AS)由一组通常处在相同管理机制下的路由器组成,通常在一个ISP中的路由器以及互联它们的链路构成一个AS,当在相同AS内的源和目的地之间进行分组选路时,分组遵循的路径完全由AS内路由选择协议所决定,然而当分组跨越多个AS进行路由时,需要一个自治系统间路由选择协议,因为AS间路由选择协议涉及多个AS之间的协调,所以AS通信必须运行相同的AS间路由选择协议。在因特网中,所有AS运行相同的AS间路由选择协议,该协议称为边界网关协议(Broder Gateway Protocol,BGP),这个协议将因特网中数以千计的ISP粘合起来。

BGP的作用

 每台路由器具有一张转发表,该转发表在将到达分组转发到路由器链路的过程中起着主要作用。对于位于相同AS中的目的地而言,在路由器转发表中的表项由AS内部路由选择协议所决定;对于该AS外部的目的地而言则依靠BGP

在BGP中,分组并不是路由到一个特定的目的地址,相反是路由到CIDR化的前缀,其中每个前缀表示一个子网或一个子网的集合;作为一种AS间的路由选择协议,BGP为每台路由器提供了一种完成以下任务的手段:

(1)从邻居AS获得前缀的可达性信息。BGP允许每个子网向因特网的其余部分通告它的存在,同时BGP确保在因特网中的所有AS知道该子网

(2)确定到该前缀的“最好的”路由。一台路由器可能知道两条或更多条到特定前缀的不同路由。为了确定最好的路由,该路由器将本地运行一个BGP路由选择过程(使用它经过相邻的路由器获得的前缀可达性信息)

接下来分别来看这两个任务是如何实现的

通告BGP路由信息

如下图所示有3个自治系统:AS1,AS2,AS3,AS3包括一个具有前缀x的子网,对于每个AS,每台路由器要么是一台网关路由器,要么是一台内部路由器。网关路由器是一台位于AS边缘的路由器,它直接连接到其他AS中的一台或多台路由器,内部路由器仅连接在它自己AS内的主机和路由器。

 考虑这样一个任务:向上图所示的所有路由器通告对于前缀x的可达性信息。在宏观上这是很简明的,AS3向AS2通告,AS2再向AS1通告。(这样忽略了自治系统内部相互发送报文)

在BGP中,每对路由器通过使用179端口的半永久TCP连接交换路由选择信息。每条直接连接以及所有通过该连接发送的BGP报文,称为BGP连接。此外跨越两个AS的BGP连接称为外部BGP(eBGP)连接,而在相同AS中的两台路由器之间的BGP会话称为内部BGP(iBGP)

为了传播可达性信息,使用eBGP和iBGP会话。现在考虑我们的任务?在这个过程中,

  • 网关路由器3a先向网关路由器2c发送一个eBGP报文"AS3 x";
  • 网关路由器2c然后向AS2中的所有其他路由器发送iBGP报文"AS3 x";
  • 网关路由器2a向网关路由器1c发送一个eBGP报文"AS2 AS3 x";
  • 最后,网关路由器1c使用iBGP向AS1中的所有路由器发送报文段"AS2 AS3 x"

在完成这个过程后,在AS1和AS2中的每个路由器都知道了x的存在并且也知道了通往x的AS路径

确定最好的路由 

 从一个给定的路由器到一个目的子网可能有多条路径,那一台路由器如何在这些路径之间进行选择(并且再相应地配置它的转发表)?

引入几个BGP术语。

当路由器通过BGP连接通告前缀时,它在前缀中包括一些BGP属性。前缀及其属性称为路由。两个较为重要的属性是AS-PATH和NEXT-HOP。

AS-PATH属性包含了通告已经通过的AS的列表。BGP路由器还使用AS-PATH属性来检测和防止通告环路,(如果一台路由器在路径列表中看到包含了它自己的AS,它将拒绝该通告)

NEXT-HOP是AS-PATH起始的路由器接口的IP地址

 如上图所示,对于从AS1通过AS2到x的路由器“AS2 AS3 x”,其属性NEXT-HOP是路由器2a左边接口的IP地址;对于从AS1绕过AS2到x的路由“AS3 x”,其NEXT-HOP属性是路由器3d最左边接口的IP地址。总的来说,AS1中的每台路由器都知道了到前缀x的两台BGP路由:

路由器2a的最左侧接口的IP地址:AS2 AS3;x

路由器3d的最左侧接口的IP地址:AS3;x

热土豆路由选择

热土豆路由选择(hot potato routing) 的思想是:对于某一路由器,尽可能快地将分组送出其AS(用可能的最低开销),而不担心其AS外部到目的地的余下部分的开销。【所谓热土豆就是烫手的热土豆,因为它烫手,你要尽可能快地将它传给另一个人】(减小在自己AS中的开销,而忽略在其他AS中的开销,可以理解为局部最优)

 路由器选择算法

在实践中,BGP使用了一种比热土豆路由选择更为复杂但却结合了其特点的算法。对于任何给定的目的地前缀,进入BGP的路由选择算法的输入是到某前缀的所有路由的集合,该前缀是已被路由器学习和接受的。(如果仅有一条这样的路由,那就选择该路由;如果到相同的前缀有两条或多条路由,则顺序地调用下列规则直到余下一条路由):

(1)路由被指派一个本地偏好值作为其属性之一(除了AS-PATH和NEXT-HOP以外)。一条路由的本地偏好可能由该路由器设置或可能由在相同AS中的另一台路由器学习到。本地偏好属性的值是一种策略决定,具有最高本地偏好值的路由将被选择。

(2)从余下的路由中(所有都具有相同的最高本地偏好值),将选择具有最短AS-PATH的路由。如果该规则是路由选择的唯一规则,则BGP将使用距离向量算法决定路径,其中距离测度使用AS跳而不是路由器跳的跳数。

(3)从余下的路由中(所有都具有相同的最高本地偏好值和相同的AS-PATH长度),使用热土豆路由选择,即选择具有最靠近NEXT-HOP路由器的路由。

(4)如果仍留下多条路由,该路由器使用BGP标识符来选择路由。

IP任播

除了作为因特网的AS间路由选择协议外,BGP还常被用于实现IP任播服务,该服务通常用于DNS中。

5.5SDN控制平面

 SDN体系结构有4个关键特征:

  • 基于流的转发。SDN控制的交换机的分组转发工作,能够基于运输层、网络层或链路层首部中任意数量的首部字段值进行。SDN控制平面的工作是计算、管理和安装所有网络交换机中的流表项
  • 数据平面与控制平面分离。数据平面由网络交换机组成,交换机是相对简单(但快速)的设备,该设备在它们的流表中执行“匹配加动作”的规则。控制平面由服务器以及决定和管理交换机流表的软件组成
  • 网路控制功能。位于数据平面交换机外部。控制平面自身由两个组件组成:一个SDN控制器(或网络操作系统)以及若干网络控制应用程序。控制器维护准确的网络状态信息(如远程链路、交换机和主机的状态);为运行在控制平面中的网络控制应用程序提供这些信息;提供方法,这些应用程序通过这些方法能够监视、编程和控制下面的网络设备
  • 通过运行在控制平面中的网络控制应用程序,该网络是可编程的。

5.6ICMP:因特网控制报文协议

 主机和路由器彼此沟通网络层的信息。ICMP最典型的用途是差错报告。ICMP通常被认为是IP的一部分,但从体系结构上讲它位于IP之上,因为ICMP报文是承载在IP分组中的。

ICMP报文有一个类型字段和一个编码字段,并且包含引起该ICMP报文首次生成的IP数据报的首部和前8个字节,下图显示了所选的ICMP报文类型

第六章、链路层和局域网

 6.1链路层概述

将运行链路层协议的任何设备均称为节点(node)。节点包括主机、路由器、交换机和WiFi接入点。把沿着通信路径连接相邻节点的通信信道称为链路(link)。为了将一个数据报从源主机传输到目的主机,数据报必须通过沿端到端路径上的各段链路传输。

链路层提供的服务

任一链路层的基本服务都是将数据报通过单一通信链路从一个节点移动到相邻节点,但所提供的服务细节能够随着链路层协议的不同而变化。链路层协议能够提供的可能服务包括:

  • 成帧。在每个网络层数据报经链路传送之前,几乎所有的链路层协议都要将其用链路层帧封装起来,一个帧由一个数据字段和若干首部字段组成,其中网络层数据报就插在数据字段中。
  • 链路接入。媒体访问控制(Medium Access Control,MAC)协议规定了帧在链路上传输的规则。无论何时链路空闲,发送方都能够发送帧。
  • 可靠交付。当链路层协议提供可靠交付服务时,它保证无差错地经链路层移动每个网络层数据报。链路层的可靠交付服务通常是通过确认和重传取得的。
  • 差错检测和纠正。通过让发送节点在帧中包括差错检测比特,让接收节点进行差错检查。
链路层在何处实现 

下图显示了一个典型的主机体系结构。链路层的主体部分是在网络适配器中实现的, 网络适配器也称为网络接口卡(Network Interface Card,NIC)。位于网络适配器核心的是链路层控制器,该控制器通常是一个实现了许多链路层服务的专用芯片,(链路层控制器的许多功能是用硬件实现的)

 在发送端,控制器取得了由协议栈较高层生成并存储在主机内存中的数据报,在链路层帧中封装该数据报(填写该帧的各个字段),然后遵守链路接入协议将该帧传进通信链路中。在接收端,控制器接收了整个帧,抽取出网络层数据报。

尽管大部分链路层都是在硬件中实现的,但部分链路层是在运行于主机CPU上的软件中实现的。链路层的软件组件实现了高层链路层功能。链路层是硬件和软件的结合体。

6.2差错检测和纠正技术

前面我们提到了比特级差错检测和纠正, 即对从一个节点发送到另一个物理上连接的邻近节点的链路层帧中的比特损伤进行检测和纠正。

下图是我们研究的场景,

 在发送节点,为了保护比特免受差错,使用差错检测和纠正比特(Error-Detection and Correction,EDC)来增强数据D。通常,要保护的数据不仅包括从网络层传递下来需要通过链路传输的数据报,而且包括链路帧首部中的链路级的寻址信息、序号和其他字段。链路级帧中的D和EDC都被发送到接收节点,在接收节点,接收到比特序列D'和EDC',D'和EDC'可能与初始的D和EDC不同。

我们现在研究在传输数据中检测差错的3种技术:奇偶校验(它用来描述差错检测和纠正背后隐含的基本思想)、检验和方法(通常更多地应用于运输层)和循环冗余检测(通常更多地应用在适配器中的链路层)

奇偶校验

差错检测最简单的方式就是用单个奇偶校验位。 假设在下图中要发送的信息D有d比特。在偶校验方案种,发送方只需要包含一个附加的比特,使得这d+1比特(初始信息加上一个校验比特)中1的总数是偶数,(对于奇校验方案,选择校验比特值使得有奇数个1)。下图描述了一个偶校验的方案,单个校验比特被存放在一个单独的字段

 采用单个奇偶校验位方式,接收方的操作也很简单,接收方只需要数一数接收的d+1比特中1的个数,

如果接收方发现了奇数个值为1的比特,接收方知道至少出现了一个比特差错(奇数个比特差错)

如果出现了偶数个比特差错,这将导致一个未检出的差错。这样是不够的,需要一个更健壮的差错检测方案

下图显示了单比特奇偶校验方案的二维一般化方案。这里的D中的d个比特被划分为i行j列。对每行和每列计算奇偶值。产生的i+j+1奇偶比特构成了链路层帧的产错检测比特

 现在假设在初始d比特信息中出现了单个比特差错,使用这种二维奇偶校验方案,包含比特值改变的行和列的校验值都将会出现差错,因此接收方不仅可以检测到出现了单个比特差错的事实,而且还可以利用存在奇偶校验差错的列和行的索引来实际识别发生差错的比特并纠正它。

接收方检测和纠正差错的能力被称为前向纠正(Forward Error Correction,FEC)。

检验和方法

在检验和技术中,图6-4中的d比特数据被作为一个k比特整数的序列处理。一个简单检验和方法就是将这k比特整数加起来,并用得到的和作为差错检测比特。检验和方法需要相对小的分组开销。

循环冗余检测

计算机网络中广泛应用的差错检测技术基于循环冗余检测(Cyclic Redundancy Check,CRC)编码 。CRC编码也称为多项式编码,因为该编码能够将要发送的比特串看作为系数是0和1的一个多项式,对比特串的操作被解释为多项式算术。

CRC编码操作如下。

考虑d比特的数据D,发送节点要将它发送给接收节点,发送方和接收方首先必须协商一个r+1比特模式,称为生成多项式,将其表示为G,要求G的最高有效位比特(最左边)是1。CRC编码的关键思想如下图所示

 对于一个给定的数据段D,发送方要选择r个附加比特R,并将它们附加到D上,使得得到的d+r比特模式(被解释为一个二进制数)用模2算术恰好能被G整除

用CRC进行差错检测的过程很简单:接收方用G去除接收到的d+r比特,如果余数非0,接收方知道出现了差错,否则认为数据正确而被接收

(模2算术,乘法和除法与在二进制中是相同的,在加法中不进位,在减法中不借位,加法和减法等价于操作数的按位异或(XOR))

那么发送方如何计算R?对于n,R需要满足D*2^r XOR R=nG,也就是说需要选择R使得G能够除以D*2^r XOR R而没有余数。对上式等式的两边都用R异或将得到D*2=nG XOR R,这个等式告诉我们,如果用G来除D*2^r,余数值刚好是R。可以这样计算R

R=remainder(D*2^r/G)

6.3多路访问链路和协议

前面提到了两种类型的网络链路:点对点链路和广播链路。点对点链路由链路一端的单个发送方和链路另一端的单个接收方组成。广播链路能够让多个发送和接收节点都连接到相同的、单一的、共享的广播信道上。

如何协调多个发送和接收节点对一个共享广播信道的访问?即就是多路访问问题。

传统的电视是一种一个方向的广播(即一个固定的节点向许多接收节点传输),而计算机网络广播信道上的节点既能够发送也能够接收。计算机网络的多路访问协议来规范它们在共享的广播信道上的传输行为。

因为所有的节点都能够传输帧,所以多个节点可能会同时传输帧。当发生这种情况时,所有节点同时接到多个帧,这就是说,传输的帧在所有的接收方处碰撞。通常当碰撞发生时,没有一个接收节点能够有效地获得任何传输的帧,在碰撞时间间隔中的广播信道被浪费了。为确保广播信道执行有用的工作,以某种方式协调活跃节点的传输是必要的,这种协调由多路访问协议负责:信道划分协议,随机接入协议,轮流协议

信道划分协议 

 时分多路复用(TDM)和频分多路复用(FDM)是两种能够用于在所有共享信道节点之间划分广播信道带宽的技术

假设一个支持N个节点的信道且信道的传输速率为Rbps。TDM将时间划分为时间帧(time frame),并进一步划分每个时间帧为N个时隙。然后把每个时隙分配给N个节点中的一个,无论何时某个节点在有分组要发送的时候,它在循环的TDM帧中指派给它的时隙内传输分组比特(通常选择的时隙长度应使一个时隙内能够传输单个分组)

TDM消除了碰撞而且非常公平:每个节点在每个帧时间内得到了专用的传输速率R/N bps。

然而也有两个主要缺陷,首先节点被限制于R/N bps的平均速率,即使当它是唯一有分组要发送的节点时。其次,节点必须总是等待它在传输序列中的轮次,即使它是唯一一个有帧要发送的节点。

TDM在时间上共享广播信道,而FDM将R bps信道划分为不同的频段(每个频段具有R/N带宽),并把每个频率分配给N个节点中的一个,FDM的主要缺点是限制一个节点只能使用R/N的带宽。

第三种信道划分协议是码分多址(Code Division Multiple Access,CDMA)。TDM和FDM分别为节点分配时隙和频率,而CDMA对每个节点分配一种不同的编码。然后每个节点用它唯一的编码来对它发送的数据进行编码。

随机接入协议 

在随机接入协议中,一个传输节点总是以信道的全部速率(即R bps)进行发送。当有碰撞时,涉及碰撞的每个节点反复地重发它的帧(也就是分组),到该帧无碰撞地通过为止。但是当一个节点经历一次碰撞时,它不必立刻重发该帧。相反,它在重发该帧之前等待一个随机时延。 涉及碰撞的每个节点独立地选择随机时延。

常用的随机接入协议:ALOHA协议和载波侦听多路访问(CSMA)协议

时隙ALOHA

假设

  • 所有帧由L比特组成
  • 时间被划分为长度L/R秒的时隙(即一个时隙等于传输一帧的时间)
  • 节点只在时隙起点开始传输帧
  • 节点是同步的,每个节点都知道时隙何时开始
  • 如果在一个时隙中有两个或多个帧碰撞,则所有节点在该时隙结束之前检测到该碰撞事件

p是一个概率,在每个节点中,时隙ALOHA的操作是简单的:

  • 当节点有一个新帧要发送时,它等到下一个时隙开始并在该时隙传输整个帧
  • 如果没有碰撞,该节点成功地传输它的帧,从而不需要考虑重传该帧
  • 如果有碰撞,该节点在时隙结束之前检测到这次碰撞。该节点以概率p在后续的每个时隙中重传它的帧,直到该帧被无碰撞地传输出去 

与信道划分不同,当某节点是唯一活跃的节点时(一个节点如果有帧要发送就认为它是活跃的),时隙ALOHA允许该节点以全速R连续传输,时隙ALOHA也是高度分散的,因为每个节点检测碰撞并独立地决定什么时候重传。

当有多个活跃节点时,一部分时隙将有碰撞,因此将被“浪费”掉了;时隙的另一部分将是 空闲的,因为所有活跃节点由于概率传输策略会节制传输。

唯一“未浪费的”时隙是那些刚好有一个节点传输的时隙,称为成功时隙。时隙多路访问协议的效率定义为:当有大量的活跃节点且每个节点总有大量的帧要发送时,长期运行中成功时隙的份额。

 当有N个活跃节点时,时隙ALOHA的效率是Np(1-p)^(N-1)。该协议的最大效率为1/e

ALOHA

时隙ALOHA协议要求所有的节点同步它们的传输,以在每个时隙开始时开始传输。

第一个ALOHA协议实际上是一个非时隙、完全分散的协议。在纯ALOHA中,当一帧首次到达(即一个网络层数据报在发送节点从网络层传递下来),节点立刻将该帧完整地传输进广播信道。如果一个传输的帧与一个或多个传输经历了碰撞,这个节点将立即(在完全传输完它的碰撞帧之后)以概率p传输该帧。否则该节点等待一个帧传输时间。纯ALOHA协议的最大效率为1/2e,是时隙ALOHA的一半

载波侦听多路访问(CSMA)  

在时隙和纯ALOHA中,一个节点传输的决定独立于连接到这个广播信道上的其他节点的活动。特别是一个节点不关心在它开始传输时是否有其他节点碰巧在传输,而且即使有另一个节点开始干扰它的传输也不会停止传输。

  • 载波侦听。即一个节点在传输前先听信道。如果来自另一个节点帧正向信道上发送,节点则等待直到检测到一小段事件没有传输,然后开始传输
  • 碰撞检测。当一个传输节点在传输时一直在侦听此信道。如果它检测到另一个节点正在传输干扰帧,它就停止传输,在重复”侦听-当空闲时传输“循环之前等待一段随机时间 

这两个 规则包含在载波侦听多路访问(Carrier Sense Multiple Access,CSMA )和具有碰撞检测的CSMA协议族中

下图显示了连接到一个线状广播总线的4个节点(A,B,C,D)的时空图,横轴表示每个节点在空间的位置,纵轴表示时间

在t0时刻,节点B侦听到信道是空闲的,因为当前没有其他节点在传输。因此节点B开始传输,沿着广播媒体在两个方向上传播它的比特,B的比特传输实际所需要的时间不是0。在t1时刻,节点D有一个帧要发送。尽管节点B在时刻t1正在传输,但B传输的比特还没有到达D,因此D在t1侦听到信道空闲。根据CSMA协议,从而D开始传输它的帧,一个短暂的时间之后,B的传输开始在D干扰D的传输。广播信道的端到端信道传播时延在决定其性能方面起着关键的作用。 

具有碰撞检测的载波侦听多路访问(CSMA/CD)

在上图中,节点没有进行碰撞检测,即使已经出现了碰撞,B和D都将继续完整地传输它们的帧。当某节点执行碰撞检测时,一旦检测到碰撞将立即停止传输,下图显示了这种情况,只是这两个节点在检测到碰撞后很短的时间内都放弃了它们的传输

 

从与广播信道相连的适配器(在节点中)的角度总结它的运行:

(1)适配器从网络层获得数据报,准备链路层帧,并将其放入帧适配器缓存中

(2) 如果适配器侦听到信道空闲,它开始传输帧;如果侦听到信道正忙,它将等待,直到侦听到没有信号时才开始传输

(3)在传输过程中,适配器监视来自其他使用该广播信道的适配器的信号能量的存在。

(4)如果适配器传输整个帧而未检测到干扰,该适配器就完成了该帧;如果检测到了干扰,它终止传输

(5)终止传输后,适配器等待一个随机时间量,然后返回步骤2

等待一个随机(不是固定)的时间量。如果两个节点同时传输帧,然后它们等待固定的相同时间,它们将持续碰撞下去

轮流协议

多路访问协议的两个理想特性是:① 当只有一个节点活跃时,该活跃节点具有R bps的吞吐量;②当有M个节点活跃时,每个活跃节点的吞吐量接近R/M bps。ALOHA和CSMA协议具备第一个特性,但不具备第二个特性。

讨论两种比较重要的协议:轮询协议和令牌传递协议

 轮询协议要求这些节点之一要被指定为主节点。主节点以循环的方式轮询每个节点。主节点首先向节点1发送一个报文,告诉它(节点1)能够传输的帧的最多数量。在节点1传输了某些帧后,主节点告诉节点2它(节点2)能够传输的帧的最多数量。(主节点能够通过观察信道上是否缺乏信号来决定一个节点何时完成了帧的发送),以上过程以这种方式继续进行,主节点以循环的方式轮询了每个节点 轮询协议消除了困扰随机接入协议的碰撞和空时隙

令牌传递协议。这种协议没有主节点,一个称为令牌的小的特殊帧在节点之间以某种固定的次序进行交换。当一个节点收到令牌时,仅当它有一些帧要发送时,它才持有这个令牌;否则它立即向下一个节点转发该令牌。令牌传递是分散的并且有很高的效率。但是一个节点的故障可能会使整个信道崩溃。

6.4交换局域网

链路层寻址和ARP 

MAC地址 

实际上并不是主机或路由器具有链路层地址,而是它们的适配器(网络接口)具有链路层地址。因此具有多个网络接口的主机或路由器将具有与之相关联的多个链路层地址。链路层交换机并不具有与它们的接口(这些接口是与主机和路由器相连的)相关联的链路层地址。这是因为链路层交换机的任务是在主机与路由器之间承载数据报;

链路层地址有各种不同的称呼:LAN地址、物理地址或MAC地址 。

MAC地址的一个有趣性质是没有两块适配器具有相同的地址

适配器的MAC地址具有扁平结构(与层次结构相反),而且不论适配器到哪里用都不会变化。与之形成对照的是,前面说过的IP地址具有层次结构(即一个网络部分一个主机部分),而且当主机移动时,主机的IP地址需要改变(改变到它所连接到的网络)

当某适配器要向某些目的适配器发送一个帧时,发送适配器将目的适配器的MAC地址插入到该帧中,并将该帧发送到局域网上。一台交换机偶尔将一个帧广播到它的所有接口,当适配器接收到一个帧时,将检查该帧中的目的MAC地址是否与它自己的MAC地址匹配,如果匹配,该适配器提取出封装的数据报,并将数据报沿协议栈向上传递;如果不匹配,该适配器丢弃该帧,而不会向上传播该网络层数据报。

有时某发送适配器的确要让局域网上所有其他适配器来接收并处理它发送的帧,此时,发送适配器在该帧的目的地址字段中插入一个特殊的MAC广播地址。(对于使用6字节地址的局域网,广播地址是48个连续的1组成的字符串(即16进制表示法表示的FF-FF-FF-FF-FF-FF))

地址解析协议

因为存在网络层地址(如IP地址)和链路层地址(MAC地址),所以需要在它们之间进行转换。这是地址解析协议的任务(Address Resolution Protocol,ARP)的任务 

在下面的例子中,每台主机和路由器有一个单一的IP地址和单一的MAC地址。IP地址以点分十进制表示,MAC地址以16进制表示,假设交换机广播所有帧

 假设IP地址为222.222.222.220的主机要向主机222.222.222.222发送IP数据报,源和目的均位于相同的子网中,为了发送数据报,源不仅需要向它的适配器提供IP数据报,还要提供目的主机222.222.222.222的MAC地址,然后发送适配器将构造一个包含目的地的MAC地址的链路层帧,并把该帧发送进局域网。

主机如何确定IP地址为222.222.222.222的目的主机的MAC地址?

使用ARP。在发送主机中的ARP模块将取在相同局域网上的任何IP地址作为输入,然后返回相应的MAC地址。

一个ARP将一个IP地址解析为一个MAC地址。在很多方面它与DNS类似,DNS将主机名解析为IP地址。然而这两种解析器之间的一个重要区别是,DNS为在因特网中任何地方的主机解析主机名,而ARP只为在同一个子网上的主机和路由器解析IP地址

ARP是如何工作的?

 每台主机或路由器在其内存中具有一个ARP表,这张表包含IP地址到MAC地址的映射关系,也包含了一个寿命(TTL)值,它指示了从表中删除每个映射的时间

 如果发送方的ARP表具有目的节点的表项,则很容易发送;假如ARP表中没有目的主机的表项该怎么办呢?

发送方用ARP协议来解析这个地址。首先发送方构造一个特殊分组---ARP分组,一个ARP分组包括发送和接收IP地址已经MAC地址。ARP查询分组和响应分组都具有相同的格式。ARP查询分组的目的是询问子网上所有其他主机和路由器,以确定对应于要解析的IP地址的那个MAC地址。

222.222.222.220向它的适配器传递一个ARP查询分组,并且指示适配器应用该MAC广播地址(FF-FF-FF-FF-FF-FF)来发送这个分组。适配器在链路层帧中封装这个ARP分组,用广播地址作为帧的目的地址,并将该帧传输进子网中。包含该ARP查询的帧能被子网上的所有其他适配器接收到,并且(由于广播地址)每个适配器都把在该帧中的ARP分组向上传递给ARP模块,这些ARP模块中的每个都检查它的IP地址是否与ARP分组中的目的IP地址相匹配。与之匹配的一个给查询主机发送回一个带有所希望映射的ARP分组,然后查询主机222.222.222.220能够更新它的ARP表,并发送它的IP数据报,该数据报封装在一个链路层帧中,并且该帧的目的MAC就是对先前ARP请求进行响应的主机或路由器的MAC地址

查询ARP报文是在广播帧中发送的,而响应ARP报文在一个标准帧中发送

发送数据报到子网以外

子网中的某主机要向子网以外(跨越路由器的另一个子网)的主机发送网络层数据报的情况。

下图展示了一个由一台路由器互联两个子网所组成的网络

关于上图,每台主机仅有一个IP地址和一个适配器,但是一台路由器对它的每个接口都有一个IP地址,也有一个ARP模块和一个适配器

子网1中的一台主机如何向子网2中的主机发送数据报?

为了使数据报从111.111.111.111到子网2上的主机,该数据报必须首先发送给路由器接口111.111.111.110,它是通往最终目的地路径上的第一条路由器的IP地址,因此对于该帧来说,适当的MAC地址是路由器接口111.111.111.110的适配器地址(发送主机通过ARP得到),有了这个MAC地址,它创建一个帧(包含寻址到222.222.222.222的数据报),并把该帧发送到子网1中,子网1上的路由器适配器把该帧传递到路由器的网络层,路由器通过查询转发表转发到222.222.222.222接口,然后该接口把数据报传递给它的适配器,适配器把该数据报封装到一个新的帧中,并将该帧发送到子网2中。

以太网

以太网几乎占领着现有的有线局域网市场。

以太网帧结构 

以太网帧结构如下图所示

考虑从一台主机间向另一台主机发送一个IP数据报,且这两台主机在相同的以太局域网上。设发送适配器(即适配器A)的MAC地址是AA-AA-AA-AA-AA-AA,接收适配器(即适配器B)的MAC地址是BB-BB-BB-BB-BB-BB。发送适配器在一个以太网帧中封装了一个IP数据报,并将该IP数据报传递给网络层。现在考察上图所示的以太网的6个字段:

  •  数据字段(46~1500字节)。这个字段承载了IP数据报,以太网的最大传输单元(MTU)是1500字节。

如果IP数据报超过了1500字节,则主机必须将该数据报分片;数据字段的最小长度是46字节,如果IP数据报小于46字节,则数据报必须被填充到46字节。当填充时,传递到网络层的数据包括IP数据报和填充部分。网络层使用IP数据报首部中的长度字段来去除填充部分

  • 目的地址(6字节)。这个字段包含目的适配器的MAC地址。当适配器收到一个以太网帧,帧的目的地址无论是目的适配器的MAC地址还是MAC广播地址,它都将该帧的数据字段的内容传递给网络层;如果收到了具有其他任何MAC地址的帧,则丢弃
  • 源地址(6字节)。这个字段包含了传输该帧到局域网上的适配器的MAC地址
  • 类型字段(2字节)。类型字段允许以太网复用多种网络层协议。主机能够使用除了IP以外的其他网络层协议,因此当以太网帧到达适配器B,适配器B需要知道它应该将数据字段的内容传递给哪个网络层协议。
  • CRC(4字节)。CRC(循环冗余检测)字段的目的是使得接收适配器(适配器B)检测帧中是否引入了差错
  • 前同步码(8字节)。以太网帧以一个8字节的前同步码字段开始。该前同步码的前7字节用于“唤醒”接收适配器,并将它们的时钟和发送方的时钟同步。第8个字节的最后两个比特警告适配器B,“重要的内容”要来了
链路层交换机 

交换机的任务是接收入链路层帧并将它们转发到出链路 

交换机转发和过滤 

过滤是决定一个帧应该转发到某个接口还是应当将其丢弃的交换机功能。转发是决定一个帧应该被导向哪个接口,并把该帧移动到那些接口的交换机功能。 交换机的过滤和转发借助于交换机表完成。该交换机表包含某局域网上某些主机和路由器的但不必是全部的表项。交换机中的一个表项包含:①一个MAC地址②通向该MAC地址的交换机接口③表项放置在表中的时间

假定目的地址为DD-DD-DD-DD-DD-DD的帧从交换机接口x到达。交换机用MAC地址DD-DD-DD-DD-DD-DD索引它的表,有三种可能的情况

  • 表中没有对于DD-DD-DD-DD-DD-DD的表项。在这种情况下,交换机向除接口x外的所有接口前面的输出缓存转发该帧的副本。换句话说,如果没有对于目的地址的表项,交换机广播该地址
  • 表中有一个表项将DD-DD-DD-DD-DD-DD与接口x联系起来。在这种情况下,该帧从包括适配器DD-DD-DD-DD-DD-DD的局域网网段中到来。
  • 表中有一个表项将DD-DD-DD-DD-DD-DD与接口y≠x联系起来。在这种情况下,该帧需要被转发到与接口y相连的局域网网段。交换机通过将该帧放到接口y前面的输出缓存完成转发功能
自学习 

交换机的表是自动、动态和自治地建立的,换句话说,交换机是自学习的。 

交换机是即插即用设备,因为它们不需要网络管理员或用户干预。

链路层交换机的性质
  • 消除碰撞
  • 异质的链路。交换机将链路彼此隔离,因此局域网中的不同链路能够以不同的速率运行并且能够在不同的媒体上运行
  • 管理 。易于进行网络管理

交换机和路由器比较 

路由器是使用网络层地址转发分组的存储转发分组交换机,交换机是用MAC地址转发分组。

交换机是第二层的分组交换机,路由器是第三层的分组交换机。 

  • 2
    点赞
  • 7
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值