计算机网络是指将地理位置不同、具有独立功能的多个计算机终端通过通信线路和网络设备连接起来,在网络软件的管理和协调下,实现资源共享和信息传递的系统。
计算机网络 = 网络结点 + 通信线路
网络结点 = 交换结点 + 访问结点
资源子网 = 访问结点的集合
通信子网 = 交换结点 + 通信线路
因特网是通过网络互联技术将现有的异构网络互联起来所构成的一个统一的一致性网络,是世界上最大的互联网络。
上层和下层之间的关系:
下层为上层提供服务;
上层无需关注下层操作的细节。
协议(Protocol):通信双方在进行数据交换时共同遵守的一些规则、约定与标准
网络协议三要素:
语法:规定了信息的结构和格式;
语义:表明信息要表达的内容;
同步规则:涉及双方的交互关系和事件顺序。
实体(Entity):某层中的特定协议的执行体
一层中通常都会有多个实体存在。
通信双方对等层中完成相同协议的功能的实体称为对等实体
服务(Service):实体向上层提供的各种功能
服务访问点(Service Access Point,SAP):相邻层间的服务接口,实现层与层之间的实体通信。
服务数据单元(Service Data Unit,SDU):从上层实体得到的报文
协议数据单元(Protocol Data Unit,PDU):协议通信时传递的数据单元
分层的网络体系结构:协议是水平的,服务是垂直的。
层次结构
协议族:相互协调的一系列工作协议的集合
TCP/IP体系结构中,每一层的功能由一个或多个协议实现。
多路复用是指多个上层协议复用同一种下层协议报文。
多路分解是指从底层协议报文解封装数据,交由相应的上层协议来处理。
实施TCP/IP协议的互联网需要用到四个级别的地址:
TCP/IP协议的实现
在IP层识别每一个连接到因特网设备的标识符称为IP地址,IPv4地址是一个32位的地址,它唯一地且全球地定义了一台主机或路由器与因特网之间的一个连接。
记法:
点分十进制记法
例:117.149.29.234
在点分十进制记法中不应当有以0开头的数。
IPv4地址不能超过4个字节。
每个字节必须小于或等于255。
二进制记法和点分十进制记法混合使用是不允许的。
在分类编址中,IP地址空间分为5类
对于A、B、C类地址来说,IP地址都可划分为网络号(net-id)和主机号(host-id)两个部分。这两个部分的长度随地址类别的不同而变化。
D类和E类地址不划分网络号和主机号。
一个网络的首地址被称为网络地址,它不会指派给任何主机,而是用来定义这个网络。
一个网络的末地址被用作该网络的广播地址。
分类地址中的网络掩码是一个与IPv4地址表示方法相同的32位二进制数,网络号部分用1表示,主机号部分用0表示。
一个网络没有子网划分时,使用的是网络掩码。而当我们将一个网络划分为若干个子网后,就要为每个子网建立一个子网掩码。
子网掩码网络号和子网号部分都用1表示,主机号部分用0表示。子网掩码指定了子网号和主机号的分界点。
把若干个网络合并成为一个更大的地址段。
构造超网的条件
(1)被合并网络数必须是2的幂;
增加的主机号位数 = log2被合并网络数
(2)被合并的地址段在地址空间中必须是连续的;
(3)超网地址的第3个字节必须能被被合并网络数整除。
超网通过超网掩码来指定超网号和主机号的分界点。
和子网的划分类似,超网掩码超网号部分用1表示,主机号部分用0表示。
在无分类编址中,整个地址空间被划分为许多不同大小的地址块。唯一的限制是一个地址块中的地址数必须是2的幂。一个机构可以分配一个地址块。
将一个地址划分为前缀和后缀两部分来提供两级编址。作用分别与网络号和主机号一致。
前缀长度可以为0~32之间的任意整数。
全0地址:地址块0.0.0.0/32仅含有一个地址,它被保留用于某主机需要发送一个IPv4分组,但不知道自己地址的情况。
全1地址:受限广播地址:地址块255.255.255.255/32仅含有一个地址,它被保留作为当前网络的受限广播地址,路由器会把具有这种类型地址的分组阻挡住,广播只局限在本地网络。
环回地址:地址块127.0.0.0/8用于网络软件测试以及本机进程之间通信。数据不会被发送到网络上,而是在数据离开网络层时将其回送给本机的有关进程。环回地址在IPv4分组中只能用作目的地址。
私有地址:用于隔绝其他网络的情况下,或者用于具有网络地址转换(NAT)技术的连接。
组播地址:地址块224.0.0.0/4为组播通信保留。每个地址对应一个组,发往某一组地址的数据将被该组中的所有成员接收。
自动专用IP寻址:Windows系统专用的IP地址块:自动专用IP寻址(APIPA)地址(169.254.0.0/16)。
用于支持DHCP故障转移处理机制。当设置为DHCP客户端的Windows启动时,如果DHCP服务器不可用,DHCP客户机会自己自动配置IP地址和子网掩码。
网络地址:一个地址块的首地址(即后缀全部为0)定义为网络地址。指的就是网络本身。
直接广播地址:一个地址块的末地址(即后缀全部为1)可用作直接广播地址,路由器会用这个地址把一个分组发送给某个特定网络上的所有主机。这个地址在IPv4分组中只能被用作目的地址。
网络寻址规则:
(1)网络地址必须唯一;
(2)网络地址不能以127开头;
(3)网络地址的第一个字节不能为240~255;
(4)网络地址的第一个字节不能为0。
主机寻址规则:
(1)主机号在同一网络中必须是唯一的;
(2)主机号的各个位不能都为1;
(3)主机号的各个位不能都为0。
把一个分组交付到下一跳主机或路由器需要用到两级地址:逻辑地址和物理地址。需要把逻辑地址映射为相应的物理地址。
静态映射:人工创建维护一张表,把逻辑地址与物理地址关联起来。这个表存储在网络中的每一台机器上。
动态映射:利用网络通信协议直接从其他主机上获得映射信息。动态映射的协议有两个:地址解析协议(Address Resolution Protocol,ARP)和反向地址解析协议(Reverse Address Resolution Protocol,RARP)。ARP把逻辑地址映射为物理地址,RARP把物理地址映射为逻辑地址。
ARP接受来自IP协议的逻辑地址,将其映射为相应的物理地址,然后再把这个物理地址递交给数据链路层。
当主机或路由器需要找出这个网络上的另一个主机或路由器的物理地址时,它就可以以广播形式发送一个ARP查询分组。这个分组包括了发送方的物理地址和IP地址以及接收方的IP地址。
网络上的每一台主机或路由器都会接收并处理这个ARP查询分组,但只有期待的接收方才能认出是自己的IP地址,并返回一个ARP响应分组。这个响应分组包含有接收方的IP地址和物理地址。这个分组利用收到的查询分组中的物理地址以单播方式直接发送给查询者。
硬件类型:用来定义物理网络类型。以太网是类型1。
协议类型:用来定义使用的上层协议。对IPv4协议,这个字段的值是0x0800。
硬件长度:用来定义物理地址的长度,以字节为单位。对于以太网这个值是6。
协议长度:用来定义逻辑地址的长度,以字节为单位。对于IPv4协议这个值是4。
操作:用来定义分组的类型。已定义的分组类型有两种:ARP请求是1、ARP响应是2。
发送方硬件地址:这是一个可变长度字段,用来定义发送方的物理地址。对于以太网这个字段的长度是6字节。
发送方协议地址:这是一个可变长度字段,用来定义发送方的逻辑地址。对于IPv4协议,这个字段的长度是4字节。
目标硬件地址:这是一个可变长度字段,用来定义目标的物理地址。对于ARP请求报文,这个字段是全0,因为发送方并不知道目标的物理地址。
目标协议地址:这是一个可变长度字段,用来定义目标的逻辑地址。
ARP处理过程:
(1)发送方知道目标的IP地址。
(2)IP请求ARP创建一个ARP请求报文,填入发送方的物理地址、发送方的IP地址以及目标IP地址。对于目标物理地址字段则全部填入0。
(3)这个报文被递交给数据链路层。在这一层它被封装成帧,并以发送方的物理地址作为源地址,以物理广播地址作为目的地址。
(4)每一个主机或路由器都会收到这个帧。所有站点都会取走这个报文并把它交给ARP。除了目标机器之外,其他所有机器都会丢弃这个分组。目标机器认识这个IP地址。
(5)目标机器用ARP响应报文进行回答。响应报文中包含了它的物理地址。这个报文使用的是单播方式。
(6)发送方收到这个响应报文。现在发送方就知道目标机器的物理地址了。
(7)携带有给目标机器数据的IP数据报现在可以封装成帧,并用单播方式发送到终点。
ARP高速缓存:
引入的原因:源主机广播ARP请求数据报,使得网络上所有主机都必须接收和处理广播数据报,导致网络工作效率低下。
原理:将经常使用的目的主机的IP地址和物理地址记录在本机的内存上,减少广播ARP请求帧的次数,以达到提高网络工作效率。
由于网络上的设备资源是动态变化的,因此高速缓存中的数据也需要动态刷新。增加一个超时计时器。
实现从物理地址到逻辑地址的映射。
当发送一个IP分组时,主机或路由器需要知道它自己的IP地址,IP地址通常存储在硬盘上的配置文件中。但是,对于无盘计算机,只能从ROM引导。ROM中只有固化的最少的引导信息,并不包括IP地址。在这种情况下,为使无盘计算机也能使用TCP/IP进行通信,就必须首先获得IP地址。RARP主要适用于这样的情况。
在物理网络上有一个RARP服务器用于IP地址分发,需要获得IP地址的主机称为客户。RARP采用的是客户-服务器工作模式。
需要IP地址的主机在网络上广播RARP请求,RARP服务器接收RARP请求后,单播发送RARP响应,为该请求客户返回一个IP地址。
分组格式:
除了操作字段是3(RARP请求)或者是4(RARP响应)之外,其他字段与ARP分组格式完全相同。
网络层:通过选择路径,将传输层的Data通过网络层的接力(中继)方式,传送到目的地。
网络层协议:拓扑、路径、中继的多方交流和协调。
IP协议的特点:
IP是一种点到点协议,要求源和目的是同一物理网络中的对等实体;
IP不保证传输的可靠性,不对数据进行差错校验和跟踪;
IP提供无连接的数据报服务,各个数据报独立传输,路径和到达时间不确定。
网络层的分组称为数据报(datagram)。网络层提供的服务是通过封装数据报来实现的。
IP数据报分为首部区和数据区两部分,其中:
数据区包括高层协议需要传输的数据,这些数据对于IP模块是不可见的;
首部区存放着为了正确传输高层数据而添加的各种控制信息。
在传输过程中,IP模块对上层协议传送过来的数据加上IP首部进行封装后再传递到数据链路层,而对于从数据链路层接收到的数据报,IP模块则把IP首部剥除并依据其中控制信息进行处理,然后再把数据传输到上一层。
首部格式:
版本(VER):表示数据报的IP协议的版本号。IPv4的版本号为4,IPv6的版本号为6。
首部长度(HLEN):定义了数据报首部的总长度,以4字节的字为单位计算。
服务类型:用于区分不同的服务种类。服务种类可以是可靠性和速度的各种组合。
总长度:定义了以字节为单位的数据报总长度(首部加上数据)。因为总长度字段是16位,所以IP数据报长度限制在65535字节。
标识、标志、片偏移:这些字段用于IP数据报分片。
生存时间:用来控制数据报所经过的最大跳数。当源主机发送数据报时,它在这个字段存入一个数值。这个数值大约是任意两台主机之间的路由器数的两倍。每一个处理此数据报的路由器要把这个数值递减1。若在减1之后该字段的值变成了0,路由器就丢弃这个数据报。
协议:该字段定义了使用此IP层服务的高层协议。(多路复用和分解)例:ICMP=1;IGMP=2;TCP=6;UDP=17;OSPF=89
首部校验和:采用的差错检测方法,防止分组在传输期间出现的损坏。
源IP地址:该字段定义了源点的IP地址。
目的IP地址:该字段定义了终点的IP地址。
在IP数据报从源主机发送到目的主机的过程中,这两个字段始终保持不变。
选项:IP选项是IP数据报首部中的变长部分,用于网络控制和测试目的。
每个数据链路层协议都有自己的帧格式。在这个格式中有一个属性是“最大传输单元”(MTU),当数据报被封装成帧时,数据报的总长度必须小于这个最大长度。对于不同的物理网络协议,MTU的值是不同的。
IP数据报的最大长度是65535字节。在封装成帧之前,可能需要分割数据报。该过程称为分片。
数据报可以被源主机或途中的任何路由器分片,但数据报的重组只能在目的主机上进行。
标识:该16位字段唯一标志了从源主机发出的一个数据报。在数据报分片时,标识字段的值要复制到所有的分片中。
标志:这是一个3位的字段,其中:
第一位保留(未用)。
第二位称为“不分片”位。如果这个值为1,机器就不能对该数据报进行分片;如果为0,则可在必要时对这个数据报进行分片。
第三位是“片未完”位。若这个值是1,则表示这个数据报不是最后的分片;若这个值是0,则表示这是最后的或唯一的分片。
片偏移:该13位字段表示的是分片在整个数据报中的相对位置。这是数据在原数据报中的偏移量,以8字节为度量单位。
发送端按以下步骤产生校验和:
把分组划分为k段,每段的长度都是n位。
用二进制算术运算把所有这些段相加。
把最终结果取反码就得出校验和。
接收端计算校验和:
把收到的分组划分为k段,
把所有这些段相加,
然后把得到的和取反码。
若最后结果为0,则接受这个分组,否则就拒绝这个分组。
IP分组的校验和仅覆盖首部,而不管数据。原因:
将数据封装在IP数据报中的所有高层协议,都有一个涉及整个分组的校验和字段。因此,IP数据报的校验和就不必再检验所封装的数据部分。
每经过一个路由器,IP数据报的首部就要有所变化,但数据部分保持不变。因此校验和只对发生变化的部分进行检验。若检验包含数据部分,需要花费更多的处理时间。
一个IP数据报选项由三个字段组成:1个字节的类型字段、1个字节的长度字段和可变长度的值字段。这种格式经常被称为TLV(Type-Length-Value)。
类型字段的长度为8位,包括了三个子字段
长度:该字段定义选项的总长度
值:该字段是不定长的,包含的是某些特定选项所需的数据。
IP选项分为单字节选项和多字节选项两种。单字节选项不需要长度字段和值字段,多字节选项需要长度字段和值字段。
无操作选项:是一个单字节选项,用作选项和选项之间的填充符。
选项结束选项:选项结束选项是一个单字节选项(00000000),用于选项字段结束时的填充。
记录路由选项:记录路由选项用来记录处理数据报的各路由器的IP地址。
严格源路由选项:该选项被源点用来预先指定数据报在因特网中传输时的路由。
宽松源路由选项:与严格源路由选项相似,但条件要放宽一些。表中列出的路由器必须通过,但数据报还可以访问其他路由器。
时间戳选项:该选项用来记录路由器处理IP数据报的时间。时间是指从午夜开始以毫秒计的全球通用时间。
IPv6地址的长度是128位(16字节),是IPv4地址长度的4倍;地址数量是2128,是IPv4的296倍。
记法:
十六进制冒号记法:128位用32个十六进制数字表示,每4个数字用一个冒号分隔开,划分为8个区。
例:FEDC:BA98:7654:3210:FEDC:BA98:7654:3210
可以对地址进行简写:一个区开头的几个0可以忽略。
例:0074 -> 74,000F -> F,0000 -> 0。
如果连续几个区都只包含了0,那么可以用一个双冒号取代这些0,通常称为零压缩。
例:FDEC:0:0:0:0:BBFF:0:FFFF -> FDEC::BBFF:0:FFFF
注意:若有两个零段,只能对其中之一进行压缩。
混合表示法:即十六进制冒号记法加上点分十进制记法。这种表示方法适用于将一个IPv4地址嵌入到一个IPv6地址中的过渡时期,对地址最左边的6个区使用十六进制冒号记法,而最靠右的两个区则以4个字节的点分十进制记法取代。
CIDR记法:和IPv4一样,IPv6采用了分级的编址,允许无分类编址和CIDR记法。
例:FDEC::BBFF:0:FFFF/60
三种地址类型:
单播地址:定义了一个接口(计算机或路由器)。发送到单播地址的分组必须交付到这个指定的接口。
任播地址:定义了一组共享一个地址的接口。发送到任播地址的分组会被交付给这组接口中按路由协议量度最近的一个接口。
组播地址:定义了一组接口。与任播的区别是,在组播通信中,分组被送往组播地址指定的所有接口。
三级结构:
全球单播地址块2000::/3是因特网上主机与主机之间的单播通信所使用的地址块。
全球路由选择前缀:用来为分组选择路由以通过因特网到达某个组织的站点,最前面3位是固定的(001)。
子网ID:用来定义组织中的一个子网。这意味着一个组织可以拥有高达216=65536个子网。
接口ID:类似于IPv4的主机号。
IPv6编址中,只要是长度小于64位的物理地址,都可以被嵌入到接口ID中,作为该接口ID的一部分或全部,从而消除了地址映射过程。
例:将一个48位的以太网地址映射为64位的接口地址,需要把全球/本地控制位(第七位)变为1,还要另外插入16位(第三字节后插入)。这16位被定义为0xFFFE。
IPv6的分组格式:
基本首部
VER:定义了IP的版本号。对于IPv6,其值为6。
通信量类别:用于区分具有不同交付需求的各种有效载荷。
流标记:为需要作特殊处理的实时报文流进行标识。
有效载荷长度:定义了数据报除基本首部外的总长度。
下一个首部:定义了在数据报中紧跟在基本首部后面的首部,可能是IP自己要使用的一个可选的扩展首部,也可能是被封装的分组的首部,如TCP、UDP。
跳数限制:和IPv4的生存时间字段作用相同。
源地址:标志了数据报的源点。
目的地址:通常标志数据报的最后终点。但是,若使用了源路由选择,这个字段包含的就是下一个路由器的地址。
从IPv4过渡到IPv6
双协议栈:在向终点发送一个分组时,源主机要向DNS查询。若DNS返回IPv4地址,源主机就发送IPv4分组;若DNS返回IPv6地址,源主机就发送IPv6分组。
隧道技术:当两个使用了IPv6的计算机要互相通信,但分组又需要通过使用IPv4的区域时,就要使用隧道技术。当进入IPv4区域时,IPv6分组要封装成IPv4分组;而当分组离开这个区域时,再拆掉这个封装。
首部转换:当使用IPv6的计算机要把报文发送给一个仍然使用IPv4的计算机时,需要进行首部转换。
移动IP概述
移动IP技术能够保证计算机在移动过程中,不改变现有网络IP地址、不中断正在进行的网络通信及不中断正在执行的网络应用,实现对网络的不间断访问。
移动IP技术为移动主机配置两个地址:归属地址(即主机的原始地址)和转交地址(即主机的新地址)。
为了让地址的改变对因特网的其余部分是透明的,需要一个归属代理和一个外地代理。
归属代理通常是连在移动主机的归属网络上的路由器。当远程主机向移动主机发送分组时,归属代理就充当该移动主机。先由归属代理接收分组,然后再把分组发送给外地代理。
外地代理通常是连接在外地网络上的路由器,外地代理接收归属代理发送过来的分组,并把这些分组交付给移动主机。
移动主机需经过三个阶段:代理发现、登记和数据传输。
从远程主机到归属代理:远程主机要向移动主机发送分组时,它使用自己的地址作为源地址,移动主机的归属地址作为目的地址。但是,这个分组被归属代理截获。
从归属代理到外地代理:归属代理收到分组后,使用隧道技术把分组发送给外地代理。归属代理把整个IP分组封装在另一个IP分组中,用自己的地址作为源地址,外地代理的地址作为目的地址。
从外地代理到移动主机:外地代理收到分组后,从中取出原来的分组。由于原来分组的目的地址是移动主机的归属地址,外地代理需要查询登记表,找到移动主机的转交地址。然后,发送这个分组到转交地址。
从移动主机到远程主机:当移动主机要发送分组给远程主机时,它就像在正常情况下一样发送,用自己的归属地址作为源地址,远程主机的地址作为目的地址。
因特网控制报文协议(ICMP)是IP协议的补充,用于IP层的差错报告、控制以及路由器或主机信息的获取。
ICMP报文的封装:
4.2 ICMP报文
ICMP报文由一个8字节的首部和可变长度的数据部分组成:
类型字段定义了ICMP报文的类型。ICMP报文可划分为三大类:差错报告报文、控制报文和查询报文。
代码字段提供了关于报文类型的进一步信息。
校验和字段提供整个报文(首部+数据)的差错校验。
首部其他部分对于每一种类型的报文都是特有的。
数据部分提供了ICMP差错和状态报告信息,内容因报文类型而异。
由发现错误的设备向数据报的源点报告差错信息。
ICMP差错报告具有以下特点:
只报告差错,但不负责纠正差错,纠错工作留给高层协议去处理。
发现出错的设备只向信源报告差错。
差错报告作为一般数据传输,不享受特别优先权和可靠性。
产生ICMP差错报告的同时,会丢弃出错的IP数据报。
数据部分是原始数据报的IP首部再加上数据报数据的前8个字节。
信宿不可达
主机无法交付一个数据报时,该数据报被丢弃,然后由路由器或主机向发出该数据报的源主机返回一个信宿不可达报文。
超时
一旦路由器将数据报的生存时间字段值递减后变成了0,就丢弃该数据报,并向源点发送超时报文。(代码:0)
如果组成一个IP数据报的所有分片未能在某一时限内全部到达目的主机,目的主机就将已收到的所有分片丢弃,并向源点发送超时报文。(代码:1)
参数问题
如果路由器或目的主机发现数据报首部中出现二义性,或在数据报的某个字段中缺少某个值,就会丢弃这个数据报,并向源点返回一个参数问题报文。
ICMP控制报文包括源抑制报文和改变路由报文,分别用于拥塞控制和路由控制。
源抑制
当路由器或主机因拥塞而丢弃数据报时,它就向源主机发送一个源点抑制报文。
对每一个因拥塞而被丢弃的数据报,都应当发送一个源抑制报文。
改变路由
源主机有可能将数据报发送给一个错误的路由器(或非最优路由器)。此时,收到这个数据报的路由器会把它转发给正确的路由器,同时向信源机发送一个改变路由报文。当信源机收到该报文后,将根据报文信息更新信源机中路由表的路由信息
除差错报告和控制外,ICMP还能对某些网络问题进行诊断,这是通过查询报文来完成的。在使用查询报文时,先由一个结点发送一个报文,再由目的结点以指明的格式进行回答。
回送请求与应答
一个主机或路由器可以向另一个主机或路由器发送回送请求报文。收到回送请求报文的主机或路由器产生回送应答报文,并将其返回给发送方。
回送请求和回送应答报文可用来确定两台机器在IP级能否彼此通信,因为ICMP报文是被封装成IP数据报传送的。
类型8:回送请求
类型0:回送应答
时间戳请求与应答
两个机器(主机或路由器)可使用时间戳请求和时间戳应答报文来确定IP数据报在这两个机器之间来回所需的往返时间。
时间戳请求和时间戳应答报文也可用于同步两个机器的时钟。
类型13:时间戳请求
类型14:时间戳应答
源点生成时间戳请求报文:
源点在报文离开前把它的时钟所显示的通用时间填入初始时间戳字段中,其他两个时间戳字段都填入0。
终点生成时间戳应答报文:
终点把请求报文中的原始时间戳值复制到应答报文的相同字段;
在接收时间戳字段中填入收到该请求时时钟所显示的通用时间;
在应答报文离开前在发送时间戳字段中填入其时钟所显示的通用时间。
数据报传递时间计算公式:
发送时间 = 接收时间戳 – 初始时间戳
接收时间 = 分组返回的时间戳 – 发送时间戳
往返时间 = 发送时间 + 接收时间
若给出实际的单向时间,则时间戳请求和时间戳应答报文可用来对两个机器的时钟进行同步。
时间差 = 接收时间戳 – (原始时间戳 + 单向经历时间)
与IPv4一样
发送方计算校验和:
把校验和字段置0;
计算所有16位字之和;
把得到的和求反码,得到校验和;
把校验和存储在校验和字段中。
接收方检测校验和:
计算所有16位字之和;
把得到的和求反码;
若上一步得到的结果是全0,则接收这个报文,否则拒绝
交付(delivery)是指在网络层的控制下,底层各网络对分组的处理过程。
分组交付到终点的方式分为两种:
直接交付:源点和终点都在同一物理网络,分组从源点直接传递到终点;或是分组从最后一个路由器传递到目的主机。
间接交付:源点和终点分别在不同网络中,分组需要经过一系列路由器传递到终点。
从源点到终点的交付是由一个直接交付和零到多个间接交付组成,并且最后一次交付总是直接交付。
IP路由选择
在分组交付的过程中,路由器接收来自一个网络的分组,并把该分组转发到另一个网络。一个路由器通常会和多个网络相连。路径选择的实质是在不同路由器之间选择,因此,路径选择又称为IP路由选择
路由选择在主机和路由器上完成,TCP/IP采用表驱动的方式进行路由选择。在每台主机和路由器中都有一个路由表。
路由表分为两类。
静态路由表是人工设置表项的路由表。
动态路由表在互联网中某处有变化时就自动进行更新。
路由选择协议是一些规则和过程的集合,使得在互联网中的各个路由器能够彼此互相通知变化信息。
路由选择协议可以是内部协议或者是外部协议。内部协议处理域内路由选择,外部协议处理域间路由选择。
一个自治系统(autonomous system,AS)就是在一个管理机构管辖下的一组网络和路由器。
自治系统内部的路由选择称为域内路由选择;自治系统之间的路由选择称为域间路由选择。
一个自治系统可以选择一个或多个域内路由选择协议来处理本自治系统内部的路由选择;但自治系统之间的路由选择只能使用一种域间路由选择协议。
算法流程
距离矢量路由的思想基于Bellman-Ford算法,但有以下几点不同:
算法流程
当某结点i收到相邻结点j的信息(VX, DjX)时,结点i路由表更新情况如下:
若路由表中无此项,则添加表项(VX, DjX+1, j);
若路由表中有VX项 (VX, DiX, k):
若k=j,则表项更新为(VX, DjX+1, j);
若k≠j且DjX+1 < DiX,则表项更新为(VX, DjX+1, j);
若k≠j且DjX+1 ≥ DiX,则该表项保持不变。
路由信息协议(Routing Information Protocol,RIP)是对距离矢量路由算法的实现。
RIP有两个版本: RIPv1和RIPv2。
为了避免跳数计数到无穷大的问题,RIP定义无穷大为16,即最大跳数为15。
命令:指明报文的类型:请求(1)或响应(2)。
版本:定义了RIP协议的版本,可以为1或2。
系列:定义了所使用的协议族。对于TCP/IP其值为2。
网络地址:定义了目的网络的地址。RIP为这个字段分配了14个字节,可支持多种协议。IPv4只使用4个字节,其余部分置0。
距离:定义了从发出通告的路由器一直到目的网络所经过的跳数。
有一部分是重复出现的,每一个目的网络出现一次。这部分称为表项(entry)。
RIP两种类型的报文:请求和响应。
请求报文可以询问某些特定的表项或者所有表项。对特定表项的请求需要填写网络地址字段;对所有表项的请求网络地址字段为全0。
响应可以是询问的或非询问的。询问的响应仅在回答请求时才发出;而非询问的响应则是定期发送,这种响应也称为更新分组。
RIP使用了三个计时器来支持它的操作:
定期计时器(periodic timer)控制更新报文的定期发送。它是一个倒数计时器,设置为25~35秒之间的一个随机数,计时到0时就发送更新报文,然后把计时器再随机设置一次。
截止期计时器(expiration timer)管理路由的有效性。当路由器收到路由更新信息时,截止期计时器就为这个路由设置到180秒。如果在180秒内没有收到任何更新报文,就认为这个路由过期,设置其代价为16,表示终点不可达。
无用信息收集计时器(garbage collection timer)为过期的路由设置120秒。当计时器倒数到0时,相应的路由就从路由表中清除掉。
为了克服RIPv1的某些缺点,把RIPv1中的全0字段改为一些新的字段
路由标记:携带了如自治系统号这样的信息。它可用来使RIP能够从域间路由选择协议中接收信息。
子网掩码:这表示RIPv2可支持无分类编址。
下一跳地址:若两个自治系统共享一个网络,该字段可以用来定义分组必须发往的路由器,不管这个路由器是在同一个自治系统还是另一个自治系统。
为防止未授权的通告,RIPv2提供了一种简单的认证机制,要求RIP报文中的密码和所要求的密码匹配才可以接受。
RIPv1使用广播方式把RIP报文发送给每一个邻站。RIPv2引入了组播方式,用全路由器组播地址(224.0.0.9)把RIP报文仅发送给这个网络上的RIP路由器。
域内每一个结点都有这个域的完整拓扑,各结点使用Dijkstra算法构建路由表。
各结点掌握完整拓扑依靠:
发现邻居并测量与邻居的代价(通常是时延、吞吐量等等),即掌握自己的链路状态;
与所有结点交流自己掌握的链路状态信息。
四个操作来
LSP携带以下信息:
结点标识;
链路列表;
序号:用于洪泛中区分各LSP;
寿命:用于防止旧的LSP长时间在域中逗留。
产生LSP的两种场合:
当域的拓扑发生变化时;
基于定期更新。
LSP的洪泛
产生LSP的结点把LSP的副本从它的每一个接口发送出去;
结点把收到的LSP和可能已经有的副本进行比较。如果新到达的LSP比原有的还旧(通过序号判断),就丢弃这个LSP;如果它比较新,则用它替换原有的LSP,并从除分组到达接口之外的其他所有接口发送这个LSP副本。
在收到所有的LSP后,各结点就会建立起一个完整的网络拓扑。结点要利用这个拓扑找出到其他所有结点的最短路径,需要形成最短路径树。
Dijkstra算法可用来从一个给定的图产生一棵最短路径树。
Dijkstra算法
初始化:选择作为当前节点为树的根结点,并把它加到路径中。为根的所有邻站设置距离。设置根到自己的距离为0。
加入下一个结点到路径中:搜索不在路径中的结点,选择一个具有最小的最短距离的结点,把它加入到路径中。
更新:用前一步移到路径中的结点来更新所有剩余结点的最短距离,使用公式Dj = min{Dj, Di+cij}。
循环:重复上面两个步骤,直至所有结点都被加入到路径中。
开放最短路径优先(Open Shortest Path First,OSPF)协议是对链路状态路由协议的实现。
OSPF把一个自治系统划分为若干区域(area),一个区域内的所有网络必须是互相连接的。
在一个区域内的路由器使用洪泛法传送路由选择信息。
在一个区域的边界,有一些特殊的路由器,称为区域边界路由器,它们把有关本区域的信息汇总起来发送到其他区域。
在自治系统中有一个特殊的区域称为主干,其他所有区域必须连接到主干上。
主干中的路由器称为主干路由器。
每个区域都有一个区域标识,主干的区域标识是0。
OSPF定义了四种类型的链路
点对点链路(point-to-point link)直接连接两个路由器,中间没有任何其他的主机或路由器。
穿越链路(transient link)是连接了若干个路由器的一个网络。数据可以从任何一个路由器进入网络,并从任何一个路由器离开网络。
残桩链路(stub link)是仅连接了一个路由器的网络。数据分组通过这个路由器进入网络,而离开网络也是通过相同的路由器。残桩链路是穿越链路的一种特例。
虚拟链路(virtual link):当两个路由器之间的链路断开时,管理员就要在它们之间用一条更长的路径来创建一条虚拟链路,可能要经过若干个路由器。
公共首部
所有的OSPF报文都有相同的公共首部:
版本:定义了OSPF协议的版本。(目前是版本2)
类型:定义了OSPF报文的类型,用1~5表示。
报文长度:定义了包括首部在内的总报文长度,以字节计。
源路由器IP地址:定义了发送该报文的路由器的IP地址
区域标识:定义了进行路由选择的区域。
校验和:用来对整个报文进行差错检测,但不包括认证类型字段和认证数据字段。
认证类型:定义了在这个区域内使用的认证协议。目前定义了三种类型的认证:0表示无认证,1表示采用简单口令认证,2表示采用密码认证。
认证数据:若认证类型为0,则为全0;若认证类型为1,则为8个字符的口令;若认证类型为2,则存放密钥ID、认证数据长度和密码序号。
原理
·OSPF要求每台运行OSPF的路由器都了解整个网络的链路状态信息。
·OSPF的收敛过程由链路状态公告LSA泛洪开始,LSA中包含了路由器已知的接口IP地址、掩码、开销和网络类型等信息。
·收到LSA的路由器都可以根据LSA提供的信息建立自己的链路状态数据库LSDB,并在LSDB的基础上使用SPF(最短路径优先)算法进行运算,建立起到达每个网络的最短路径树。
·最后,通过最短路径树得出到达目的网络的最优路由,并将其加入到IP路由表中。
五种报文类型
OSPF运行步骤
建立毗邻关系过程
init:向邻居发送hello报文,邻居根据收到的hello报文中有自己的名字,确认建立毗邻关系(two-way)
exchange:彼此交换数据库中每条记录的摘要,也就是DD报文。
loading:双方扫描收到的摘要,如果发现存在自己没有的记录,就向对方发出LSR请求,收到LSR请求的路由器,会将完整LSA封装到LSU报文中作为应答,收到LSU应答报文的路由器向发送方发出LSAck确认报文。
full:双方的数据库同步一致后就建立了全毗邻关系。
DR的选举过程:
OSPF报文被封装成IP数据报。
路径矢量路由选择是外部路由选择协议。在路径矢量路由选择中,路由器有一个目的网络的列表,列出了到达每个网络的路径(途经AS的列表)。
每个AS有一个收集了其内部所有网络可达性的列表,AS之间共享它们的网络可达性列表,那么每个路由器就能够建立一张路径矢量路由表。
边界网关协议(Border Gateway Protocol,BGP)是对路径矢量路由协议的实现。
BGP使用四种不同类型的报文:
打开报文
更新报文
保活报文
通告报文
公共首部
所有的BGP报文都有相同的公共首部:
标记:保留给认证用。
长度:定义了包括首部在内的报文总长度。
类型:定义了BGP报文的类型,用1~4表示。
打开报文
为了建立邻站关系,运行BGP的路由器需要打开与邻站的TCP连接,因而要发送打开报文。若对方接受这种邻站关系,就用保活报文来响应,表示这两个路由器之间已经建立了关系。
更新报文
更新报文是BGP协议的核心。它被路由器用来撤销以前曾通告过的终点,或宣布到一个新终点的路由,或两者都有。
保活报文
运行BGP协议的路由定期地互相交换保活报文,用来告诉对方自己是工作的。保活报文只包括公共首部。
通告报文
当检测出差错状态或路由器打算关闭连接时,路由器就发送通告报文。
BGP报文封装成TCP报文段,并使用熟知端口179。
在TCP连接被打开后,就不停地交换着更新报文、保活报文和通告报文,直到发出停止类型的通告报文为止。
网络层负责计算机级的通信,点到点通信。传输层协议提供端到端的通信,又称进程到进程的通信。
一台计算机中同时存在多个进程,传输层协议采用端口号(port numbers)来标识某一主机上的通信进程。TCP、UDP和SCTP都是提供进程通信能力的传输层协议,各有一套端口号,都是从0到65535。
三元组和五元组
为了区别使用TCP、UDP和SCTP的进程,除了给出端口号之外,还要指明协议。
因特网中要全局唯一地标识一个进程必须采用一个三元组:(协议,主机地址,端口号)
网络通信是两个进程之间的通信,包含两个三元组。由于通信双方采用的协议必须是相同的,可以用一个五元组来唯一标识一次网络通信:(协议,本地主机地址,本地端口号,远程主机地址,远程端口号)
客户/服务器范式
完成进程到进程的通信最常用的方法是通过客户/服务器范式(client-server paradigm)。位于本地主机上的进程称为客户,它通常需要远程主机上的一个称为服务器的进程所提供的服务。
客户进程和服务器进程应当具有相同的名称。
为了让客户能够找到服务器,服务器必须使用一个客户熟知的地址,客户可以根据此地址向服务器提出服务请求。
TCP/IP让服务器使用全球通用端口号,它们称为熟知端口号。
客户进程一般采用临时端口号。
端口号划分为三个范围段:
熟知端口:范围为0~1023的端口
注册端口:范围为1024~49151的端口它们必须在ICANN处注册以防止重复。
动态端口:范围为49152~65535的端口,可被用作临时的或专用的端口号。
传输控制协议(TCP)位于传输层,为应用进程之间的通信提供面向连接的传输服务。
流交付服务
TCP是一种面向流的协议,允许发送进程以字节流的形式传递数据,并允许接收进程把数据作为字节流来接收。
发送缓存和接收缓存
TCP设置两个缓存,即发送缓存和接收缓存,每个方向各一个。
面向连接的服务
TCP是面向连接的协议。当站点A的一个进程想和站点B的另一个进程交换数据时,需要经过三个阶段:
两个站点的TCP在它们之间建立一条虚连接;
数据在两个方向上交换;
连接被终止。
可靠的服务
TCP是一个可靠的传输协议。它使用确认机制来检查数据是否安全完好地到达。
全双工通信
TCP提供全双工服务,即数据可在同一时间双向流动。
编号系统
在TCP报文段首部有两个叫做序号和确认号的字段,各占32位。
这两个字段所指的都是字节的编号而不是报文段的编号。
TCP把在一个连接中要发送的所有数据字节都编上号。两个方向的编号是相互独立的。
编号不一定从0开始。TCP选择0~232-1之间的一个随机数作为第一个字节的编号。
当字节都被编上号之后,TCP就给每一个要发送的报文段指派一个序号。报文段的序号就是其中第一个数据字节的序号。
通信双方使用确认号对各自收到的字节表示确认。
接收方把收到的最后一个字节的编号加上1所得到的值宣布为确认号。
流量控制
流量控制解决的问题:如果数据产生的速度比消耗的速度快,那么消耗方就会因来不及处理而被迫丢弃一些数据。
推送和拉取
推送:产生方只要数据一产生就发送出去,不管消耗方之前是否请求过这些数据。
拉取:产生方只有在消耗方请求数据之后才发送。
推送数据需要流量控制;拉取数据不需要流量控制
TCP提供了面向字节的流量控制。发送TCP要对能接受多少从发送进程传来的字节进行控制;接收TCP则要对发送TCP能够发送多少字节进行控制。
差错控制
差错控制只涉及发送方的传输层和接收方的传输层,不涉及应用层,因为可以假设在应用层和传输层之间的报文块交换是无差错的。
TCP提供了面向字节的差错控制。
拥塞控制
如果一个网络中的负载(发送到网络上的分组数量)大于网络的容量(网络能够处理的分组数量),这个网络就有可能发生拥塞。
TCP提供了拥塞控制。发送方允许发送的数据量不仅要受接收方的控制(流量控制),而且还要由网络的拥塞状况来决定。
TCP的分组称为报文段(segment)。
源端口号:定义了发送该报文段的主机中的应用程序的端口号。
目的端口号:定义了接收该报文段的主机中的应用程序的端口号。
序号:定义了本报文段第一个数据字节的编号。
确认号:定义了报文段的发送方期望从对方接收的字节编号。
首部长度:指出TCP首部长度,以4字节为单位。首部长度可以在20~60字节之间。
保留:保留为今后使用。
控制:定义了8种不同的控制位。在同一时间可设置一位或多位标志,用在TCP的拥塞控制、流量控制、连接建立和终止、连接异常终止、数据传输方式等方面。
窗口大小:定义了TCP的接收窗口大小,以字节为单位
校验和:对整个TCP报文段校验,涉及了三个部分:伪首部、TCP首部以及从应用层来的数据。
紧急指针:只有当紧急标志(URG)置1时,该字段才有效。此时数据的最前面为紧急数据,最后一个紧急数据字节编号 = 序号 + 紧急指针。
选项:TCP首部可以有多达40字节的可选信息。
控制位:
【紧急字段URG】- 1bit
此字段告诉系统此报文段中有紧急数据,应尽快传送。当URG=1时,紧急指针字段有效。
【确认字段ACK】
当ACK=1时,表示确认,且确认号有效;当ACK=0时,确认号字段无效。
【推送字段PSH】
当PSH=1时,则报文段会被尽快地交付给目的方,不会对这样的报文段使用缓存策略。
【复位字段RST】
当RST为1时,表明TCP连接中出现了严重的差错,必须释放连接,然后再重新建立连接。
【同步字段SYN】
当SYN=1时,表示发起一个连接请求。
【终止字段FIN】
用来释放连接。当FIN=1时,表明此报文段的发送端的数据已发送完成,并要求释放连接。
为了保证TCP的可靠性,在计算校验和时引入了伪首部的概念。
伪首部是封装TCP报文的IP数据报首部的一部分(其中有些字段要填入0)。
在TCP中,数据传输需要经过三个阶段:连接建立、数据传输和连接终止。
连接建立
三次握手
客户发送第一个报文段:SYN报文段。该报文段是控制报文段,作用是同步序号,不携带任何数据。它消耗了一个序号。
服务器发送第二个报文段:SYN+ACK报文段。一方面,它是另一个方向上的SYN,服务器使用该报文段同步它的初始序号;另一方面,服务器通过确认号来确认已收到客户的SYN报文段。
客户发送第三个报文段,它使用确认号来确认收到了第二个报文段。
连接终止
连接的一方可以停止发送数据,但仍然可以接收数据,这称为半关闭。
客户发送一个FIN报文段,此连接被半关闭了。服务器通过发送ACK报文段来表示接收这个半关闭。
服务器仍然可以发送数据,客户仍然需要对服务器的数据进行确认。
当服务器把所有处理过的数据都发送完毕后,就发送一个FIN报文段。客户发送一个ACK予以确认。
连接复位
RST(复位)标志可以用来完成以下功能:
拒绝连接请求:如果某一端的TCP向一个并不存在的端口请求连接,另一端的TCP就可以发送RST位为1的报文段来拒绝这个请求。
异常终止连接:由于出现了异常情况,某一端的TCP可能希望放弃一条在用的连接。它可以发送一个RST报文段来关闭这条连接。
终止空闲的连接:某一端的TCP可能发现另一端的TCP已经空闲了很长的时间。它可以发送RST报文来终止这个连接。
流量控制平衡了生产者产生数据的速度和消耗者消耗数据的速度。
流量控制最常见的实现方法是使用缓存。TCP对每个缓存使用一个滑动窗口(每个方向的数据传输各两个)。
TCP强制发送方和接收方不断调整它们的窗口大小,使发送窗口大小等于接收窗口大小。
发送窗口
当一个新的ACK到达时,左壁后移,发送窗口关闭;接收方通告的rwnd允许时,右臂后移,发送窗口会打开。
接收窗口
当字节从发送方传来时,左壁后移,接收窗口关闭;当字节被进程拉取走时,右壁后移,接收窗口打开。
rwnd = 接收方接收窗口大小
糊涂窗口综合征
发送应用程序产生数据的速度很慢,或接收应用程序消耗数据的速度很慢,在滑动窗口的操作中有可能出现发送方每次只发送包含一个字节(或较小字节数)的报文段,同时接收方每次也仅对接收到的包含一个字节(或较小字节数)的报文段进行确认。
Nagle算法:针对发送方产生数据慢的情况
发送TCP把它从发送应用程序收到的第一块数据发送出去,哪怕只有1个字节。
发送TCP在发送缓存中累积数据并等待,直至收到接收TCP发来的ACK,或者已积累了足够的数据可以装成最大长度的报文段。此时发送TCP发送报文段。
对剩下的数据传输,不断重复上一个步骤。
Clark解决方法:针对接收方消耗数据慢的情况
只要有数据到达就发送确认,但接收缓存空间较小时不会更新窗口大小,一直宣布窗口大小为0。
推迟确认:针对接收方消耗数据慢的情况
接收方不会对收到的报文段立即确认,而是等待一段时间,直至接收缓存有足够的空间为止。
网络拥塞由两方面组组成:网络容量、接收方容量,解决拥塞要单独处理这两个方面。
为此每个发送者维护两个窗口:
接收者窗口rwnd:反映目前接收者的处理能力(通过确认报文段中的窗口大小获取)
拥塞窗口cwnd:反映网络目前的容量(通过慢启动算法获取)
发送方窗口大小 = min{rwnd, cwnd}
拥塞窗口的获取
慢启动算法
在建立连接时,发送方将cwnd初始化为1个最大报文段的大小(MSS)。MSS的数值是在连接建立时通过选项来确定的。
之后,每当有1个报文段被确认,cwnd都将翻倍,直到达到阈值
之后每当有1个报文段被确认,cwnd都将增加一个MSS,直到超时
超时后cwnd重置为1,重新慢启动。
快速恢复
超时重新慢启动的时候,cwnd不用重置为1个MSS,而是设置为阈值大小,从这里直接开始线性增长,这就是快速恢复
CWR位和ECE位
CWR位和ECE位与IP数据报的区分业务字段中的显式拥塞通告(ECN)字段配合以便拥塞发生之前进行拥塞控制。
ECE位是ECN响应标志,信宿主机收到IP首部的ECN被设置为11的TCP报文段后,在随后的TCP报文段的首部设置ECN响应标志,通知信源主机进行拥塞窗口调整。
CWR位是拥塞窗口缩减标志,用于信源主机收到ECN响应标志置1的TCP报文段后向信宿主机报告:已收到ECE标志并已缩减拥塞窗口。
TCP使用差错控制来提供可靠性。差错控制包括以下机制:
检测并重传损坏的报文段:通过校验和和发送方的超时重传来解决;
重传丢失的报文段:通过发送方的超时重传来解决;
保存失序到达的报文段,直至缺失的分组全部抵达:当接收方收到失序报文段后不会马上确认,而是先将其存放在缓存中,当被确认报文段之前的所有报文段都已经收到了才回送确认报文;
检测和丢弃重复的报文段。
是一种无连接、不可靠的传输层协议,它仅仅在IP服务的基础上增加了进程到进程的通信。
UDP分组叫做用户数据报(user datagram),它有8个字节的固定首部。
源端口号:源主机上运行的进程所使用的端口号。
目的端口号:目的主机上运行的进程所使用的端口号。
总长度:定义了用户数据报的总长度,首部+数据。
UDP在计算校验和时也使用了伪首部。
封装
用户数据报封被封装在IP数据报中。
无连接服务
流量控制、差错控制、拥塞控制
UDP是一个非常简单的协议,它没有流量控制,因此也没有窗口机制。
除校验和之外,UDP没有其他差错控制机制。当接收方通过校验和检测出差错时,就将这个用户数据报丢弃。
UDP的校验和是可选的。若不计算校验和,则在发送之前把校验和字段置为全0。
UDP不提供拥塞控制。UDP假设发送的分组不大,并且分散发送,所以不可能造成网络拥塞。
队列
在UDP中,用户数据报传输队列与端口关联
当一个进程启动时,它向操作系统请求得到端口号,并创建一个入队列和一个出队列与之关联。
客户端应用进程通过端口号把报文送到出队列。UDP把报文逐个从出队列中取出,封装成用户数据报。
出队列可能发生溢出。若发生溢出,操作系统就要求应用进程在继续发送报文之前等待。
服务器端一个报文到达时,UDP首先检查目的端口对应的入队列是否已创建:
如果已创建,则将收到的用户数据报放在该队列的末尾;
如果未创建,UDP就丢弃该用户数据报,并请求ICMP协议向发送进程发送一个端口不可达报文。
入队列可能发生溢出。若发生溢出,UDP就丢弃该用户数据报,并请求ICMP协议向发送进程发送一个端口不可达报文。
在多播通信中,有一个源点和一组终点。源地址是一个单播地址,而目的地址则是一个多播地址。
多播地址定义了一个或多个多播组成员。组成多播组的成员不限于在同一个网络,需要多播路由器。
在使用分类编址的情况下,多播地址占据了D类唯一的地址块。在无分类编址中也将相同的地址块(224.0.0.0/4)用于多播。
当IP分组使用IP多播地址时,ARP协议无法找出相应的物理地址。如何在数据链路层交付多播分组,取决于数据链路层是否支持物理多播地址。
以太网支持物理多播地址。如果一个以太网地址的前25位是00000001 00000000 01011110 0(0x01 00 5E),就说明这是一个TCP/IP协议的物理多播地址。剩下的23位可用来定义多播组。
要将一个IP多播地址映射为一个以太网地址,多播路由器要截取IP多播地址中的最低23位,并把它们插入到以太网物理多播地址中。
是多对一映射。接收到分组的主机可能并不属于与该分组相关的组。因此主机必须检查分组的IP地址,并丢弃任何不是本机要接收的分组。
广域网不支持物理多播地址。要通过这样的网络发送一个多播分组需要使用隧道技术。多播分组被封装成单播分组并通过网络传输,而当它出现在隧道另一端时再转换为一个多播分组。
多播路由器及链路在网络中形成了一个控制多播数据传送的逻辑结构,称为多播传递结构,这种结构一般是树形的结构,称为传递树。
在传递树上,多播路由器接收、复制、转发多播数据,尽力而为地将数据报转发到对应多播组。
多播协议分为主机-路由器之间的组成员管理协议和路由器-路由器之间的多播路由协议。
因特网组管理协议(Internet Group Management Protocol,IGMP)是一种典型的组成员管理协议,负责收集和解释一个网络中的组成员信息。位于TCP/IP协议族的网络层。
IGMP的任务包括:
主机通过IGMP告诉本地路由器希望加入或离开某个特定多播组;
多播路由器通过IGMP周期性查询网络内某个已知多播组的成员是否处于活动状态;
多播路由器通过IGMP维护有关网络中的多播组的列表。
IGMP经历了三个版本的发展。版本1和版本2提供的是任意源多播,即无论从哪里来的多播报文,组成员都会接收。版本3提供的是特定源多播(SSM),接收者可以选择只接收预先定义好的源列表中的某个源的多播报文。
IGMPv3有两种类型的报文:成员关系查询报文和成员关系报告报文。
其中,成员关系查询报文有三种类型的变体:
一般的查询报文
特定组的查询报文
特定组和源的查询报文
成员关系查询报文
多播路由器为了找出网络中活跃的组成员而发送的报文。
类型:定义了报文的类型。值0x11表示成员关系查询报文。
最大响应时间:定义了在接收到该查询后必须在多长时间内作出响应。
校验和:该校验和是对整个报文做的计算。
组地址:该字段在一般的查询报文中置0;在其他两种查询报文中设置为被查询的IP多播组地址。
Resv:保留。
源地址数量:定义了依附在此查询上的32位单播源地址的数量。
源地址:该字段列出了若干个源地址,即多播报文的源点。源地址的数量在前一个字段中定义。
查询报文的三种格式
在一般的查询报文中,发起查询的路由器探询每个邻站,使之报告组成员关系的完整列表。
在特定组的查询报文中,发起查询的路由器探询每个邻站,使之报告是否仍然对某个特定的多播组感兴趣。
在特定组和源的查询报文中,发起查询的路由器探询每个邻站,使之报告是否仍然对来自N个源之一的且到某个特定多播组的多播分组感兴趣。
成员关系报告报文
类型:定义了报文的类型,值为0x22。
校验和:该校验和是对整个报文做的计算。
组记录数量:定义了报文携带的组记录的数量。
组记录:每个组记录包含了响应者在某个多播组中的成员关系信息。
每个组记录的结构如下所示:
记录类型:
辅助数据长度:定义了每个组记录中包含的辅助数据的长度。
源地址数量:定义了依附在这个报告上的32位源多播地址的数量。
源地址:该字段列出了若干个源地址。源地址的数量在前一个字段中定义。
辅助数据:包含了任何需要被包含在该报告报文中的辅助数据。IGMP目前还没有定义任何辅助数据。
封装
IGMP报文封装在IP数据报中。该IP数据报的目的IP地址取决于IGMP报文的类型(路由器向邻站广播IGMP报文):
主机上的IGMP操作
主动报告:主机的多播组成员信息有任何变化,立即向它所在的IP子网的多播路由器发送一个成员关系报告报文。
对查询的响应:当主机接收到一个查询时延迟一段随机的时间后再响应。
主机当且仅当自己符合查询条件时,对查询作出响应。
路由器上的IGMP操作
多播路由器需要维持与每一个网络接口关联的每一个多播组的状态信息。一个网络接口的状态信息是一张表,表中的每一行与一个多播组相关。
由于多播组中的成员关系是动态变化的,多播路由器周期性发送查询报文。
多播通信的目的地是一个主机组。多播路由选择是要找出以源主机为根结点的一棵最短路径树。该最短路径树的叶子结点是多播组中的主机,中间结点是多播路由器。
在多播路由选择时,每一个相关的路由器需要对每一个多播组构建一棵最短路径树。
有两种办法可以解决这个问题:源点基准树和组共享树。
源点基准树
使用源点基准树(source-based tree)的方法时,每一个路由器需要对每一个多播组建立一棵最短路径树。
一个多播组的最短路径树定义了到每一个含有组成员的网络的下一跳(此时的下一跳有多个路由器)。
组共享树
使用组共享树(group-shared tree)的方法时,不是每个路由器都涉及多播,而是只有一个称为中心核心路由器或汇集点路由器的特定路由器负责多播通信量的传播。
核心路由器在其路由表中为每个多播组维护一棵最短路径树。
如果某个路由器收到一个多播分组,它就把这个分组封装成一个单播分组,然后发送给核心路由器。核心路由器打开封装,取出多播分组,查路由表为其选择路由。