您的位置:首页 > 理论基础 > 计算机网络

《计算机网络-自顶向下方法》读书笔记-网络层篇

2015-10-30 12:56 639 查看

《计算机网络-自顶向下方法》读书笔记-网络层篇

网络层服务

从发送主机向接收主机传送数据段(segment )

发送主机:将数据段封装到数据报(datagram )中

接收主机:向传输层交付数据段(segment )

每个主机和路由器都运行网络层协议

路由器检验所有穿越它的IP数据报的头部域

决策如何处理IP数据报

网络层核心功能-转发与路由

转发:将分组从路由器的输入端口转移到合适的输出端口

路由:确定分组从源到目的经过的路径

路由算法(协议)确定通过网络的端到端路径

转发表确定在本路由器如何转发分组

网络层核心功能-连接建立

某些网络的重要功能

ATM,帧中继,X.25

数据分组传输之前两端主机需要首先建立虚拟/逻辑连接

网络设备(如路由器)参与连接的建立

网络层连接与传输层连接的对比

网络层连接: 两个主机之前(路径上的路由器等网络设备参与其中)

传输层连接: 两个应用进程之间(对中间网络设备透明)

网络层服务模型

无连接服务(connection-less service):

不事先为系列分组的传输确定传输路径

每个分组独立确定传输路径

不同分组可能传输路径不同

数据报网络(datagram network )

连接服务(connection service):

首先为系列分组的传输确定从源到目的经过的路径(建立连接)

然后沿该路径(连接)传输系列分组

系列分组传输路径相同

传输结束后拆除连接

虚电路网络(virtual-circuit network )

数据报与虚电路网络

虚电路网络

数据报(datagram)网络与虚电路(virtual-circuit)网络是典型两类分组交换网络

数据报网络提供网络层无连接服务

虚电路网络提供网络层连接服务

类似于传输层的无连接服务(UDP)和面向连接

服务(TCP ),但是网络层服务:

主机到主机服务

网络核心实现

虚电路: 一条从源主机到目的地的主机,类似于电路的路径(逻辑连接)

分组交换

每个分组的传输利用链路的全部带宽

源到目的路径经过的网络层设备共同完成虚电路功能

通信过程:

呼叫建立(call setup)→数据传输→拆除呼叫

每个分组携带虚电路标识(VCID), 而不是目的主机地址

虚电路经过的每个网络设备(如路由器),维护每条经过它的虚电路连接状态

链路、 网络设备资源(如带宽、 缓存等)可以面向VC进行预分配

预分配资源=可预期服务性能

如ATM的电路仿真(CBR)

VC具体实现

每条虚电路包括:

1. 从源主机到目的主机的一条路径

2. 虚电路号( VCID) , 沿路每段链路一个编号

3. 沿路每个网络层设备(如路由器), 利用转发表记录

经过的每条虚电路

沿某条虚电路传输的分组,携带对应虚电路的VCID,而不是目的地址

同一条VC ,在每段链路上的VCID通常不同

路由器转发分组时依据转发表改写/替换虚电路号

转发表

输入接口输入VC输出接口输出VC
112322
263118
37217
197387
VC路径上每个路由器都需要维护VC连接的状态

VC进入路由器后,路由器将VC头替换,然后转发出去

数据报网络

网络层无连接

* 每个分组携带目的地址

* 路由器根据分组的目的地址转发分组

* 基于路由协议/算法构建转发表

* 检索转发表

* 每个分组独立选路

路由器转发表

目的地址输出链路
地址范围13
地址范围22
地址范围32
地址范围41
最长前缀匹配优先:

在检索转发表时,优先选择与分组目的地址匹配前缀最长的入口(entry).

IP协议

主机、路由器网络层主要功能:

路径选择

RIP

OSPF

BGP

IP协议

寻址规约

数据报(分组)格式

分组处理规约

ICMP协议

差错报告

路由器命令

IP数据报格式



首部描述
版本号(4bit)描述IP协议的版本号,目前主要有V4和V6两个版本
首部长度(4bit)以四字节为单位例如: 5 -> IP首部长度为20(5 * 4)字节,不这么计算的话,长度描述根本不够
服务类型(8bit)指示期望获得哪种类型的服务
1 .只有在网络提供区分服务(DiffServ)时使用
2.一般情况下不使用,通常IP分组的该字段(第2字节)的值为00H
总长度(16bit)IP分组的总字节数(首部 + 数据)
1. 最大IP分组的总长度: 65535B
2.最小的IP分组首部: 20B
3. IP分组可以封装的最大数据:65535 - 20 = 65515B
生存时间TTL(8bit)IP分组在网络中可以通过的路由器数(或跳步数)
1.路由器转发一次分组, TTL减1
2.如果TTL=0,路由器则丢弃该IP分组
协议(8bit)指示IP分组封装的是哪个协议的数据包,实现复用/分解
首部校验和(16位)实现对IP分组首部的差错检测
1.计算校验和时,该字段置全0
2.采用反码算数运算求和,和的反码作为首部校验和字段
3.逐跳计算、逐跳校验
源IP地址、目的IP地址字段(各占32bit)分别标识发送分组的源主机/路由器(网络接口)和接收分组的目的主机/路由器(网络接口)的IP地址
选项字段(长度可变,范围在1~40B之间)携带安全、源选路径、时间戳和路由记录等内容(实际上很少被使用)
填充(长度可变,范围在0~3B之间)目的是补齐整个首部,符合32位对齐,即保证首部长度是4字节的倍数
标识字段(16bit)标识一个IP分组,IP协议利用一个计数器,每产生IP分组计数器加1,作为该IP分组的标识
标志位(3bit)1. DF (Don’t Fragment)
2. MF (More Fragment)
DF =1:禁止分片;
DF =0:允许分片
MF =1:非最后一片;
MF =0:最后一片(或未分片)
片偏移(13bit)一个IP分组分片封装原IP分组数据的相对偏移量
片偏移字段以8字节为单位

IP分片

网络链路存在MTU (最大传输单元)—链路层数据帧可封装数据的上限不同链路的MTU不同

大IP分组向较小MTU链路转发时, 可以被“分片” (fragmented)

1个IP分组分为多片IP分组

IP分片到达目的主机后进行“重组”(reassembled)

IP首部的相关字段用于标识分片以及确定分片的相对顺序

总长度、标识、标志位和片偏移

假设原IP分组总长度为L,待转发链路的MTU为M

若L>M,且DF=0,则可以/需要分片

分片时每个分片的标识复制原IP分组的标识

通常分片时,除最后一个分片,其他分片均分为MTU允许的最大分片

一个最大分片可封装的数据应该是8的倍数, 因此, 一个

最大分片可封装的数据为:

⌊M−208⌋∗8\lfloor\frac{M - 20}{8}\rfloor * 8

需要的总片数为:

⌈L−20d⌉\lceil\frac{L - 20}{d}\rceil

每片片偏移字段取值为

Fi=d8∗(i−1),1≤i≤nF_i = \frac{d}{8} * (i - 1),1 \leq i \leq n

每片的总长度字段为

Li={d+20L−(n−1)d1<ni=n L_i=\left\{
\begin{aligned}
d + 20 & & 1 < n \\
L -(n -1)d & & i=n \\
\end{aligned}
\right.


每片MF标志位为:

MFi={101≤i<ni=n MF_i=\left\{
\begin{aligned}
1 & & 1 \leq i < n \\
0 & & i=n \\
\end{aligned}
\right.

IP编址

接口(interface): 主机/路由器与物理链路的连接

实现网络层功能

路由器通常有多个接口

主机通常只有一个或两个接口(e.g.,有线的以太网接口,无线的802.11接口)

IP地址: 32比特(IPv4)编号标识主机、路由器的接口

IP地址与每个接口关联

IP地址:

网络号(NetID) – 高位比特

主机号(HostID) – 低位比特

IP子网

IP地址具有相同网络号的设备接口

不跨越路由器(第三及以上层网络设备)可以彼此物理联通的接口

IP子网划分与子网掩码

“有类”编码

如图:



特殊IP地址




私有IP地址



子网划分

IP地址:

网络号(NetID) – 高位比特

子网号(SubID) – 原网络主机号部分比特

主机号(HostID) – 低位比特

如何确定是否划分了子网?利用多少位划分子网?

子网掩码

形如IP地址:

32位

点分十进制形式

取值:

NetID、 SubID位

HostID位全取0

将IP分组的目的IP地址与子网掩码按位与运算,提取子网地址

无类域间路由(CIDR: Classless InterDomain Routing)

消除传统的 A 类、 B 类和 C 类地址界限

NetID+SubID→Network Prefix (Prefix)可以任意长度

融合子网地址与子网掩码,方便子网划分

无类地址格式: a.b.c.d/x,其中x为前缀长度

子网201.2.3.64, 255.255.255.192→201.2.3.64/26

无类域间路由(CIDR: Classless InterDomain Routing)

提高IPv4 地址空间分配效率

提高路由效率

将多个子网聚合为一个较大的子网

构造超网( supernetting)

当一个子网无法聚合所有的子网时,需要零碎出去的”子网片”利用最长前缀匹配原则向路由器通告,以便正确收发消息.

路由算法

路由算法通过设置转发表来得到应用

网络可以抽象成图

其中

N = 路由器集合

E = 链路集合

费用(Costs):每段链路的费用可以总是1,或者是宽带的倒数、拥塞程度等.

静态路由VS动态路由?

静态路由:

手工配置

路由更新慢

优先级高

动态路由:

定期更新

及时响应链路费用或网络拓扑变化

全局信息VS分散信息?

全局信息:

所有路由器掌握完整的网络拓扑和链路费用信息

分散信息:

路由器只掌握物理相连的邻居以及链路费用

邻居间信息交换,运算的迭代过程

链路状态路由算法

Dijkstra算法:

数据结构有实现,这里直接上代码:

[code]#include<stdio.h>
#include<stdlib.h>
#define max 11000000000
int a[1000][1000];
int d[1000];//d表示某特定边距离
int p[1000];//p表示永久边距离
int i,j,k;
int m;//m代表边数
int n;//n代表点数
int main()
{
    scanf("%d%d",&n,&m);
    int min1;
    int x,y,z;
    for(i=1;i<=m;i++)
    {
    scanf("%d%d%d",&x,&y,&z);
    a[x][y]=z;
    a[y][x]=z;
    }
    for(i=1;i<=n;i++)
        d[i]=max1;
    d[1]=0;
    for(i=1;i<=n;i++)
    {
        min1=max1;
        for(j=1;j<=n;j++)
            if(!p[j]&&d[j]<min1)
            {
                min1=d[j];
                k=j;
            }
        p[k]=j;
        for(j=1;j<=n;j++)
            if(a[k][j]!=0&&!p[j]&&d[j]>d[k]+a[k][j])
                d[j]=d[k]+a[k][j];
    }
    for(i=1;i<n;i++)
    printf("%d->",p[i]);
    printf("%d\n",p
);
    return0;
}


复杂性分析和优化见数据结构

链路状态路由算法的震荡:



距离向量路由算法

Bellman-Ford方程(动态规划)

令:

dx(y):=从x到y最短路径的费用(距离)

则:dx(y) = min {c(x,v) + dv(y) }

Dx(y) = 从结点x到结点y的最小费用估计

x维护距离向量(DV): Dx = [Dx(y): y є N ]

结点x:

已知到达每个邻居的费用: c(x,v)

维护其所有邻居的距离向量: Dv = [Dv(y): y є N ]

核心思想:

每个结点不定时地将其自身的DV估计发送给其邻居

当x接收到邻居的新的DV估计时,即依据B-F更新其自身的距离向量估计:

Dx(y) ← minv{c(x,v) + Dv(y)}for each node y ∊ N

Dx(y)将最终收敛于实际的最小费用 dx(y)

异步迭代:

引发每次局部迭代的因素

局部链路费用改变

来自邻居的DV更新

分布式:

每个结点只当DV变化时才通告给邻居

邻居在必要时(其DV更新后发生改变)再通告它们的邻居

无穷计数问题

见示意图



解决方案

毒性逆转(poisoned reverse):

如果一个结点(e.g.Z)到达某目的(e.g.X)的最小费用路径是通过某个邻居(e.g.Y),则:

通告给该邻居结点到达该目的的距离为无穷大

毒性逆转并不能从根本上彻底解决无穷计数问题,在某些更复杂的网络情况下,毒性逆转就无能为力了

定义最大度量

定义一个最大的有效费用值,如15跳步,16跳步表示无穷.

具体过程见示意图



层次路由

网络规模: 考虑6亿目的结点的网络

路由表几乎无法存储!

路由计算过程的信息(e.g.链路状态分组、DV)交换量巨大,会淹没链路!

管理自治:

每个网络的管理可能都期望自主控制其网内的路由

互联网(internet) = 网络之网络(network of networks)

聚合路由器为一个区域:自治系统AS(autonomous systems)

同一AS内的路由器运行相同的路由协议(算法)

自治系统内部路由协议(“ intra-AS” routingprotocol)

不同自治系统内的路由器可以运行不同的AS内部路由协议

网关路由器(gatewayrouter):

位于AS“边缘”

通过链路连接其他AS的网关路由器

转发表由AS内部路由算法和AS间路由算法共同配置

AS内部路由算法设置AS内部目的网络路由入口(entries)

AS内部路由算法与AS间路由算法共同设置AS外部目的网络路由入口

自治系统间(inter-AS)路由任务

假设AS1内某路由器收到一个目的地址在AS1之外的数据报:

路由器应该将该数据报转发给哪个网关路由器呢?

假设AS1通过AS间路由协议学习到:子网x通过AS3和AS2均可到达

为了配置转发表,路由器1d必须确定应该将去往子网x的数据报转发给哪个网关?

这个任务也是由AS间路由协议完成!

热土豆路由: 将分组发送给最近的网关路由器.

RIP协议

AS内部路由协议也称为内部网络协议IGP(interiorgatewayprotocols)

最常见的AS内部路由协议:

路由信息协议: RIP(Routing Information Protocol)

开放最短路径优先: OSPF(Open Shortest Path First)

内部网关路由协议: IGRP(Interior Gateway Routing Protocol)

Cisco私有协议

RIP

早于1982年随BSD-UNIX操作系统发布

距离向量路由算法

距离度量:跳步数 (max = 15 hops),每条链路1个跳步(防止无穷计数)

每隔30秒,邻居之间交换一次DV,成为通告(advertisement)

每次通告:最多25个目的子网(IP地址形式)

RIP示例



注意这里路由器之间交换的通告和一般的距离向量路由算法不同,增加了下一跳信息,如果看到某个路由器看到下一跳就是自己,那么就相当于起到了毒性逆转的作用.

RIP链路的失效和恢复信息

如果180秒没有收到通告→邻居/链路失效

经过该邻居的路由不可用

重新计算路由

向邻居发送新的通告

邻居再依次向外发送通告(如果转发表改变)

链路失效信息能否快速传播到全网?

可能发生无穷计数问题

毒性逆转技术用于预防乒乓(ping-pong)环路(另外:无穷大距离 = 16 hops)

RIP路由表的处理:RIP路由表是利用一个称作route-d(deamon)的应用层进程实现的

通告报文周期性通过UDP数据报发送

RIP协议适用于小规模AS,以为最大跳步15.

OSPF协议

采用链路状态路由算法

LS分组扩散(通告)

每个路由器构造完整的网络(AS)拓扑图

利用Dijkstra算法计算路由

OSPF通告中每个入口对应一个邻居

OSPF通告在整个AS范围泛洪

OSPF报文直接封装到IP数据报中

与OSPF极其相似的一个路由协议:IS-IS路由协议

OSPF优点

安全(security): 所有OSPF报文可以被认证(预防恶意入侵)

允许使用多条相同费用的路径 (RIP只能选一条)

对于每条链路,可以针对不同的TOS设置多个不同的费用度量(e.g.,卫星链路可以针对“尽力”(best effort)ToS设置“低”费用;针对实时ToS设置“高”费用)

集成单播路由与多播路由:

多播OSPF协议(MOSPF) 与OSPF利用相同的网络拓扑数据

OSPF支持对大规模AS分层(hierarchical)

OSPF分层示例:



两级分层

链路状态通告只限于区内

每个路由器掌握所在区的详细拓扑

只知道去往其他区网络的”方向”(最短路径)

路由器种类描述
区边界路由器(Area Border Routers)“汇总”到达所在区网络的距离,通告给其他区边界路由器(每个小区和蓝色区相交的那个路由器)
主干路由器(Backbone Routers)在主干区内运行OSPF路由算法.(图中蓝色区域的普通路由器)
AS边界路由器(AS boundary routers)连接其他AS.(最上面那个路由器)

BGP路由协议

边界网关协议BGP (Border GatewayProtocol):事实上的标准域间路由协议

将Internet “粘合”为一个整体的关键

BGP为每个AS提供了一种手段:

* eBGP: 从邻居AS获取子网可达性信息.

* iBGP: 向所有AS内部路由器传播子网可达性信息.

* 基于可达性信息与策略,确定到达其他网络的 “好”

路径.

* 容许子网向Internet其余部分通告它的存在:“ 我在这儿! ”

BGP会话(session): 两个BGP路由器 (“ Peers” )交换BGP报文:

通告去往不同目的前缀( prefix)的路径 (“路径向量(path vector)” 协议)

报文交换基于半永久的TCP连接

BGP报文:

* OPEN: 与peer建立TCP连接,并认证发送方

* UPDATE: 通告新路径 (或撤销原路径)

* KEEPALIVE: 在无UPDATE时,保活连接;也用于对OPEN请求的确认

* NOTIFICATION: 报告先前报文的差错;也被用于关闭连接

当AS3通告一个前缀给AS1时:

* AS3承诺可以将数据报转发给该子网

* AS3在通告中会聚合网络前缀

BGP分发路径信息:

如示意图:




在3a与1c之间, AS3利用eBGP会话向AS1发送前缀可达性信息.

1c则可以利用iBGP向AS1内的所有路由器分发新的前缀可达性信息

1b可以( 也可能不)进一步通过1b-到-2a的eBGP会话,向AS2通告新的可达性信息

当路由器获得新的前缀可达性时,即在其转发表中增加关于该前缀的入口(路由项) .

通告的前缀信息包括BGP属性

前缀+属性= “ 路由”

两个重要属性:

AS-PATH(AS路径): 包含前缀通告所经过的AS序列: e.g., AS 67,AS 17

NEXT-HOP(下一跳): 开始一个AS-PATH的路由器接口,指向下一

跳AS.

可能从当前AS到下一跳AS存在多条链路(如图中2b和2c)

BGP路由选择

网关路由器收到路由通告后,利用其输入策略(import policy)决策接受/拒绝该路由e.g., 从不将流量路由到AS x

基于策略(policy-based) 路由

路由器可能获知到达某目的AS的多条路由,基于以下准则选择:

本地偏好(preference)值属性: 策略决策(policy

decision)

最短AS-PATH

最近NEXT-HOP路由器: 热土豆路由(hot potato

routing)

附加准则

路由选择策略示例:




A向B通告一条路径: AW

B向X通告路径: BAW

B是否应该向C通告路径BAW呢?

绝不! B路由CBAW的流量没有任何“收益”,因为W和C均不是B的客户。

B期望强制C通过A向W路由流量

B期望只路由去往/来自其客户的流量!

为什么采取不同的AS内与AS间路由协议

策略(policy):

inter-AS: 期望能够管理控制流量如何被路由,谁路由经过其网络等.

intra-AS: 单一管理,无需策略决策

规模(scale):

层次路由节省路由表大小,减少路由更新流量

适应大规模互联网

性能(performance):

intra-AS: 侧重性能

inter-AS: 策略主导
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: