TCP/IP入门(2) --网络层
/**
本篇博客由汗青ZJF整理并发布, 转载请注明出处:
http://blog.csdn.net/zjf280441589/article/category/1854365
*/
什么是虚拟网络互连?
所谓虚拟互连网络也就是逻辑互连网络,它的意思就是互连起来的各种物理网络的异构性本来是客观存在的(比如局域网有的采用的是以太网, 有的采用令牌环网),但是我们利用 IP 协议就可以使这些性能各异的网络从用户角度来看好像是一个统一的网络(在网络的上层, 我们看不到各网络具体的异构网络细节)。使用IP 协议的虚拟互连网络可简称为 IP 网。
好处是: 当互联网上的处于不同网络的主机之间进行通信时, 就好像在一个网络上通信一样, 而看不见互连的各具体的网络异构细节(如具体的编址方案, 路由选择协议等).
IP报文
各个字段说明 | |
版本 | IP协议版本号, IPv4此字段值为4, IPv6此字段值为6 |
首部长度 | 取值范围5(0101)~15(1111), 单位为4字节,包括固定部分和可选部分, 因此首部最长为60字节, 最短为20字节(不包括选项和填充部分); |
服务类型 | 长度为8位(由于该字段一直弃而不用, 因此不用考虑) |
总长度 | 该字段长度为16位, 以字节为单位, 总长度包含IP的头部和数据部分, IP数据报最大长度为65535字节, 但是注意最大不要超过MTU的长度 |
标识 | 16位长度, 唯一标识一个数据报,可以将之当成一个计数器, 每发送一个数据包, 则该值加1, 如果数据报分片,则每个分片的标识都一样, 各个分片共享一个标识号 |
标志 | 3位标志中第一位不使用, 第二位为DF(Don`t Fragment不分片), 如果该位为1, 并且传输的数据报超过最大传输单元(MTU), 则该数据报会被丢弃, 并发送一个ICMP差错报文; 第三位MF(More Fragment更多分片),表示是否有更多的分片, 如果该位为1, 则说明后续还有分片, 最后一片MF为0 |
片偏移 | 用以指出该分段的第一个数据字节在原始数据报中的偏移位置(以8字节为单位),IP分片后每一个分组都具有自己的首部, 而且标志位相同, 但是片偏移值不同, 通过片偏移值接收端可以重新组装IP包 |
生存时间(TTL) | 表示数据报最多可经过的路由器的数量. 取值0~255,每经过一个路由器, TTL值减1,为0时被丢弃, 并发送ICMP报文通知源主机, TTL可以避免数据报在路由器之间不断循环(Tranceroute程序的实现原理) |
协议类型 | 指明IP层上承载的是哪个高级协议, 在分用的过程中, 协议栈知道该交给上层的哪个协议处理, 如1为ICMP, 2为IGMP, 6为TCP, 17为UDP等. |
头部校验和 | 保证数据报头部的数据完整性,但校验不包括数据部分。这样做的目的有二:一是所有将数据封装在IP数据包中的高层协议均含有覆盖整个数据的校验和,因此IP数据报没有必要再对其所承载的数据部分进行校验。二是每经过一个路由器,IP数据报的头部要发生改变(如TTL),而数据部分不变,这样只对发生改变的头部进行校验,显然不会浪费太多的时间。为了减少计算时间,一般不用CRC校验码,而是采用更简单的网际校验和(Internet Checksum)。 |
选项与填充 | 增加首部的可变部分是为了增加IP数据报的功能, 如支持排错, 测量以及安全等, 选项长度从1到40字节不等, 取决于所选择的项目(选项为4字节整数倍,否则用0填充); 但这样就增加了每一个路由器处理数据的开销, 实际上这些选项很少被使用, 很多路由器都并不考虑IP首部的选项字段; |
IP地址分类
IP地址的编址方法,共经历了三个历史阶段。这三个阶段是:
1)分类的 IP 地址。这是最基本的编址方法;
2)划分子网。这是对最基本的编址方法的改进;
3)构成超网。这是比较新的无分类编址方法,提出后很快得到推广, 并沿用至今;
分类的IP地址:
A)为了适应不同网络规模的需求,将IP地址进行分类,不同类型IP地址拥有的主机数不一样。两级的 IP 地址可以记为:
IP 地址 ::= { <网络号>, <主机号>}
B)特殊地址
对于因特网 IP 地址中有特定的专用地址,不作分配(但他们还是IP地址):
(1) 主机地址全为"0"
不论哪类网络,主机地址全为"0"表示指向本网,常用在路由表中。
(2) 主机地址全为"1"
主机地址全为"1"表示广播地址,向特定的所在网上所有主机发送数据报。
(3) 32位全为"1"
若 IP 地址 4 字节 32 比特全为"1",表示仅在本网内进行广播发送(见Arp协议)。
(4) 网络为127
TCP/IP 协议规定网络号 127 不可用于任何网络。其中有一个特别地址:127.0.0.1 称之为还回地址(loop-back);
C)使用范围:
网络类别 | 最大网络数 | 第一个可用的网络号 | 最后一个可用的网络号 | 每个网络中的最大主机数 |
A | 2^7 -2 | 1 | 126(127不可用) | 2^24 -2 |
B | 2^14 -1 | 128.1 | 191.255 | 2^16 -2 |
C | 2^21 -1 | 192.0.1 | 223.255.255 | 2^8 -2 |
D)IP地址的重要特点
1)IP 地址是一种分等级的地址结构。分两个等级的好处是:
a. IP 地址管理机构在分配 IP 地址时只分配网络号,而剩下的主机号则由得到该网络号的单位自行分配。这样就方便了 IP 地址的管理。
b. 路由器仅根据目的主机所连接的网络号来转发分组(而不考虑目的主机号), 这样就可以使路由表中的项目数大幅度减少,从而减小了路由表所占的存储空间。
2)实际上 IP 地址是标志一个主机/路由器和一条链路的接口。
当一个主机同时连接到两个网络上时,该主机就必须同时具有两个IP 地址,其网络号 net-id 必须是不同的; 由于一个路由器至少应当连接到两个网络(这样它才能将 IP 数据报从一个网络转发到另一个网络),因此一个路由器至少应当有两个不同的 IP 地址。
3)用转发器或网桥连接起来的若干个局域网仍为一个网络,因此这些局域网都具有同样的网络号 net-id。
4)所有分配到net-id 的网络, 无论是范围很小的局域网,还是覆盖很大地理范围的广域网,都是平等的。
分组转发算法
(1) 从数据报的首部提取目的站的 IP 地址 D, 得出目的网络地址为 N。
(2) 若网络 N 与此路由器直接相连,则直接将数据报直接交付给目的站 D;否则是间接交付,执行(3)。
(3) 若路由表中有目的地址为 D 的特定主机路由,则将数据报传送给路由表中所指明的下一跳路由器;否则,执行(4)。
(4) 若路由表中有到达网络 N 的路由,则将数据报传送给路由表指明的下一跳路由器;否则,执行(5)。
(5) 若路由表中有一个默认路由,则将数据报传送给路由表中所指明的默认路由器;否则,执行(6)。
(6) 报告转发分组出错。
子网划分
一个拥有许多物理网络的单位,可将所属的物理网络划分为若干个子网。划分子网纯属一个单位内部的事情。本单位以外的网络看不见这个网络是由多少子网组成,因为这个单位对外仍然表现一个网络。
划分子网的方法是从网络的主机号借用若干位作为子网号subnet-id。划分子网增加了灵活性,但也减少了能够连接在网络上主机总数。于是两级IP地址在本单位内部就变为三级IP地址:
IP地址 ::= {<网络号>,<子网号>,<主机号>}
凡是从其他网络发送给本单位某个主机的IP数据报,仍然是根据IP数据报的目的网络号找到连接在本单位网络上的路由器。但此路由器在收到IP数据报后,在按目的网络号和子网号找到目的子网,把IP数据报交付给目的主机;
子网掩码
子网掩码也是32位,由一串1和跟随的一串0组成。子网掩码中的1对应于IP地址中原来的网络号和子网号,而子网掩码中的0对应于现在的主机号。故将子网掩码和IP地址进行按位”与“运算(AND),就可得出网络地址, 由此可知:
A 类网络的缺省的子网掩码是 | 255.0.0.0 |
B 类网络的缺省的子网掩码是 | 255.255.0.0 |
C 类网络的缺省的子网掩码是 | 255.255.255.0(最常见) |
不同的子网掩码可以得出相同的网络地址, 但不同的掩码的效果是不同的.
使用子网时分组的转发过程:
使用子网划分后,路由表必须包含以下三项内容:{目的网络地址,子网掩码和下一跳地址}, 路由器转发分组的流程如下:
1)从收到的数据报首部提取目的IP地址D;
2)先判断是否为直接交付。对路由器直接相连的网络进行逐个检查:用各网络的子网掩码和D逐位相与,看结果是否和相对应的网络地址匹配。若匹配,则把分组进行直接交付,转发任务结束。否则就是间接交付,执行(3)。
3)若路由表中有目的地址为D的特定主机路由,则把数据报传送给路由表中所指明的下一跳路由,否则执行(4)。
4)对路由表的每一行,用其中的子网掩码和D逐位相与,其结果为N。若N与该行的目的网络地址匹配,则把数据报传送给该行指明的下一跳路由器,否则执行(5)。
5)若路由表中有一个默认路由,则把数据报传送给路由表中所指明的默认路由器;否则执行(6)。
6)报告转发分组出错。
无分类编址(CIDR)
无分类域间路由选择(CIDR)是在变长子网掩码的基础上提出的一个消除A, B, C类网络划分, 并且可以在软件的支持下实现构造超网的一种IP地址的划分方法;
CIDR的主要特点:
1)消除了传统的A,B,C类地址以及子网划分的概念, 因而可以更加有效的分配IPv4的地址空间. CIDR使用”网络前缀”的概念代替网络号的概念, 这样IP地址的无分类两级编址就变为:
IP::= {<网络前缀>,<主机地址>}
CIDR还使用”斜线记法”, 即: <IP地址>/<网络前缀所占位数>. 其中, 网络前缀所占位数对应于网络号部分, 等效于子网掩码中连续1的部分, 因此通过逐位相”与”的方法依然可以得到该地址的网络前缀;
注:CIDR并不使用子网, CIDR并没有在32位地址中指明若干位作为子网字段, 但分配到一个CIDR地址块的组织仍可以在本组织内根据需要划分出一些子网;
2)将网络前缀都相同的连续的IP地址组成”CIDR地址块”, 一个CIDR地址块可以表示很多地址, 这种地址的聚合成为路由聚合, 或称构成超网; 路由聚合使得路由表中的一个项目可以表示很多个原来传统分类地址的路由, 有利于减少路由器之间的路由选择信息的交换, 从而提高网络性能.
最长前缀匹配
使用CIDR时, 路由表中的每个项目由”网络前缀”和”下一跳地址”组成. 在查找路由表时可能会得到不止一个匹配结果, 应当从匹配结果中选择具有最长网络前缀的路由, 因为网络前缀越长, 其地址块就越小, 因而路由就越具体;
CIDR查找路由表的方法: 为了进行更加有效地查找最长前缀匹配, 通常是将无分类编址的路由表存放在一种层次的数据结构中, 然后自上而下地按层次进行查找, 这就是最常用的二叉线索;
网络地址转换NAT
网络地址转换(NAT,Network Address Translation)属接入广域网(WAN)的技术,是一种将私有(保留)地址转化为合法IP地址的转换技术. NAT不仅完美地解决了IP地址不足的问题,而且还能够有效地避免来自网络外部的攻击,隐藏并保护网络内部的计算机。
三个私有IP地址块 | |
A 类 | 10.0.0.0 ~ 10.255.255.255 |
B 类 | 172.16.0.0 ~ 172.31.255.255 |
C 类 | 192.168.0.0 ~ 192.168.255.255 |
上述三个范围内的地址不会在因特网上被分配(因此路由器并不会路由这些IP地址),因此可以不必向ISP 或注册中心申请而在公司或企业内部自由使用。
NAT工作流程
①如图这个 client(终端) 的 gateway (网关)设定为 NAT 主机,所以当要连上 Internet 的时候,该封包就会被送到 NAT 主机,这个时候的封包 Header 之 source IP为 192.168.1.100;
②而透过这个 NAT 主机,它会将 client 的对外联机封包的 source IP ( 192.168.1.100 ) 伪装成 ppp0 ( 假设为拨接情况 )这个接口所具有的公共 IP ,因为是公共 IP 了,所以这个封包就可以连上 Internet 了!同时 NAT 主机并且会记忆这个联机的封包是由哪一个 ( 192.168.1.100 ) client 端传送来的;
③由 Internet 传送回来的封包,当然由 NAT主机来接收了,这个时候, NAT 主机会去查询原本记录的路由信息,并将目标 IP 由 ppp0 上面的公共 IP 改回原来的 192.168.1.100 ;
④最后则由 NAT 主机将该封包传送给原先发送封包的 Client.
ARP协议
ARP协议的用途:解决同一个局域网内主机或路由器的IP地址和MAC地址的映射问题。
如图所示,假设在一个以太网上的 4 台计算机,分别是计算机 A 、 B 、 X 和 Y ,通过TCP/IP 协议进行通信,那么双方的数据链路层必须知道对方的 MAC 地址。每台计算机都要在各自的高速缓存区中存放一张 IP 地址到 MAC 地址的转换表,称 ARP 表。其中存放着最近用到的一系列和它通信的处于同一子网的计算机的 IP 地址和 MAC 地址的映射。在主机初始启动时, ARP 表为空。现在源端计算机 A ( 192.168.3.1 )要和计算机 B(192.168.3.2)通信。在计算机 A 发送信息前, 必须首先得到计算机B的MAC地址的映射关系。 ARP 协议工作过程如下:
(1)主机 A 首先查看自己的高速缓存中的 ARP缓存表,看其中是否有与 192.168.3.2 对应的 ARP 表项。如果找到,则直接利用该 ARP 表项中的 MAC 值把 IP 数据包封装成帧发送给主机B。
(2)如果在 ARP 表中找不到对应的地址项,则创建一个 ARP 请求数据包,并以广播方式发送(把以太帧的目的地址设置为 FF-FF-FF-FF-FF-FF) 。包中有需要查询的目的计算机的 IP 地址(192.168.3.2) , 以及主机 A 自己的 IP 地址和 MAC 地址。
(3)包括计算机 B 在内的属于 192.168.3.0 网络上的所有计算机都收到 A 的 ARP 请求包,然后将计算机 A 的 IP 地址与 MAC 地址的映射关系存入各自的 ARP 表中。
(4)计算机 B 创建一个 ARP 响应包,在包中填入自己的 MAC 地址,以单播方式直接发送给主机 A。
(5) 主机 A 收到响应后, 从包中提取出所需查询的 IP 地址及其对应的 MAC 地址, 添加到自己的 ARP 表中。并根据该 MAC 地址将所需要发送的数据包封装成帧发送出去。
注意:
(1)ARP 表的内容是定期更新的,如果一条 ARP 表项很久没有使用了,则它将被从 ARP 表中删除。
(2)如果所要找的主机和源主机不在同一个局域网上, 那么就要通过ARP找到一个位于本局域网上的某个路由器的硬件地址, 然后把分组发送给这个路由器, 让这个路由器把分组转发给下一个网络, 剩下的工作就由下一个网络来做.
DHCP协议
DHCP动态主机配置协议常用于给主机动态地分配IP地址, 他提供了即插即用联网的机制,这种机制允许一台计算机加入新的网络和获取IP地址而不用手工参与; DHCP是应用层协议, 他是基于UDP的;
DHCP工作原理:
首先,DHCP客户端发送DHCPDISCOVER消息(DHCP发现),这个消息是通过广播方式发送出去的,所有网络中的DHCP服务器都将接收到这个消息。
随后,网络中的DHCP服务器会回应一个DHCPOFFER消息(DHCP提供),由于这个时候客户端还没有网络地址,所以DHCPOFFER也是通过广播的方式发送出去的。需要注意的是,由于网络中可能存在不止一台的DHCP服务器,所以,如果不考虑网络丢包的话,客户端将接收到不止一条的DHCPOFFER消息。那么客户端会选择它接收到的第一条DHCPOFFER作为获取配置的服务器。
然后,DHCP客户端向该服务器发送DHCPREQUEST消息(DHCP请求)。虽然这个时候客户端已经明确知道选择的DHCP服务器的地址所在,但仍将采用广播的方式发送,这样做不仅可以通知选中的服务器向客户端分配IP地址,同时也可以通知其他没有选中的DHCP服务器不需要再响应它的请求。在DHCPREQUEST消息中将包含客户端申请的IP地址。
最后,DHCP服务器将回送DHCPACK(DHCP确认)的响应消息来通知客户端可以使用该IP地址,该确认里面包含了分配的IP地址和该地址的一个稳定期限的租约(默认是8天),并同时更新DHCP数据库。
当租约过了一半时(即4天),客户端将和设置它的TCP/IP配置的DHCP服务器更新租约。当租约过了85.7%时,如果客户端仍然无法与当初的DHCP服务器联系上,他将与其他DHCP服务器通信,如果网络中再没有任何DHCP服务器在运行时,该客户端停止使用该IP地址,并重新发送一个DHCPDISCOVER消息,再一次重复整个过程。
ICMP协议
IP提供的是尽最大努力交付的无连接服务,因此并不能解决网络层中的数据报丢失、重复、延迟或乱序等问题,为了提高IP数据报成功交付的机会, 在网络层使用ICMP(Internet Control Message Protocol:Internet控制报文协议)协议来允许主机或者路由器报告差错和异常情况.
ICMP的特征
a.ICMP就像一个更高层的协议那样使用IP协议(ICMP消息被封装在IP数据报中);然而,ICMP是IP的一个组成部分,并且所有IP模块都必须实现它。
b.ICMP用来报告错误,是一个差错报告机制。它为遇到差错的路由器提供了向最初源站报告差错的办法,源站必须把差错交给一个应用程序或采取其它措施来纠正问题。
c.ICMP报文的种类有两种: ICMP差错报告报文和ICMP询问报文;
ICMP差错报告报文
ICMP差错报告报文类型 | |
终点不可达 | 当路由器检测到数据报无法传递到目的地时,向创建数据报的源主机发出终点不可达报文。这类报文分为:网络不通(如路由器故障),目的主机连不通(没开机),协议不可达、端口不可达等共15种不同的情况,用不同代码表示。 |
源点抑制 | 当路由器/主机收到太多的数据报以致来不及处理时,在丢弃所收数据报的同时,向创建数据报的源主机发送源点抑制报文。 使源点知道应当把数据报的发送速率放慢。 |
时间超过 | 有两种情况需要发送超时报文: 1.路由器把数据报的生存时间减至零时,路由器丢弃数据报,并向源主机发送时间超过报文;2.当终点在预先规定的时间内不能收到一个数据报的全部数据报分片时, 就把已收到的数据报片全部丢弃, 并向源点发送时间超过报文; |
参数问题 | 当路由器/目的主机收到的数据报的首部有的字段的值不正确时, 就丢弃该数据报, 并向源点发送参数问题报文; |
改变路由(重定向) | 当一个源主机创建的数据报发至某路由器,该路由器发现数据报应该选择其他路由时,则向源主机发送改变路由报文。改变路由的报文能指出网络或特定主机的变化,一般发生在一个网络连接多路由器的情况下. |
不应发送ICMP差错报告报文的几种情况:
1)对ICMP差错报告报文不再发送ICMP差错报告报文。
2)对第一个分片的数据报片的所有后续数据报片都不发送ICMP差错报告报文。
3)对具有多播地址的数据报都不发送ICMP差错报告报文。
4)对具有特殊地址(如127.0.0.0或0.0.0.0)的数据报不发送ICMP差错报告报文。
ICMP询问报文
回送请求和回答报文, 时间戳请求和回答报文, 掩码地址请求和回答报文, 路由器询问和通告报文;
常用的ICMP询问报文有两种,即:
1)回送请求和回答: ICMP回送请求报文是由主机或路由器向一个特定的目的主机发出的询问。收到此报文的主机必须给源主机或路由器发送ICMP回送回答报文。这种询问报文用来测试目的站是否可达以及了解其有关状态(Ping实现机制)。
2)时间戳请求和回答: ICMP时间戳请求报文是请某个主机或路由器回答当前的日期和时间。在ICMP时间戳回答报文中有一个32位的字段,其中写入的整数代表从1900年1月1日起到当前时刻一共有多少秒。时间戳请求与回答可用来进行时钟同步和测量时间。
Ping实现原理
Ping(Packet Internet Groper)分组网间探测是ICMP的一个重要应用,用来测试两个主机之间的连通性。Ping使用了ICMP回送请求与回答报文。Ping是应用层直接使用网络层ICMP的一个例子。它没有通过运输层的TCP或UDP。
实现原理为: ping向目的主机发送4个32字节长的ICMP回送请求报文,若目的主机正常工作并且响应了该ICMP回送请求报文,就将发回ICMP回送回答报文。最后可得出的统计结果为目的IP地址,发送的,收到的和丢失的分组数,及往返时间的最小值、最大值和平均值。
ping命令格式为 ping <host-name> #host-name为要测试连通性的主机名/IP地址。
TraceRoute原理
Traceroute(Linux)/tracert(Windows)是用来侦测主机到目的主机之间所经路由情况的重要工具。它的原理如下:
源主机首先给目的主机发送一个TTL=1的UDP数据包,而经过的第一个路由器收到这个数据包以后,就自动把TTL减1,而TTL变为0以后,路由器就把这个包给丢弃了,并同时产生”目的主机不可达”的ICMP差错报告报文给源主机。源主机收到这个数据报以后再发一个TTL=2的UDP数据报给目的主机,然后刺激第二个路由器给源主机发送差错报文。如此往复直到到达目的主机。这样,traceroute就拿到了所有的路由器IP。
RIP协议
路由信息协议RIP是一种分布式的基于距离向量的路由选择协议, 属于内部网关协议(IGP)。RIP协议中的“距离”也称为“跳数”,每经过一个路由器,跳数就加1。协议规定: 同一自治系统(A.S.)中的路由器每30秒会与相邻的路由器交换路由信息,以动态的建立路由表。当传输数据时,RIP将选择一条具有最少路由器的路由。
RIP协议规定:
1) 网络中的每一个路由器都要维护从它自己到其他每一个目的网络的距离记录(因此, 这是一组距离, 称”距离向量”);
2) 距离也称为跳数(Hop Count), 规定从一路由器到直接连接的网络跳数为1, 而每经过一个路由器, 则跳数加1;
3) RIP认为好的路由就是它通过的路由器的数目少, 即优先选择跳数少的路径;
4) RIP允许一条路径最多只能包含15个路由器(即最多允许15跳), 因此距离等于16时表示网络不可达. 可见RIP只适用于小型互联网.
5) RIP默认在任意两个使用RIP协议的路由器之间每30秒广播一次RIP路由更新信息. 以便于自动建立并维护路由表(动态维护).
6) 在RIP中不支持子网掩码的RIP广播, 所以RIP中每个网络的子网掩码必须相同. 但在新的RIP2中, 支持变长子网掩码和CIDR.
RIP 协议特点:
1)仅和相邻路由器交换信息。【注】如果两个路由器之间的通信不需要经过另一个路由器,那么这两个路由器就是相邻的。RIP协议规定,不相邻的路由器不交换信息。
2)路由器交换的信息是当前本路由器所知道的全部信息,即自己的路由表。【注】交换的信息是:“我到本自制系统中所有网路的(最短)距离,以及到每个网络应该经过的下一跳路由器。”
(3)按固定的时间间隔交换路由信息。【注】每隔30秒,路由器根据收到的路由信息更新路由表。当网路拓扑发生变化时,路由器也及时向相邻路由器通告拓扑变化后的路由信息。
距离向量算法
对每一个相邻路由器发送过来的RIP报文,进行以下步骤:
1)对地址为X的相邻路由器发来的RIP报文,先修改此报文中的所有项目:把“下一跳”字段中的地址都改为X,并把所有的"距离"字段的值加1.每个项目都有三个关键数据,即:目的网络N,距离是d,下一跳路由器是X。
2)对修改后的RIP报文中的每一个项目,进行如下步骤:
* 若原来的路由表中没有目的网络N,则把该项目添加到路由表中;
* 否则, 若下一跳路由器地址是X,则把收到的项目替换原路由表中的项(使用最新的路由信息);
* 否则, 若收到的项目中距离d小于路由表中的距离,则进行更新;
3)若3分钟还没有收到相邻路由器的更新路由表,则把此相邻路由器记为不可到达的路由器,即把距离设置为16。
4)返回
RIP路由协议优缺点
优点是配置简单,非常适用于小规模网络。
RIP协议的缺点包括:
1)大量广播。RIP向所有邻居每隔30秒广播一次完整的路由表,将占用宝贵的带宽资源,在较慢的广域网链路上问题更加明显。
2)没有成本概念。RIP没有网络延迟和链路成本的概念。当采用RIP时,路由/转发的决定只是基于跳数, 这样很容易导致无法选择最佳路由。 例如,一条链路拥有较高的带宽,但是跳数较多,从而不能被选择。
3)支持的网络规模有限。由于RIP路由协议最多只支持16个步跳,当超过该跳数时,网络将认为无法到达。因此,RIP只能适用于规模较少的网络。
4)当网络出现故障时, 会出现慢收敛现象(需要较长时间才能将此信息传送到所有路由器), 俗称”坏消息传的慢”, 使更新过程的收敛时间长;
小结:RIP是应用层协议, 它使用UDP传送数据(端口520). RIP协议选择的路径不一定是最短的, 但一定是具有最少路由器的路径.
OSPF协议
OSPF (Open Shortest Path First, 开放最短路径优先)。它是为克服RIP的缺点在1989年开发出来的。OSPF的原理很简单,但实现起来却较复杂。“开放”表明OSPF协议不是受某一家厂商控制,而是公开发表的。“最短路径优先”是因为使用了Dijkstra最短路径算法。
请注意:OSPF只是一个协议的名字,它并不表示其他的路由选择协议不是“最短路径优先”。实际上,所有的在自治系统内部使用的路由选择协议(包括RIP协议)都是要寻找一条最短的路径。
OSPF最主要的特征就是使用分布式的链路状态协议(link state protocol),而不是像RIP那样的距离向量协议。和RIP协议相比,OSPF的四个要点和RIP的都不一样:
(1)OSPF向本自治系统中所有路由器发送信息。这里使用的方法是洪泛法(flooding),这就是路由器通过所有输出端口向所有相邻的路由器发送信息。而每一个相邻路由器又再将此信息发往其所有的相邻路由器(但不再发送给刚刚发来信息的那个路由器)。这样,最终整个区域中所有的路由器都得到了这个信息的一个副本。我们应注意,RIP协议是仅仅向自己相邻的几个路由器发送信息。
(2)OSPF发送的信息就是与本路由器相邻的所有路由器的链路状态,但这只是路由器所知道的部分信息。所谓“链路状态”就是说明本路由器都和哪些路由器相邻,以及该链路的“度量”(metric)。OSPF将这个“度量”表示为费用、距离、时延、带宽等。这些都由网络管理人员来决定,因此较为灵活。有时为了方便就称这个度量为“代价”(注意:对于RIP协议,发送的信息是:“到所有网络的距离和下一跳路由器”)。
(3)OSPF只有当链路状态发生变化时,路由器才向所有路由器用洪泛法发送此信息。而不像RIP那样,不管网络拓扑有无发生变化,路由器之间都要定期交换路由表的信息。
(4)OSPF是网络层协议, 他不使用UDP/TCP而是直接使用IP数据报传送(其IP数据报首部的协议字段为89).且OSPF数据报较短, 不会导致IP数据报分片, 因此更加高效; 而RIP是应用层协议, 他在传输层使用UDP协议.
除了以上区别之外, OSPF还有以下特点:
1) OSPF对不同的链路可根据IP分组的不同服务类型(TOS)而设置成不同的代价. 因此, OSPF对于不同类型的业务可计算出不同的路由, 因此十分灵活.
2) 如果到同一个目的网络有多条相同代价的路径, 那么OSPF可将通信量分配给这几条路径, 这叫做多路径之间的负载均衡.
3) 所有在OSPF路由器之间交换的分组都具有鉴别功能, 因而保证了仅在可信赖的路由器之间交换链路状态信息.
4) OSPF支持可变长度的子网划分和无分类编址CIDR.
5) 每一个链路状态都带上一个32位的序号, 序号越大状态就越新.
OSPF基本工作原理
由于各路由器之间频繁地交换链路状态信息, 因此所有的路由器最终都能建立一个链路状态数据库. 这个数据库实际上就是全网的拓扑结构图, 他在全网范围内是一致的(这称为链路状态数据库的同步). 然后每个路由器就根据这个全网拓扑结构图, 使用Dijkstra最短路径算法计算从自己到各目的网络的最优路径, 以此构造自己的路由表. 在此之后, 当链路状态发生变化时, 每个路由器重新计算到各目的网络的最优路径, 构造新的路由表.
OSPF的链路状态数据库能较快的进行更新, 使各个路由器能及时更新其路由表. OSPF的更新过程收敛得快是其重要的优点.
{注意: 虽然使用Dijkstra算法能够计算出完整的最优路径, 但是路由表不会存储完整路径, 而只存储”下一跳”(只有到了下一跳路由器, 才能知道再下一跳应当怎么走)}
划分区域
为了使OSPF能够用于规模很大的网络, OSPF将一个自治系统再划分为若干个更小的范围, 叫做区域. 每一个区域都有一个32位的区域标示符(用点分十进制表示). 区域也不能太大, 在一个区域内的路由器最好不要超过200个.
划分区域的好处是: 将利用洪泛法交换链路状态信息的范围局限于每一个区域而不是整个的自治系统, 这就减少了整个网络上的通信量. 由于区域内部路由器仅与同区域的路由器交换LSA信息,这样LSA报文数量及链路状态信息库表项都会极大减少,SPF计算速度因此得到提高。
在一个区域内部的路由器只知道本区域的完整网络拓扑, 而不知道其他区域的网络拓扑情况.
这些区域也有层次之分, 处在上层的域叫做主干区域, 负责连通其他下层的区域, 并且还连接其他自治域;
OSPF分组类型与OSPF工作过程
类型 | 用途 |
问候分组 | 用来发现和维持邻站的可达性 |
数据库描述分组 | 向邻站发送自己的链路状态数据库中的所有链路状态项目的摘要信息 |
链路状态请求分组 | 向对方请求发送某些链路状态项目的详细信息 |
链路状态更新分组 | 用洪泛法对全网更新链路状态 |
链路状态确认分组 | 对链路更新分组的确认 |
通常每隔10秒, 每两个相邻路由器就要交换一次问候分组, 以便知道哪些站可达.
(1)在路由器刚开始工作时, OSPF让每一个路由器使用数据库描述分组和相邻路由器交换本数据库中已有的链路状态摘要信息. 然后, 路由器就使用链路状态请求分组向对方请求发送自己所缺少的某些链路状态项目的详细信息. 经过一系列的这种分组交换, 全网同步的链路数据库就建立了.
(2)在网络运行的过程中, 只要一个路由器的链路状态发生变化, 该路由器就要使用链路状态更新分组, 用洪泛法向全网更新链路状态. 其他路由器在更新后, 发送链路状态确认分组对更新进行确认.
(3)为了确保链路状态数据库与全网的状态保持一致, OSPF还规定每隔一段时间(如30分钟), 要刷新一次数据库中的链路状态. 由于一个路由器的链路状态只涉及与相邻路由器的连通状态, 因而与整个互联网的规模并无直接关系. 因此, 当互联网规模很大时, OSPF协议要比RIP好得多, 而且OSPF协议没有”坏消息传的慢”的问题.
BGP协议
BGP(Border Gateway Protocol)是一种不同自治系统的路由器之间交换路由信息的协议, 它的基本功能是在自治系统间自动交换无环路的路由信息, 他是一种外部网关协议(EGP), 边界网关协议常常应用于互联网的网关之间. 路由表包含已知路由器的列表, 路由器能够到达的地址以及到达每个路由器的跳数.
由于:
1) 因特网的规模太大, 使得自治系统之间路由选择非常困难;
2) 对于自治系统之间的路由选择, 要寻找最佳路由是很不现实的;
3) 自治系统之间的路由选择必须考虑有关策略;
因此, 边界网关协议BGP只能是力求寻找一条能够到达目的网络且比较好的路由(不能兜圈子), 而非要找到一条最佳路由.
BGP采用的是”路径向量选择协议”, 他与距离向量协议和链路状态协议都有很大的区别. BGP是应用层协议, 他是基于TCP的;
BGP协议工作原理
每一个自治系统管理员要选择至少一个路由器(可以有多个)作为该自治系统的”BGP发言人”. 一个BGP发言人与其他自治系统中的BGP发言人要交换路由信息, 就要首先建立TCP连接, 然后在此连接上交换BGP报文以建立BGP会话, 再利用BGP会话交换路由信息. 当所有BGP发言人都互相交换网络可达性信息之后, 各BGP发言人就可找出到达各个自治系统的比较好的路由.
每个BGP发言人除了必须运行BGP协议外, 还必须运行该AS所使用的内部网关协议(如OSPF,RIP等), BGP所交换的网络可达性信息就是要到达某个网络(用网络前缀表示)所要经历的一系列AS;
BGP协议特点:
1) BGP协议交换路由信息的结点数量级是自治系统的数量级, 这要比这些自治系统中的网络数少得多;
2) 每一个自治系统中BGP发言人(或边界路由器)的数目是很少的. 这样就使得自治系统之间的路由选择不致过分复杂;
3) BGP支持CIDR, 因此BGP的路由表也就应当包括目的网络前缀, 下一跳路由器, 以及到达该目的网络所要经过的各个自治系统序列;
4) 在BGP刚运行时, BGP的邻站是交换整个的BGP路由表, 但以后只需要在发生变化时更新有变化的部分. 这样做对节省网络带宽和减少路由器的处理开销方面都有好处;
BGP-4使用的四种报文
打开(open)报文 | 用来与相邻的另一个BGP发言人建立关系 |
更新(update)报文 | 用来发送某一路由的信息, 以及列出要撤销的多条路由. |
保活(keep-alive)报文 | 用来确认打开报文和周期性地证实邻站关系 |
通知(notification)报文 | 用来发送检测到的差错 |
IP组播与IGMP协议
使用组播的缘由是: 有的应用程序要把一个分组发送给多个目的主机. 不是让源主机给每一个目的主机都发送一个单独的分组, 而是让源主机把单个分组发送给一个组播地址, 该组播地址标识一组地址. 网络把这个分组给该组中的每一个主机都投递一份拷贝(单播与组播的比较示意图如上图所示). 主机可以选择加入/离开一个组, 从而一个主机可以同时属于多个组; 主机使用一个称作IGMP(因特网组管理协议)的协议加入组播组.
需要注意:
(1)主机组播时仅发送一份数据, 只有数据在传送路径出现分岔时才将分组复制后继续转发. 这样对发送者而言, 数据只需发送一次就可以发送到所有接收者, 大大减轻了网络的负载和发送者的负担.
(2)组播需要路由器的支持才能实现, 能够运行组播协议的路由器称为组播路由器.
IP组播地址
IP组播使用D类地址格式. D类地址的前四位是1110, 因此D类地址范围为224.0.0.0~239.255.255.255. 每一个D类IP地址标志一个组播组;
组播数据报和一般IP数据报的区别在于它使用D类IP地址仅作为目的地址, 并且首部中协议字段值为2, 表明使用IGMP协议. 需要注意的是:
1)组播数据报也是”尽最大努力交付”, 不提供可靠交付(组播一定是仅应用于UDP);
2)组播地址只能用于目的地址, 而不能用于源地址;
3)组播数据报不产生ICMP差错报文. 因此, 若在ping命令后面键入组播地址, 则永远不会收到响应;
4)并非所有的D类地址都可以作为组播地址;
IP组播地址与MAC地址映射
IGMP协议
IGMP协议用来在IP主机和与其直接相邻的组播路由器之间建立、维护组播组成员关系。 组播路由器不需要保存所有主机的成员关系,它只是通过IGMP协议了解每个接口连接的网段上是否存在某个组播组的组成员。而主机只需要保存自己加入了哪些组播组。
简而言之,IGMP协议是让连接在本地局域网上的组播路由器知道本局域网上是否有主机上的某个进程参加或退出了某个组播组。
IGMP应视作TCP/IP协议的一部分, 其工作可以分为两个阶段:
1) 当某个主机加入新的组播组时, 该主机应向组播组的组播地址发送一个IGMP报文, 声明自己要成为该组的成员. 本地组播路由器收到ICMP报文后, 将组成员关系转发给因特网上其他的组播路由器.
2) 因为组成员的关系是动态的, 本地组播路由器要周期性地探询本地局域网上的路由器, 以便知道这些主机是否还继续是组的成员. 只要对某个组有一个主机响应, 那么组播路由器就认为这个组是活跃的. 但一个组在经过几次探询之后仍然没有一个主机响应, 则不再将该组的成员关系转发给其他的组播路由器.
组播路由选择实际上就是要找出以源主机为根节点的组播转发树, 其中每一个分组在每条链路上只传送一次(即在组播转发树上的路由器不会收到重复的组播数据报). 对不同的多播组对应于不同的多播转发树; 同一个多播组, 对不同的源点也会有不同的多播转发树.
[附]组播/广播/单播的不同
广播是指在IP子网内广播数据包,所有在子网内部的主机都将收到这些数据包。广播意味着网络向子网每一个主机都投递一份数据包,不论这些主机是否乐于接收该数据包。所以广播的使用范围非常小,只在本地子网内有效,通过路由器和网络设备控制广播传输。
广播地址是专门用于同时向网络中所有工作站进行发送的一个地址。在使用TCP/IP 协议的网络中,主机标识段host ID 为全1 的IP 地址为广播地址,广播的分组传送给host ID段所涉及的所有计算机。如,对于10.1.1.0 (255.255.255.0 )网段,其广播地址为10.1.1.255,当发出一个目的地址为10.1.1.255 的分组时,它将被分发给该网段上的所有计算机。
组播协议与现在广泛使用的单播协议的不同之处在于,一个主机用单播协议向n个主机发送相同的数据时,发送主机需要分别向n个主机发送,共发送n次。一个主机用组播协议向n个主机发送相同的数据时,只要发送1次,其数据由网络中的路由器和交换机逐级进行复制并发送给各个接收方,这样既节省服务器资源也节省网络主干的带宽资源。
路由表的内容
标准的路由表最少应具有四个项目: 目的网络IP地址, 子网掩码, 下一跳IP地址和接口; 而Linux系统中的路由表包含有如图所示内容:
Destination | 目标网络或主机 |
Gateway | 网关地址, *代表是目标和本机在同一个网络, 不需要路由 |
Genmask | 网络掩码 |
Flags | 路由项标志, 常见的标志有如下5种: U: 该路由项是活动的 H: 该路由项的目标是一台主机 G: 该路由项的目标是网关 D: 该路由项是由重定向生成的 M: 该路由项被重定向修改过 |
Metric | 路由距离, 即到达指定网络所需的中转数 |
Ref | 该路由项被引用的次数(Linux未使用) |
Use | 该路由项被使用的次数 |
Iface | 该路由项对应的输出网卡接口 |
IPv6简介
IPv6数据报格式
IPv6数据报的基本首部长度变为固定的40字节,首部只有8个字段, 称为基本首部, 用扩展首部取代了IPv4首部中的可选项, 将不必要的功能取消了, 便于中间节点高效率对其进行处理。
IPv6基本首部
IPv6数据报的基本首部是40字节的固定首部,其携带的信息为数据报传输途中经过的节点都必须处理的信息。
IPv6首部字段含义 | |
版本(version) | 4位 |
通信类型(traffic class) | 8位, 用来区分不同的IPv6数据报的类别或优先级 |
流标签(flow label) | 20位, 所谓流就是因特网上从特定源到特定目的的一系列数据报。而在这个“流”所经过的路径上的路由器都保证指定的服务质量(QoS)。所有属于同一个流的数据报都有相同的流标识 |
有效载荷长度(payload length)
| 16 位, 基本首部以外的字节数,包括扩展首部和数据部分 |
下一首部(头)(next header) | 8位, 定义了紧跟在基本首部后面的扩展首部的数字标识号或数据部分的协议类型。 若没有扩展首部,相当于IPv4中的协议字段。 若有扩展首部,用来说明紧跟在基本首部后的第一个扩展首部的数字标识号,即是扩展首部的类型。 每个扩展首部也包含下一首部字段,下一首部的数字标识号在RFC 1700中定义。 |
跳数极限/跃点限制(hop limit) | 8位。其作用类似于IPv4的TTL字段 |
源/目的地址(source/destination address) | 各128位, 标识发送/接收数据报节点的IPv6地址 |
IPv6数据报格式的主要变化
(1)取消首部的校验和字段。提高数据报的传输效率。
(2)基本首部增加了流标识和传输类别字段,以加强对多媒体实时数据传送的支持。
(3)增加了鉴别扩展首部(Authentication Header,AH)和加密安全载荷扩展首部(Encapsulating Security Payload header,ESP),以增强安全性。
(4)所有的扩展首部和数据合起来叫数据报的有效载荷/净载荷;
IPv6地址表示方法
1、用十六进制表示,4位一组,中间用“:”隔开,如:FE08:….
2、零压缩, 若以零开头可以省略,全零的组可用“::”表示,如: 1:2::ACDR:….
3、地址前缀长度用“/xx”来表示,如: 1::1/64
IPv6主要特点
简化的报头和灵活的扩展
层次化的地址结构
即插即用的连网方式
网络层的认证与加密
服务质量的满足
对移动通讯更好的支持
移动IP的基本通信流程
(1)本地代理和外地代理不停地向网上发送代理广告消息,以声明自己的存在。
(2)移动主机收到这些消息,确定自己是在本地网还是在外地网。
(3)如果移动主机发现自己仍在本地网,即收到的是本地代理发来的消息,则不启动移动功能。如果是从外地网络重新返回的,则向本地代理发出取消注册的消息,声明自己回到了本地网。
(4)当移动主机检测到它移动到外地网时,则获得接管地址。
(5)然后移动主机向本地代理登记,表明自己已离开本地网,把所获得的接管地址通知本地代理。
(6)登记完毕后,所有发给移动主机的数据包被本地代理截获,经本地代理封装后,通过隧道发到外地网络的外地代理或移动主机自身。第一种情况下,外地代理再把数据包转发给移动主机。此时,数据包在不同子网间传送成功。
(7)移动主机发送数据到一般的IP主机时,按正常的IP寻址方法发送,不必通过本地代理。