上一章的数据链路层内容真的好多,光md文件就有62KB
再加上中间跑去刷算法了,就鸽了很久
但是细心的可以发现,算法的最后一篇和这篇的发布时间是隔了一段时间的
就是小黎刷算法太累了给自己放了个小长假
总之终于开始新的一章啦!
网络层概述
- 网络层的主要任务是实现网络互连,进而实现数据包在各网络之间的传输。
- 要实现网络层任务,需要解决以下主要问题:
- 网络层向运输层提供怎样的服务(“可靠传输”还是“不可靠传输”)
- 网络层寻址问题
- 路由选择问题
- 因特网(Internet)是目前全世界用户数量最多的互联网,它使用TCP/IP协议栈。
- 由于TCP/IP协议栈的网络层使用网际协议IP,它是整个协议栈的核心协议,因此在TCP/IP协议栈中网络层常称为网际层。
- 本章通过学习TCP/IP协议栈的网际层来学习网络层的理论知识和实践技术。
网络层提供的两种服务
面向连接的虚电路服务
- 核心思想:可靠通信由网络来保证
- 必须建立网络层的连接——虚电路VC(Virtual Circuit)
- 通信双方沿着已建立的虚电路发送分组
- 目的主机的地址仅在连接建立阶段使用,之后每个分组的首部只需携带一条虚电路的编号(构成虚电路的每一段链路都有一个虚电路编号)。
- 这种通信方式如果再使用可靠传输的网络协议,就可使所发送的分组最终正确到达接收方(无差错按序到达、不丢失、不重复)。
- 通信结束后,需要释放之前所建立的虚电路。
- 很多广域分组交换网都使用面向连接的虚电路服务。例如,曾经的X.25和逐渐过时的帧中继FR、异步传输模式ATM等。
无连接的数据报服务
- 核心思想:可靠通信应当由用户主机来保证
- 不需要建立网络层连接
- 每个分组可走不同的路径
- 每个分组的首部必须携带目的主机的完整地址
- 这种通信方式所传送的分组可能误码、丢失、重复和失序。
- 由于网络本身不提供端到端的可靠传输服务,这就使网络中的路由器可以做得比较简单,而且价格低廉(与电信网的交换机相比较)。
- 因特网采用了这种设计思想,也就是将复杂的网络处理功能置于因特网的边缘(用户主机和其内部的运输层),而将相对简单的尽最大努力的分组交付功能置于因特网核心。
虚电路服务与数据报服务的比较
对比方面 | 虚电路服务 | 数据报服务 |
---|---|---|
思路 | 可靠通信应当由网络来保证 | 可靠通信应当由用户主机来保证 |
连接的建立 | 必须建立网络层连接 | 不需要建立网络层连接 |
终点地址 | 仅在连接建立阶段使用,每个分组使用短的虚电路号 | 每个分组都有终点的完整地址 |
分组的转发 | 属于同一条虚电路的分组均按照同一路由进行转发 | 每个分组可走不同的路由 |
当结点出故障时 | 所有通过出故障的结点的虚电路均不能工作 | 出故障的结点可能会丢失分组,一些路由可能会发生变化 |
分组的顺序 | 总是按发送顺序到达终点 | 到达终点时不一定按发送顺序 |
服务质量保证 | 可以将通信资源提前分配给每一个虚电路,容易实现 | 很难实现 |
由于TCP/IP体系结构的因特网的网际层提供的是简单灵活、无连接的、尽最大努力交付的数据报服务,因此本章主要围绕网际层如何传送IP数据报这个主题进行讨论。
IPv4地址
- IPv4地址就是给因特网(Internet)上的每一台主机(或路由器)的每一个接口分配一个在全世界范围内是唯一的32比特的标识符。
- IP地址由因特网名字和数字分配机构ICANN(Internet Corporation for Assigned Names and Numbers)进行分配。
- 我国用户可向亚太网络信息中心APNIC(Asia Pacific Network Information Center)申请IP地址,需要缴费。
- 2011年2月3日,互联网号码分配管理局IANA(由ICANN行使职能)宣布,IPv4地址已经分配完毕。
- 我国在2014至2015年也逐步停止了向新用户和应用分配IPv4地址。同时全面开展商用部署IPv6。
- IPv4地址的编址方法经历了如下三个历史阶段:
- 32比特的IPv4地址不方便阅读、记录以及输入等,因此IPv4地址采用点分十进制表示方法以方便用户使用。
分类编址的IPv4地址
分类编址的IPv4地址分为A、B、C、D、E五类
需要注意的是:
- 只有A类、B类和C类地址可分配给网络中的主机或路由器的各接口
- 主机号为“全0”的地址是网络地址,不能分配给主机或路由器的各接口
- 主机号为“全1”的地址是广播地址,不能分配给主机或路由器的各接口
A类地址
B类地址
C类地址
ABC类IP地址类别判断
-
根据地址左起第一个十进制数的值,可以判断出网络类别(小于127的为A类,128~191的为B类,192~223的为C类)
-
根据网络类别,就可找出地址中的网络号部分和主机号部分(A类地址网络号为左起第一个字节,B类地址网络号为左起前两个字节,C类地址网络号为左起前三个字节)
-
以下三种情况的地址不能指派给主机或路由器接口:
- A类网络号0和127
- 主机号为“全0”,这是网络地址
- 主机号为“全1”,这是广播地址
特殊的IPv4地址
地址0.0.0.0是一个特殊的IPv4地址,只能作为源地址使用,表示“在本网络上的本主机”封装有DHCP Discovery报文的IP分组的源地址使用0.0.0.0。
以127开头且后面三个字节非“全0”或“全1”的IP地址是一类特殊的IPv4地址,既可以作为源地址使用,也可以作为目的地址使用,用于本地软件环回测试,例如常用的环回测试地址127.0.0.1。
地址255.255.255.255是一个特殊的IPv4地址,只能作为目的地址使用,表示“只在本网络上进行广播(各路由器均不转发)”。
还有一些一般不使用的特殊IP地址如下:
网络号 | 主机号 | 作为源地址 | 作为目的地址 | 代表的含义 |
---|---|---|---|---|
0 | 0 | 可以 | 不可 | 在本网络上的本主机(DHCP协议) |
0 | host-id | 可以 | 不可 | 在本网络上的某台主机host-id |
全1 | 全1 | 不可 | 可以 | 只在本网络上进行广播(各路由器均不转发) |
net-id | 全1 | 不可 | 可以 | 对net-id上的所有主机进行广播 |
127 | 非全0或全1 | 可以 | 可以 | 用于本地软件环回测试 |
划分子网的IPv4地址
- 为新增网络申请新的网络号会带来以下弊端:
- 需要等待时间和花费更多的费用
- 会增加其他路由器中路由表记录的数量
- 浪费原有网络号中剩余的大量IP地址
- 可以从主机号部分借用一部分比特作为子网号
子网掩码
32比特的子网掩码可以表明分类IP地址的主机号部分被借用了几个比特作为子网号:
- 子网掩码使用连续的比特1来对应网络号和子网号
- 子网掩码使用连续的比特0来对应主机号
- 将划分子网的IPv4地址与其相应的子网掩码进行逻辑与运算就可得到IPv4地址所在子网的网络地址
子网划分细节
给定一个分类的IP地址和其相应的子网掩码,就可知道子网划分的细节:
- 划分出的子网数量
- 每个子网可分配的IP地址数量
- 每个子网的网络地址和广播地址
- 每个子网可分配的最小和最大地址
例如,已知某个网络的地址为218.75.230.0,使用子网掩码255.255.255.128对其进行划分:
默认子网掩码
默认子网掩码是指在未划分子网的情况下使用的子网掩码
无分类编址的IPv4地址
划分子网在一定程度上缓解了因特网在发展中遇到的困难,但是数量巨大的C类网因为其地址空间太小并没有得到充分使用,而因特网的IP地址仍在加速消耗,整个IPv4地址空间面临全部耗尽的威胁。
为此,因特网工程任务组IETF又提出了采用无分类编址的方法来解决IP地址紧张的问题,同时还专门成立IPv6工作组负责研究新版本IP以彻底解决IP地址耗尽问题。
1993年,IETF发布了无分类域间路由选择CIDR(Classless Inter-Domain Routing)的RFC文档:RFC 1517~1519和1520。
- CIDR消除了传统的A类、B类和C类地址,以及划分子网的概念;
- CIDR可以更加有效地分配IPv4的地址空间,并且可以在新的IPv6使用之前允许因特网的规模继续增长。
CIDR使用“斜线记法”,或称CIDR记法。即在IPv4地址后面加上斜线“/”,在斜线后面写上网络前缀所占的比特数量。
CIDR实际上是将网络前缀都相同的连续的IP地址组成一个“CIDR地址块”。
CIDR地址块细节
我们只要知道CIDR地址块中的任何一个地址,就可以知道该地址块的全部细节:
- 地址块的最小地址
- 地址块的最大地址
- 地址块中的地址数量
- 地址块聚合某类网络(A类、B类或C类)的数量地址掩码(也可继续称为子网掩码)
例如对于CIDR地址块128.14.35.7/20
路由聚合(构造超网)
保留共同前缀,后面都取0,再加上“/共同前缀长度”,即为聚合地址块。
网络前缀越长,地址块越小,路由越具体;
若路由器查表转发分组时发现有多条路由可选,则选择网络前缀最长的那条,这称为最长前缀匹配,因为这样的路由更具体。
IPv4地址的应用规划
定长的子网掩码FLSM(Fixed Length Subnet Mask)
- 使用同一个子网掩码来划分子网
- 子网划分方式不灵活:只能划分出2^n个子网(n是从主机号部分借用的用来作为子网号的比特数量)
- 每个子网所分配的IP地址数量相同,容易造成IP地址浪费。
变长的子网掩码VLSM(Variable Length Subnet Mask)
- 使用不同的子网掩码来划分子网
- 子网划分方式灵活:可以按需分配
- 每个子网所分配的IP地址数量可以不同,尽可能减少对IP地址的浪费。
IP数据报的发送和转发过程
IP数据报的发送和转发过程包含以下两部分:
- 主机发送IP数据报
- 路由器转发IP数据报
主机发送IP数据报
- 若在同一个网络,则属于直接交付;
- 若不在同一个网络,则属于间接交付,传输给主机所在网络的默认网关(路由器),由默认网关帮忙转发;
源主机判断目的主机是否与自己在同一网络
将目的IP地址与自身掩码相与,与自身IP地址与自身掩码相与的结果作对比,若不相等则不在同一网络中,为间接交付。
源主机判断间接交付所用路由器
当本网络中主机要与其他网络中主机进行通信时,会将IP数据报传输给默认网关,由默认网关将IP数据报转发出去。
路由器转发IP数据报
- 检查IP数据报首部是否出错:
- 若出错,则直接丢弃该IP数据报并通告源主机;
- 若没有出错,则进行转发;
- 根据IP数据报的目的地址在路由表中查找匹配的条目
- 若找到匹配的条目,则转发给条目中指示的下一跳;
- 若找不到,则丢弃该IP数据报并通告源主机;
路由器不对广播数据报进行转发,是隔离广播域的
静态路由配置及其可能产生的路由环路问题
- 静态路由配置是指用户或网络管理员使用路由器的相关命令给路由器人工配置路由表。
- 这种人工配置方式简单、开销小。但不能及时适应网络状态(流量、拓扑等)的变化。
- 一般只在小规模网络中采用。
- 使用静态路由配置可能出现以下导致产生路由环路的错误
- 配置错误
- 聚合了不存在的网络
- 网络故障
静态路由配置
对于如下网络,由于路由器接口与网络直连,可以直接将网络及其接口加入路由表,类型属于直连。
假设R1要发送数据报到192.168.2.0/24网络中的某个主机,应该将数据报转发给R2的接口0,但R1的路由表中并没有关于该目的网络的路由条目,即R1并不知道目的网络的存在。因此,可以使用路由器相关的配置命令,给R1添加一条到达该目的网络的路由条目。
同理如下:
默认路由
假设R1要转发一个IP数据报给因特网中某个网络中的某个主机,从图中可以看出,R1应该将该IP数据报转发给路由器R2的接口0.由于因特网中包含了众多的网络,如果我们给R1添加针对这些网络的每一条路由条目,则会给人工配置带来巨大的工作量,并且使R1的路由表变得非常大,降低了查表转发的速度。
实际上,对于具有相同下一跳的不同目的网络的路由条目,我们可以用一条默认路由条目来替代。默认路由条目中的目的网络地址为0.0.0.0,地址掩码也为0.0.0.0,CIDR形式为0.0.0.0/0。对于本例,默认路由条目中的下一跳是路由器R2的接口0的地址。由于默认路由也是由人工配置的,因此其类型也为静态。
特定主机路由
有时候,我们可以给路由器添加针对某个主机的特定主机路由条目。一般用于网络管理人员对网络的管理和测试。另外,在需要考虑某种安全问题时,也可以采用特定主机路由。
静态路由配置错误导致路由环路
为了防止IP数据报在路由环路中永久兜圈,在IP数据报首部设有生存时间TTL字段。IP数据报进入路由器后,TTL字段的值减1。若TTL的值不等于0,则被路由器转发,否则被丢弃。
聚合不存在网络而导致路由环路
针对这种情况,可以添加针对所聚合的、不存在的网络的黑洞路由。黑洞路由的下一跳为null0,这是路由器内部的虚拟接口,数据报进入该虚拟接口后路由器会将其丢弃(就像个黑洞,有去无回的那种
对于下例,根据最长前缀匹配原则,IP数据报就会直接进入黑洞
网络故障而导致路由环路
假设路由器R1检测到其接口0所直连的网络出现了故障而不可达,就会自动在其路由表中删除其直连网络的路由条目。之后R2要转发IP数据报到该网络,从而导致路由环路。
针对这种情况,可以在R1的路由表中添加针对该直连网络的黑洞路由。
假设过一段时间后故障消失,黑洞路由就会自动失效,路由器自动添加针对该直连网络的路由条目。如果再次出现故障,则路由器自动删除针对该直连网络的路由条目,黑洞路由也会自动生效。于是只有路由器受伤的世界完成了
路由选择协议
路由选择协议概述
静态路由选择:
- 由人工配置的网络路由、默认路由、特定主机路由、黑洞路由等都属于静态路由。
- 这种人工配置方式简单、开销小。但不能及时适应网络状态(流量、拓扑等)的变化。
- 一般只在小规模网络中采用。
动态路由选择:
- 路由器通过路由选择协议自动获取路由信息。
- 比较复杂、开销比较大。能较好地适应网络状态的变化。
- 适用于大规模网络。
因特网所采用的路由选择协议的主要特点:
自适应:动态路由选择,能较好地适应网络状态的变化
分布式:路由器之间交换路由信息
分层次:将整个因特网划分为许多较小的自治系统AS(Autonomous System)
常见的路由选择协议:
路由器的基本结构
路由器是一种具有多个输入端口和输出端口的专用计算机,其任务是转发分组。
路由器结构可以划分为两大部分,一个是路由选择部分,另一个是分组转发部分。
路由选择部分的核心构件是路由选择处理机,它的任务是根据所使用的路由选择协议,周期性地与其他路由器进行路由信息的交互来更新路由表。
分组转发部分由三部分构成,分别是交换结构、一组输入端口和一组输出端口。信号从某个输入端口进入路由器,物理层将信号转换成比特流送交数据链路层处理。数据链路层从比特流中识别出帧,去掉帧头和帧尾后送交网络层处理。
如果送交网络层的分组是普通待转发的数据分组,则根据分组首部中的目的地址进行查表转发,若找不到匹配的转发条目,则丢弃该分组;否则按照匹配条目中所指示的端口进行转发。网络层更新数据分组首部中某些字段的值,例如将数据分组的生存时间减1。然后送交数据链路层进行封装。数据链路层将数据分组封装成帧,送交物理层处理。物理层将帧看作是比特流,将其变换成相应的电信号进行发送。
如果送交网络层的分组是路由器之间交换路由信息的路由报文,则把这种分组送交路由选择处理机,路由选择处理机根据分组的内容,来更新自己的路由表。路由表一般仅包含从目的网络到下一跳的映射,路由表需要对网络拓扑变化的计算最优化。而转发表是从路由表得出的,转发表的结构应当使查找过程最优化。
路由选择处理机除了处理收到的路由报文外,还会周期性地给其他路由器发送自己所知道的路由信息。路由器的各端口还应具有输入缓冲区和输出缓冲区。输入缓冲区用来暂存新进入路由器但还来不及处理的分组,输出缓冲区用来暂存已经处理完毕,但还来不及发送的分组。需要说明的是,路由器的端口一般都具有输入和输出的功能,我们图中分别给出输入端口和输出端口目的在于更好地演示路由器的基本工作过程。
路由信息协议RIP(Routing Information Protocol)
RIP要求自治系统AS内的每一个路由器都要维护从它自己到AS内其他每一个网络的距离记录。这是一组距离,称为“距离向量D-V(Distance-Vector)”。
RIP使用跳数(Hop Count)作为度量(Metric)来衡量到达目的网络的距离。
- 路由器到直连网络的距离定义为1。
- 路由器到非直连网络的距离定义为所经过的路由器数加1。口允许一条路径最多只能包含15个路由器。
- “距离”等于16时相当于不可达。因此,RIP只适用于小型互联网。
RIP认为好的路由就是“距离短”的路由,也就是所通过路由器数量最少的路由。当到达同一目的网络有多条“距离相等”的路由时,可以进行等价负载均衡。
RIP包含以下三个要点:
- 和谁交换信息:仅和相邻路由器交换信息
- 交换什么信息:自己的路由表
- 何时交换信息:周期性交换(例如每30秒)
RIP的基本工作过程
-
路由器刚开始工作时,只知道自己到直连网络的距离为1。
-
每个路由器仅和相邻路由器周期性地交换并更新路由信息。
-
若干次交换和更新后,每个路由器都知道到达本AS内各网络的最短距离和下一跳地址,称为收敛。
RIP的路由条目更新规则
路由器C和D互为相邻路由器,它们之间周期性地交换并更新路由信息。路由器C的路由表中到达各目的网络的下一跳都记为问号,可以理解为路由器D并不需要关心路由器C的这些内容。
假设路由器C的RIP更新报文发送周期到了,则路由器C将自己路由表中的相关路由信息封装到RIP更新报文中发送给路由器D。我们可以简单地理解为路由器C将自己的路由表发送给了路由器D。
路由器D收到后对其进行改造,将到达各目的网络的下一跳都改为C,距离都增加1。
现在路由器D根据改造的路由表来更新自己的路由表,更新规则如下图。
“坏消息传得慢”的问题
RIP存在“坏消息传播得慢”的问题。“坏消息传播得慢”又称为路由环路或距离无穷计数问题,这是距离向量算法的一个固有问题。
如图所示,假设R1到达其直连网络的链路出现了故障,当R1检测出该故障后会将到达N1的路由条目中的距离修改为16,表示N1不可达。并等待RIP更新周期到时后发送该路由信息给R2。而此时R2的路由表中关于N1的路由条目仍然是先前通过RIP协议获取到的,也就是到达N1的距离为2,下一跳通过R1转发。
假设R2的RIP更新周期先到时,也就是R2的这条路由信息先到达R1,而R1的这条路由信息后到达R2。当R1收到R2的路由信息后,就会被该谣言误导,认为可以通过R2到达N1,距离为3,并在自己的RIP更新信息到时后,发送给R2。如此循环往复,直到R1和R2的路由表中到达N1的路由条目的距离都增加到16后,R1和R2才知道N1不可达(收敛)。在此过程中,R1和R2之间会出现路由环路,时间长达数分钟。
可以采取多种措施减少出现该问题的概率或减小该问题带来的危害,但不能完全避免。
- 限制最大路径距离为15(16表示不可达)
- 当路由表发生变化时就立即发送更新报文(即“触发更新”),而不仅是周期性发送
- 让路由器记录收到某特定路由信息的接口,而不让同一路由信息再通过此接口向反方向传送(即“水平分割”)
开放最短路径优先OSFP(Open Shortest Path First)的基本工作原理
-
开放最短路径优先OSPF(Open Shortest Path First),是为克服RIP的缺点在1989年开发出来的。
- “开放”表明OSPF协议不是受某一家厂商控制,而是公开发表的。
- “最短路径优先”是因为使用了Dijkstra提出的最短路径算法SPF。
-
OSPF是基于链路状态的,而不像RIP那样是基于距离向量的。
-
OSPF采用SPF算法计算路由,从算法上保证了不会产生路由环路。
-
OSPF不限制网络规模,更新效率高,收敛速度快。
-
链路状态是指本路由器都和哪些路由器相邻,以及相应链路的“代价”(cost)。
OSPF中的邻居关系
- OSPF相邻路由器之间通过交互问候(Hello)分组,建立和维护邻居关系。
OSPF的LSA和LSU
- 使用OSPF的每个路由器都会产生链路状态通告LSA(Link State Advertisement)。LSA中包含以下内容:
- 直连网络的链路状态信息
- 邻居路由器的链路状态信息
- LSA被封装在链路状态更新分组LSU中,采用洪泛法发送,也就是进行洪泛转发。这样,自治系统中每个路由器所发送的封装有链路状态通告的链路状态更新分组会传递给系统中其他所有路由器。
OSPF的LDB
- 使用OSPF的每个路由器都有一个链路状态数据库LSDB,用于存储LSA。
- 通过各路由器洪泛发送封装有自己LSA的LSU分组,各路由器的LSDB最终将达到一致。
OSPF中最短路径的获取
使用OSPF的各路由器基于LSDB进行最短路径优先SPF计算,构建出各自到达其他各路由器的最短路径,即构建各自的路由表。
OSPF的分组类型
- OSPF有以下五种分组类型:
- 问候(Hello)分组:用来发现和维护邻居路由器的可达性。
- 数据库描述(Database Description)分组:向邻居路由器给出自己的链路状态数据库中的所有链路状态项目的摘要信息
- 链路状态请求(Link State Request)分组:向邻居路由器请求发送某些链路状态项目的详细信息。
- 链路状态更新(Link State Update)分组:路由器使用这种分组将其链路状态进行洪泛发送,即用洪泛法对全网更新链路状态。
- 链路状态确认(Link State Acknowledgment)分组:这是对链路状态更新分组的确认分组。
OSPF的基本工作过程
OSPF在多点接入网络中路由器邻居关系的建立
- 当OSPF路由器在多点接入网络中建立邻居关系时,如果不采用其他机制,将会产生大量的多播分组。
- 为了减少所发送分组的数量,OSPF选举指定路由器DR(designated router)和备用的指定路由器BDR(backup designated router)
- 所有的非DR/BDR只与DR/BDR建立邻居关系
- 非DR/BDR之间通过DR/BDR交换信息
- 当DR出现故障,则由BDR顶替DR
OSPF分层次划分区域
为了使OSPF能够用于规模很大的网络,OSPF把一个自治系统再划分为若干个更小的范围,叫做区域(Area)
如图所示,这是一个规模很大的网络,我们将其划分成一个自治系统。在该自治系统内,所有路由器都使用OSPF协议。OSPF将该自治系统再划分成四个更小的区域。每个区域都有一个32比特的区域标识符,可以用点分十进制表示。例如,主干区域的标识符必须为0,也可以表示为点分十进制的0.0.0.0。主干区域用于连通其他区域,其他区域的标识符不能为0且互不相同。
每个区域的规模不应太大,一般所包含的路由器不应超过200个。划分区域的好处就是把利用洪泛法交换链路状态信息的范围局限于每一个区域,而不是整个自治系统,这样就减少了整个网络上的通信量。
如果路由器的所有接口都在同一个区域内,则该路由器称为区域内路由器。为了本区域可以和自治系统内的其他区域连通,每个区域都会有一个区域边界路由器,它的一个接口用于连接自身所在区域,另一个接口用于连接主干区域。主干区域内的路由器称为主干路由器。我们可以把区域边界路由器看作是主干路由器。在主干区域内还要有一个路由器,专门和本自治系统外的其他自治系统交换路由信息,这样的路由器称为自治系统边界路由器。
采用分层次划分区域的方法,虽然使交换信息的种类增多了,同时也使OSPF协议更加复杂了,但这样做却能使每一个区域内部交换路由信息的通信量大大减小,因而使OSPF协议能够用于规模很大的自治系统中。
边界网关协议BGP(Border Gateway Protocol)
- 内部网关协议IGP(例如路由信息协议RIP或开放最短路径优先OSPF)
- 设法使分组在一个自治系统内尽可能有效地从源网络传输到目的网络
- 无需考虑自治系统外部其他方面的策略
- 外部网关协议EGP(例如边界网关协议BGP)
BGP发言人
- 在配置BGP时,每个自治系统的管理员要选择至少一个路由器作为该自治系统的“BGP发言人”
- 不同自治系统的BGP发言人要交换路由信息,首先必须建立TCP连接,端口号为179
- 在此TCP连接上交换BGP报文以建立BGP会话
- 利用BGP会话交换路由信息(例如,增加新的路由,或撤销过时的路由,以及报告出错的情况等)
- 使用TCP连接交换路由信息的两个BGP发言人,彼此称为对方的邻站(neighbor)或对等站(peer)
- BGP发言人除了运行BGP外,还必须运行自己所在自治系统所使用的内部网关协议IGP,例如OSPF或RIP。
- BGP发言人交换网络可达性的信息(要到达某个网络所要经过的一系列自治系统)
- 当BGP发言人互相交换了网络可达性的信息后,各BGP发言人就根据所采用的策略从收到的路由信息中找出到达各自治系统的较好的路由。也就是构造出树形结构、不存在回路的自治系统连通图。
BGP发言人交换路径向量
BGP-4的四种报文
- OPEN(打开)报文:用来与相邻的另一个BGP发言人建立关系,使通信初始化。
- UPDATE(更新)报文:用来通告某一路由的信息,以及列出要撤销的多条路由。
- KEEPALIVE(保活)报文:用来周期性地证实邻站的连通性。
- NOTIFICATION(通知)报文:用来发送检测到的差错。
在BGP协议刚刚运行时,BGP的邻站交换整个BGP路由表。但以后只需要在发生变化时更新有变化的部分,这样做对节省网络带宽和减少路由器的处理开销都有好处。
RIP、OSPF、BGP的封装
IPv4数据报的首部格式
(以下IPv4数据报简称为IP数据报
如图所示,这是IP数据报的首部格式。它由20字节的固定部分和最大40字节的可变部分组成。所谓固定部分,是指每个IP数据报首部都必须包含的部分。而某些IP数据报的首部,除了包含20字节的固定部分外,还包含一些可选的字段来增加IP数据报的功能。IP数据报的首部常以32个比特为单位进行描述。图中的每一行都由32个比特(四个字节)构成,每个小格子称为字段或域。每个字段或某些字段的组合用来表达IP协议的相关功能。
版本、首部长度、区分服务、总长度字段
-
版本:
占4比特,表示IP协议的版本。
通信双方使用的IP协议的版本必须一致。目前广泛使用的IP协议版本号为4(即IPv4)。 -
首部长度:
占4比特,表示IP数据报首部的长度。
该字段的取值以4字节为单位。最小十进制取值为5,表示IP数据报首部只有20字节固定部分;
最大十进制取值为15,表示IP数据报首部包含20字节固定部分和最大40字节可变部分。 -
区分服务
占8比特,用来获得更好的服务。
该字段在旧标准中叫作服务类型,但实际上一直没有被使用过。
1998年,因特网工程任务组IETF把这个字段改名为区分服务。
利用该字段的不同数值可提供不同等级的服务质量。
只有在使用区分服务时,该字段才起作用。一般情况下都不使用该字段。 -
总长度
占16比特,表示IP数据报的总长度(首部+数据载荷)。
最大取值为十进制的65535,以字节为单位。
标识、标志、片偏移字段
这三个字段共同用于IP数据报的分片。例如对于网际层封装出的IP数据报,它将在数据链路层封装成帧,每一种数据链路层协议都规定了帧的数据载荷的最大长度,称为最大传输单元MTU。例如,以太网的数据链路层规定MTU的值为1500个字节,如果某个IP数据报的总长度超过MTU时,将无法封装成帧。需要将原IP数据报分片为更小的IP数据报,再将各分片IP数据报封装成帧。
-
标识
占16比特,属于同一个数据报的各分片数据报应该具有相同的标识。
IP软件维持一个计数器,每产生一个数据报,计数器值加1,并将此值赋给标识字段。 -
标志
占3比特,各比特含义如下:- DF位:
- 1表示不允许分片;
- 0表示允许分片
- MF位:
- 1表示“后面还有分片”:
- 0表示“这是最后一个分片”
- 保留位:必须为0
- DF位:
-
片偏移
占13比特,指出分片数据报的数据载荷部分偏移其在原数据报的位置有多少个单位。
片偏移以8个字节为单位。
片偏移量必须为整数
分片举例
生存时间、协议、首部检验和字段
-
生存时间TTL
占8比特,最初以秒为单位,最大生存周期为255秒
路由器转发IP数据报时,将IP数据报首部中的该字段的值减去IP数据报在本路由器上所耗费的时间,若不为0就转发,否则就丢弃。
现在以“跳数”为单位,路由器转发IP数据报时,将IP数据报首部中的该字段的值减1,若不为0就转发,否则就丢弃。
生存时间TTL字段可以防止IP数据报在网络中永久兜圈
-
协议
占8比特,指明IPv4数据报的数据部分是何种协议数据单元。
常用的一些协议和相应的协议字段值如下
|协议名称|ICMP|IGMP|TCP|UDP|IPv6|OSPF|
|—|—|—|—|—|—|—|
|协议字段值|1|2|6|17|41|89| -
首部检验和
占16比特,用来检测首部在传输过程中是否出现差错。比CRC检验码简单,称为因特网检验和。
IP数据报每经过一个路由器,路由器都要重新计算首部检验和,因为某些字段(生存时间、标志、片偏移等)的取值可能发生变化。
由于IP层本身并不提供可靠传输的服务,并且计算首部校验和是一项耗时的操作,因此在IPv6中,路由器不再计算首部校验和,从而更快转发IP数据报。
源IP地址、目的IP地址字段
各占32比特,用来填写发送该IP数据报的源主机的IP地址和接收该IP数据报的目的主机的IP地址。
可选、填充字段
- 可选字段
长度从1个字节到40个字节不等。用来支持排错、测量及安全等措施。
可选字段增加了IP数据报的功能,但这同时也使得IP数据报的首部长度成为可变的。这就增加了每一个路由器处理IP数据报的开销。实际上可选字段很少被使用。 - 填充字段
确保首部长度为4字节的整数倍。使用全0进行填充。
网际控制报文协议ICMP(Internet Control Message Protocol)
- 为了更有效地转发IP数据报和提高交付成功的机会,在网际层使用了网际控制报文协议ICMP(Internet Control Message Protocol)。
- 主机或路由器使用ICMP来发送差错报告报文和询问报文。
- ICMP报文被封装在IP数据报中发送。
ICMP差错报告报文
ICMP差错报告报文有以下五种:
- 终点不可达
- 源点抑制
- 时间超过
- 参数问题
- 改变路由(重定向)
终点不可达
当路由器或主机不能交付数据报时,就向源点发送终点不可达报文。具体可再根据ICMP的代码字段细分为目的网络不可达目的主机不可达、目的协议不可达、目的端口不可达、目的网络未知、目的主机未知等13种错误。
源点抑制
当路由器或主机由于拥塞而丢奔数据报时,就向源点发送源点抑制报文,使源点知道应当把数据报的发送速率放慢。
时间超过
当路由器收到一个目的IP地址不是自己的IP数据报,会将其生存时间TTL字段的值减1。
若结果不为0,则将该IP数据报转发出去;若结果为0,除丢奔该IP数据报外,还要向源点发送时间超过报文。
另外,当终点在预先规定的时间内不能收到一个数据报的全部数据报片时,就把已收到的数据报片都丢弃,也会向源点发送时间超过报文。
参数问题
当路由器或目的主机收到IP数据报后,根据其首部中的检验和字段发现首部在传输过程中出现了误码,就丢弃该数据报,并向源点发送参数问题报文。
改变路由(重定向)
路由器把改变路由报文发送给主机,让主机知道下次应将数据报发送给另外的路由器(可通过更好的路由)。
不发送ICMP差错报告报文的情况
- 对ICMP差错报告报文不再发送ICMP差错报告报文
- 对第一个分片的数据报片的所有后续数据报片都不发送ICMP差错报告报文
- 对具有多播地址的数据报都不发送ICMP差错报告报文
- 对具有特殊地址(如127.0.0.0或0.0.0.0)的数据报不发送ICMP差错报告报文
ICMP询问报文
常用的ICMP询问报文有以下两种:
-
回送请求和回答
ICMP回送请求报文是由主机或路由器向一个特定的目的主机发出的询问。
收到此报文的主机必须给源主机或路由器发送ICMP回送回答报文。
这种询问报文用来测试目的站是否可达及了解其有关状态。 -
时间戳请求和回答
ICMP时间戳请求报文是请某个主机或路由器回答当前的日期和时间。
在ICMP时间戳回答报文中有一个32位的字段,其中写入的整数代表从1900年1月1日起到当前时刻一共有多少秒。
这种询问报文用来进行时钟同步和测量时间。
ICMP用于分组网间探测PING(Packet InterNet Groper)
- 用来测试主机或路由器间的连通性
- 应用层直接使用网际层的ICMP(没有通过运输层的TCP或UDP)
- 使用ICMP回送请求和回答报文
(我那个破学校官网是怎么回事
ICMP用于跟踪路由(traceroute)
- 用来测试IP数据报从源主机到达目的主机要经过哪些路由器
- Windows版本
- tracert命令
- 应用层直接使用网际层ICMP
- 使用了ICMP回送请求和回答报文以及差错报告报文
- Unix版本
- traceroute命令
- 在运输层使用UDP协议
- 仅使用ICMP差错报告报文
工作原理
假设主机H1想知道到达主机H2要经过哪些路由器。H1就给H2发送ICMP回送请求报文,该报文被封装在IP数据报中,IP数据报首部中生存时间字段TTL的值被设置为1。该IP数据报到达R1后,其生存时间减1结果为0。R1丢弃该数据报,并向发送该数据报的源主机H1发送ICMP差错报告报文,其类型为时间超过。
这样,H1就知道了到达H2的路径中的第一个路由器。
H1继续发送下一个封装有ICMP回送请求报文的IP数据报,首部中生存时间字段TTL的值被设置为2。经过R1的转发后,该数据报的生存时间减少为1。该IP数据报到达R2后,其生存时间减一结果为0。R2丢弃该数据报,并向发送该数据报的源主机H1发送ICMP差错报告报文,其类型为时间超过。
这样,H1就知道了到达H2的路径中的第二个路由器。
H1继续发送下一个封装有ICMP回送请求报文的IP数据报,首部中生存时间字段TTL的值被设置为3。经过R1、R2的转发后,该数据报到达主机H2,其生存时间减少为1。H2解析该数据报,发现其内部封装的是ICMP回送请求报文,于是就给H1发送封装有ICMP回送请求回答报文的IP数据报。
这样,H1就知道已经跟踪到路径中的最后一站,也就是目的主机H2。
虚拟专用网VPN与网络地址转换NAT
虚拟专用网VPN(Virtual Private Network)
利用公用的因特网作为本机构各专用网之间的通信载体,这样的专用网又称为虚拟专用网。
由于IPv4地址的紧缺,一个机构能够申请到的IPv4地址数量往往远小于本机构所拥有的主机数量。因此,虚拟专用网中的各主机所分配的地址应该是本机构可自由分配的专用地址,而不是需要申请的、在因特网上使用的公有地址。
对于下图,给部门A分配的专用网分配的私有地址的网络号为10.1.0.0,给部门B的专用网分配的私有地址的网络号为10.2.0.0。两个专用网中各主机所分配的私有地址如图所示。需要注意的是,私有地址只能用于一个机构的内部通信,而不能用于和因特网上的主机通信。换句话说,私有地址只能用作本地地址,而不能用作全球地址。在因特网中的所有路由器,对目的地址是私有地址的IP数据报一律不进行转发。很显然,部门A和B各自至少需要一个路由器具有合法的全球IP地址,这样,它们各自的专用网才能利用公有的因特网进行通信。
假设部门A中一台主机要给部门B中的另一台主机发送数据,它会将待发送数据封装成内部IP数据报发送给路由器R1。其首部中源地址字段的值为部门A中该主机的IP地址,目的地址字段的值为部门B中另一台主机的IP地址。
R1收到该数据报后,发现其目的网络必须通过因特网才能到达,就将内部IP数据报进行加密,这样就确保了内部IP数据报的安全。然后重新添加上数据报的首部,封装成为在因特网上发送的外部数据报。其首部中源地址字段的值为路由器R1的全球地址,目的地址字段的值为路由器R2的全球地址。
路由器R2收到该外部IP数据报后,去掉其首部,将其数据部分进行解密,恢复出原来的IP数据报。这样就可以从其首部提取出源地址和目的地址。根据目的地址,将该内部IP数据报发送给相应的主机。
很显然,两个专用网内的主机间发送的数据报是通过了公用的因特网,但在效果上就好像是在本机构的专用网上传送一样,数据报在因特网中可能要经过多个网络和路由器,但从逻辑上看,R1和R2之间好像是一条直通的点对点链路,因此也被称为IP隧道技术。
-
如上图所示,同一机构内不同部门的内部网络所构成的虚拟专用网VPN又称为内联网VPN。
-
有时一个机构的VPN需要有某些外部机构(通常就是合作伙伴)参加进来。这样的VPN就称为外联网VPN。
-
在外地工作的员工需要访问公司内部的专用网络时,只要在任何地点接入到因特网,运行驻留在员工PC中的VPN软件,在员工的PC和公司的主机之间建立VPN隧道,即可访问专用网络中的资源。这种VPN称为远程接入VPN。
网络地址转换NAT(Network Address Translation)
虽然因特网采用了无分类编址方式来减缓IPv4地址空间耗尽的速度,但由于因特网用户数目的激增,特别是大量小型办公室网络和家庭网络接入因特网的需求不断增加,IPv4地址空间即将面临耗尽的危险仍然没有被解除。
1994年提出了一种网络地址转换NAT的方法再次缓解了IPv4地址空间即将耗尽的问题。NAT能使大量使用内部专用地址的专用网络用户共享少量外部全球地址来访问因特网上的主机和资源。
对于下图,使用私有地址的主机要与因特网上使用全球IP地址的主机进行通信。这需要在专用网络连接到因特网的路由器上安装NAT软件,装有NAT软件的路由器叫做NAT路由器,它至少有一个有效的外部全球IP地址,这样,所有使用私有地址的主机在和外界通信时都要在NAT路由器上将其私有地址转换成全球IP地址。
假设使用私有地址的主机要给因特网上使用全球IP地址的另一台主机发送IP数据报。该主机将IP数据报发送给NAT路由器,数据报首部中源地址字段的值为该主机的私有地址,目的地址字段的值为因特网上另一台主机的全球地址。NAT路由器从自己的全球IP地址池中为该主机分配一个临时的全球IP地址172.38.1.5,并将IP数据报的源地址修改为该地址。然后将私有地址与全球地址的对应关系记录在NAT转换表中。之后就可以转发该IP数据报了。
请注意,此时该IP数据报中的源地址和目的地址都是全球IP地址。
因特网上的这台主机给源主机发回数据报,数据报的源地址和目的地址都是全球IP地址。NAT路由器收到该IP数据报后,在NAT转换表中进行查找,发现该数据报的目的地址所对应的私有地址为192.168.0.2,于是就将该数据报的目的地址修改为192.168.0.2,并将其发送给相应的主机。
请注意,此时该IP数据报中的源地址为因特网上那台主机的全球IP地址,而目的地址为专用网络中这台主机的私有地址。
当专用网中的这两台使用私有地址的主机,都要给因特网上使用全球地址的另一台主机发送数据报时,在NAT路由器的NAT转换表中就会产生两条记录,分别记录两个私有地址与两个全球地址的对应关系。这种基本转换方法存在一个问题:如果NAT路由器具有N个全球IP地址,那么至多只能由N个内网主机能够同时和因特网上的主机通信。
由于绝大多数的网络应用都是使用运输层协议TCP或UDP来传送数据,因此可以利用运输层的端口号和IP地址一起进行转换。
这样,用一个全球IP地址就可以使多个拥有本地地址的主机同时和因特网上的主机进行通信。这种将端口号和IP地址一起进行转换的技术叫作网络地址与端口号转换NAPT(Network Address and Port Translation)。
外网主机不可以首先对内网主机发起通信,因此内网主机不能直接充当因特网服务器。
对于一些P2P网络应用,需要外网主机主动与内网主机进行通信,在通过NAT时会遇到问题,需要网络应用自己使用一些特殊的NAT穿越技术来解决问题。
另外,由于NAT对外网屏蔽了内网主机的网络地址,能为内网的主机提供一定的安全保护。