计网学习笔记一

目录

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

1.1什么是因特网

1.1.1 具体构成描述

1.1.2 服务描述

1.1.3 什么是协议

1.2网络边缘

1.2.1接入网

1.2.2网络媒介

1.3网络核心

1.3.1分组交换

1.3.2电路交换

1.3.3网络的网络

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

1.4.1分组交换网中的时延

1.4.2排队时延和丢包

1.4.3端到端时延

1.4.4计算机网络中的吞吐量

1.5协议层次及其服务模型

1.5.1分层的体系结构

1.5.2封装

1.6面对攻击的网络

1.7计算机网络和因特网的历史

第二章 应用层

2.1网络应用原理

2.1.1网络应用体系结构

2.1.2进程通信

2.1.3可供应用程序使用的运输服务

2.1.4因特网提供的运输服务

2.1.5应用层协议

2.1.6本书涉及的网络应用

2.2 Web和HTTP

2.2.1 HTTP概述

2.2.2非持续连接和持续连接

2.2.3HTTP报文格式

2.2.4用户与服务器的交互:cookie

2.2.5 Web缓存

2.2.6 HTTP/2

2.3因特网中的电子邮件

2.3.1SMTP

2.3.2邮件报文格式

2.3.3邮件访问协议

2.4DNS:因特网的目录服务

2.4.1 DNS提供的服务

2.4.2 DNS工作机理概述

2.4.3 DNS记录和报文

2.5 P2P文件分发

2.6视频流和问题分发

2.6.1因特网视频

2.6.2 HTTP流和DASH

2.6.3 内容分发网

2.6.4 学习案例:Netflix和YouTube

2.7套接字编程:生成网络应用

2.7.1 UDP套接字编程

2.7.2 TCP套接字编程

第三章 运输层

3.1概述和运输层服务

3.1.1运输层和网络层的关系

3.1.2因特网运输层概述

3.2多路复用与多路分解

3.3无连接运输:UDP

3.3.1UDP报文段结构

3.3.2UDP检验和

3.4可靠数据传输原理

3.4.1构造可靠数据传输协议

3.4.2流水线可靠数据传输协议

3.4.3回退N步

3.4.4选择重传

3.5面向连接的传输:TCP

3.5.1 TCP连接

3.5.2 TCP报文段结构

1.序号和确认号

2.Telnet:序号和确认号的一个学习案例

3.5.3往返时间的估计与超时

1.估计往返时间

2.设置和管理重传超时间隔

3.5.4可靠数据传输

1.一些有趣的情况

2.超时间隔加倍

3.快速重传

4.是回退N步还是选择重传

3.5.5流量控制

3.5.6 TCP连接管理

3.6拥塞控制原理

3.6.1拥塞原因与代价

1.情况 1: 两个发送方和一台具有无穷大缓存的路由器

2.情况 2: 两个发送方和一台具有有限缓存的路由器

3.情况 3: 四个发送方和具有有限缓存的多台路由器及多跳路径

3.6.2拥塞控制方法

3. 7 TCP 拥塞控制

3.7.1经典的TCP拥塞控制

1.慢启动

2.拥塞避免

3.快速恢复

4.TCP拥塞控制:回顾

5.TCP CUBIC

6.对TCP吞吐量的宏观描述

3.7.2 网络辅助明确拥塞通告和基于时延的拥塞控制

1.明确拥塞通告

2.基于时延的拥塞控制

3.7.3公平性

1.公平性和UDP

2.公平性和并行TCP连接

3.8运输层功能的演化

第四章 网络层:数据平面

4.1网络层概述

1.控制平面:传统的方法

2.控制平面:SDN方法

4.1.2网络服务模型

4.2路由器工作原理

4.2.1 输入端口处理和基于目的地转发

4.2.2交换

4.2.3输出端口处理

4.2.4何处出现排队

1.输入排队

2.输出排队

3.多少缓存才“够用”?

4.2.5分组调度

1.先进先出

2.优先排队权

3.循环和加权公平排队

4.3 网际协议:IPv4、寻址、IPv6及其他

4.3.1 IPv4 数据报格式

4.3.2 IPv4编址

1.获取一块地址

2.获取主机地址:动态主机配置协议 

4.3.3 网络地址转换

4.3.4 IPv6

1. IPv6 数据报格式

2.从IPv4到IPv6的迁移

4.4 泛化转发和SDN

4.4.1匹配

4.4.2操作

4.4.3运行中的匹配加操作的 OpenFlow 例子

4.5中间盒

第五章 网络层:控制平面

5.1概述

5.2路由选择算法

5.2.1 链路状态路由选择算法

5.2.2 距离向量路由选择算法

5.3 因特网中自治系统内部的路由选择:OSPF

5.4 ISP 之间的路由选择:BGP

5.4.1BGP的作用

5.4.2通告BGP路由信息

5.4.3确定最好的路由

1.热土豆路由选择

2.路由器选择算法

5.4.4 IP任播

5.4.5路由选择策略

5.4.6 拼装在一起:在因特网中呈现

5.5 SDN控制平面

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

第六章 链路层和局域网

6.1链路层概述

6.2差错检测和纠正技术

6.3多路访问链路和协议

6.4交换局域网

6.4.1链路层寻址和ARP

1.MAC地址

2.地址解析协议

6.4.2以太网

1.以太网帧结构

2.以太网技术

6.5链路虚拟化:网络作 为链路层

6.6数据中心网络

6.7回顾:Web页面请求的历程


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

1.1什么是因特网

        回答这个问题有两种方式:其一是描述因特网的具体构成,即构成因特网的软件和硬件;其二是描述为分布式应用提供服务的联网基础设施。

1.1.1 具体构成描述

 主机/端系统:与因特网连接的计算机和其他设备。进一步可划分为客户和服务器。

端系统通过通信链路分组交换机的网络连接到一起

通信链路有不同类型的物理媒介组成,不同的链路能够以不同的速率传输数据,称为传输速率[单位:bps]

两种常见的分组交换机类型是路由器链路层交换机,链路层交换机通常用于接入网中,路由器通常用于网络核心。

当一台端系统向另一台端系统发送数据时,发送端系统将数据分段,并为每段加上首部字节,由此形成的信息包称为分组,一个分组从发送端系统到接收端系统所经历的一些列通信链路和分组交换机称为通过该网络的路径。

端系统通过因特网服务提供商(ISP)接入因特网。ISP是由多台分组交换机和通信链路组成的网络。各ISP为端系统提供了各种不同类型的网络接入,ISP也为内容提供商(如Google)提供因特网接入服务,直接将服务器连入因特网。

1.1.2 服务描述

分布式应用:涉及多个相互交换数据的端系统的应用

套接字接口:该接口规定了运行在一个端系统上的程序请求因特网基础设施向运行在另一个端系统上的特定目的程序交付数据的方式。

1.1.3 什么是协议

在因特网中,涉及两个或多个远程通信实体的所有活动都受协议的制约。

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

1.2网络边缘

网络边缘位于网络核心之外,网络边缘通过接入网与网络核心相连,用户直接使用的主机组成。

1.2.1接入网

接入网:将端系统物理连接到其边缘路由器的所有通信设备组成的网络

边缘路由器:端系统到任何其他远程端系统的路径上的第一台路由器

接入方式:

数字用户线(DSL)

电缆/混合光纤同轴(HFC)

光纤到户(FTTH)

局域网(LAN)

有线局域网:以太网

无线局域网(WLAN):WIFI

广域网(WAN)

广域无线网:3G、4G、5G

1.2.2网络媒介

双绞铜线

同轴电缆

光纤

陆地无线电信道

卫星无线电信道

1.3网络核心

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

1.3.1分组交换

报文能够包含该应用的设计者需要的任何东西,报文可以执行一种控制功能,也可以包含数据。

源端系统将长报文分为较小的数据块称为分组

在源和目的端系统之间每个分组都通过通信链路和分组交换机传送,分组以等于该链路最大传输速率的速度通过通信链路。L bit的分组,链路传输速度R bps,传输时间=L/R s

存储转发传输是指在交换机开始向输出链路传输该分组的第一个比特之前,必须接收到整个分组,即分组中到达的部分缓存在交换机中,等待分组的全部比特到达后才传输到输出链路

输出缓存/输出队列:用于存储路由器准备发往那条链路的分组

到达的分组要传输到某条链路,但发现该链路正忙于传输其他分组,该到达分组必须在输出缓存中等待-->排队时延

丢失/丢包:缓存空间的大小是有限的,当缓存空间已被其他等待传输的分组占满后,到达的分组或已经排队的分组之一将会被丢弃

每台路由器有一个转发表,用于将目的地址映射为输出链路。当分组到达路由器时,路由器检查该地址,并用这个目的地址搜索其转发表,已发现适当的输出链路。

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

1.3.2电路交换

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

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

链路中的电路是通过频分复用(FDM)或时分复用(TDM)来实现的

1.3.3网络的网络

任何ISP都可以选择多宿,即可以与两个或更多提供商ISP链接

位于相同等级结构层次的邻近的一对ISP能够对等,即能够直接将它们的网络连接到一起,使它们之间的所有流量经直接连接而不是通过上游的中间ISP传输

第三方公司能够创建一个因特网交换点(IXP),IXP是一个汇合点,多个ISP能够在这里一起对等

今天的因特网是一个网络的网路,其结构复杂,由十多个第一层ISP和数十万个较低层ISP组成。ISP的覆盖范围不同,有些跨越多个大洲和大洋,有些限于狭窄的地理区域。较低层的ISP和较高层的ISP相连,较高层的ISP彼此互联。用户和内容提供商是较低层ISP的客户,较低层ISP是较高层ISP的客户。

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

1.4.1分组交换网中的时延

时延中比较重要的是节点处理时延排队时延传输时延传播时延,这些时延累加起来是节点总时延

处理时延:检查分组首部和决定将该分组导向何处所需要的时间是处理时延的一部分,处理时延也包括其他因素,如检查比特级别的差错所需要的时间。

排队时延:分组在链路上等待传输的时间。一个特定分组的排队时延长度将取决于先期到达的正在排队等待向链路传输的分组数量。到达分组期待发现的分组数量是到达该队列的流量的强度和性质的函数。

传输时延:将所有分组的比特推向链路所需要的时间,L/R

传播时延:一个比特从一台路由器传播到另一台路由器所需的时间,它是两台路由器之间距离的函数,与分组长度或链路传输速率无关

最大吞吐量是一台路由器能够转发分组的最大速率

1.4.2排队时延和丢包

排队时延很大程度取决于流量到达该队列的速率、链路的传输速率和到达流量的性质,即流量是周期性到达还是以突发形式到达。

流量强度:La/R【a表示分组到达队列的平均速率,单位是分组/秒,即pkt/s】

如果La/R>1,即比特到达队列的平均速率超过从该队列传输出去的速率,该队列趋向于无限增加

当La/R<=1时,到达流量的性质影响排队时延  

随着流量强度接近1,排队时延并不真正趋向无穷大,相反,到达的分组将发现一个满的队列,由于没有地方存储这个分组,路由器将丢弃该分组,即该分组将会丢失

分组丢失的比例随着流量强度的增加而增加

1.4.3端到端时延

假定在源和目的主机之间有N-1台路由器,假设网络此时是无拥塞的,每台路由器和源主机上的处理时延是dproc,传播时延是dprop,传输时延是dtrans,节点时延累加起来得到端到端时延:dene-end = N(dproc+dprop+dtrans)

除了处理时延、传输时延和传播时延以外,端系统中还有其他一些重要时延。例如希望向共享媒介传输分组的端系统可能有意地延迟它的传输,把这作为它与其他端系统共享媒介的协议的一部分,另一个重要的时延是媒介分组化时延

1.4.4计算机网络中的吞吐量

吞吐量的单位是bps,所以它虽然名为“量”,其实也还是一种“速率”

从主机A到主机B跨越计算机网络传送一个大文件,任意时刻主机B接收到该文件的速率叫做瞬时吞吐量

假设主机B接收该文件的所有F bit用了T s,那么 F/T bps就叫做平均吞吐量

吞吐量等于瓶颈链路的传输速率

当没有其他干扰流量时,吞吐量能够近似为沿着源和目的之间路径的最小传输速率。吞吐量不仅取决于沿着路径的传输速率,而且取决于干扰流量。

1.5协议层次及其服务模型

1.5.1分层的体系结构

网络设计者以分层的方式组织协议并实现这些协议的网络硬件和软件,每个协议属于这些层次之一,某层向他的上一层提供服务,协议分层具有概念化和结构化的优点

各层的所有协议被称为协议栈,因特网的协议栈由5个层次组成:物理层、链路层、网络层、运输层和应用层

应用层分布在多个端系统上,而一个端系统中的应用程序使用协议与另一个端系统中的应用程序交换信息分组。这种位于应用层的信息分组称为报文

运输层在应用程序端点之间传送应用层报文,运输层的分组称为报文段

网络层通过源和目的之间的一系列路由器路由数据报,网络层的分组称为数据报

链路层的任务是将帧从一个网络元素移动到邻近的网络元素,链路层的分组称为

物理层的任务是将帧中的一个个比特从一个节点移动到下一个节点

1.5.2封装

封装:在发送端主机,一个应用层报文被传送给运输层。运输层收取报文并附上附加信息,应用层报文和运输层首部信息一道构成运输层报文段,运输层报文段因此封装了应用层报文,运输层向网络层传递该报文段。网络层增加网络层首部信息,生成网络层数据报,该数据报传递给链路层。链路层增加链路层首部信息并生成链路层帧。

在每一层,一个分组具有两种类型的字段:首部字段和有效载荷字段。有效载荷字段通常来自于上一层的分组

1.6面对攻击的网络

1.7计算机网络和因特网的历史

第二章 应用层

2.1网络应用原理

2.1.1网络应用体系结构

应用体系结构由应用程序研发者设计,规定了如何在各终端系统上组织该应用程序

现代网络应用程序中所使用的两种主流体系结构:客户-服务器体系结构或对等(P2P)体系结构

客户-服务器体系结构:总是打开的主机称为服务器,它服务于来自许多其他称为客户的主机请求,该服务器具有固定的、周知的地址(IP地址)。客户相互之间不直接通信。

托管大量主机的数据中心常被用于创建强大的虚拟服务器

P2P体系结构:应用程序在间断连接的主机对之间使用直接通信,这些主机对被称为对等方

P2P体系结构最引人入胜的特性之一是其自扩展性。例如在一个P2P文件共享应用中,尽管每个对等方都由于请求文件产生工作负载,但每个对等方通过向其他对等方分发文件也为系统增加服务能力。

2.1.2进程通信

关注运行在不同端系统(可能具有不同的操作系统)上的进程通信

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

1.客户和服务器进程

对每对通信进程,我们通常将这两个进程之一标识为客户,而另一个进程标识为服务器

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

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

从一个进程向另一个进程发送的报文必须通过下面的网络,进程通过一个称为套接字的软件接口向网络发送报文和从网络接收报文。

套接字是同一台主机内应用层与运输层之间的接口。由于该套接字是建立网络应用程序的可编程接口,因此套接字也称为应用程序和网络之间的应用编程接口(API)

应用程序开发者可以控制套接字在应用层端的一切,但是对该套接字的运输层端几乎没有控制权

3.进程寻址

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

主机由其IP地址标识,端口号用于标识目的主机上的应用程序,流行的应用有固定的端口号

2.1.3可供应用程序使用的运输服务

一个运输层协议能够为调用它的应用程序大体能够提供以下四个方面的服务:

1.可靠数据传输

可靠数据传输:确保由应用程序的一端发送的数据正确并完全地交付给该应用程序的另一端

运输层协议不提供可靠数据传输即由发送进程发送的某些数据可能到达不了接收进程,这可能被容忍丢失的应用所接受

2.吞吐量

运输层协议能够以某种特定的速率提供确保的可用吞吐量

具有吞吐量要求的应用程序被称为带宽敏感的应用

弹性应用能够根据当时可用的带宽或多或少地利用可供使用的吞吐量

3.定时

4.安全性

2.1.4因特网提供的运输服务

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

1.TCP服务

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

面向连接服务:在应用层数据报文开始流动之前,TCP让客户和服务器相互交换运输层控制信息。这个所谓的握手过程提醒客户和服务器,让他们为大量分组的到来做好准备。在握手阶段后,一个TCP连接就在两个进程的套接字之间建立了。这条连接是全双工的,即连接双方可以在此连接上同时进行报文收发。当应用程序结束报文时,必须拆除连接。

可靠的数据传输服务:通信进程能够依靠TCP,无差错、按适当顺序交付所有发送的数据

TCP还具有拥塞控制机制,可以为因特网整体带来好处

运输层安全(TLS):TCP的加强版本,能够做TCP所能做的一切,而且提供了关键的进程到进程的安全性服务,包括加密、数据完整性和端点鉴别。不是与TCP和UDP在相同层次上的第三种因特网运输协议,而是一种对TCP的加强,是在应用层上实现的。

2.UDP服务

UDP是一种不提供不必要服务的轻量级运输协议,它仅提供最低限度的服务。UDP是无连接的,提供一种不可靠数据传输服务,不包括拥塞控制机制

3.因特网运输协议所不提供的服务

今天的因特网通常能够为时间敏感应用提供满意的服务,但它不能提供任何定时或吞吐量保证

2.1.5应用层协议

应用层协议定义了运行在不同端系统上的应用程序进程如何相互传递报文,应用层报文规定了以下内容:

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

应用层协议只是网络应用的一部分

2.1.6本书涉及的网络应用

Web、电子邮件、目录服务、流式视频和P2P

2.2 Web和HTTP

对大多数用户来说最有吸引力的是Web的按需操作,当用户需要时就能得到想要的内容

2.2.1 HTTP概述

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

Web页面由对象组成。一个对象只是一个文件,它们可通过一个URL寻址。每个URL由两部分组成:存放对象的服务器主机名和对象的路径名。

HTTP使用TCP作为它的支撑运输协议

HTTP服务器并不保存关于客户的任何信息,HTTP是一个无状态协议

HTTP的初始版本称为HTTP/1.0,到2020年为止,绝大部分的HTTP事务都采用HTTP/1.1,然而越来越多的浏览器和Web服务器也支持新版的HTTP,称为HTTP2。

2.2.2非持续连接和持续连接

1.采用非持续连接的HTTP

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

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

三次握手中前两个部分占用1个RTT,握手的第三部分+HTTP请求/响应用用去了1个RTT,总响应时间是2个RTT加上服务器传输HTML文件的时间

2.采用持续连接的HTTP

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

持续连接:所有的请求及其响应经相同的TCP连接发送。服务器在发送响应后保持该TCP连接打开,相同的客户与服务器之间,后续的请求和响应报文能够通过相同的连接进行传送。

通常,如果一条连接经过一定时间间隔(一个可配置的超时间隔)仍未被使用,HTTP服务器就关闭该连接

HTTP的默认模式是使用带流水线的持续连接 

2.2.3HTTP报文格式

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

1.HTTP请求报文

HTTP请求报文的第一行叫作请求行,其后继的行叫作首部行

请求行的三个字段:方法字段、URL字段和HTTP版本字段

方法字段可以取几种不同的值,包括GET、PUT、DELETE、PUT、HEAD

使用GET方法时整个实体体为空,而使用POST方法时才使用该实体体

2.HTTP响应报文

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

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

一些常见的状态码和相关的短语包括:

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

 浏览器产生的首部行与很多因素有关,包括浏览器的类型和版本、浏览器的用户配置、浏览器当前是否有一个缓存的但可能超期的对象版本。Web服务器的表现也类似:在产品、版本和配置上都有差异,所有这些都会影响响应报文中包含的首部行,

2.2.4用户与服务器的交互:cookie

HTTP使用了cookie,它允许站点对用户进行跟踪

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

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

cookie的使用具有争议,因为它被认为是对用户隐私的一种侵犯

2.2.5 Web缓存

Web缓存器也叫代理服务器,它是能够代表初始Web服务器来满足HTTP请求的网络实体。Web缓存器有自己的磁盘存储空间,并在存储空间中保存最近请求过的对象的副本。可以通过配置用户的浏览器,使得用户的所有HTTP请求首先指向Web缓存器。

Web缓存器既是服务器又是客户

Web缓存器通常由ISP购买并安装

Web缓存器可以大大减少对客户请求的响应时间;Web缓存器能够大大减少一个机构的接入链路到因特网的通信量;Web缓存器能从整体上大大减少因特网上的Web流量。

保存在服务器中的对象自该副本缓存在客户上以后可能已经被修改了,HTTP有一种机制,允许缓存器证实它的对象是最新的,这种机制就是条件GET。如果HTTP请求报文使用GET方法,并且请求报文中包含一个“If-modified-since:”首部行,那么这个HTTP请求报文是一个条件GET请求报文。

2.2.6 HTTP/2

2.3因特网中的电子邮件

因特网电子邮件系统的三个主要组成部分:用户代理邮件服务器简单邮件传输协议(SMTP)

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

2.3.1SMTP

限制所有邮件报文的体部分(不只是其首部)只能采用简单的7比特ASCII表示

SMTP一般不使用中间邮件服务器发送邮件

客户SMTP在25号端口建立一个到服务器SMTP的TCP连接,如果服务器没有开机,客户会在稍后继续尝试连接。一旦建立连接,服务器和客户执行某些应用层的握手,在握手阶段SMTP客户指示发送方的邮件地址和接收方的邮件地址。

SMTP能依赖TCP提供的可靠数据传输无差错地将邮件投递到接收服务器,用的是持续连接。该客户如果有另外的报文要发送到该服务器,就在相同的TCP连接上重复这种处理,否则它指示TCP关闭连接。

2.3.2邮件报文格式

如同HTTP一样,每个首部行包含了可读的文本,是由关键词后跟冒号及其值组成的。某些关键词是必需的,另一些则是可选的。每个首部必须含有一个“From:”首部行和一个“To:”首部行。在报文首部之后,紧接着一个空白行,然后是以ASCII格式表示的报文体。

2.3.3邮件访问协议

Bob的用户代理不能使用SMTP得到报文,因为取报文是一个拉操作,而SMTP是一个推协议

Bob从邮件服务器取回邮件有两种常用方法。如果Bob使用基于Web的电子邮件或智能手机上的客户端,则用户代理将使用HTTP来取回Bob的电子邮件。这种情况要求Bob的电子邮件服务器具有HTTP接口和SMTP接口。另一种方法是使用因特网邮件访问协议(IMAP),这通常用于微软的Outlook等。

2.4DNS:因特网的目录服务

主机的一种标识方法是用主机名,如www.google.com。主机名几乎没有提供关于主机在因特网中位置的信息。主机名可能由不定长的字母数字组成,路由器难以处理。

主机名也可以使用IP地址进行标识,一个IP地址由4个字节组成,有着严格的层次结构,因为当从左至右扫描它时,会得到越来越具体的关于主机位于因特网何处的信息(即在众多网络的哪个网络里)。

2.4.1 DNS提供的服务

人们更喜欢便于记忆的主机名标识方式,而路由器喜欢定长的、有层次结构的额IP地址。为了对这些不同的偏好进行折中,我们需要一种能进行主机名到IP地址转换的目录服务。这就是域名系统(DNS)的主要任务。

DNS是:①一个由分层的DNS服务器实现的分布式数据库;②一个使得主机能够查询分布式数据库的应用层协议

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

DNS通常是由其他应用层协议所使用的,包括HTTP和SMTP,将用户提供的主机名解析为IP地址,DNS还提供一些重要的服务:

  • 主机别名:有着复杂主机名的主机能拥有一个或者多个别名。它的原主机名称为规范主机名。主机别名比规范主机名更加容易记忆。应用程序可以调用DNS来获得主机别名对应的规范主机名以及主机的地址。
  • 邮件服务器别名
  • 负载分配:繁忙的站点被冗余分布在多台服务器上,每台服务器均运行在不同的端系统上,每个都有着不同的IP地址。一个IP地址集合因此与同一个规范主机名相联系。DNS数据库中存储着这些IP地址集合。当客户对映射到某地址集合的名字发出一个DNS请求时,该服务器用IP地址的整个集合进行响应,但在每个回答中循环这些地址次序。因为客户通常总是向IP地址排在最前面的服务器发送HTTP请求报文,所以DNS在冗余的Web服务器之间循环分配了负载。

2.4.2 DNS工作机理概述

假设运行在用户主机上的某些应用程序需要将主机名转换为IP地址。这些应用程序将调用DNS的客户端,并指明需要被转换的主机名。用户主机上的DNS接到后,向网络中发送一个DNS查询报文。所有的DNS请求和回答报文使用UDP数据报经端口号53发送。经过若干毫秒到若干秒的时延后,用户主机上的DNS接收到一个提供所希望映射的DNS回答报文,这个映射结果被传递到调用DNS的应用程序。

集中式设计的问题:

  • 单点故障:如果该DNS服务器崩溃,整个因特网随之瘫痪
  • 通信容量:单个服务器处理所有DNS查询,用于为上亿台主机产生的所有HTTP请求报文和电子邮件报文服务
  • 远距离的集中式数据库:单个DNS服务器不可能临近所有查询客户,将导致严重的时延
  • 维护

1.分布式、层次数据库

为了处理扩展性问题,DNS使用了大量的DNS服务器,它们以层次方式组织处,并且分布在全世界范围内。没有一台DNS服务器拥有因特网上所有主机的映射,这些映射分布在所有的DNS服务器上。

有三种类型的DNS服务器:

  • 根DNS服务器:有超过1000台根DNS服务器实体遍及全世界,这些根服务器是13个不同根服务器的副本。根名字服务器提供TLD服务器的IP地址。
  • 顶级域(TLD)DNS服务器:对于每个顶级域(如com、org、net、edu和gov)和所有国家的顶级域(如uk、fr、ca和jp)都有TLD服务器(或服务器集群)。TLD服务器提供了权威DNS服务器的IP地址。
  • 权威DNS服务器:在因特网上具有公共可访问主机的每个组织机构必须提供公共可访问的DNS记录,这些记录将这些主机的名字映射为IP地址。一个组织机构的权威DNS服务器以保存这些记录。

这些服务器按下图所示的层次结构组织起来:

还有另一类重要的DNS服务器,称为本地DNS服务器。严格来说一个本地DNS服务器不属于该服务器的层次结构,但它对DNS层次结构是至关重要的。每个ISP都有一台本地DNS服务器(也叫默认名字服务器)。当主机与某个ISP连接时,该ISP提供一台主机的IP地址,该主机具有一台或多台其本地DNS服务器的IP地址(通常通过DHCP)。当主机发出DNS请求时,该请求被发往本地DNS服务器,它起着代理服务器的作用,并将该请求转发到DNS服务器层次结构中。

图2-18:从请求主机到本地DNS服务器的查询是递归的,其余的查询是迭代的

图2-19:所有的查询都是递归的

2.DNS缓存

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

在一个请求链中,当某DNS服务器接收一个DNS回答时。它就能将映射缓存在本地存储器中。

由于主机和主机名和IP地址间的映射不是永久的,DNS服务器在一段时间后将丢弃缓存的信息。

本地DNS服务器也能缓存TLD服务器的IP地址,因而允许本地DNS服务器绕过查询链中的根DNS服务器。

2.4.3 DNS记录和报文

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

资源记录是一个包含了下列字段的4元组:(Name,Value,Type,TTL)

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

Name和Value的意义取决于Type(在下面给出的记录例子中,忽略掉TTL字段):

  • 如果Type=A,则Name是主机名,Value是该主机名对应的IP地址。因此,一条类型为A的资源记录提供了标准的主机名到IP地址的映射。例如(relayl. bar.foo.com,145.37.93.126,A)
  • 如果Type=NS,则Name是域(如foo.com),而Value是一个知道如何获得该域中主机IP地址的权威DNS服务器的主机名。这个记录用于沿着查询链来路由DNS查询。例如(foo.com,dns.foo.com,NS)
  • 如果Type=CNAME,则Value是别名为Name的主机对应的规范主机名。该记录能够向查询的主机提供一个主机名对应的规范主机名,例如(foo.com,relay1. bar.foo.com,CNAME)
  • 如果Type=MX,则Value是一个别名为Name的邮件服务器的规范主机名。例如(foo.com,mail.bar.foo.com,MX)。MX记录允许邮件服务器主机名具有简单的别名。值得注意的是,通过使用MX记录,一个公司的邮件服务器和其他服务器(如它的Web服务器)可以使用相同的别名。为了获得邮件服务器的规范主机名,DNS客户应当请求一条MX记录;而为了获得其他服务器的规范主机名,DNS客户应当请求CNAME记录。

如果一台DNS服务器是用于某特定主机名的权威DNS服务器,那么该DNS服务器会有一条包含用于该主机名的类型A记录(即使该DNS服务器不是其权威DNS服务器,它也可能在缓存中包含有一条类型A记录)。如果服务器不是用于某主机名的权威服务器, 那么该服务器将包含一条类型NS记录,该记录对应于包含主机名的域;它还将包括一条类型A记录,该记录提供了在NS记录的Value字段中的DNS服务器的IP地址。

1. DNS报文

DNS只有DNS查询和回答报文这两种报文,并且查询和回答报文有着相同的格式,如图2-20所示。DNS报文中各字段的语义如下:

  • 前12个字节是首部区域
    • 标识符是一个16比特的数,用于标识该查询。这个标识符会被复制到对查询的回答报文中,以便让客户用它来匹配发送的请求和接收到的回答。
    • 标志字段中含有若干标志。
      • 1比特的“查询/回答”标志位指出报文是查询报文(0)还是回答报文(1)。
      • 当某DNS 服务器是所请求名字的权威DNS服务器时,1比特的“权威的”标志位被置在回答报文中。
      • 如果客户(主机或者DNS服务器)在该DNS服务器没有某记录时希望它执行递归查询,将设置1比特的“希望递归”标志位。
      • 如果该DNS服务器支持递归查询,在它的回答报文中会对1比特的“递归可用”标志位置位。
    • 在该首部中有4个有关数量的字段,这些字段指出了在首部后的4类数据区域出现的数量。
  • 问题区域包含着正在进行的查询信息。该区域包括:①名字字段,包含正在被查询的主机名字;②类型字段,指出有关该名字的正被询问的问题类型,例如主机地 是与一个名字相关联(类型A)还是与某个名字的邮件服务器相关联(类型MX)。
  • 在来自DNS服务器的回答中,回答区域包含了对最初请求的名字的资源记录。在回答报文的回答区域中可以包含多条RR,因此一个主机名能够有多 个IP地址(例如,就像本节前面讨论的冗余Web服务器)。
  • 权威区域包含了其他权威服务器的记录。
  • 附加区域包含了其他有帮助的记录。例如,对于一个MX请求的回答报文的回答区域包含了一条资源记录,该记录提供了邮件服务器的规范主机名。该附加信息区域包含一个类型A记录,该记录提供了用于该邮件服务器的规范主机名的IP地址。

2. 在DNS数据库中插入记录

注册登记机构(registrar)是一个商业实体,它验证该域名的唯一性,将该域名输入DNS数据库,对提供的服务收取少量费用。

当你向某些注册登记机构注册域名networkutopia.com时,需要向该机构提供你的基本、辅助权威DNS服务器的名字和IP地址。假定该名字和IP地址是dns1.networkutopia.com 和dns2.networkutopia.com及212.212.212.1和212.212.212.2。对这两个权威DNS服务器的每一个,该注册登记机构确保将一个类型NS和一个类型A的记录输人TLDcom服务器。特别是对于用于networkutopia.com的基本权威服务器,该注册登记机构将下列两条资源记录插入该DNS系统中: (networkutopia.com, dnsl.networkutopia.com, NS) (dns1.networkutopia.com, 212.212.212.1, A)

2.5 P2P文件分发

1.P2P体系结构的扩展性

在本节中我们将研究一个非常自然的P2P应用,即从单一服务器向大量主机(称为对等方)分发一个大文件。在客户-服务器文件分发中,该服务器必须向每个对等方发送该文件的一个副本,即服务器承受了极大的负担,并且消耗了大量的服务器带宽。在P2P文件分发中,每个对等方能够向任何其他对等方重新分发它已经收到的该文件的任何部分,从而在分发过程中协助该服务器。

分发时间:是所有N个对等方得到该文件的副本所需要的时间。

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

2.BitTorrent

BitTorrent是一种用于文件分发的流行P2P协议。用BitTorrent的术语来讲,参与一个特定文件分发的所有对等方的集合被称为一个洪流。在一个洪流中的对等方彼此下载等长度的文件块,典型的块长度为256KB。当一个对等方首次加人一个洪流时,它没有块。随着时间的流逝,它累积了越来越多的块。当它下载块时,也为其他对等方上载了多个块。一旦某对等方获得了整个文件,它也许(自私地)离开洪流,或(大公无私地)留在该洪流中并继续向其他对等方上载块。同时,任何对等方可能在任何时候仅具有块的子集就离开该洪流,并在以后重新加入该洪流中。 每个洪流具有一个基础设施节点,称为追踪器。当一个对等方加入某洪流时,它向追踪器注册自己,并周期性地通知追踪器它仍在该洪流中。以这种方式,追踪器跟踪参与在洪流中的对等方。一个给定的洪流可能在任何时刻具有数以百计或数以千计的对等方。

最稀缺优先技术:针对她没有的块在她的邻居中决定最稀缺的块(最稀缺的块就是那些在她的邻居中副本数量最少的块),并首先请求那些最稀缺的块。这样,最稀缺块得到更为迅速的重新分发,其目标是(大致地)均衡每个块在洪流中的副本数量。

对换算法:Alice根据当前能够以最高速率向她提供数据的邻居,给出其优先权。特别是,Alice对于她的每个邻居都持续地测量接收到比特的速率,并确定以最高速率流入的4个邻居。每过 10秒,她重新计算该速率并可能修改这4个对等方的集合。用BitTorrent术语来说,这4个对等方被称为疏通。重要的是,每过30秒,她也要随机地选择另外一个邻居并向其发送块。我们将这个被随机选择的对等方称为Bob。因为Alice正在向Bob发送数据,她可能成为Bob前4位上载者之一,这样的话Bob将开始向Alice发送数据。如果 Bob向Alice发送数据的速率足够高,Bob接下来也能成为Alice的前4位上载者。换言之, 每过30秒Alice将随机地选择一名新的对换伴侣并开始与那位伴侣进行对换。如果这两对等方都满足此对换,它们将对方放入其前4位列表中并继续与对方进行对换,直到该对等方之一发现了一个更好的伴侣为止。这种效果是对等方能够以趋向于找到彼此的协调的速率上载。随机选择邻居也允许新的对等方得到块,因此它们能够具有对换的东西。除了这5个对等方(“前”4个对等方和一个试探的对等方)的所有其他相邻对等方均被“阻塞”,即它们不能从Alice接收到任何块。

2.6视频流和问题分发

2.6.1因特网视频

视频是一系列的图像, 通常以一种恒定的速率(如每秒24或30张图像)来展现。一幅未压缩、数字编码的图像由像素阵列组成,其中每个像素是由一些比特编码来表示亮度和颜色。视频的一个重要特征是它能够被压缩,因而可用比特率来权衡视频质量。今天现成的压缩算法能够将一个视频压缩成所希望的任何比特率。当然,比特率越高,图像质量越好,用户的总体视觉感受越好。

从网络的观点看,也许视频最为突出的特征是它的高比特率。压缩的因特网视频的比特率范围通常从用于低质量视频的100kbps,到用于流式高分辨率电影的超过3Mbps,再到用于4K在线播放的超过10Mbps。这能够转换为巨大的流量和存储,特别是对高端视频。到目前为止,对流式视频的最为重要的性能度量是平均端到端吞吐量。为了提供连续不断的播放,网络必须为流式应用提供平均吞吐量,这个流式应用至少与压缩视频的比特率一样大。

2.6.2 HTTP流和DASH

在HTTP流中,视频只是存储在HTTP服务器中作为一个普通的文件,每个文件有一个特定的URL。当用户要看该视频时,客户与服务器创建一个TCP连接并发送对该URL的HTTPGET请求。服务器在一个HTTP响应报文中发送该视频文件。在客户一侧,字节被收集在客户应用缓存中。一旦该缓存中的字节数量超过预先设定的门限,客户应用程序就开始播放,特别是,流式视频应用程序周期性地从客户应用程序缓存中抓取帧,对这些帧解压缩并且在用户屏幕上展现。 因此,流式视频应用接收到视频就进行播放,同时缓存该视频后面部分的帧。HTTP流具有严重缺陷,即所有客户接收到相同编码的视频,尽管不同客户可用的带宽大小有很大不同。

经HTTP的动态适应性流(DASH):在DASH中,视频编码为几个不同的版本,其中每个版本具有不同的比特率,对应于不同的质量水平。客户动态地请求来自不同版本且长度为几秒的视频段数据块。当可用带宽量较高时,客户自然地选择来自高速率版本的块;当可用带宽量较低时,客户自然地选择来自低速率版本的块。 如果端到端带宽在会话过程中改变的话,DASH允许客户适应可用带宽。使用DASH后,每个视频版本存储在HTTP服务器中,每个版本都有一个不同的 URL。HTTP服务器也有一个告示文件,为每个版本提供了一个URL及其比特率。DASH允许客户自由地在不同的质量等级之间切换。

2.6.3 内容分发网

为了应对向分布于全世界的用户分发巨量视频数据的挑战,几乎所有主要的视频流公司都利用内容分发网(CDN)。CDN管理分布在多个地理位置上的服务器,在它的服务器中存储视频(和其他类型的Web内容,包括文档、图片和音频)的副本,并且所有试图将每个用户请求定向到一个将提供最好的用户体验的CDN位置。

CDN通常采用两种不同的服务器安置原则:

  • 深入。该原则是通过在遍及全球的接入ISP中部署服务器集群来深入到ISP的接入网中。其目标是靠近端用户,通过减少端用户和 CDN集群之间链路和路由器的数量,从而改善了用户感受的时延和吞吐量。
  • 邀请做客。该原则是通 过在少量(例如10个)关键位置建造大集群来邀请到ISP做客。不是将集群放在接入ISP中,这些CDN通常将它们的集群放置在因特网交换点(IXP)。与深入设计原则相比,邀请做客设计通常产生较低的维护和管理开销。

1.CDN操作

当用户主机中的一个浏览器指令检索一个特定的视频(由URL标识)时,CDN必须截获该请求,以便能够:①确定此时适合用于该客户的CDN服务器集群;②将客户的请求重定向到该集群的某台服务器。

大多数CDN利用DNS来截获和重定向请求

2.集群选择策略

任何CDN部署,其核心是集群选择策略,即动态地将客户定向到CDN中的某个服务器集群或数据中心的机制。一种简单的策略是指派客户到地理上最为邻近的集群。使用商用地理位置数据库,每个 LDNS IP地址都映射到一个地理位置。当从一个特殊的LDNS接收到一个DNS请求时,CDN选择地理上最为接近的集群。这样的解决方案对于众多用户来说能够工作得相当好。但对于某些客户,该解决方案可能执行的效果差,因为就网络路径的长度或跳数而言,地理最邻近的集群可能并不是最近的集群。此外,一种所有基于DNS的方法都内在具有的问题是,某些端用户配置使用位于远地的LDNS,在这种情况下,LDNS位置可能远离客户的位置。此外,这种简单的策略忽略了时延和可用带宽随因特网路径时间而变化,总是为特定的客户指派相同的集群。

为了基于当前流量条件为客户决定最好的集群,CDN能够对其集群和客户之间的时延和丢包性能执行周期性的实时测量

2.6.4 学习案例:Netflix和YouTube

2.7套接字编程:生成网络应用

2.7.1 UDP套接字编程

2.7.2 TCP套接字编程

第三章 运输层

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

3.1概述和运输层服务

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

运输层协议是在端系统中而不是在路由器中实现的。在发送端,运输层将从发送应用程序进程接收到的报文转换成运输层分组(即报文段)。实现的方法是将应用报文划分为较小的块,并为每块加上一个运输层首部以生成运输层报文段。然后运输层将这些报文段传递给网络层,网路层将其封装成网络层分组(即数据报)并向目的地发送。注意到下列事实是重要的:网络路由器仅作用于该数据报的网络层字段;即它们不检查封装在该数据报的运输层报文段的字段。在接收端,网络层从数据报中提取运输层报文段,并将该报文段向上交给运输层。运输层则处理接收到的报文段,使该报文段中的数据为接收应用进程使用。

网络应用程序可以使用多种的运输层协议。例如,因特网有两种协议,即TCP和 UDP。每种协议都能为调用的应用程序提供一组不同的运输层服务。

3.1.1运输层和网络层的关系

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

运输协议能够提供的服务常常受制于底层网络层协议的服务模型。如果网络层协议无法为主机之间发送的运输层报文段提供时延或带宽保证的话,运输层协议也就无法为进程之间发送的应用程序报文提供时延或带宽保证。 然而,即使底层网络协议不能在网络层提供相应的服务,运输层协议也能提供某些服务。例如,即使底层网络协议是不可靠的,也就是说网络层协议会使分组丢失、篡改和冗余,运输协议也能为应用程序提供可靠的数据传输服务。即使网络层不能保证运输层报文段的 机密性,运输协议也能使用加密来确保应用程序报文不被入侵者读取。

3.1.2因特网运输层概述

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

UDP和TCP最基本的责任是,将两个端系统间IP的交付服务扩展为运行在端系统上的两个进程之间的交付服务。将主机间交付扩展到进程间交付被称为运输层的多路复用多路分解。UDP和TCP还可以通过在其报文段首部中包括差错检查字段而提供完整性检查。进程到进程的数据交付和差错检查是两种最低限度的运输层服务,也是UDP所能提供的仅有的两种服务。UDP是一种不可靠的服务,不能保证一个进程所发送的数据能够完整无缺地到达目的进程。TCP为应用程序提供了几种附加服务。首先,它提供可靠数据传输。通过使用流量控制、序号、确认和定时器, TCP确保正确地、按序地将数据从发送进程交付给接收进程。TCP还提供拥塞控制。拥塞控制与其说是一种提供给调用它的应用程序的服务,不如说是一种提供给整个因特网的服务。不太严格地说,TCP拥塞控制防止任何一条TCP连接用过多流量来淹没通信主机之间的链路和交换设备。TCP力求为每个通过一条拥塞网络链路的连接平等地共享网络链路带宽。这可以通过调节TCP连接的发送端发送进网络的流量速率来做到。UDP流量是不可调节的。使用UDP传输的应用程序可以根据其需要以其愿意的任何速率发送数据。 

3.2多路复用与多路分解

在接收主机中的运输层实际上并没有直接将数据交付给进程,而是将数据交给了一个中间的套接字

将运输层报文段中的数据交付到正确的套接字的工作称为多路分解。在源主机从不同套接字中收集数据块,并为每个数据块封装上首部信息从而生成报文段,然后将报文段传递到网络层,所有这些工作称为多路复用

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

端口号是一个16比特的数,其大小在0~65535之间。0~1023范围的端口号称为周知端口号,是受限制的,这是指它们保留给周知应用层协议来使用,例如,【FTP 20、21】【SMTP 25】【DNS 53】【HTTP 80】。当我们开发一个新的应用程序时,必须为其分配一个端口号。

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

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

运输层报文段中的源端口号的用途:源端口号用作“返回地址”的一部分,即当需要回发个报文段给源主机时,目的主机的报文段中的目的端口号便从报文段中的源端口号中取值。

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

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

3.Web服务器与TCP

连接套接字与进程之间并非总是有着一一对应的关系。事实上,当今高性能服务器通常只使用一个进程,但是为每个新的客户连接创建一个具有新连接套接字的新线程。

如果客户与服务器使用持续HTTP,则在整条连接持续期间,客户与服务器之间经由同一个服务器套接字交换 HTTP 报文。如果客户与服务器使用非持续 HTTP,则对每一对请求/响应都创建一个新的 TCP 连接并在随后关闭,因此对每一对请求/响应创建一个新的套接字并在随后关闭。这种套接字的频繁创建和关闭会严重地影响一个繁忙的 Web 服务器的性能。 

3.3无连接运输:UDP

UDP 只是做了运输协议能够做的最少工作。除了复用/分解功能及少量差错检测外,它几乎没有对 IP增加别的东西。

有许多应用相比TCP更适合用 UDP,原因主要以下几点:

  • 关于发送什么数据以及何时发送的应用层控制更为精细。采用 UDP 时,只要应用进程将数据传递给 UDP,UDP就会将此数据打包进 UDP 报文段并立即将其传递给网络层。TCP 有拥塞控制机制会遏制运输层TCP发送方。TCP不管可靠交付需要用多长时间。因为实时应用通常要求最小的发送速率,不希望过分地延迟报文段的传送,且能容忍一些数据丢失,TCP 服务模型并不是特别适合这些应用的需要。
  • 无须连接建立。TCP在开始数据传输之前要经过三次握手。UDP却不需要任何准备即可进行数据传输。因此UDP不会引入建立连接的时延。这可能是DNS运行在UDP之上的主要原因。HTTP使用TCP,因为对于具有文本数据的Web网页来说,可靠性是至关重要的。
  • 无连接状态。TCP需要在端系统中维护连接状态,此连接状态包括接收和发送缓存、拥塞控制参数以及序号与确认号的参数。UDP 不维护连接状态,也不跟踪这些参数。因此,某些专门用于某种特定应用的服务器当应用程序运行在UDP之上时,一般都能支持更多的活跃客户。
  • 分组首部开销小。每个TCP报文段都有20字节的首部开销,而UDP仅有8字节的开销。

UDP 中缺乏拥塞控制能够导致UDP发送方和接收方之间的高丢包率,并挤垮了TCP会话,这是一个潜在的严重问题。

使用 UDP 的应用是可能实现可靠数据传输的,这可通过在应用程序自身中建立可靠性机制来完成

3.3.1UDP报文段结构

应用层数据占用UDP报文段的数据字段。UDP首部只有4个字段,每个字段由两个字节组成。通过端口号可以使目的主机将应用数据交给运行在目的端系统中的相应进程(即执行分解功能)。长度字段指示了在UDP报文段中的字节数(首部加数据)。接收方使用检验和来检查在该报文段中是否出现了差错。

实际上,计算检验和时,除了UDP报文段以外还包括了IP首部的一些字段。IPv4在计算检验和时,临时把「伪头部」和 UDP 用户数据报连接在一起。伪头部包括了IPv4头部中的一些信息,但它并不是发送 IP 数据包时使用的 IP 数据包的头部,而只是一个用来计算校验和而已。 

3.3.2UDP检验和

检验和用于确定当UDP报文段从源到达目的地移动时,其中的比特是否发生了改变。发送方的 UDP对报文段中的所有16比特字的和进行反码运算,求和时遇到的任何溢出都被回卷。得到的结果被放在UDP报文段中的检验和字段。

为什么UDP首先提供了检验和?其原因是不能保证源和目的之间的所有链路都提供差错检测,也许这些链路中的一条可能使用没有差错检测的协议。此外,即使报文段经链路正确地传输,当报文段存储在某台路由器的内存中时,也可能引入比特差错。 在既无法确保逐链路的可靠性,又无法确保内存中的差错检测的情况下,如果端到端数据传输服务要提供差错检测,UDP就必须在端到端基础上在运输层提供差错检测。这是一个在系统设计中端到端原则的例子,该原则表述为因为某种功能必须基于端到端实现。

虽然UDP提供差错检测,但它对差错恢复无能为力。UDP的某种实现只是丢弃受损的报文段;其他实现是将受损的报文段交给应用程序并给出警告。

3.4可靠数据传输原理

TCP向调用它的因特网应用所提供的服务模型:传输数据比特不会受到损坏(由0变为1,或者相反)或丢失,而且所有数据都是按照其发送顺序进行交付。实现这种服务抽象是可靠数据传输协议(RDT)的责任。

这一节假设分组将以它们发送的次序进行交付,底层信道将不会对分组重排序。

3.4.1构造可靠数据传输协议

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

有限状态机(Machine,FSM)的定义:FSM描述图中的箭头指示了协议从一个状态变迁到另一个状态。引起变迁的事件显示在表示变迁的横线上方,事件发生时所采取的动作显示在横线下方。如果对一个事件没有动作, 或没有就事件发生而采取了一个动作,将在横线上方或下方使用符号A,以分别明确地表示缺少动作或事件。FSM的初始状态用虚线表示。

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

肯定确认否定确认控制报文使得接收方可以让发送方知道哪些内容被正确接收,哪些内容接收有误并因此需要重复。在计算机网络环境中,基于这样重传机制的可靠数据传输协议称为自动重传请求 (ARQ)协议

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

  • 差错检测。需要一种机制以使接收方检测到何时出现了比特差错。
  • 接收方反馈。发送方要了解接收方情况(此时为分组是否被正确接收)的唯一途径就是让接收方提供明确的反馈信息。rdt2.0协议将从接收方向发送方回送ACK与NAK分组。
  • 重传。接收方收到有差错的分组时,发送方将重传该分组文。

当发送方处于等待ACK或NAK的状态时,发送方将不会发送一块新数据,除非发送方确信接收方已正确接收当前分组。由于这种行为,rdt2.0这样的协议被称为停等协议。

rdt2.0协议存在一个致命的缺陷:ACK或NAK分组可能受损。当发送方收到含糊不清的ACK或NAK分组时,只需重传当前数据分组即可。然而,这种方法在发送方到接收方的信道中引入了冗余分组。冗余分组的根本困难在于接收方无法事先知道接收到的分组是新的还是一次重传。

解决这个问题的一个方法是在数据分组中添加一新字段,让发送方对其数据分组编号,即将发送数 据分组的序号放在该字段。于是,接收方只需要检查序号即可确定收到的分组是否为重传。

图 3-10 说明了表示 rdt2.0的FSM, 该数据传输协议采用了差错检测、肯定确认与否定确认。

rdt2.1的发送方和接收方FSM的状态数都是以前的两倍。这是因为协议状态此时必须反映出目前由发送方正发送的分组或在接收方希望接收的分组的序号是0还是1。协议rdt2.1使用了从接收方到发送方的肯定确认和否定确认。当接收到失序的分组时,接收方对所接收的分组发送一个肯定确认。如果收到受损的分组,则接收方将发送一个否定确认。

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

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

发送方负责检测和恢复丢包工作。假定发送方传输一个数据分组,该分组或者接收方对该分组的ACK发生了丢失。在这两种情况下,发送方都收不到应当到来的接收方的响应。如果发送方愿意等待足够长的时间以便确定分组已丢失,则它只需重传该数据分组即可。

发送方至少需要等待这样长的时间:即发送方与接收方之间的一个往返时延加上接收方处理一个分组所需的时间。实践中采取的方法是发送方明智地选择一个时间值,以判定可能发生了丢包。如果在这个时间内没有收到ACK,则重传该分组。注意到如果一个分组经历了一个特别大的时延,发送方可能会重传该分组,即使该数据分组及其ACK都没有丢失。这就在发送方到接收方的信道中引入了冗余数据分组的可能性。幸运的是,rdt2.2协议已经有足够的功能(即序号)来处理冗余分组情况。

发送方不知道是一个数据分组丢失,还是一个ACK丢失,或者只是该分组或ACK过度延时,动作是同样的:重传。为了实现基于时间的重传机制,需要一个倒计数定时器,在一个给定的时间量过期后,可中断发送方。因此,发送方需要能做到:①每次发送一个分组(包括第一次分组和重传分组)时,便启动一个定时器;②响应定时器中断(采取适当的动作);③终止定时器。

3.4.2流水线可靠数据传输协议

发送方(或信道)的利用率为:发送方实际忙于将发送比特送进信道的那部分时间与发送时间之比。停等协议有着非常低的发送方利用率,rdt3.0性能问题的核心在于它是一个停等协议。这种特殊的性能问题的一个简单解决方法是:不以停等方式运行,允许发送方发送多个分组而无须等待确认。流水线技术对可靠数据传输协议可带来如下影响:

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

3.4.3回退N步

回退N步(GBN)协议中,允许发送方发送多个分组而不需等待确认,但它也受限于在流水线中未确认的分组数不能超过某个最大允许数N。将基序号(base)定义为最早未确认分组的序号,将下一个序号(nextseqnum)定义为最小的未使用序号(即下一个待发分组的序号),则可将序号范围分割成4段。在[0,base-1] 段内的序号对应于已经发送并被确认的分组。[base,nextseqnum-1] 段内对应已经发送但未被确认的分组。[nextseqnum,base+N-1]段内的序号能用于那些要被立即发送的分组(如果有数据来自上层的话)。大于或等于base+N的序号是不能使用的,直到当前流水线中未被确认的分组已得到确认为止。

那些已被发送但还未被确认的分组的许可序号范围可以被看成是一个在序号范围内长度为N的窗口。随着协议的运行,该窗口在序号空间向前滑动。因此,N常被称为窗口长度,GBN协议也常被称为滑动窗口协议。为什么先要限制这些被发送的、未被确认的分组的数目为N呢?为什么不允许这些分组为无限制的数目呢?流量控制是对发送方施加限制的原因之一。

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

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

在GBN中,接收方的动作也很简单。如果一个序号为n的分组被正确接收到,并且按序(即上次交付给上层的数据是序号为n-1的分组),则接收方为分组n发送一个ACK,并将该分组中的数据部分交付到上层。在所有其他情况下,接收方丢弃该分组,并为最近按序接收的分组重新发送ACK。注意到因为一次交付给上层一个分组,如果分组k已接收并交付,则所有序号比k小的分组也已经交付。

在GBN协议中,接收方丢弃所有失序分组。这种方法的优点是接收缓存简单,即接收方不需要缓存任何失序分组。因此,接收方需要维护的唯一信息就是下一个按序接收的分组的序号。丢弃一个正确接收的分组的缺点是随后对该分组的重传也许会丢失或出错,因此甚至需要更多的重传。

3.4.4选择重传

GBN本身有一些情况存在着性能问题。单个分组的差错就能够引起GBN重传大量分组,许多分组根本没有必要重传。随着信道差错率的增加,流水线可能会被这些不必要重传的分组所充斥。

选择重传(SR)协议通过让发送方仅重传在接收方出错(即丢失或受损)的分组而避免了不必要的重传。这种个别的、按需的重传要求接收方逐个地确认正确接收的分组。SR接收方将确认一个正确接收的分组而不管其是否按序。失序的分组将被缓存直到所有丢失分组(即序号更小的分组)皆被收到为止,这时才可以将一批分组按序交付给上层。

SR发送方的事件与动作:

  •  从上层收到数据。当从上层接收到数据后,SR发送方检查下一个可用于该分组的序号。如果序号位于发送方的窗口内,则将数据打包并发送;否则就像在GBN中一样,要么将数据缓存,要么将其返回给上层以便以后传输。
  • 超时。定时器再次被用来防止丢失分组。然而,现在每个分组必须拥有其自己的逻辑定时器,因为超时发生后只能发送一个分组。
  • 收到ACK。如果收到ACK,倘若该分组序号在窗口内,则SR发送方将那个被确认的分组标记为已接收。 如果该分组的序号等于send_base,则窗口基序号向前移动到具有最小序号的未确认分组处。如果窗口移动了并且有序号落在窗口内的未发送分组,则发送这些分组。

SR接收方的事件与动作:

  • 序号在[rev_base,rcv_base+N-1]内的分组被正确接收。在此情况下,收到的分组落在接收方的窗口内,一个选择ACK被回送给发送方。如果该分组以前没收到过,则缓存该分组。如果该分组的序号等于接收窗口的基序号(rev_base),则该分组以及以前缓存的序号连续的(起始于rev_base的)分组交付给上层。 然后,接收窗口按向前移动分组的编号向上交付这些分组。举例子来说,考虑一下图3-26。当收到一个序号为 rev_base =2的分组时,该分组及分组3、4、5可被交付给上层。
  • 序号在[rcv_base-N,rcv_base-l]内的分组被正确收到。在此情况下,必须产生一个ACK,即使该分组是接收方以前已确认过的分组。接收方重新确认已收到过的那些序号小于当前窗口基序号的分组。例如,给定在图3-23中所示的发送方和接收方的序号空间,如果分组send_base的ACK没有从接收方传播回发送方,则发送方最终将重传分组send_base,即使接收方已经收到了该分组。如果接收方不确认该分组,则发送方窗口将永远不能向前滑动。这个例子说明了发送方和接收方并不总是能看到相同的结果。 对SR协议而言,这就意味着发送方和接收方的窗口并不总是一致
  • 其他情况。忽略该分组。

3.4.5可靠数据传输机制及其用途的总结

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

我们通过考虑在底层信道模型中的一个遗留假设来结束对可靠数据传输协议的讨论。 前面讲过,我们曾假定分组在发送方与接收方之间的信道中不能被重新排序。这在发送方与接收方由单段物理线路相连的情况下,通常是一个合理的假设。然而,当连接两端的“信道”是一个网络时,分组重新排序是可能会发生的。分组重新排序的一个表现就是, 一个具有序号或确认号x的分组的旧副本可能会出现,即使发送方或接收方的窗口中都没有包含x。对于分组重新排序,信道可被看成基本上是在缓存分组,并在将来任意时刻自然地释放出这些分组。由于序号可以被重新使用,那么必须小心,以免出现这样的冗余分组。实际应用中采用的方法是,确保一个序号不被重新使用,直到发送方“确信”任何先前发送的序号为x的分组都不再在网络中为止。通过假定一个分组在网络中的“存活”时间不会超过某个固定最大时间量来做到这一点。在高速网络的TCP扩展中,最长的分组寿命被假定为大约3分钟。

3.5面向连接的传输:TCP

3.5.1 TCP连接

  • TCP被称为是面向连接的,这是因为在一个应用进程可以开始向另一个应用进程发送数据之前,这两个进程必须先相互“握手”,即它们必须相互发送某些预备报文段,以建立确保数据传输的参数。作为TCP连接建立的一部分,连接的双方都将初始化与TCP连接相关的许多TCP状态变量。
  • TCP“连接”是一条逻辑连接,其共同状态仅保留在两个通信端系统的TCP程序中。由于TCP协议只在端系统中运行,而不在中间的网络元素(路由器和链路层交换机)中运行,所以中间的网络元素不会维持TCP连接状态。事实上,中间路由器对TCP连接完全视而不见,它们看到的是数据报,而不是连接。
  • TCP连接提供的是全双工服务。
  • TCP连接也总是点对点的,即在单个发送方与单个接收方之间的连接。所谓“多播”,即在一次发送操作中,从一个发送方将数据传送给多个接收方,这种情况对TCP来说是不可能的。

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

一旦建立起一条TCP连接,两个应用进程之间就可以相互发送数据了。我们考虑一下从客户进程向服务器进程发送数据的情况。客户进程通过套接字传递数据流。数据一旦通过该门,它就由客户中运行的TCP控制了。TCP将这些数据引导到该连接的发送缓存里,发送缓存是发起三次握手期间设置的缓存之一。接下来TCP就会不时从发送缓存里取出一块数据,并将数据传递到网络层。TCP可从缓存中取出并放入报文段中的数据数量受限于最大报文段长度(MSS)。MSS通常根据最初确定的由本地发送主机发送的最大链路层帧长度 [即所谓的最大传输单元(MTU)] 来设置。设置该MSS要保证一个TCP 报文段(当封装在一个IP数据报中)加上TCP/IP首部长度(通常40字节)将适合单个链路层帧。以太网和PPP链路层协议都具有1500字节的MTU,因此MSS的典型值为1460 字节。已经提出了多种发现路径MTU的方法,并基于路径MTU值设置MSS(路径MTU是指能在从源到目的地的所有链路上发送的最大链路层帧)。注意到MSS是指在报文段里应用层数据的最大长度,而不是指包括首部的TCP报文段的最大长度。

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

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

3.5.2 TCP报文段结构

  • 16比特的源端口号和16比特的目的端口号字段。与 UDP一样,它被用于多路复用/分解来自或送到上层应用的数据。
  • 32比特的序号字段和32比特的确认号字段。这些字段被TCP发送方和接收方用来实现可靠数据传输服务。一个报文段的序号是该报文段首字节的字节流编号。主机A填充进报文段的确认号是主机A期望从主机B收到的下一字节的序号。
  • 4比特的首部长度字段,该字段指示了以32比特的字为单位的TCP首部长度。由于TCP选项字段的原因,TCP首部的长度是可变的。通常选项字段为空,所以TCP首部的典型长度是20字节。
  • 6比特的标志字段ACK比特用于指示确认字段中的值是有效的,即该报文段包括一个对已被成功接收报文段的确认。RSTSYNFIN比特用于连接建立和拆除。在明确拥塞通告中使用了CWR和 ECE比特。当PSH比特被置位时,就指示接收方应立即将数据交给上层。URG比特用来指示报文段里存在着被发送端的上层实体置为“紧急”的数据。紧急数据的最后一个字节由16比特的紧急数据指针字段指出。当紧急数据存在并给出指向紧急数据尾指针的时候,TCP必须通知接收端的上层实体。
  • 16比特的接收窗口字段,该字段用于流量控制。该字段用于指示接收方愿意接受的字节数量。
  • 检验和字段。同UDP一样。
  • 可选与变长的选项字段,该字段用于发送方与接收方协商最大报文段长度(MSS)时,或在高速网络环境下用作窗口调节因子时使用。首部字段中还定义了一个时间戳选项。
1.序号和确认号

TCP把数据看成一个无结构的、有序的字节流。序号是建立在传送的字节流之上,而不是建立在传送的报文段的序列之上。 一个报文段的序号是该报文段首字节的字节流编号。 举例来说,假设主机A上的一个进程想通过一条TCP连接向主机B上的一个进程发送一个数据流。主机A中的TCP将隐式地对数据流中的每一个字节编号。假定数据流由一个包含500000字节的文件组成,其MSS为1000字节,数据流的首字节编号是0。如图3-30所示,该TCP将为该数据流构建500个报文段。给第一个报文段分配序号0,第二个报文段分配序号1000,第三个报文段分配序号2000,以此类推。每一个序号被填入到相应TCP 报文段首部的序号字段中。

主机A填充进报文段的确认号是主机A期望从主机B收到的下一字节的序号。假设主机A已收到了来自主机B的编号为0~535的所有字节,同时假设它打算发送一个报文段给主机B。主机A等待主机B的数据流中字节536及之后的所有字节。所以主机A就会在它发往主机B的报文段的确认号字段中填上536。

当主机在一条TCP连接中收到失序报文段时该怎么办?有趣的是,TCP RFC并没有为此明确规定任何规则,而是把这一问题留给实现TCP的编程人员去处理。他们有两个基本的选择:①接收方立即丢弃失序报文段;②接收方保留失序的字节,并等待缺少的字节以填补该间隔。显然,后一种选择对网络带宽而言更为有效,是实践中采用的方法。

在图3-30中,我们假设初始序号为0。事实上,一条TCP连接的双方均可随机地选择初始序号。这样做可以减少将那些仍在网络中存在的来自两台主机之间先前已终止的连接的报文段,误认为是后来这两台主机之间新建连接所产生的有效报文段的可能性(它碰巧与旧连接使用了相同的端口号)。

2.Telnet:序号和确认号的一个学习案例

Telnet协议是一个用于远程登录的流行应用层协议。它运行在 TCP之上,被设计成可在任意一对主机之间工作。许多用户现在更愿意采用SSH协议而不是Telnet,因为在Telnet连接中发送的数据(包括口令)是没有加密的,使得Telnet易于受到窃听攻击。

3.5.3往返时间的估计与超时

1.估计往返时间

报文段的样本RTT(SampleRTT)是从某报文段被发出(即交给IP)到对该报文段的确认被收到之间的时间量。大多数TCP的实现仅在某个时刻做一次SampleRTT测量,而不是为每个发送的报文段测量一个SampleRTT。TCP不为已被重传的报文段计算SampleRTT。TCP维持一个SampleRTT均值(EstimatedRTT),一旦获得一个新SampleRTT时,TCP就会根据下列公式来更新EstimatedRTT:

EstimatedRTT = (1-α)·EstimatedRTT + α·SampleRTT

EstimatedRTT的新值是由以前的EstimatedRTT值与SampleRTT新值加权组合而成的。a推荐值是0.125。EstimatedRTT是一个SampleRTT值的加权平均值,这个加权平均对最近的样本赋予的权值要大于对旧样本赋予的权值,因为越近的样本越能更好地反映网络的当前拥塞情况。从统计学观点讲,这种平均被称为指数加权移动平均(EWMA)

除了估算RTT外,测量RTT的变化也是有价值的。RTT偏差 DevRTT用于估算SampleRTT一般会偏离EstimatedRTT的程度:

DevRTT =(1 -β) · DevRTT + β · |SampleRTT - EstimatedRTT|

注意到DevRTT是一个SampleRTT与EstimatedRTT之间差值的EWMA。如果SampleRTT值波动较小,那么DevRTT的值就会很小;另一方面,如果波动很大,那么DevRTT 的值就会很大。β的推荐值为0.25。

2.设置和管理重传超时间隔

假设已经给出了EstimatedRTT值和DevRTT值:

TimeoutInterval = EstimatedRTT + 4 · DevRTT

推荐的初始TimeoutInterval值为1秒。当出现超时后,TimeoutInterval值将加倍,以免即将被确认的后继报文段过早出现超时。只要收到报文段并更新EstimatedRTT,就使用上述公式再次计算Timeoutlnterval。

3.5.4可靠数据传输

因特网的网络层服务(IP服务)是不可靠的。IP不保证数据报的交付、数据报的按序交付以及数据报中数据的完整性。对于IP服务,数据报能够溢出路由器缓存而永远不能到达目的地,数据报也可能是乱序到达,而且数据报中的比特可能损坏(由0变为1或者相反)。由于运输层报文段是被IP数据报携带着在网络中传输的,所以运输层的报文段也会遇到这些问题。

TCP在IP不可靠的尽力而为服务之上创建了一种可靠数据传输服务。TCP的可靠数据传输服务确保一个进程从其接收缓存中读出的数据流是无损坏、无间隙、非冗余和按序的数据流;即该字节流与连接的另一方端系统发送出的字节流是完全相同。

为每一个已发送但未被确认的报文段都关联一个定时器,这在概念上是最简单的,但定时器的管理却需要相当大的开销。因此,推荐的定时器管理仅使用单一的重传定时器,即使有多个已发送但还未被确认的报文段。

给出一个TCP发送方高度简化的描述:

  • 从上面应用程序接收到数据e:
    生成具有序号NextSeqNum的TCP报文段;
    if(定时器当前没有运行) 
        启动定时器
    向IP传递报文段
    NextSeqNum=NextSeqNum+length(data)
    break;
  • 定时器超时
    重传具有最小序号但仍未应答的报文段
    启动定时器
    break;
  • 收到ACK,具有ACK字段值y 
    if(y > SendBase){
        SendBase=y
        if(当前还有尚未被确认的报文段)
            启动定时器
    }
    else(/*对已经确认的报文段的一个冗余ACK*/
        对y收到的冗余ACK数加1
        if(对y==3收到的冗余ACK数)
            /*TCP快速重传*/
            重新发送具有序号y的报文段
    }
    break;

1.一些有趣的情况

2.超时间隔加倍

每当超时事件发生时,TCP重传具有最小序号的还未被确认的报文段,将下一次的超时间隔设为先前值的两倍,而不是用从EstimatedRTT和DevRTT推算出的值。超时间隔在每次重传后会呈指数型增长。然而,每当定时器在另两个事件(即收到上层应用的数据和收到ACK)中的任意一个启动时,Timeoutlnterval由最近的EstimatedRTT值与DevRTT值推算得到。

这种修改提供了一个形式受限的拥塞控制。定时器过期很可能是由网络拥塞引起的,即太多的分组到达源与目的地之间路径上的一台(或多台)路由器的队列中,造成分组丢失或长时间的排队时延。在拥塞的时候,如果源持续重传分组,会使拥塞更加严重。相反,TCP使用更文雅的方式,每个发送方的重传都是经过越来越长的时间间隔后进行的。

3.快速重传

超时触发重传存在的问题之一是超时周期可能相对较长。当一个报文段丢失时, 这种长超时周期迫使发送方延迟重传丢失的分组,因而增加了端到端时延。幸运的是,发送方通常可在超时事件发生之前通过注意所谓冗余ACK来较好地检测到丢包情况。冗余ACK就是再次确认某个报文段的ACK,而发送方先前已经收到对该报文段的确认。当TCP接收方收到一个序号大于下一个所期望的、按序的报文段的报文段时,它检测到了数据流中的一个间隔(这个间隔可能是由于在网络中报文段丢失或重新排序造成的),TCP接收方对已经接收到的最后一个按序字节数据进行重复确认(即产生一个冗余ACK)即可。如果TCP发送方接收到对相同数据的3个冗余ACK,它把这当作一种指示,说明跟在这个已被确认过3次的报文段之后的报文段已经丢失。一旦收到3个冗余ACK,TCP就执行快速重传,即在该报文段的定时器过期之前重传丢失的报文段。

4.是回退N步还是选择重传

TCP确认是累积式的,正确接收但失序的报文段是不会被接收方逐个确认的。TCP发送方仅需维持已发送过但未被确认的字节的最小序号(SendBase)和下一个要发送的字节的序号(NextSeqNum)。在这种意义下,TCP看起来更像一个GBN风格的协议。但是TCP和GBN协议之间有着一些显著的区别。许多TCP实现会将正确接收但失序的报文段缓存起来。

对TCP提出的一种修改意见是选择确认,它允许TCP接收方有选择地确认失序报文段,而不是累积地确认最后一个正确接收的有序报文段。当将该机制与选择重传机制结合起来使用时(即跳过重传那些已被接收方选择性地确认过的报文段),TCP看起来很像SR协议。因此,TCP的差错恢复机制也许最好被分类为GBN协议与SR协议的混合体。

3.5.5流量控制

一条TCP连接的每一侧主机都为该连接设置了接收缓存。当该TCP连接收到正确、按序的字节后,它就将数据放人接收缓存。相关联的应用进程会从该缓存中读取数据,但不必是数据刚一到达就立 即读取。事实上,接收方应用也许正忙于其他任务,甚至要过很长时间后才去读取该数据。如果某应用程序读取数据时相对缓慢,而发送方发送得太多、太快,发送的数据就会很容易地使该连接的接收缓存溢出。

TCP为它的应用程序提供了流量控制服务以消除发送方使接收方缓存溢出的可能性。流量控制是一个速度匹配服务,即发送方的发送速率与接收方应用程序的读取速率相匹配。TCP发送方也可能因为IP网络的拥塞而被遏制,这种形式的发送方的控制被称为拥塞控制。即使流量控制和拥塞控制采取的动作非常相似(对发送方的遏制),但是它们显然是针对完全不同的原因而采取的措施。

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

为了能从整体上看问题,我们在本节都假设TCP接收方丢弃失序的报文段。假设主机A通过一条TCP连接向主机B发送一个大文件。主机B为该连接分配了一个接收缓存,并用RcvBuffer来表示其大小。主机B上的应用进程不时地从该缓存中读取数据。我们定义以下变量:

LastByteRead:主机B上的应用进程从缓存读出的数据流的最后一个字节的编号。 LastByteRcvd:从网络中到达的并且已放入主机B接收缓存中的数据流的最后一个字节的编号。

由于TCP不允许已分配的缓存溢出,下式必须成立:

LastByteRcevd – LastByteRead ≤RcvBuffer

接收窗口用rwnd表示,rwnd是一个变量,根据缓存可用空间的数量来设置:

rwnd = RcvBuffer - [LastByteRcvd - LastByteRead]

主机B通过把当前的rwnd值放入发给主机A的报文段的接收窗口字段中,通知主机A它在该连接的缓存中还有多少可用空间。开始时,主机B设定rwnd=RcvBuffer。

主机A轮流跟踪两个变量:LastByteSent和LastByteAcked。这两个变量之间的差就是主机A发送到连接中但未被确认的数据量。通过将未确认的数据量控制在值rwnd以内,就可以保证主机A不会使主机B的接收缓存溢出。因此,主机A在该连接的整个生命周期须保证:

LastByteSent - LastByteAcked ≤ rwnd

假设主机B的接收缓存已经存满rwnd=0。在将rwnd=0通告给主机A之后,还要假设主机B没有任何数据要发给主机A。此时主机B上的应用进程将缓存清空,TCP并不向主机A发送带有rwnd新值的新报文段;因为TCP仅当在它有数据或有确认要发时才会发送报文段给主机A。这样,主机A不可能知道主机B的接收缓存已经有新的空间了,即主机A被阻塞而不能再发送数据!为了解决这个问题,TCP规范中要求:当主机B的接收窗口为0时,主机A继续发送只有一个字节数据的报文段。这些报文段将会被接收方确认。最终缓存将开始清空,并且确认报文里将包含一个非0的rwnd值。

UDP并不提供流量控制, 报文段由于缓存溢出可能在接收方丢失。

3.5.6 TCP连接管理

一条TCP连接是如何建立的:

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

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

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

当一台主机接收到一个TCP报文段,其端口号或源IP地址与该主机上进行中的套接字都不匹配的情况。例如,假如一台主机接收了具有目的端口80的一个TCP SYN分组,但该主机在端口80不接受连接(即它不在端口80上运行Web服务器)。则该主机将向源发送一个特殊重置报文段。该TCP报文段将RST标志位置为1。因此,当主机发送一个重置报文段时,它告诉该源“我没有那个报文段的套接字。请不要再发送该报文段了”。

当一台主机接收一个UDP分组,它的目的端口与进行中的UDP套接字不匹配,该主机发送一个特殊的ICMP数据报。

3.6拥塞控制原理

3.6.1拥塞原因与代价

网络拥塞的代价:

  • 当分组的到达速率接近链路容量时,分组经历巨大的排队时延
  • 发送方必须执行重传以补偿因为缓存溢出而丢弃的分组
  • 发送方在遇到大时延时所进行的不必要重传会引起路由器利用其链路带宽来转发不必要的分组副本
  • 当一个分组沿一条路径被丢弃时,每个上游路由器用于转发该分组到丢弃该分组而使用的传输容量最终被浪费掉了

3.6.2拥塞控制方法

在最为宽泛的级别上,我们可根据网络层是否为运输层拥塞控制提供了显式帮助,来区分拥塞控制方法:

  • 端到端拥塞控制。在端到端拥塞控制方法中,网络层没有为运输层拥塞控制提供显式支持。即使网络中存在拥塞,端系统也必须通过对网络行为的观察(如分组丢失与时延)来推断之。TCP采用端到端的方法解决拥塞控制,因为IP层不会向端系统提供有关网络拥塞的反馈信息。TCP报文段的丢失(通过超时或3次冗余确认而得知)被认为是网络拥塞的一个迹象,TCP会相应地减小其窗口长度。我们还将看到关于TCP拥塞控制的一些最新建议,即使用增加的往返时延值作为网络拥塞程度增加的指示。
  • 网络辅助的拥塞控制。在网络辅助的拥塞控制中,路由器向发送方提供关于网络中拥塞状态的显式反馈信息。对于网络辅助的拥塞控制,拥塞信息从网络反馈到发送方通常有两种方式。直接反馈信息可以由网络路由器发给发送方。这种方式的通知通常采用了一种阻塞分组的形式(主要是说“我拥塞了!”)。更为通用的第二种形式的通知是,路由器标记或更新从发送方流向接收方的分组中的某个字段来指示拥塞的产生。一旦收到一个标记的分组后,接收方就会向发送方通知该网络拥塞指示。注意到后一种形式的通知至少要经过一个完整的往返时间。

3. 7 TCP 拥塞控制

在本节中,TCP使用端到端拥塞控制

3.7.1经典的TCP拥塞控制

TCP所采用的方法是让每一个发送方根据所感知到的网络拥塞程度来限制其能向连接发送流量的速率。如果一个TCP发送方感知从它到目的地之间的路径上没什么拥塞,则TCP发送方增加其发送速率;如果发送方感知沿着该路径有拥塞,则发送方就会降低其发送速率。

  • 问题一:TCP发送方如何限制它向其连接发送流量的速率呢?

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

LastByteSent - LastByteAcked≤min |cwnd, rwnd|

为了关注拥塞控制(与流量控制形成对比)我们假设TCP接收缓存足够大,以至可以忽略接收窗口的限制;因此在发送方中未被确认的数据量仅受限于cwnd。还假设发送方总是有数据要发送,即在拥塞窗口中的所有报文段要被发送。上面的约束限制了发送方中未被确认的数据量,因此间接地限制了发送方的发送速率。为了理解这一点,我们来考虑一个丢包和发送时延均可以忽略不计的连接。因此粗略地讲,在每个往返时间(RTT)的起始点,上面的限制条件允许发送方向该连接发送cwnd个字节的数据,在该RTT结束时发送方接收对数据的确认报文。因此,该发送方的发送速率大概是cwnd/RTT (字节/秒)。通过调节cwnd的值,发送方因此能调整它向连接发送数据的速率。

  • 问题二:TCP发送方如何感知从它到目的地之间的路径上存在拥塞呢?

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

接下来考虑网络没有拥塞,即没有出现丢包事件的情况。TCP将确认的到达作为一切正常的指示,并使用确认来增加窗口的长度(及其传输速率)。如果确认以相当慢的速率到达,则该拥塞窗口将以相当慢的速率增加。如果确认以高速率到达,则该拥塞窗口将会更为迅速地增大。因为TCP使用确认来触发(或计时)增大它的拥塞窗口长度,TCP被说成是自计时的。

如果众多TCP发送方总体上发送太快,它们能够拥塞网络;如果TCP 发送方发送太慢,它们不能充分利用网络的带宽。那么TCP发送方如何确定它们的发送速率,既使得网络不会拥塞,与此同时又能充分利用所有可用的带宽?TCP使用下列指导性原则回答这些问题:

  • 一个丢失的报文段表意味着拥塞,因此当丢失报文段时应当降低TCP发送方的速率。
  • 一个确认报文段指示该网络正在向接收方交付发送方的报文段,因此当对先前未确认报文段的确认到达时,能够增加发送方的速率。
  • 带宽探测。给定ACK指示源到目的地路径无拥塞,而丢包事件指示路径拥塞,TCP调节其传输速率的策略是增加其速率以响应到达的ACK,出现丢包事件时减小传输速率。因此,为探测拥塞开始出现的速率,TCP发送方增加它的传输速率,从该速率后退,进而再次开始探测,看看拥塞开始速率是否发生了变化。

TCP拥塞控制算法包括3个主要部分:①慢启动;②拥塞避免; ③快速恢复。慢启动和拥塞避免是TCP的强制部分,两者的差异在于对收到的ACK做出反应时增加cwnd长度的方式。我们很快将会看到慢启动比拥塞避免能更快地增加cwnd的长度。快速恢复是推荐部分,对TCP发送方并非是必需的。

1.慢启动

慢启动状态,cwnd的值以1个MSS开始并且每当传输的报文段首次被确认就增加1个MSS。TCP发送速率起始慢,但在慢启动阶段以指数增长。

何时结束这种指数增长呢 ?首先,如果存在一个由超时指示的丢包事件(即拥塞),TCP发送方将cwnd设置为1并重新开始慢启动过程,并将第二个状态变量ssthresh(慢启动阈值)的值设置为cwnd/2。慢启动结束的第二种方式是直接与ssthresh的值相关联。当cwnd的值等于ssthresh时,结束慢启动并且TCP转移到拥塞避免模式。最后一种结束慢启动的方式是,如果检测到3个冗余ACK,这时TCP执行一种快速重传并进入快速恢复状态。

2.拥塞避免

一旦进入拥塞避免状态,cwnd的值大约是上次遇到拥塞时的值的一半,每个RTT只将cwnd的值增加一个MSS。

但是何时应当结束拥塞避免的线性增长(每RTT 1MSS)呢?当出现超时时,cwnd的值被设置为1个MSS,ssthresh的值被更新为cwnd值的一半。当发送方收到三个冗余ACK时,TCP将cwnd的值减半(为使测量结果更好,已收到的3个冗余的 ACK 要加上3个MSS),将ssthresh的值记录为cwnd的值的一半。接下来进入快速恢复状态。

3.快速恢复

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

快速恢复是TCP推荐的而非必需的构件。TCP早期版本TCP Tahoe,不管是发生超时指示的丢包事件,还是发生3个冗余ACK指示的丢包事件,都无条件地将其拥塞窗口减至1个MSS,并进入慢启动阶段。TCP的较新版本TCP Reno,则综合了快速恢复。

4.TCP拥塞控制:回顾

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

5.TCP CUBIC
6.对TCP吞吐量的宏观描述

给出TCP的锯齿状行为后,自然要考虑一个长存活期的TCP连接的平均吞吐量(即平均速率)可能是多少。在这个分析中,我们将忽略在超时事件后出现的慢启动阶段(这些阶段通常非常短,因为发送方很快就以指数增长离开该阶段)。在一个特定的往返间隔内,TCP发送数据的速率是拥塞窗口与当前RTT的函数。当窗口长度是w字节,往返时间是RTT秒时,则TCP的发送速率大约是w/RTT。TCP通过每经过1个RTT将w增加1个MSS探测出额外的带宽,直到一个丢包事件发生为止。当一个丢包事件发生时,用W表示w的值。假设在连接持续期间RTT和W几乎不变,那么TCP的传输速率在W/(2xRTT)到W/RTT之间变化。 这些假设导出了TCP稳态行为的一个高度简化的宏观模型。当速率增长至W/RTT时,网络丢弃来自连接的分组;然后发送速率就会减半,进而每过一个RTT就发送速率增加MSS/RTT,直到再次达到W/RTT为止。这一过程不断地自我重复。因为TCP吞吐量(即速率)在两个极值之间线性增长,所以我们有

一条连接的平均吞吐量=0.75 × W / RTT

3.7.2 网络辅助明确拥塞通告和基于时延的拥塞控制

1.明确拥塞通告
2.基于时延的拥塞控制

3.7.3公平性

1.公平性和UDP
2.公平性和并行TCP连接

3.8运输层功能的演化

第四章 网络层:数据平面

网络层提供主机到主机的通信服务。

网络层能够被分解为两个相互作用的部分,即数据平面控制平面。网络层的数据平面功能:决定到达路由器输入链路之一的数据报如何转发到该路由器的输出链路之一。网络层的控制平面功能:控制数据报沿着从源主机到目的主机的端到端路径中路由器之间的路由方式。

我们将约定术语分组交换机是指一台通用分组交换设备,它根据分组首部字段中的值,从输入链路接口到输出链路接口转移分组。某些分组交换机称为链路层交换机,基于链路层帧中的字段值做出转发决定,这些交换机因此被称为链路层(第2层)设备。其他分组交换机称为路由器,基于网络层数据报中的首部字段值做出转发决定。路由器因此是网络层(第3层)设备。因为在本章中我们关注的是网络层,所以我们将主要使用术语路由器来代替交换机。

4.1网络层概述

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

转发是指将分组从一个输入链路接口转移到适当的输出链路接口的路由器本地动作。转发发生的时间尺度很短(通常为几纳秒),因此通常用硬件来实现。转发是在数据平面中实现的唯一功能。

路由选择是指确定分组从源到目的地所采取的端到端路径的网络范围处理过程。路由选择发生的时间尺度长得多(通常为几秒),因此通常用软件来实现。路由选择在网络层的控制平面中实现。

每台网络路由器中有一个关键元素是它的转发表。分组首部的一个或多个字段值对应存储在转发表项中的值,表项指出了该分组将被转发的路由器的输出链路接口。路由器检使用这些首部值在其转发表中索引,通过这种方法来转发分组。

1.控制平面:传统的方法

路由选择算法运行在每台路由器中,并且在每台路由器中都包含转发和路由选择两种功能。在一台路由器中的路由选择算法与在其他路由器中的路由选择算法通信,以计算出它的转发表的值。这种通信是根据路由选择协议交换包含路由选择信息的路由选择报文。

2.控制平面:SDN方法

控制平面路由选择功能与物理的路由器是分离的,即路由选择设备仅执行转发,而远程控制器计算和分发转发表以供每台路由器所使用。远程控制器可能实现在具有高可靠性和冗余的远程数据中心中,并可能由ISP或某些第三方管理。路由器和远程控制器通过交换包含转发表和其他路由选择信息的报文进行通信。

软件定义网络(SDN)通过将这些控制平面功能作为一种单独服务,明确地分离数据平面和控制平面,控制平面功能通常置于一台远程“控制器”中。控制平面方法是软件定义网络(SDN)的本质,因为计算转发表并与路由器交互的控制器是用软件实现的,故网络是“软件定义”的。

4.1.2网络服务模型

网络服务模型定义了分组在发送与接收端系统之间的端到端运输特性。因特网的网络层提供了单一的服务,称为尽力而为服务。使用尽力而为服务,传送的分组既不能保证以它们发送的顺序被接收,也不能保证它们最终交付;既不能保证端到端时延,也不能保证有最小的带宽。尽力而为服务看起来是根本无服务的一种委婉说法。

4.2路由器工作原理

一台路由器的四个组件: 

  • 输入端口。图4-4中输入端口最左侧的方框执行终结入物理链路的物理层功能。中间的方框与位于入链路远端的数据链路层交互来执行数据链路层功能。最右侧的方框执行查找功能。控制分组(如携带路由选择协议信息的分组)从输入端口转发到路由选择处理器。通过查询转发表决定路由器的输出端口,到达的分组通过路由器的交换结构转发到输出端口。
  • 交换结构。交换结构将路由器的输入端口连接到它的输出端口。这种交换结构完全包含在路由器之中,即它是一个网络路由器中的网络!
  • 输出端口。输出端口存储从交换结构接收的分组,并通过执行必要的链路层和物理层功能在输出链路上传输这些分组。
  • 路由选择处理器。路由选择处理器执行控制平面功能。在传统的路由器中,它执行路由选择协议,维护路由选择表与关联链路状态信息,并为该路由器计算转发表。在SDN路由器中,路由选择处理器负责与远程控制器通信,目的是接收由远程控制器计算的转发表项,并在该路由器的输人端口安装这些表项。路由选择处理器还执行网络管理功能。

路由器的输入端口、输出端口和交换结构几乎总是用硬件实现。当数据平面以纳秒时间尺度运行时,路由器的控制功能以毫秒或秒时间尺度运行。控制平面的功能通常用软件实现并在路由选择处理器(通常是一种传统的CPU)上执行。

4.2.1 输入端口处理和基于目的地转发

输入端口的线路端接功能与链路层处理实现了用于各个输入链路的物理层和链路层。路由器使用转发表来查找输出端口,使得到达的分组能经过交换结构转发到该输出端口。转发表是由路由选择处理器计算和更新的(使用路由选择协议与其他网络路由器中的路由选择处理器进行交互)。或者转发表接收来自远程SDN控制器的内容,转发表从路由选择处理器经过独立总线复制到线路卡,使用在每个输入端口的影子副本,转发决策能在每个输入端口本地做出,无须基于每个分组调用集中式路由选择处理器,因此避免了集中式处理的瓶颈。

路由器用分组目的地址的前缀与该表中的表项进行匹配;如果存在一个匹配项,则路由器向与该匹配项相关联的链路转发分组。如果一个前缀不匹配前3项中的任何一项,则路由器向链路接口3转发该分组。一个目的地址可能与不止一个表项相匹配。当有多个匹配时,该路由器使用最长前缀匹配规则,即在该表中寻找最长的匹配项,并向与最长前缀匹配相关联的链路接口转发分组。

尽管“查找”在输入端口处理中可认为是最为重要的动作,但必须采取许多其他动作:①必须出现物理层和链路层处理;②必须检查分组的版本号、检验和以及寿命字段,并且重写后两个字段; ③必须更新用于网络管理的计数器(如接收到的IP数据报的数目)。

4.2.2交换

交换结构位于一台路由器的核心部位,通过交换结构,分组从一个输入缓冲区交换(即转发)到一个输出端口中。三种典型的交换结构:

  • 经内存交换
  • 经总线交换
  • 经互联网络交换

4.2.3输出端口处理

如图4-7中所示,输出端口处理取出已经存放在输出端口内存中的分组并将其发送到输出链路上。这包括选择和取出排队的分组进行传输,执行所需的链路层和物理层传输功能。

4.2.4何处出现排队

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

假定输入线路速度与输出线路速度(传输速率)是相同的,均为Rline(单位为每秒分组数),并且有N个输入端口和N个输出端口。为进一步简化讨论,假设所有分组具 有相同的固定长度,分组以同步的方式到达输入端口。这就是说,在任何链路发送分组的时间等于在任何链路接收分组的时间,在这样的时间间隔内,在一个输入链路上能够到达0个或1个分组。定义交换结构传送速率Rswitch为从输入端口到输出端口能够移动分组的速率。如果Rswitch比Rline快N倍,则在输人端口处仅会出现微不足道的排队。这是因为即使在最坏情况下,所有N条输人线路都在接收分组,并且所有的分组将被转发到相同的输出端口,每批N个分组(每个输入端口一个分组)也能够在下一批到达前 通过交换结构处理完毕。

1.输入排队

如果交换结构不能快得(相对于输入线路速度而言)使所有到达分组无时延地通过它传送,在输入端口将出现分组排队。到达的分组必须加入输入端口队列中,以等待通过交换结构传送到输出端口。为了举例说明这种排队的重要后果,考虑纵横式交换结构,并假定:①所有链路速度相同;②一个分组能够以一条输入链路接收一个分组所用的相同的时间量,从任意一个输入端口传送到给定的输出端口;③分组按FCFS方式,从一指定输入队列移动到其要求的输出队列中。只要其输出端口不同,多个分组可以被并行传送。然而,如果位于两个输入队列前端的两个分组是发往同一输出队列的,则其中的一个分组将被阻塞,且必须在输入队列中等待,因为交换结构一次只能传送一个分组到某指定端口。

图4-8显示了一个例子,其中在输入队列前端的两个分组(带深色阴影)要发往同一个右上角输出端口。假定该交换结构决定发送左上角队列前端的分组。在这种情况下,左下角队列中的深色阴影分组必须等待。但不仅该分组要等待,左下角队列中排在该分组后面的浅色阴影分组也要等待,即使右中侧输出端口( 色阴影分组的目的地)中无竞争。这种现象叫作输入排队交换机中的线路前部(HOL)阻塞,即在一个输入队列中排队的分组必须等待通过交换结构发送(即使输出端口是空闲的),因为它被位于线路前部的另一个分组所阻塞。由于 HOL阻塞,只要输入链路上的分组到达 速率达到其容量的58%,在某些假设前提下,输入队列长度就将无限制地增大。

2.输出排队

再次假定Rswitch比Rline快N倍,并且到达N个输入端口的每个端口的分组,其目的地是相同的输出端口。在这种情况下,在向输出链路发送一个分组的时间内,将有N个新分组到达该输出端口(N个输入端口的每个都到达1个)。因为输出端口在一个单位时间(该分组的传输时间)内仅能传输一个分组,这N个到达分组必须排队(等待)经输出链路传输。在正好传输N个分组(这些分组是前面正在排队的)之一的时间中,可能又到达N个分组,等等。所以,分组队列能够在输出端口形成,即使交换结构比端口线路速率快N倍。最终,排队的分组数量能够变得足够大,耗尽输出端口的可用内存。

当没有足够的内存来缓存一个入分组时,就必须做出决定:要么丢弃到达的分组(采用一种称为弃尾的策略),要么删除一个或多个已排队的分组为新来的分组腾出空间。在某些情况下,在缓存填满之前便丢弃一个分组(或在其首部加上标记)的做法是有利的,这可以向发送方提供一个拥塞信号。

3.多少缓存才“够用”?

多年以来,用于缓存长度的经验方法是,缓存数量(B)应当等于平均往返时延(RTT)乘以链路的容量(C)。这个结果是基于相对少量的TCP流的排队动态性分析得到的。因此,一条具有250ms RTT的 10Gbps链路需要的缓存量等于B=RTT·C=2.5Gb。然而,最近的理论和试验研究表明,当有大量的TCP流(N条)流过一条链路时,缓存所需要的数量是B=RTT·C/√N。对于通常有大量流经过的大型主干路由器链路,N的值可能非常大,所需的缓存明显减小。

更大的缓冲区使路由器有能力承受分组到达率的更大波动,从而降低路由器的分组丢失率。但更大的缓冲区也意味着潜在的更长的排队时延。

4.2.5分组调度

1.先进先出

FIFO(也称为先来先服务,FCFS)调度规则按照分组到达输出链路队列的相同次序 来选择分组在链路上传输。

2.优先排队权

在优先权排队规则下,到达输出链路的分组被分类放入输出队列中的优先权类,每个优先权类通常都有自己的队列。当选择一个分组传输时,优先权排队规则将从队列为非空的最高优先权类中传输一个分组。在同一优先权类的分组之间的选择通常以FIFO方式完成。

3.循环和加权公平排队

在循环排队规则下,分组像使用优先权排队那样被分类。然而,在类之间不存在严格的服务优先权,循环调度器在这些类之间轮流提供服务。在最简单形式的循环调度中,类1的分组被传输,接着是类2的分组,接着又是类1的分组,再接着又是类2的分组,等等。一个所谓的保持工作排队规则在有(任何类的)分组排队等待传输时,不允许链路保持空闲。当寻找给定类的分组但是没有找到时,保持工作的循环规则将立即检查循环序列中的下一个类。

4.3 网际协议:IPv4、寻址、IPv6及其他

4.3.1 IPv4 数据报格式

IPv4数据报中的关键字段如下:

  • 版本(号)。这4比特规定了数据报的IP协议版本。IP版本4(IPv4);IP版本6(IPv6)。
  • 首部长度。这4比特用来确定IP分组首部长度,以4字节为单位。
  • 服务类型(TOS)。指定期望获得哪种类型的服务,以便使不同类型的IP数据报(例如,一些特别要求低时延、高吞吐量或可靠性的数据报)能相互区别开来。
  • 数据报长度。这是IP数据报的总长度(首部加上数据),以字节计。该字段长为16比特。
  • 标识、标志、片偏移。这三个字段与所谓IP分片有关。
  • 寿命(Time-To-Live,TTL)。寿命字段用来标识IP分组在网络中可以通过的路由器数,确保数据报不会永远在网络中循环。每当一台路由器处理数据报时,该字段的值减 1。若TTL字段减为0,则该数据报必须丢弃。
  • 协议。该字段值指示了IP数据报的数据部分应交给哪个特定的运输层协议。例如,值为6表明 数据部分要交给TCP,而值为17表明数据要交给UDP。IP数据报中的协议号所起的作用,类似于运输层报文段中端口号字段、链路层帧的类型字段所起的作用。
  • 首部检验和。路由器要对每个收到的IP数据报计算其首部检验和,如果数据报首部中携带的检验和与计算得到的检验和不一致,则检测出是个差错。路由器一般会丢弃检测出错误的数据报。在每台路由器上必须重新计算检验和并再次存放到原处,因为TTL字段以及可能的选项字段会改变。为什么TCP/IP在运输层与网络层都执行差错检测?首先,在IP层只对IP首部计算了检验和,而TCP/UDP检验和是对整个TCP/UDP报文段进行的。其次,TCP/UDP与IP不一定都必须属于同一个协议栈。原则上, TCP能够运行在一个不同的协议(如ATM)上,而IP能够携带不一定要传递给TCP/UDP的数据。
  • 源和目的IP地址。
  • 选项。选项字段允许IP首部被扩展。
  • 数据(有效载荷)。在大多数情况下,IP数据报中的数据字段包含要交付给目的地的运输层报文段(TCP或UDP)。然而,该数据字段也可承载其他类型的数据,如ICMP报文。

4.3.2 IPv4编址

主机/路由器与物理链路之间的边界叫作接口。一个IP地址与一个接口相关联,而不是与包括该接口的主机或路由器相关联。每个IP地址长度为32比特。这些地址通常按点分十进制记法书写,即地址中的每个字节用它的十进制形式书写,各字节间以句点隔开。

在全球因特网中的每台主机和路由器上的每个接口,都必须有一个全球唯一的IP地址(NAT后面的接口除外)。一个接口的IP地址的一部分需要由其连接的子网来决定。 图4-18中,左上侧的3台主机以及它们连接的路由器接口,都有一个形如223.1.1.xxx的IP地址。它们的IP地址中最左侧的24比特是相同的。这4个接口也通过一个并不包含路由器的网络互联起来。用IP的术语来说,互联这3个主机接口与1个路由器接口的网络形成一个子网。IP编址为这个子网分配一个地址223.1.1.0/24,其中的 /24记法,称为子网掩码,指示32比特中的最左侧24比特定义了子网地址。

因特网的地址分配策略被称为无类别域间路由选择(CIDR)。当使用子网寻址时,具有32比特的IP地址a.b.c.d/x被划分为两部分,其中x指示了地址的第一部分中的比特数。一个地址的x最高比特构成了IP地址的网络部分,并且经常被称为该地址的前缀(或网络前缀)。一个地址的剩余32-x比特可认为是用于区分该组织内部设备的,其中的所有设备具有相同的网络前缀。当该组织内部的路由器转发分组时,才会考虑这些比特。这些较低阶比特可能(或可能不)具有另外的子网结构。

在CIDR被采用之前,IP地址的网络部分被限制为长度为8、16或24比特,这是分类编址的编址方案,具有8、16和24比特子网地址的子网分别被称为A、B和C类网络。一个IP地址的网络部分正好为1、2或3字节的要求,已经在支持数量迅速增加的具有小规模或中等规模子网的组织方面出现了问题。一个C类子网仅能容纳多达2^{8}-2=254(其中的两个地址预留用于特殊用途)台主机,这对于许多组织来说太小了。然而一个B类子网可支持多达65534 台主机,又太大了。例如有2000台主机的组织通常被分给一个B类地址。这就导致了B类地址空间的迅速损耗以及所分配的地址空间的利用率低下。

IP广播地址255.255.255.255:当一台主机发出一个目的地址为255.255.255.255的数据报时,该报文会交付给同一个网络中的所有主机。路由器也会有选择地向邻近的子网转发该报文。

特殊IP地址:

私有IP地址是指在内部网络中使用,但在全球互联网上不可路由的IP地址。这些地址是在特定的地址范围内分配,以便在内部网络中唯一标识设备。这些地址范围内的IP地址不会在公共互联网上直接路由,因此可以在不同的私有网络中重复使用,而不会发生冲突。私有IP无法直接连接互联网,需要使用网络地址转换(NAT)或者代理服务器来实现。私有IP地址范围通常包括以下三个段:

  • 10.0.0.0 到 10.255.255.255
  • 172.16.0.0 到 172.31.255.255
  • 192.168.0.0 到 192.168.255.255
1.获取一块地址

IP地址由因特网名字和编号分配机构(ICANN)管理,一个全球性的权威机构,它具有管理IP地址空间并向各ISP和其他组织分配地址块的最终责任。非营利的ICANN组织的作用不仅是分配IP地址,还管理DNS根服务器,还有分配域名与解决域名纷争。ICANN向区域性因特网注册机构(如ARIN、RIPE、 APNIC和LACNIC)分配地址,这些机构一起形成了ICANN的地址支持组织,处理本区域内的地址分配/管理。

2.获取主机地址:动态主机配置协议 

某组织一旦获得了一块地址,它就可为本组织内的主机与路由器接口逐个分配IP地址。系统管理员通常手工配置路由器中的IP地址,但是这项任务目前更多的是使用动态主机配置协议(DHCP)来完成。DHCP允许主机自动获取(被分配)一个IP地址。网络管理员能够配置DHCP,以使某给定主机每次与网络连接时能得到一个相同的IP地址,或者某主机将被分配一个临时的IP地址,每次与网络连接时该地址也许是不同的。除了主机IP地址分配外,DHCP还允许一台主机得知其他信息,例如它的子网掩码、它的第一跳路由器地址(常称为默认网关)与它的本地 DNS服务器的地址。 由于DHCP具有将主机连接进一个网络的网络相关方面的自动能力,故它又常被称为即插即用协议零配置协议。

DHCP是一个客户-服务器协议。客户通常是新到达的主机,它要获得包括自身使用的IP地址在内的网络配置信息。在最简单场合下,每个子网将具有一台DHCP服务器。如果在某子网中没有服务器,则需要一个DHCP中继代理(通常是一台路由器),这个代理知道用于该网络的DHCP服务器的地址。

从移动性角度看,DHCP有非常严重的缺陷。因为每当节点连到一个新子网,要 从DHCP得到一个新的IP地址,当一个移动节点在子网之间移动时,就不能维持与远程应用之间的TCP连接。移动IP是一种对IP基础设施的扩展, 允许移动节点在网络之间移动时使用其单一永久的地址。

4.3.3 网络地址转换

地址空间10.0.0.0/8是三部分私有IP地址空间之一,这些地址用于家庭网络等专用网络具有专用地址的地域。专用网络是指建立在私有IP地址基础上的内部网络,通常在组织或企业内部使用,仅对该网络中的设备有意义的网络。

网络地址转换(NAT)是一种在IP数据包通过路由器或防火墙时重写来源或目的IP地址或端口的技术。

NAT路由器通常会维护一个NAT转换表来跟踪内部私有网络和外部公共网络之间的地址转换。这个表记录了内部私有IP地址和端口号与外部公共IP地址和端口号之间的映射关系。NAT 路由器收到该子网中某台主机的数据报时,为该数据报生成新的源端口号,将源IP替代为其广域网侧接口的IP, 且将源端口更换为新端口(当生成一个新的源端口号时,NAT路由器可选择任意一个当前未在NAT转换表中的源端口号)。路由器中的NAT在它的NAT转换表中增加一表项,当外部网络的响应返回时,NAT路由器可以根据转换表找到正确的内部设备,将响应数据包传递给它。

NAT路由器对外界的行为就如同一个具有单一IP地址的单一设备,不像一台路由器。NAT使能路由器对外界隐藏了家庭网络的细节。路由器从ISP的DHCP服务器得到它的地址,并且路由器运行一个DHCP服务器,为位于NAT-DHCP路由器控制的家庭网络地址空间中的计算机提供地址。

4.3.4 IPv6

1. IPv6 数据报格式

下是在IPv6中定义的字段。

  • 版本。该4比特字段用于标识IP版本号。将该字段值置为4并不能创建一个合法的IPv4数据报。
  • 流量类型。该8比特字段与IPv4中的TOS字段的含义相似。
  • 流标签。该20比特用于标识一个数据流。这个字段的目的是帮助IPv6设备在网络层轻松地识别和处理属于同一流的数据包。
  • 有效载荷长度。该16比特值作为一个无符号整数,给出了IPv6数据报中跟在定长的40字节数据报首部后面的字节数量。
  • 下一个首部。该字段标识数据报中的内容(数据字段)需要交付给哪个协议(如TCP)。该字段使用与IPv4首部中协议字段相同的值。
  • 跳限制。转发数据报的每台路由器将对该字段的内容减1。如果跳限制计数达到0,则该数据报将被丢弃。
  • 源地址和目的地址。IPv6将IP地址长度从32比特增加到128比特。除了单播与多播地址以外,IPv6 还引入了任播地址的新型地址,这种地址可以使数据报交付给一组主机中的任意一个。
  • 数据。这是IPv6数据报的有效载荷部分。当数据报到达目的地时,该有效载荷就从IP数据报中移出,并交给在下一个首部字段中指定的协议处理。

在IPv4数据报中出现的几个 字段在IPv6数据报中已不复存在:

  • 分片/重新组装。IPv6不允许在中间路由器上进行分片与重新组装。这种操作只能在源与目的地执行。如果路由器收到的IPv6数据报因太大而不能转发到出链路上的话,则路由器只需丢掉该数据报,并向发送方发回一个“分组太大”的ICMP 差错报文即可。于是发送方能够使用较小长度的IP数据报重发数据。分片与重新组装是一个耗时的操作,将该功能从路由器中删除并放到端系统中, 大大加快了网络中的IP转发速度。
  • 首部检验和。因为因特网层中的运输层(如TCP与UDP)和数据链路层(如以太网)协议执行了检验操作,IP设计者大概觉得在网络层中具有该项功能实属多余,所以将其去除。再次强调的是,快速处理IP分组是关注的重点。由于IPv4首部中包含有一个TTL字段,所以在每台路由器上都需要重新计算IPv4首部检验和。就像分片与重新组装一样,在IPv4中这也是一项耗时的操作。
  • 选项。选项字段不再是标准IP首部的一部分了。但它并没有消失,而是可能出现 在IPv6首部中由“下一个首部”指出的位置上。这就是说,就像TCP或UDP协议首部能够是IP分组中的“下一个首部”一样,选项字段也能是“下一个首部”。 删除选项字段使得IP首部成为定长的40字节。

2.从IPv4到IPv6的迁移

在实践中已经得到广泛采用的IPv4到IPv6迁移的方法包括建隧道。建隧道依据的基本思想如下:假定两个IPv6节点要使用IPv6数据报进行交互,但它们是经由中间IPv4路由器互联的。我们将两台IPv6路由器之间的中间IPv4路由器的集合称为一个隧道。借助于隧道,在隧道发送端的IPv6节点 可将整个IPv6数据报放到一个IPv4数据报的数据(有效载荷)字段中。于是, 该IPv4数据报的地址设为指向隧道接收端的IPv6节点,再发送给隧道中的第一个节点。隧道中的中间IPv4路由器在它们之间为该数据报提供路由,就像对待其他数据报一样,完全不知道该IPv4数据报自身就含有一个完整的IPv6数据报。隧道接收端的IPv6节点最终收到该IPv4数据报(它是该IPv4数据报的目的地),并确定该IPv4数据报含有一个IPv6数据报(通过观察在IPv4数据报中的协议号字段是41,指示该IPv4有效载荷是IPv6数据报),从中取出IPv6数据报,然后再为该IPv6数据报提供路由,就好像它是从一个直接相连的IPv6邻居那里接收到该IPv6数据报一样。

4.4 泛化转发和SDN

4.2.1节将基于目的地转发的特征总结为两个步骤:查找目的IP地址(“匹配”),然后将分组发送到有特定输出端口的交换结构(“操作”)。现在考虑一种更有意义的通用“匹配加操作”范式,其中能够对协议栈的多个首部字段进行“匹配”,这些首部字段是与不同层次的不同协议相关联的。“操作”能够包括:将分组转发到一个或多个输出端口、重写首部值、有意识地阻挡/丢弃某个分组、为进一步处理和操作而向某个特定的服务器发送一个分组等等。

由于转发决策可能使用网络层和链路层源和目的地址做出转发决定,所以转发设备更为准确地描述为“分组交换机”而不是第三层“路由器”或第二层“交换机”。图4-28显示了位于每台分组交换机中的一张匹配加操作表,该表由远程控制器计算、安装和更新。

我们后续对泛化转发的讨论将基于OpenFlow,OpenFlow是一种用于实现SDN的通信协议,它使控制平面和数据平面分离。OpenFlow定义了控制器和交换机之间的通信协议,允许控制器通过流表配置交换机的数据转发行为。OpenFlow交换机内部包含一个或多个流表。每个流表都由多个流表项组成,每个流表项定义了一个特定流的匹配条件和相应的操作。它的每个表项包括:

  • 首部字段值的集合,入分组将与之匹配。匹配不上流表项的分组将被丢弃或发送到远程控制器做更多处理。
  • 计数器集合(当分组与流表项匹配时更新计数器)。这些计数器可以包括已经与该表项匹配的分组数量,以及自从该表项上次更新以来的时间。
  • 当分组匹配流表项时所采取的动作集合。这些动作可能将分组转发到给定的输出端口,丢弃该分组、复制该分组和将它们发送到多个输出端口,和/或重写所选的首部字段。

4.4.1匹配

图4-29显示了11个分组首部字段和入端口ID,它们可与OpenFlow 1.0中的匹配加操作规则所匹配。OpenFlow的匹配抽象允许对来自三个层次的协议首部所选择的字段进行匹配(违反了分层原则)。每个流表项也具有相应的优先权。 如果一个分组匹配多个流表项,选定的匹配和对应的动作将是其中有最高优先权的那个。

4.4.2操作

每个流表项都有零个或多个操作列表,这些操作决定了应用于与流表项匹配的分组的处理。如果有多个操作,它们以在表中规定的次序执行。 其中最为重要的动作可能是:

  • 转发。一个入分组可以转发到一个特定的物理输出端口,广播到所有端口(分组到 达的端口除外),或通过所选的端口集合进行多播。该分组可能被封装并发送到用于该设备的远程控制器。该控制器则可能(或可能不)对该分组采取某些操作, 包括安装新的流表项,以及可能将该分组返回给该设备以在更新的流表规则集合下进行转发。
  • 丢弃。没有操作的流表项表明某个匹配的分组应当被丢弃。
  • 修改字段。在分组被转发到所选的输出端口之前,分组首部10个字段(图4-29中显示的除IP协议字段外的所有第二、三、四层的字段)中的值可以重写。

4.4.3运行中的匹配加操作的 OpenFlow 例子

4.5中间盒

中间盒:在源主机和目的主机之间的数据路径上,执行除了IP路由器的正常标准功能之外的其他功能的任何中间的盒子。

由中间盒提供的三种服务:

  • NAT转换
  • 安全服务
  • 性能增强

第五章 网络层:控制平面

5.1概述

转发表(在基于目的地转发的场景中)和流表(在泛化转发的场景中)是链接网络层的数据平面和控制平面的首要元素。我们知道这些表定义了一台路由器的本地数据平面转发行为。在本章中,我们将学习这些转发表和流表是如何计算、维护和安装的。完成这些工作有两种可能的方法:

  • 每路由器控制。图5-1显示了在每台路由器中运行一种路由选择算法的情况,每台路由器中都包含转发和路由选择功能。每台路由器有一个路由选择组件,用于与其他路由器中的路由选择组件通信,以计算其转发表的值。OSPF和BGP协议都是基于这种每路由器的方法进行控制的。
  • 逻辑集中式控制。图5-2显示了逻辑集中式控制器计算并分发转发表以供每台路由器使用的情况。该控制器经一种定义良好的协议与每台路由器中的一个控制代理(CA)进行交互,以配置和管理该路由器的转发表。CA一般具有最少的功能,其任务是与控制器通信并且按控制器命令行事。与图5-1中的路由选择算法不同,这些CA既不能直接相互交互,也不能主动参与计算转发表。这是每路由器控制和逻辑集中式控制之间的关键差异。

5.2路由选择算法

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

路由选择算法的分类方式:

  • 根据该算法是集中式还是分散式来划分。
    • 集中式路由选择算法用完整的、全局性的网络知识计算出从源到目的地之间的最低开销路径。集中式算法具有关于连通性和链路开销方面的完整信息。具有全局状态信息的算法常被称作链路状态(LS)算法,因为该算法必须知道网络中每条链路的开销。
    • 分散式路由选择算法中,路由器以迭代、分布式的方式计算出最低开销路径。没有节点拥有关于所有网络链路开销的完整信息。每个节点仅有与其直接相连链路的开销知识即可开始工作。然后,通过迭代计算过程以及与相邻节点的信息交换,一个节点逐渐计算出到达某目的节点或 一组目的节点的最低开销路径。距离向量(DV)算法每个节点维护到网络中所有其他节点的开销(距离)估计的向量。
  • 根据算法是静态的还是动态的进行分类。在静态路由选择算法中,通常是人工进行调整(如人为手工编辑一条链路开销)。动态路由选择算法随着网络流量负载或拓扑发生变化而改变路由选择路径。一个动态算法可周期性地运行或直接响应拓扑或链路开销的变化而运行。虽然动态算法易于对网络的变化做出反应,但也更容易受诸如路由选择循环、路由振荡之类问题的影响。
  • 根据负载敏感的还是负载迟钝的进行划分。在负载敏感算法中,链路开销会动态地变化以反映出底层链路的当前拥塞水平。如果当前拥塞的一条链路与高开销相联系,则路由选择算法趋向于绕开该拥塞链路来选择路由。当今的因特网路由选择算法(如RIP、OSPF和BGP)都是负载迟钝的,因为某条链路的开销不明确地反映其当前(或最近)的拥塞水平。

5.2.1 链路状态路由选择算法

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

我们下面给出的链路状态路由选择算法叫作Dijkstra算法。Dijkstra算法计算从某节点(源节点,我们称之为u)到网络中所有其他节点的最低开销路径。Dijkstra算法是迭代算法,其性质是经算法的第k次迭代后,可知道到k个目的节点的最低开销路径,在到所有目的节点的最低开销路径之中,这k条路径具有k个最低开销。我们定义下列记号:

D(v):到算法的本次迭代,从源节点到目的节点v的最低开销路径的开销。

p(v):从源到v沿着当前最低开销路径的前一节点。

N':节点子集;如果从源到v的最低开销路径已确知,v在N'中。

该集中式路由选择算法由一个初始化步骤和其后的循环组成。循环执行的次数与网络中节点个数相同。一旦终止,该算法就计算出了从源节点u到网络中每个其他节点的最短路径。

当LS算法终止时,对于每个节点,我们都得到从源节点沿着它的最低开销路径的前一节点。对于每个前一节点,我们又有它的前一节点,以此方式我们可以构建从源节点到所有目的节点的完整路径。通过对每个目的节点存放从u到目的地的最低开销路径上的下一跳节点,在一个节点中的转发表则能够根据此信息而构建。

算法的计算复杂性:O(x^{2})

5.2.2 距离向量路由选择算法

距离向量算法是一种迭代的、异步的和分布式的算法,而LS算法是一种使用全局信息的算法。说它是分布式的,是因为每个节点都要从一个或多个直接相连邻居接收某些信息,执行计算,然后将其计算结果分发给邻居。说它是迭代的,是因为此过程一直要持续到邻居之间无更多信息要交换为止。(有趣的是,此算法是自我终止的,即没有计算应该停止的信号,它就停止了)说它是异步的,是因为它不要求所有节点相互之间步伐一致地操作。

令d(y)是从节点x到节点y的最低开销路径的开销。则该最低开销与著名的 Bellman-Ford 方程相关,即:

d_{x}(y)=min_{v}{c(x,v)+d_{v}(y)} 

方程中的min,是对于x的所有邻居的。

1.距离向量算法:链路开销改变与链路故障

当一个运行DV算法的节点检测到从它自己到邻居的链路开销发生变化时,它就更新距离向量,并且如果最低开销路径的开销发生了变化,向邻居通知其新的距离向量。考虑下面两种情况:

  • 当某链路开销减小时发生的情况。假设从y到x的链路开销从4变为1。我们在此只关注y与z到目的地x的距离表中的有关表项。DV算法导致下列事件序列的出现:y检测到链路开销变化(开销从4变为1),更新其距离向量,并通知其 邻居这个变化,因为最低开销路径的开销已改变。接下来,z收到来自y的更新报文并更新了其距离表。它计算出到x的新最低开销(从开销5减为开销2),它向其邻居发送了它的新距离向量。y收到来自z的更新并更新其距离表。y的最低开销未变,因此y不发送任何报文给z。该算法进入静止状态。 因此,对于该DV算法只需两次迭代就到达了静止状态。在x与y之间开销减少的好消息通过网络得到了迅速传播。
  • 当某链路开销增加时发生的情况。假设x与y之间的链路开销从4增加到60。y检测到链路开销变化(开销从4变为60)。y计算它到x的新的最低开销路径的开销,其值为:从网络全局的视角来看,我们能够看出经过z的这个新开销是错误的。但节点y仅有的信息是:它到x的直接开销是60,且z上次已告诉y,z能以开销5到x。因此,y将通过z路由,完全期望z能以开销5到达x,并将该新距离向量通知z。接下来z收到y的新距离向量,它指示了y到x的最低开销是6。z知道它能以开销1到达y,因此计算出到x的新最低开销为7,并通知y其新开销。以类似方式,在收到z的新距离向量后,y计算出到达x的最低开销8并向z发送其距离向量。 接下来z确定到x的最低开销9并向y发送其距离向量,等等。该循环将持续44次迭代,直到z最终算出它经由y的路径开销大于50为止。此时,z将确定它到x的最低开销路径是经过它到x的直接连接。y将经由z路由选择到x。关于链路开销增加的坏消息传播得很慢。

我们遇到路由选择环路,即为到达x,y通过z路由,z又通过y路由。路由选择环路就像一个黑洞,即目的地为x的分组在t时刻到达y或z后,将在这两个节点之间不停地(或直到转发表发生改变为止)来回反复。如果链路开销c(y,x)从4变为10000且开销c(z,x)为9999 时将发生什么样的现象呢?由于这种情况,我们所见的问题有时被称为无穷计数问题。

2.距离向量算法:增加毒性逆转 

刚才描述的特定循环的场景可以通过使用一种称为毒性逆转的技术而加以避免。其思想较为简单:如果z通过y路由选择到目的地x,则z将通告y,z到x的距离是无穷大。只要z经y路由选择到x,z就持续地向y讲述这个善意的小谎言。因为y相信z没有到x的路径,故只要z继续经y路由选择到x,y将永远不会试图经由z路由选择到x。 当涉及3个或更多节点(而不只是两个直接相连的邻居节点)的环路将无法用毒性逆转技术检测到。

3.LS 与 DV 路由选择算法的比较
  • 报文复杂性。LS算法要求每个节点都知道网络中每条链路的开销,而且无论何时一条链路的开销改变时,必须向所有节点发送新的链路开销。DV算法要求在每次迭代时,在两个直接相连邻居之间交换报文。当链路开销改变时,DV算法仅当在新的链路开销导致与该链路相连节点的最低开销路径发生改变时,才传播已改变的链路开销。
  • 收敛速度。DV算法收敛较慢,且在收敛时会遇到路由选择环路、无穷计数的问题。
  • 健壮性。如果一台路由器发生故障、行为错乱或受到蓄意破坏时情况会怎样呢?对于LS算法,路由器能够向其连接的链路(而不是其他链路)广播不正确的开销。 作为LS广播的一部分,一个节点也可损坏或丢弃它收到的任何LS广播分组。但是一个LS节点仅计算自己的转发表;其他节点也自行执行类似的计算。这就意味着在LS算法下,路由计算在某种程度上是分离的,提供了一定程度的健壮性。在DV算法下,一个节点可向任意或所有目的节点通告其不正确的最低开销路径。更一般地,我们会注意到每次迭代时,在DV算法中一个节点的计算会传递给它的邻居,然后在下次迭代时再间接地传递给邻居的邻居。在此情况下,DV算法中一个不正确的节点计算值会扩散到整个网络。

5.3 因特网中自治系统内部的路由选择:OSPF

每个自治系统(AS)由一组通常处在相同管理控制下的路由器组成。通常在一个ISP中的路由器以及互联它们的链路构成一个AS。某些ISP将它们的网络划分为多个AS。一个自治系统由其全局唯一的AS号(ASN)所标识,AS号由ICANN区域注册机构所分配。在相同AS中的路由器都运行相同的路由选择算法并且有彼此的信息。在一个自治系统内运行的路由选择算法叫作自治系统内部路由选择协议

开放最短路优先(OSPF)

OSPF路由选择协议被广泛用于因特网的AS内部路由选择。OSPF是一种链路状态协议,它使用洪泛链路状态信息和Dijkstra最低开销路径算法。使用OSPF,一台路由器构建了一幅关于整个自治系统的完整拓扑图。每台路由器在本地运行Dijkstra的最短路径算法,以确定一个以自身为根节点到所有子网的最短路径树。各条链路开销是由网络管理员配置的。管理员也许会选择将所有链路开销设为1,因而实现了最少跳数路由选择,或者可能会选择将链路权值按与链路容量成反比来设置,从而不鼓励流量使用低带宽链路。OSPF不强制使用设置链路权值的策略,而是提供了一种机制 (协议),为给定链路权值集合确定最低开销路径的路由选择。

使用OSPF时,路由器向自治系统内所有其他路由器广播路由选择信息,而不仅仅是向其相邻路由器广播。每当一条链路的状态发生变化时(如开销的变化或连接/中断状态的变化),路由器就会广播链路状态信息。即使链路状态未发生变化,它也要周期性地(至少每隔30min一次)广播链路状态。OSPF通告包含在OSPF报文中,该OSPF报文直接由IP承载,对OSPF其上层协议的值为89。因此OSPF协议必须自己实现诸如可靠报文传输、链路状态广播等功能。OSPF协议还要检查链路正在运行(通过向相连的邻居发送HELLO报文),并允许OSPF路由器获得相邻路由器的网络范围链路状态的数据库。

OSPF的优点包括下列几方面:

  • 安全。能够鉴别OSPF路由器之间的交换(如链路状态更新)。使用鉴别,仅有受信任的路由器能参与一个AS内的OSPF协议,因此可防止恶意入侵者将不正确的信息注人路由器表内。
  • 多条相同开销的路径。当到达某目的地的多条路径具有相同的开销时,OSPF允许使用多条路径(当存在多条相等开销的路径时,无须仅选择单一的路径来承载所有的流量)。
  • 对单播与多播路由选择的综合支持。多播OSPF(MOSPF)提供对OSPF的简单扩展,以便提供多播路由选择。MOSPF使用现有的OSPF链路数据库, 并为现有的OSPF链路状态广播机制增加了一种新型的链路状态通告。
  • 支持在单个AS中的层次结构。一个OSPF自治系统能够层次化地配置多个区域。 每个区域都运行自己的OSPF链路状态路由选择算法,区域内的每台路由器都向该区域内的所有其他路由器广播其链路状态。在每个区域内,一台或多台区域边界路由器负责为流向该区域以外的分组提供路由选择。最后,在AS中只有一个OSPF区域配置成主干区域。主干区域的主要作用是为该AS中其他区域之间的流量提供路由选择。该主干总是包含本AS中的所有区域边界路由器,并且可能还包含了一些非边界路由器。在AS中的区域间的路由选择要求分组先路由到一个区域边界路由器(区域内路由选择),然后通过主干路由到位于目的区域的区域边界路由器,进而再路由到最终目的地。

5.4 ISP 之间的路由选择:BGP

OSPF是一个AS内部路由选择协议。当在相同AS内的源和目的地之间进行分组选路时,分组遵循的路径完全由AS内路由选择协议所决定。当分组跨越多个AS进行路由时,需要自治系统间路由选择协议。因为AS间路由选择协议涉及多个AS之间的协调,所以AS通信必须运行相同的AS间路由选择协议。在因特网中,所有的AS运行相同的AS间路由选择协议,称为边界网关协议(BGP)。 

5.4.1BGP的作用

在BGP中,分组并不是路由到一个特定的目的地址,相反是路由到CIDR化的前缀,其中每个前缀表示一个子网或一个子网的集合。一台路由器的转发表将具有形式为(x,I)的表项,其中x是一个前缀(例如138.16.68/22),I是该路由器的接口之一的接口号。

作为一种AS间的路由选择协议,BGP为每台路由器提供了一种完成以下任务的手段:

1)从邻居AS获得前缀的可达性信息。BGP允许每个字网向因特网的其余部分通告它的存在。

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

5.4.2通告BGP路由信息

对于每个AS,每台路由器要么是一台网关路由器,要么是一台内部路由器。网关路由器是一台位于AS边缘的路由器,它直接连接到在其他AS中的一台或多台路由器。内部路由器仅连接在它自己AS中的主机和路由器。例如,在AS1中路由器1c是网关路由器;路由器1a、1b和1d是内部路由器。

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

为了传播可达性信息,使用了iBGP和eBGP会话。考虑向AS1和AS2中的所有路由器通告前缀x的可达性信息。在这个过程中,网关路由器3a先向网关路由器2c发送 一个eBGP报文“AS3 x”。网关路由器2c然后向AS2中的所有其他路由器(包括网关路由器2a)发送iBGP报文“AS3 x”。网关路由器2a接下来向网关路由器1c发送一个eBGP报文“AS2 AS3 x”。最后,网关路由器1c使用iBGP向AS1中的所有路由器发送报文 “AS2 AS3 x”。在这个过程完成后,在AS1和AS2中的每个路由器都知道了x的存在并且也都知道了通往x的AS路径。当路由器获得新的前缀可达性时,即在其转发表中增加关于该前缀的入口(路由项)。

当然,在真实的网络中,从某个给定的路由器到某个给定的目的地可能有多条不同的路径,每条通过了不同的AS序列。例如,考虑图5-10所示的网络,它是在图5-8那个初始网络基础上,从路由器1d到路由器3d附加了一条物理链路。在这种情况下,从AS1到x有两条路径:经过路由器1c的路径“AS2 AS3 x”;以及经过路由器1d的新路径“AS3 x”。

5.4.3确定最好的路由

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

AS-PATH属性包含了通告已经通过的AS的列表。为了生成AS-PATH的值,当一个前缀通过某AS时,该AS将其ASN加入AS-PATH中的现有列表。BGP路由器还使用AS-PATH属性来检测和防止通告环路,如果一台路由器在路径列表中看到包含了它自己的AS,它将拒绝该通告。

NEXT-HOP是AS-PATH起始的路由器接口的IP地址。如图5-10中所指示的那样,对于从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

这里,每条BGP路由包含3个组件:NEXT-HOP;ASPATH;目的前缀。注意到NEXT-HOP属性是不属于AS1的某路由器的IP地址;然而,包含该IP地址的子网直接连接到AS1。

1.热土豆路由选择

使用热土豆路由选择,(从所有可能的路由中)选择的路由到开始该路由的NEXT-HOP路由器具有最小开销。

考虑在图5-10网络中的路由器1b。这台路由器将学习到达前缀x的两条BGP路由。路由器1b将查阅它的AS内部路由选择信息,以找到通往NEXT-HOP路由器2a的最低开销AS内部路径以及通往NEXT-HOP路由器3d的最低开销AS间路径,进而选择这些最低开销路径中具有最低开销的那条。例如,假设开销定义为穿越的链路数。则从路由器1b到路由器2a的最低开销是2,从路由器1b到路由器3d的最低开销是3,因此将选择路由器2a。路由器1b则将查阅它的转发表 (由它的AS内部算法所配置),并且找到通往路由器2a的位于最低开销路径上的接口 I。 1b则把(x,I)加到它的转发表中。

图5-11中总结了在一台路由器转发表中对于热土豆路由选择增加AS向外前缀的步骤。注意到下列问题是重要的:当在转发表中增加AS向外前缀时,AS间路由选择协议 (BGP)和AS内部路由选择协议(如OSPF)都要用到。

热土豆路由选择依据的思想是:对于路由器1b,尽可能快地将分组送出其AS(用可能的最低开销),而不担心其AS外部到目的地的余下部分的开销。就“热土豆路由选择”名称而言,分组被类比为烫手的热土豆。因为它烫手,你要尽可能快地将它传给另一个人(另一个AS)。热土豆路由选择因而是自私的算法,即它试图减小在它自己AS中的开销,而忽略在其AS之外的端到端开销的其他部分。注意到使用热土豆路由选择,对于在相同AS中的两台路由器,可能对相同的前缀选择两条不同的AS路径。例如,路由器1b到达x将通过AS2发送分组。而路由器1d将绕过AS2并直接向AS3发送分组到达x。

2.路由器选择算法

在实践中,BGP使用了一种比热土豆路由选择更为复杂但却结合了其特点的算法。对于任何给定的目的地前缀,进入BGP的路由选择算法的输人是到某前缀的所有路由的集合,该前缀是已被路由器学习和接受的。如果仅有一条这样的路由,BGP则显然选择该路由。

如果到相同的前缀有多条路由,则顺序地调用下列消除规则直到余下一条路由:

1)路由被的本地偏好值。

2)最短AS-PATH的路由。

3)最靠近NEXT-HOP路由器的路由(使用热土豆路由选择)。

4)使用BGP标识符来选择路由。

举一个例子,我们再次考虑图5-10中的路由器1b。前面讲过到前缀x确切地有两条BGP路由,一条通过AS2而另一条绕过AS2。前面也讲过如果它使用自己的热土豆路由选择,则BGP将通过AS2向前缀x路由分组。但在上面的路由选择算法中,在规则3之前应用了规则2,导致BGP选择绕过AS2的那条路由,因为该路由具有更短的AS-PATH。因此我们看到使用上述路由选择算法,BGP不再是一种自私的算法,即它先查找具有短AS路径的路由(因而很可能减小端到端时延)。 

5.4.4 IP任播

除了作为因特网的AS间路由选择协议外,BGP还常被用于实现IP任播服务,该服务通常用于DNS中。为了说明IP任播的动机,考虑在许多应用中,我们对下列情况感兴趣:①在许多分散的不同地理位置,替换不同服务器上的相同内容;②让每个用户从最靠近的服务器访问内容。例如,一个CDN能够更换位于不同国家、不同服务器上的视频和其他对象。类似地,DNS系统能够在遍及全世界的DNS服务器上复制DNS记录。当一个用户要访问该复制的内容,可以将用户指向具有该复制内容的“最近的”服务器。BGP的路由选择算法为做这件事提供了一种最为容易和自然的机制。

为使我们的讨论具体,我们描述CDN可能使用IP任播的方式。如图5-12所示,在IP任播配置阶段,CDN公司为它的多台服务器指派相同的IP地址,并且使用标准的BGP从这些服务器的每台来通告该IP地址。当某台BGP路由器收到对于该IP地址的多个路由通告,它将这些通告处理为对相同的物理位置提供不同的路径(事实上,这时这些通告对不同的物理位置是有不同路径的)。当配置其路由选择表时,每台路由器将本地化地使用BGP路由选择算法来挑选到该IP地址的“最好的”(例如,由AS跳计数确定的最近的)路由。例如,如果一个BGP路由离该路由器仅一AS跳的距离,并且所有其他BGP路由是两AS跳和更多AS跳,则该BGP路由器将选择把分组路由到一跳远的那个位置。在这个初始BGP地址通告阶段后,CDN能够进行其分发内容的主要任务。当某客户请求视频时,CDN向该客户返回由地理上分散的服务器所使用的共同IP地址,而无论该客户位于何处。当该客户想向那个IP地址发送一个请求时,因特网路由器则向那个“最近的”服务器转发该请求分组,最近的服务器是由BGP路由选择算法所定义的。

尽管上述CDN的例子很好地诠释了能够如何使用IP任播,但实践中CDN通常选择不使用IP任播,因为BGP路由选择变化能够导致相同的TCP连接的不同分组到达Web服务器的不同实例。但IP任播被DNS系统广泛用于将DNS请求指向最近的根DNS服务器。 2.4节讲过,当前根DNS服务器有13个IP地址。但对应于这些地址的每一个,有多个DNS根服务器,其中有些地址具有100多个DNS根服务器分散在世界的各个角落。当一 个DNS请求向这13个IP地址发送时,使用IP任播将该请求路由到负责该地址的最近的 那个DNS根服务器。

5.4.5路由选择策略

当某路由器选择到目的地的一条路由时,AS路由选择策略能够胜过所有其他考虑, 例如最短AS路径或热土豆路由选择。在路由选择算法中,实际上首先根据本地偏好属性选择路由,本地偏好值由本地AS的策略所确定。

图5-13显示了6个互联的自治系统:A、B、C、W、X和 Y。重要的是注意到A、B、C、W、X和 Y是AS,而不是路由器。假设自治系统W、X和Y是接入ISP,而A、B和C是主干提供商网络。我们还要假设A、B和C直接向彼此发送流量,并向它们的客户网络提供全部的BGP信息。

所有进入一个接入ISP网络的流量必定是以该网络为目的地,所有离开一个接入ISP网络的流量必定源于该网络。W和Y是桩网络,因为它只与一个其他AS相连。X是一个多宿接入ISP,因为它连接两个其他AS。X向其邻居B和C通告它没有通向(除自身以外)任何其他目的地的路径,这就是说,即使X可能知道一条路径(比如说 XCY)能到达网络Y,它也将不把该条路径通告给B。由于B不知道X有一条路径到Y,B绝不会经由X转发目的为Y(或C)的流量。这个简单的例子说明了如何使用一条选择的路由通告策略来实现客户/提供商路由选择关系。

我们接下来关注一个提供商网络,比如自治系统B。假定B已经从A处知道了A有一条到W的路径A W。B因此能将路由A W安装到其路由信息库中。显然,B也想向它的客户X通告路径B A W,这样X知道它能够通过B路由到W。但是,B应该将路径B A W通告给C吗?如果它这样做,则C可以经由B A W将流量引导到W。如果A、B和C都是主干提供商,而B也许正好觉得它不应该承担在A与C之间传送流量的负担和开销。B可能有理由认为,确保C能经过A和C之间的直接连接引导A客户的来去流量是A和C的工作和开销。目前还没有强制主干ISP之间如何路由选择的官方标准。然而,商业 运行的ISP们都遵从的一个经验法则是:任何穿越某ISP主干网的流量必须是其源或目的(或两者)位于该ISP的某个客户网络中;不然的话这些流量将会免费搭车通过该ISP的网络。各个对等协定通常都是ISP双方进行协商,而且经常是对外保密的。

5.4.6 拼装在一起:在因特网中呈现

5.5 SDN控制平面

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

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

5.5.1 SDN控制平面:SDN控制器和SDN网络控制应用程序

SDN控制器的功能可大体组织为3个层次:

  • 通信层:SDN控制器和受控网络设备之间的通信。如果SDN控制器要控制 远程SDN使能的交换机、主机或其他设备的运行,需要一个协议来传送控制器与 这些设备之间的信息。
  • 网络范围状态管理层。控制器具有有关网络的主机、链路、交换机和其他SDN控制设备的最新状态信息。控制器维护流表的拷贝。这些信息都构成了由SDN 控制器维护的网络范围“状态”的例子。
  • 对于网络控制应用程序层的接口。控制器通过它的“北向”接口与网络控制应用 程序交互。该API允许网络控制应用程序在状态管理层之间读/写网络状态和流表。 当状态改变事件出现时,应用程序能够注册进行通告。

5.5.2 OpenFlow协议

OpenFlow协议运行在SDN控制器和SDN控制的交换机或其他实现OpenFlow API的设备之间。OpenFlow 协议运行在TCP之上,使用6653的默认端口号。

从控制器到受控交换机流动的重要报文 有下列这些:

  • 配置。该报文允许控制器查询并设置交换机的配置参数。
  • 修改状态。该报文由控制器所使用,以增加/删除或修改交换机流表中的表项,并且设置交换机端口特性。
  • 读状态。该报文被控制器用于从交换机的流表和端口收集统计数据和计数器值。
  • 发送分组。该报文被控制器用于在受控交换机从特定的端口发送出一个特定的报文。

从受控交换机到控制器流动的重要报文有下列这些:

  • 流删除。该报文通知控制器已删除一个流表项,例如由于超时,或作为收到“修改状态”报文的结果。
  • 端口状态。交换机用该报文向控制器通知端口状态的变化。
  • 分组入。一个分组到达交换机端口,并且不能与任何流表项匹配,那么这个分组将被发送给控制器进行额外处理。匹配的分组也被发送给控制器,作为匹配时所采取的一个动作。“分组入”报文被用于将分组发送给控制器。

5.5.3 数据平面和控制平面交互的例子

为了具体地理解SDN控制的交换机与SDN控制器之间的交互,我们考虑图5-16中所示的例子,其中使用了Dijkstra算法来决定最短路径 路由。图5-16中的SDN场景与前面5.2.1节和5.3节中描述的每路由器控制场景有两个重要差异,Dijkstra算法是实现在每台 路由器中并且在所有网络路由器中洪泛 链路状态更新:

  • Dijkstra算法作为一个单独的程 序来执行,位于分组交换机的 外部。
  • 分组交换机向SDN控制器发送 链路更新并且不互相发送。

在这个例子中,我们假设交换机 s1和s2之间的链路断开;实现了最短 路径路由选择,因此,除了s2操作未 改变外,sl、s3和4的人和出流转发 规则都受到影响。我们也假定Open- Flow被用作通信层协议,控制平面只 执行链路状态路由选择而不执行其他 功能。 1)交换机sl经历了自己与s2之间 的链路故障,使用OpenFlow“端口状 态”报文向SDN控制器通报该链路状 态的更新。 2)SDN控制器接收指示链路状态更新的OpenFlow报文,并且通告链路状态管理器,由管理器更新链路状态库。 3)实现Dijkstra链路状态路由选择的网络控制应用程序先前进行了注册,当链路状态 更新时将得到通告。应用程序接收该链路状态更新的通告。 4)链路状态路由选择应用程序与链路状态管理器相互作用,以得到更新的链路状态; 它也会参考状态管理层中的其他组件。然后它计算新的最低开销路径。 5)链路状态路由选择应用则与流表管理器交互,流表管理器决定更新的流表。 6)流表管理器则使用OpenFlow协议更新位于受影响的交换机sl、s2和s4的流表项, 其中sl此时将经s4将分组的目的地指向s2,s2此时将经中间交换机s4开始接收来自sl 的分组,s4此时必须转发来自sl且目的地为s2的分组。 这个例子虽简单,但图示了SDN控制平面如何提供控制平面服务(此时为网络层路 由选择),而该服务以前是以每路由器控制在每台路由器中实现的。我们现在能够容易地 体会到,SDN使能的ISP能够容易地将最低开销路径的路由选择转变为更加定制的路由选 择方法。因为控制器的确能够随心所欲地定制流表,因此能够实现它喜欢的任何形式的转 发,即只是通过改变它的应用控制软件。这种改变的便利性与传统的每路由器控制平面的情况形成对照,传统的情况必须要改变所有路由器中的软件,而这些路由器可能是由多个 不同厂商提供给ISP的。

5.5.4 SDN的过去与未来

很多研究工作以研发未来SDN体系结构和能力为目标。如我们所见,SDN革命正在导致颠覆性地替代专用的整体交换机和路由器。类似地,称之为网络功能虚拟化(NFV)的通用SDN的目标是用简单的商用服务器、交换机和存储器来颠覆性地替代复杂的中间盒(例如用于媒体高速缓存/服务的具有专用硬件和专有软件的中间盒)。第二个重要研究领域是寻求将SDN概 念从AS内部设置扩展到AS之间设置。

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

因特网控制报文协议(ICMP),被主机和路由器用来彼此沟通网络层的信息。ICMP最典型的用途是差错报告。例如,当运行一个HTTP会话时,也许会遇到一些诸如“目的网络不可达”之类的错误报文。这种报文就来源于ICMP。在某个位置,IP路由器不能找到一条通往HTTP请求中所指定的主机的路径,该路由器就会向你的主机生成并发出一个ICMP报文以指示该错误。

ICMP通常被认为是IP的一部分,但从体系结构上讲它位于IP之上,因为ICMP报文是承载在IP分组中的。当一台主机收到一个指明上层协议为ICMP的IP数据报时(协议号为1),它分解出该数据报的内容给ICMP。

ICMP报文有一个类型字段和一个编码字段,并且包含引起该ICMP报文首次生成的IP数据报的首部和前8个字节(以便发送方能确定引发该差错的数据报)。

在图5-19中显示了所选的ICMP报文类型。注意到ICMP报文并不仅是用于通知差错情况。

第六章 链路层和局域网

在链路层的讨论中,我们将看到两种截然不同类型的链路层信道。第一种类型是广播信道,这种信道用于连接有线局域网、卫星网和混合光纤同轴电缆(HFC)接入网中的多台主机。因为许多主机与相同的广播信道连接,需要所谓的媒体访问协议来协调帧传输。在某些场合中,可以使用中心控制器来协调传输。第二种类型的链路层信道是点对点通信链路,在诸如长距离链路连接的两台路由器之间,或用户办公室计算机与它们所连接的邻近以太网交换机之间等场合经常能够发现。协调对点对点链路的访问较为简单,点到点协议(PPP)的适用范围从经电话线的拨号服务到经光纤链路的高速点到点帧传输。

6.1链路层概述

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

6.1.1链路层提供的服务

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

  • 成帧。在每个网络层数据报经链路传送之前,几乎所有的链路层协议都要将其用链路层帧封装起来。一个帧由一个数据字段和若干首部字段组成,其中网络层数据报就插在数据字段中。帧的结构由链路层协议规定。
  • 链路接入。媒体访问控制(Medium Access Control,MAC)协议规定了帧在链路上传输的规则。对于在链路的一端仅有一个发送方、链路的另一端仅有一个接收方的点对点链路,MAC协议比较简单(或者不存在),即无论何时链路空闲,发送方都能够发送帧。当多个节点共享单个广播链路时,即所谓多路访问问题。这里,MAC协议用于协调多个节点的帧传输。
  • 可靠交付。当链路层协议提供可靠交付服务时,它保证无差错地经链路层移动每个网络层数据报。与运输层可靠交付服务类似,链路层的可靠交付服务通常是通过确认和重传取得的。链路层可靠交付服务通常用于易于产生高差错率的链路,例如无线链路,其目的是本地(也就是在差错发生的链路上)纠正一个差错,而不是通过运输层或应用层协议迫使进行端到端的数据重传。然而,对于低比特差错的链路,包括光纤、同轴电缆和许多双绞铜线链路,链路层可靠交付可能会被认为是一种不必要的开销。由于这个原因,许多有线的链路层协议不提供可靠交付服务。
  • 差错检测和纠正。当帧中的一个比特作为1传输时,接收方节点中的链路层硬件可能不正确地将其判断为0,反之亦然。这种比特差错是由信号衰减和电磁噪声导致的。因为没有必要转发一个有差错的数据报,所以许多链路层协议提供一种机制来检测这样的比特差错。通过让发送节点在帧中包括差错检测比特,让接收节点进行差错检查,以此来完成这项工作。因特网的运输层和网络层也提供了有限形式的差错检测,即因特网检验和。链路层的差错检测通常更复杂,并且用硬件实现。差错纠正类似于差错检测,区别在于接收方不仅能检测帧中出现的比特差错,而且能够准确地确定帧中的差错出现的位置(并因此纠正这些差错)。

6.1.2链路层在何处实现

路由器的链路层是实现在路由器线路卡中的。主机的链路层是在网络适配器中实现的(网络适配器有时也称为网络接口卡(NIC))。

图6-2显示了一个典型的主机体系结构。位于网络适配器核心的是链路层控制器,该控制器通常是一个实现了许多链路层服务(成帧、链路接入、差错检测等)的专用芯片。因此,链路层控制器的许多功能是用硬件实现的。

链路层的软件组件实现了高层链路层功能,如组装链路层寻址信息和激活控制器硬件。在接收端,链路层软件响应控制器中断(例如,由于一个或多个帧的到达),处理差错条件和将数据报向上传递给网络层。所以,链路层是硬件和软件的结合体,即此处是协议栈中软件与硬件交接的地方。

6.2差错检测和纠正技术

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

接收方的挑战是在它只收到D'和EDC'的情况下,确定D'是否和初始的D相同。在图6-3中的接收方判定的准确措辞(我们问是否检测到一个差错,而非是否出现了差错!) 是重要的。差错检测和纠正技术使接收方有时但并总是检测出已经出现的比特差错。即使采用差错检测比特,也还是可能有未检出比特差错。因此,接收方可能向网路层交付一个损伤的数据报,或者不知道该帧首部的某个其他字段的内容已经损伤。因此要选择一个差错检测方案,使得这种事件发生的概率很小。一般而言,差错检测和纠错技术越复杂 (即那些具有未检测出比特差错概率较小的技术),导致的开销就越大,这就是意味着需要更多的计算量及更多的差错检测和纠错比特。

6.2.1 奇偶校验

假设要发送的信息有d比特。在偶校验方案中,发送方只需包含一个附加的比特,选择它的值,使得这d+1比特(初始信息加上一个校验比特)中1的总数是偶数。对于奇校验方案,选择校验比特值使得有奇数个1。单个校验比特被存放在一个单独的字段中。接收方只需要数一数接收的d+1比特中1的数目即可。如果在采用偶校验方案中发现了奇数个值为1的比特,接收方知道至少出现了一个比特差错。更精确的说法是,出现了奇数个比特差错。 在突发差错的情况下,使用单比特奇偶校验保护的一帧中未检测出差错的概率能够达到50%。图6-4描述了一个偶校验的方案。

图6-5显示了单比特奇偶校验方案的二维一般化方案。这里D中的d个比特被划分为i行j列。对每行和每列计算奇偶值。 产生的 i + j + l 奇偶比特构成了链路层帧的差错检测比特。现在假设在初始d比特信息中出现了单个比特差错。使用这种二维奇偶校验方案,包含比特值改变的列和行的校验值都将会出现差错。接收方不仅可以检测到出现了单个比特差错的事实,而且还可以利用存在奇偶校验差错的列和行的索引来实际识别发生差错的比特并纠正它。

 

6.2.2 检验和方法

将数据的字节作为16比特的整数对待并求和,这个和的反码形成了携带在报文段首部的因特网检验和。接收方通过对接收的数据(包括检验和)的和取反码,并且检测其结果是否为全1比特来检测检验和。如果这些比特中有任何比特是0,就可以指示出差错。

6.2.3 循环冗余检测

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

CRC编码操作如下。考虑d比特的数据D,发送节点要将它发送给接收节点。发送方和接收方首先必须协商一个r+l比特模式,称为生成多项式G。要求G的最高有效位的比特(最左边)是1。CRC编码的关键思想如图6-6 所示。对于一个给定的数据段D,发送方要选择r个附加比特R,并将它们附加到D上,使得得到的d+r比特模式(被解释为一个二进制数)用模2算术恰好能被G整除。用CRC进行差错检测的过程很简单:接收方用G去除接收到的d+r比特。如果余数为非零,接收方知道出现了差错;否则认为数据正确而被接收。

6.3多路访问链路和协议

点对点链路由链路一端的单个发送方和链路另一端的单个接收方组成。许多链路层协议都是为点对点链路设计的,如点对点协议(PPP)和高级数据链路控制(HDLC)就是两种这样的协议。第二种类型的链路是广播链路,它能够让多个发送和接收节点都连接到相同的、单一的、共享的广播信道上。这里使用术语“广播”是因为当任何一个节点传输一个帧时,信道广播该帧,每个其他节点都收到一个副本。以太网和无线局域网是广播链路层技术的例子。如何协调多个发送和接收节点对一个共享广播信道的访问,这就是多路访问问题。广播信道通常用于局域网中,局域网是一个地理上集中在一座建筑物中(或者在一个公司,或者在大学校园)的网络。因此我们还将在本节后面考察一下多路访问信道是如何在局域网中使用的。

节点通过多路访问协议来规范它们在共享的广播信道上的传输行为。在各种各样的网络环境下需要多路访问协议,包括有线和无线接入网,以及卫星网络。尽管从技术上讲每个节点通过它的适配器访问广播信道,但在本节中我们将把节点作为发送和接收设备。在实践中,数以百计或者甚至数以千计个节点能够通过一个广播信道直接通信。

因为所有的节点都能够传输帧,所以多个节点可能会同时传输帧。当发生这种情况时,所有节点同时接到多个帧;这就是说,传输的帧在所有的接收方处碰撞了。通常,当碰撞发生时,没有一个接收节点能够有效地获得任何传输的帧;在某种意义下,碰撞帧的信号纠缠在一起。因此,涉及此次碰撞的所有帧都丢失了,在碰撞时间间隔中的广播信道被浪费了。显然,如果许多节点要频繁地传输帧,许多传输将导致碰撞,广播信道的大量带宽将被浪费掉。当多个节点处于活跃状态时,为了确保广播信道执行有用的工作,以某种方式协调活跃节点的传输是必要的。这种协调工作由多路访问协议负责。能够将任何多路访问协议划分为3种类型之一:信道划分协议随机接入协议轮流协议

在理想情况下,对于速率为R bps的广播信道,多路访问协议应该具有以下所希望的特性:

1)当仅有一个节点发送数据时,该节点具有Rbps的吞吐量;

2)当有M个节点发送数据时,每个节点吞吐量为R/Mbps。这不必要求M个节点中 的每一个节点总是有R/M的瞬间速率,而是每个节点在一些适当定义的时间间隔内应该 有R/M的平均传输速率。

3)协议是分散的;这就是说不会因某主节点故障而使整个系统崩溃。

4)协议是简单的,使实现不昂贵。

6.3.1 信道划分协议

  • 时分多路复用(TMD)。TDM将时间划分为时间帧,并进一步划分每个时间帧为N个时隙。然后把每个时隙分配给N个节点中的一个。无论何时某个节点在有分组要发送的时候,它在循环的TDM帧中指派给它的时隙内传输分组比特。通常,选择的时隙长度应使一个时隙内能够传输单个分组。TDM消除了碰撞而且非常公平。然而它有两个主要缺陷。首先,节点被限制于R/Nbps的 平均速率,即使当它是唯一有分组要发送的节点时。其次,节点必须总是等待它在传输序列中的轮次,即我们再次看到,即使它是唯一一个有帧要发送的节点。
  • 频分多路复用(FMD)。TDM在时间上共享广播信道,而FDM将Rbps信道划分为不同的频段,并把每个频率分配给N个节点中的一个。FDM也有TDM同样的优点和缺点。它避免了碰撞,在N个节点之间公平地划分了带宽。然而,FDM限制一个节点只能使用R/N的带宽,即使当它是唯一一个有分组要发送的节点时。
  • 码分多址(CDMA)。CDMA对每个节点分配一种不同的编码。然后每个节点用它唯一的编码来对它发送的数据进行编码。如果精心选择这些编码,CDMA网络具有一种奇妙的特性,即不同的节点能够同时传输,并且它们各自相应的接收方仍能正确接收发送方编码的数据比特(假设接收方知道发送方的编码),而不在乎其他节点的干扰传输。

6.3.2 随机接入协议

在随机接入协议中,一个传输节点总是以信道的全部速率进行发送。当有碰撞时,涉及碰撞的每个节点反复地重发它的帧,到该帧无碰撞地通过为止。但是当一个节点经历一次碰撞时,它不必立刻重发该帧。相反,它在重发该帧之前等待一个随机时延。涉及碰撞的每个节点独立地选择随机时延。因为该随机时延是独立地选择的,所以下述现象是有可能的:这些节点之一所选择的时延充分小于其他碰撞节点的时延,并因此能够无碰撞地将它的帧在信道中发出。

1.时隙 ALOHA

在对时隙ALOHA的描述中,我们做下列假设:

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

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

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

优点:①当某节点是唯一活跃的节点时(一个节点如果有帧要发送就认为它是活跃的),时隙ALOHA允许该节点以全速R连续传输。②时隙ALOHA也是高度分散的,因为每个节点检测碰撞并独立地决定什么时候重传。③时隙ALOHA也是一个极为简单的协议。

缺点:①当有多个活跃节点时,一部分时隙将有碰撞,因此将被“浪费”掉了。②时隙的另一部分将是空闲的,因为所有活跃节点由于概率传输策略会节制传输。唯一“未浪费的”时隙是那些刚好有一个节点传输的时隙。刚好有一个节点传输的时隙称为一个成功时隙。③时隙ALOHA需要在节点中对时隙同步。

时隙多路访问协议的效率定义为:当有大量的活跃节点且每个节点总有大量的帧要发送时,长期运行中成功时隙的份额。时隙ALOHA的最大效率为 1/e=0.37。

2.ALOHA

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

3.载波侦听多路访问 (CSMA)

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

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

这两个规则包含在载波侦听多路访问(CSMA)和具有碰撞检测的CSMA(CSMA/CD)协议族中。

图6-12显示了连接到一个线状广播总线的4个节点(A、B、C、D)的时空图。横轴表示每个节点在空间的位置,纵轴表示时间。 在时刻t0节点B侦听到信道是空闲的,因为当前没有其他节点在传输。因此节点B开始传输,沿着广播媒体在两个方向上传播它的比特。图中B的比特随着时间的增 加向下传播,这表明B的比特沿着广播媒体传播所实际需要的时间不是零。在时刻t1,节点D有一个帧要发送。尽管节点B在时刻t1正在传输,但B传输的比特还没有到达D,因此D在侦听到信道空闲。根据CSMA协议,D开始传输它的帧。一个短暂的时间之后,B的传输开始在D干扰D的传输。从图中可以看出,显然广播信道的端到端信道传播时延(信号从一个节点传播到另一个节点所花费的时间)在决定其性能方面起着关键的作用。该传播时延越长,载波侦听节点不能侦听到网络中另一个节点已经开始传输的机会就越大。

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

在图6-12中,节点没有进行碰撞检测;即使已经出现了碰撞,B和D都将继续完整地传输它们的帧。当某节点执行碰撞检测时,一旦它检测到碰撞将立即停止传输。图6-13表示了和图6-12相同的情况,只是这两个节点在检测到碰撞后很短的时间内都放弃了它们的传输。显然,在多路访问协议中加入碰撞检测,通过不传输一个无用的、(由来自另一个节点的帧干扰)损坏的帧,将有助于改善协议的性能。

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

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

2)如果适配器侦听到信道空闲(即无信号能量从信道进入适配器),它开始传输帧。如果适配器侦听到信道正在忙,它将等待,直到侦听到没有信号能量时才开始传输帧。

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

4)如果适配器传输整个帧而未检测到来自其他适配器的信号能量,该适配器就完成了该帧。如果适配器在传输时检测到来自其他适配器的信号能量,它中止传输(即它停止了传输帧)。

5)中止传输后,适配器等待一个随机时间量(利用二进制指数后退算法),然后返回步骤2。

用于以太网以及DOCSIS电缆网络多路访问协议中的二进制指数后退算法。当传输一个给定帧时,在该帧经历了一连串的n次碰撞后,节点随机地从0,1,2,…,2^n-1中选择 一个K值。因此,一个帧经历的碰撞越多,K选择的间隔越大。对于以太网,一个节点等待的实际时间量是K·512比特时间(即发送512比特进入以太网所需时间量的K倍),n能够取的最大值在10以内。

5.CSMA/CD效率

当只有一个节点有一个帧发送时,该节点能够以信道全速率进行传输。如果很多节点都有帧要发送,信道的有效传输速率可能会小得多。CSMA/CD效率定义为:当有大量的活跃节点,且每个节点有大量的帧要发送时,帧在信道中无碰撞地传输的那部分时间在长期运行时间中所占的份额。

令Tprop,表示信号能量在任意两个适配器之间传播所需的最大时间。令Ttrans表示传输一个最大长度的以太网帧的时间。CSMA/CD效率= 1/(1+5Tprop/Ttrans)。

6.3.3 轮流协议

和随机接入协议一样,有几十种轮流协议, 其中每一个协议又都有很多变种。 这里我们要讨论两种比较重要的协议。

第一种是轮询协议。轮询协议要求这些节点之一要被指定为主节点。主节点以循环的方式轮询每个节点。特别是,主节点首先向节点1发送一个报文,告诉它(节点1)能够传输的帧的最多数量。在节点1传输了某些帧后,主节点告诉节点2它(节点2)能够传输的帧的最多数量。主节点能够通过观察在信道上是否缺乏信号,来决定一个节点何时完成了帧的发送。上述过程以这种方式继续进行,主节点以循环的方式轮询了每个节点。轮询协议消除了困扰随机接入协议的碰撞和空时隙,这使得轮询取得高得多的效率。 但是它也有一些缺点。第一个缺点是该协议引人了轮询时延,即通知一个节点“它可以传输”所需的时间。第二个缺点可能更为严重,就是如果主节点有故障,整个信道都变得不可操作。 

第二种轮流协议是令牌传递协议。在这种协议中没有主节点。一个称为令牌的小的特殊帧在节点之间以某种固定的次序进行交换。当一个节点收到令牌时,仅当它有一些帧要发送时,它才持有这个令牌;否则,它立即向下一个节点转发该令牌。当一个节点收到令牌时,如果它确实有帧要传输,它发送最大数目的帧数,然后把令牌转发给下一个节点。令牌传递是分散的,并有很高的效率。但是它也有自己的一些问题。一个节点的故障可能会使整个信道崩溃。或者如果一个节点偶然忘记了释放令牌,则必须调用某些恢复步骤使令牌返回到循环中来。

6.3.4 DOCSIS:用于电缆因特网接入的链路层协议

6.4交换局域网

图6-15显示了一个交换局域网连接了3个部门,两台服务器和一台与4台交换机连接的路由器。因为这些交换机运行在链路层,所以它们交换链路层帧(而不是网络层数据报),不识别网络层地址,不使用如OSPF这样的路由选择算法来确定通过第二层交换机网络的路径。它们使用链路层地址而不是IP地址来转发链路层帧通过交换机网络。

6.4.1链路层寻址和ARP

1.MAC地址

主机或路由器的适配器(即网络接口)具有链路层地址。因此,具有多个网络接口的主机或路由器将具有与之相关联的多个链路层地址,就像它也具有与之相关联的多个IP地址一样。链路层交换机并不具有与它们的接口(这些接口是与主机和路由器相连的)相关联的链路层地址。这是因为链路层交换机的任务是在主机与路由器之间承载数据报;交换机透明地执行该项任务,这就是说,主机或路由器不必明确地将帧寻址到其间的交换机。

链路层地址有各种不同的称呼:LAN地址物理地址MAC地址。对于大多数局域网而言,MAC地址长度为6字节。如图6-16所示,这些6个字节地址通常用十六进制表示法,地址的每个字节被表示为一对十六进制数。尽管MAC地址被设计为永久的,但用软件改变一块适配器的MAC地址现在是可能的。没有两块适配器具有相同的MAC地址,IEEE在管理着该MAC地址空间。适配器的MAC地址具有扁平结构(这与层次结构相反),而且不论适配器到哪里用都不会变化。与之形成对照的是,IP地址具有层次结构(即一个网络部分和一个主机部分),而且当主机移动时,主机的IP地址需要改变,即改变它所连接到的网络。

当某适配器要向某些目的适配器发送一个帧时,发送适配器将目的适配器的MAC地址插入到该帧中,并将该帧发送到局域网上。一块适配器可以接收一个并非向它寻址的帧。当适配器接收到一个帧时,将检查该帧中的目的MAC地址是否与它自己的MAC地址匹配。如果匹配,该适配器提取出封装的数据报,并将该数据报沿协议栈向上传递。如果不匹配,该适配器丢弃该帧,而不会向上传递该网络层数据报。有时某发送适配器要让局域网上所有其他适配器来接收并处理它打算发送的帧。在这种情况下,发送适配器在该帧的目的地址字段中插入一个特殊的MAC广播地址。对于使用6字节地址的局域网来说,广播地址是48个连续的1组成的字符串(即以十六进制表示法表示的FF-FF-FF-FF-FF-FF)。

2.地址解析协议

因为存在网络层地址(例如,因特网的IP地址)和链路层地址(即MAC地址),所以需要在它们之间进行转换。对于因特网而言,这是地址解析协议(ARP)的任务。 为了理解对于诸如ARP这样协议的需求,考虑如图6-17所示的网络。在这个简单的例子中,每台主机和路由器有一个单一的IP地址和单一的MAC地址。为了便于讨论,我们在本节中将假设交换机广播所有帧;这就是说,无论何时交换机在一个接口接收一个帧,它将在其所有其他接口上转发该帧。

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

在发送主机中的ARP模块将取在相同局域网上的任何IP地址作为输入,然后返回相应的MAC地址。在这个例子中,发送主机222.222.222.220向它的ARP模块提供了IP地址222.222.222.222,并且其ARP模块返回了相应的MAC地址49-BD-D2-C7-56-2A。

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

每台主机或路由器在其内存中具有一个ARP表,这张表包含IP地址到MAC地址的映射关系。 图6-18显示了在主机222.222.222.220中可能看到的ARP表中的内容。该ARP表也包含一个寿命(TTL)值,它指示了从表中删除每个映射的时间。注意到这张表不必为该子网上的每台主机和路由器都包含一个表项;某些可能从来没有进入到该表中,某些可能已经过期。从一个表项放置到某ARP表中开始,一个表项通常的过期时间是20分钟。

现在假设主机要发送一个数据报,该数据报要IP寻址到本子网上另一台主机或路由器。发送主机需要获得给定IP地址的目的主机的MAC地址。如果发送方的ARP表具有该目的节点的表项,则通过查询ARP表可得。如果ARP表中当前没有该目的主机的表项,发送方用ARP协议来解析这个地址。首先,发送方构造一个称为ARP分组的特殊分组。一个ARP分组有几个字段,包括发送和接收IP地址及MAC地址。ARP查询分组和响应分组都具有相同的格式。ARP查询分组的目的是询问子网上所有其他主机和路由器,以确定对应于要解析的IP地址的那个MAC地址。 源向它的适配器传递一个ARP查询分组,并且指示适配器应该用MAC广播地址(即FF-FF-FF-FF-FF-FF)来发送这个分组。适配器在链路层帧中封装这个ARP分组,用广播地址作为帧的目的地址,并将该帧传输进子网中。包含该ARP查询的帧能被子网上的所有其他适配器接收到,并且(由于广播地址)每个适配器都把在该帧中的ARP分组向上传递给ARP模块。这些ARP模块中的每个都检查它的IP地址是否与ARP分组中的目的IP地址相匹配。与之匹配的一个给查询主机发送回一个带有所希望映射的响应ARP分组。然后源主机能够更新它的ARP表,并发送它的IP数据报,该数据报封装在一个链路层帧中,并且该帧的目的MAC就是对先前ARP请求进行响应的主机或路由器的MAC地址。

ARP是一个链路层协议还是一个网络层协议?一个ARP分组封装在链路层帧中,因而在体系结构上位于链路层之上。然而,一个 ARP分组具有包含链路层地址的字段,因而可认为是链路层协议,但它也包含网络层地址,因而也可认为是为网络层协议。所以,可能最好把ARP看成是跨越链路层和网络层边界两边的协议,即不完全符合简单的分层协议栈。

3.发送数据报到子网以外

现在考虑当子网中的某主机要向子网之外(也就是跨越路由器的另一个子网)的主机发送网络层数据报的情况。我们在图6-19的环境中来讨论这个问题,该图显示了一个由一台路由器互联两个子网所组成的简单网络。

现在我们考察子网1上的一台主机向子网2上的一台主机发送数据报。假设主机111.111.111.111要向主机222.222.222.222发送一个IP数据报。发送主机向它的适配器传递数据报,发送主机必须向它的适配器指示一个适当的目的MAC地址。为了使一个数据报从111.111.111.111到子网2上的主机,该数据报必须首先发送给路由器接口111.111.111.110,它是通往最终目的地路径上的第一跳路由器的IP地址。因此,对于该帧来说,适当的MAC地址是路由器接口111.111.111.110的适配器地址,即E6-E9-00-17-BB-4B。发送主机用ARP获得路由器接口111.111.111.110的MAC地址。 一旦发送适配器有了这个MAC地址,它创建一个帧(包含了寻址到222.222.222.222的数据报),并把该帧发送到子网1中。在子网1上的路由器适配器看到该链路层帧是向它寻址的,因此把这个帧传递给路由器的网络层。路由器现在必须决定该数据报要被转发的正确接口,这是通过查询路由器中的转发表来完成的。转发表告诉这台路由器该数据报要通过路由器接口222.222.222.220转发。然后该接口把这个数据报传递给它的适配器,适配器把该数据报封装到一个新的帧中,并且将帧发送进子网2中。这时,该帧的目的MAC地址确实是最终目的地MAC地址。路由器又是怎样获得这个目的地MAC地址的呢?当然是用ARP获得的! 

6.4.2以太网

以太网是到目前为止最流行的有线局域网技术,而且到可能预见的将来它可能仍保持这一位置。可以这么说,以太网对本地区域联网的重要性就像因特网对全球联网所具有的地位那样。 

1.以太网帧结构

以太网帧的6个字段:

  • 前同步码(8字节)。该前同步码的前7字节的值都是10101010;最后一个字节是10101011。前同步码字段的前7字节用于“唤醒”接收适配器,并且将它们的时钟和发送方的时钟同步。为什么这些时钟会不同步呢?发送适配器会根据以太局域网类型的不同,分别以10Mbps、100Mbps或者1Gbps的速率传输帧,然而适配器不会以精确的额定速率传输帧,相对于额定速率总有一些漂移,局域网上的其他适配器不会预先知道这种漂移的。接收适配器只需通过锁定前同步码的前7字节的比特,就能够锁定发送适配器的时钟。前同步码的第8个字节的最后两个比特(第一个出现的两个连续的1)警告接收适配器,“重要的内容”就要到来了。
  • 目的地址(6字节)。这个字段包含目的适配器的MAC地址。当目的适配器收到一个以太网帧,帧的目的地址无论是该目的适配器的MAC地址,还是MAC广播地址,它都将该帧的数据字段的内容传递给网络层;如果它收到了具有任何其他MAC地址的帧,则丢弃之。 
  • 源地址(6字节)。这个字段包含了传输该帧到局域网上的适配器的MAC地址。
  • 类型字段(2字节)。当以太网帧到达接收适配器,适配器需要知道它应该将数据字段的内容传递给哪个网络层协议(即分解)。IP和其他链路层协议(例如,Novell IPX或AppleTalk)都有它们各自的、标准化的类型编号。该类型字段和网络层数据报中的协议字段、运输层报文段的端口号字段相类似;所有这些字段都是为了把一层中的某协议与上一层的某协议结合起来。
  • 数据字段(46~1500字节)。这个字段承载了IP数据报。以太网的最大传输单元 (MTU)是1500字节。这意味着如果IP数据报超过了1500字节,则主机必须将该数据报分片。数据字段的最小长度是46字节。这意味着如果IP数据报小于46字节,数据报必须被填充到46字节。当采用填充时,传递到网络层的数据包括IP数据报和填充部分。网络层使用IP数据报首部中的长度字段 来去除填充部分。
  • CRC(4字节)。循环余检测(CRC)字段的目的是使得接收适配器检测帧中是否引入了差错。

所有的以太网技术都向网络层提供无连接服务。

所有的以太网技术都向网络层提供不可靠服务。特别是,当接收适配器收到一个帧,它对该帧执行CRC校验,当该帧通过CRC校验时它不发送确认帧,而当该帧没有通过CRC校验时它也不发送否定确认帧。当某帧没有通过CRC校验,适配器只是丢弃该帧。因此,发送适配器根本不知道它传输的帧是否到达了接收适配器并通过了CRC校验。在链路层缺乏可靠的传输有助于使得以太网简单和便宜。但是它也意味着传递到网络层的数据报流能够有间隙。

如果由于丢弃了以太网帧而存在间隙,接收方主机上的应用也会看见这个间隙吗?这只取决于该应用是使用UDP还是使用TCP。如果应用使用的是 UDP,则接收方主机中的应用的确会看到数据中的间隙。另一方面,如果应用使用的是TCP,则接收方主机中的TCP将不会确认包含在丢弃帧中的数据,从而引起发送方主机的TCP重传。注意到当TCP重传数据时,数据最终将回到曾经丢弃它的以太网适配器。因此,从这种意义上来说,以太网的确重传了数据,尽管以太网并不知道它是正在传输一个具有全新数据的全新数据报,还是一个包含已经被传输过至少一次的数据的数据报。

2.以太网技术

6.4.3链路层交换机

1.交换机转发和过滤

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

为了理解交换机过滤和转发的工作过程,假定目的地址为DD-DD-DD-DD-DD-DD的帧从交换机接口x到达。交换机用MAC地址DD-DD-DD-DD-DD-DD索引它的表。有3种可能的情况:

  • 如果没有对于目的地址的表项,交换机广播该帧。
  • 表中有一个表项将DD-DD-DD-DD-DD-DD与接口x联系起来。在这种情况下,该帧从包括适配器DD-DD-DD-DD-DD-DD的局域网网段到来。无须将该帧转发到任何其他接口,交换机通过丢弃该帧执行过滤功能即可。
  • 表中有一个表项将DD-DD-DD-DD-DD-DD与接口y≠x联系起来。在这种情况下,该帧需要被转发到与接口y相连的局域网网段。交换机通过将该帧放到接口y前面的输出缓存完成转发功能。
2.自学习

交换机的表是自动、动态和自治地建立的,即没有来自网络管理员或来自配置协议的任何干预。 换句话说,交换机是自学习的。这种能力是以如下方式实现的:

1)交换机表初始为空。

2)对于在每个接口接收到的每个入帧,该交换机在其表中存储:①在该帧源地址字段中的MAC地址;②该帧到达的接口;③当前时间。交换机以这种方式在它的表中记录了发送节点所在的局域网网段。如果在局域网上的每个主机最终都发送了一个帧,则每个主机最终将在这张表中留有记录。

3)如果在一段时间(称为老化期)后,交换机没有接收到以该地址作为源地址的帧,就在表中删除这个地址。以这种方式,如果一台PC被另一台PC(具有不 同的适配器)代替,原来PC的MAC地址将最终从该交换机表中被清除掉。 

交换机是即插即用设备,因为它们不需要网络管理员或用户的干预。交换机也是双工的,这意味着任何交换机接口能够同时发送和接收。

3.链路层交换机的性质
  • 消除碰撞。
  • 异质的链路。交换机将链路彼此隔离,因此局域网中的不同链路能够以不同的速率运行并且能够在不同的媒体上运行。
  • 管理。除了提供强化的安全性,交换机也易于进行网络管理。例如,如果一个适配器工作异常并持续发送以太网帧,交换机能够检测到该问题,并在内部断开异常适配器。
4.交换机和路由器比较

首先考虑交换机的优点和缺点。交换机是即插即用的。交换机还能够具有相对高的分组过滤和转发速率。在另一方面,为了防止广播帧的循环,交换网络的活跃拓扑限制为一棵生成树。另外,一个大型交换网络将要求在主机和路由器中有大的ARP表,这将生成可观的ARP流量和处理量。而且,交换机对于广播风暴并不提供任何保护措施,即如果某主机出了故障并传输出没完没了的以太网广播帧流,该交换机将转发所有这些帧, 使得整个以太网的崩溃。

现在考虑路由器的优点和缺点。因为网络寻址通常是分层次的(不像MAC寻址那样是扁平的),即使当网络中存在冗余路径时,分组通常也不会通过路由器循环。所以,分组就不会被限制到一棵生成树上,并可以使用源和目的地之间的最佳路径。因为路由器没有生成树限制,所以它们允许以丰富的拓扑结构构建因特网,例如包括欧洲和北美之间的多条活跃链路。路由器的另一个特色是它们对第二层的广播风暴提供了防火墙保护。尽管也许路由器最重要的缺点就是它们不是即插即用的,即路由器和连接到它们的主机都需要人为地配置IP地址。而且路由器对每个分组的处理时间通常比交换机更长,因为它们必须处理高达第三层的字段。

通常,由几百台主机组成的小网络通常有几个局域网网段。对于这些小网络,交换机就足够了,因为它们不要求IP地址的任何配置就能使流量局部化并增加总计吞吐量。但是在由几千台主机组成的更大网络中,通常在网络中(除了交换机之外)还包括路由器。路由器提供了更健壮的流量隔离方式和对广播风暴的控制,并在网络的主机之间使用更“智能的”路由。

6.4.4虚拟局域网

在前面图6-15的讨论中,我们注意到现代机构的局域网常常是配置为等级结构的, 每个工作组(部门)有自己的交换局域网,经过一个交换机等级结构与其他工作组的交换局域网互联。在图6-15中的配置中,能够发现3个缺点:

  • 缺乏流量隔离。尽管该等级结构把组流量局域化到一个单一交换机中,但广播流量(例如携带ARP和DHCP报文或那些目的地还没有被自学习交换机学习到的帧)仍然必须跨越整个机构网络。限制这些广播流量的范围将改善局域网的性能。为了安全/隐私的目的也可能希望限制局域网广播流量。例如,如果一个组包括公司的行政管理团队,另一个组包括运行着Wireshark分组嗅探器的心怀不满的雇员,网络管理员也许非常希望行政流量无法到达该雇员的主机。
  • 交换机的无效使用。如果该机构有10个组,则将要求有10个第一级交换机。如果每个组都较小,比如说少于10个人,则单台96端口的交换机将足以容纳每个人,但这台单一的交换机将不能提供流量隔离。
  • 管理用户。如果一个雇员在不同组间移动,必须改变物理布线,以将该雇员连接到图6-15中的不同的交换机上。属于两个组的雇员将使问题更为困难。

这些难题都能够通过支持虚拟局域网(VLAN)的交换机来处理。支持VLAN的交换机允许经一个单一的物理局域网基础设施定义多个虚拟局域网。在一个VLAN内的主机彼此通信,仿佛它们(并且没有其他主机)与交换机连接。在一个基于端口的VLAN中,交换机的端口(接口) 为组。每个组构成一个VLAN,在每个VLAN中的端口形成一个广播域(即来自一个端口的广播流量仅能到达该组中的其他端口)。图6-25显示了具有16个端口的单一交换机。人们容易想象到VLAN交换机配置和操作的方法,即网络管理员使用交换机管理软件声明一个端口属于某个给定的VLAN(其中未声明的端 口属于一个默认的VLAN),在交换机中维护一张端口到VLAN的映射表;交换机软件仅在属于相同VLAN的端口之间交付帧。

VLAN和VLAN之间如何通信?方法之一是将VLAN交换机的一个端口与一台外部的路由器相连,并且将该端口配置为属于EEVLAN和CSVLAN。 在此情况下,即使电子工程系和计算机科学系共享相同的物理交换机,其逻辑配置看起来也仿佛是电子工程系和计算机科学系具有分离的经路由器连接的交换机。从电子工程系发往计算机科学系的数据报将首先跨越EE VLAN到达路由器,然后由该路由器转发跨越CS VLAN到达CS主机。

图6-26显示了第二台8端口交换机。但是这两台交换机应当如何互联呢?一种解决方案是在每台交换机上定义一个属于CS VALN的端口(对EE VLAN也类似处理),如图6-26a所示将这两个端口彼此互联起来。然而,这种解决方案不具有扩展性,因为在每台交换机上N个VLAN将要求N个端口直接互联这两台交换机。

更具扩展性互联VLAN交换机的方法称为VLAN干线连接。在图6-26b所示的VLAN干线方法中,每台交换机上的一个特殊端口(左侧交换机上的端口16,右侧交换机上的端口1)被配置为干线端口,以互联这两台VLAN交换机。该干线端口属于所有VLAN,发送到任何VLAN的帧经过干线链路转发到其他交换机。IEEE定义了一种扩展的以太网帧格式802.1Q,用于跨越VLAN干线的帧。如图6-27中所示,802.1Q帧由标准以太网帧与加进首部的4字节VLAN标签组成,而VLAN标签承载着该帧所属的VLAN标识符。VLAN标签由在VLAN干线发送侧的交换机加进帧中,解析后并由在VLAN干线接收侧的交换机删除。VLAN标签自身由一个2字节的标签协议标识符(TPID)字段(具有固定的十六进制值81-00)、一个2字节的标签控制信息字段(包含一个12比特的VLAN标识符字段)和一个3比特优先权字段(具有类似于IP数据报TOS字段的目的)组成。

在这部分讨论中,仅关注了基于端口的VLAN。VLAN也能够以几种其他方式定义。在基于MAC的VLAN中,网络管理员指定属于每个VLAN的MAC地址的集合;无论何时一个设备与一个端口连接时,端口基于设备的MAC地址将其连接进适当的VLAN。VLAN也能基于网络层协议(例如IPv4、IPv6或 Appletalk)和其他准则进行定义。VLAN跨越IP路由器扩展也是可能的,这使得多个LAN 孤岛能被连接在一起,以形成能够跨越全局的单一LAN。

6.5链路虚拟化:网络作为链路层

6.6数据中心网络

6.7回顾:Web页面请求的历程

  • 2
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值