IP协议

IP协议

4.1 IP即网际协议

TCP/IP的心脏是互联网层。 这一层主要由IP(Internet Protocol) 和ICMP(Internet Control Message Protocol) 两个协议组成。

4.1.1 IP相当于OSI参考模型的第3层

IP(IPv4、 IPv6) 相当于OSI参考模型中的第3层——网络层。

网络层的主要作用是“实现终端节点之间的通信”。 这种终端节点之间的通信也叫“点对点(end-to-end) 通信”。

从前面的章节可知, 网络层的下一层——数据链路层的主要作用是在互连同一种数据链路的节点之间进行包传递。 而一旦跨越多种数据链路, 就需要借助网络层。 网络层可以跨越不同的数据链路, 即使是在不同的数据链路上也能实现两端节点之间的数据包传输

4.1.2 网络层与数据链路层的关系

数据链路层提供直连两个设备之间的通信功能。 与之相比, 作为网络层的IP则负责在没有直连的两个网络之间进行通信传输。 那么为什么一定需要这样的两个层次呢? 它们之间的区别又是什么呢?

仔细分析一下机票和火车票, 不难发现, 每张票只能够在某一限定区间内移动。 此处的“区间内”就如同通信网络上的数据链路。 而这个区间内的出发地点和目的地点就如同某一个数据链路的源地址和目标地址等首部信息(出发地点好比源MAC地址, 目标地点好比目的MAC地址。 )。 整个全程的行程表的作用就相当于网络层。

4.2 IP基础知识

IP大致分为三大作用模块, 它们是IP寻址、 路由(最终节点为止的转发) 以及IP分包与组包。

4.2.1 IP地址属于网络层地址

在计算机通信中, 为了识别通信对端, 必须要有一个类似于地址的识别码进行标识。我们介绍过数据链路的MAC地址。 MAC地址正是用来标识同一个链路中不同计算机的一种识别码。

作为网络层的IP, 也有这种地址信息。 一般叫做IP地址。 IP地址用于在“连接到网络中的所有主机中识别出进行通信的目标地址”。 因此,在TCP/IP通信中所有主机或路由器必须设定自己的IP地址(严格来说,要针对每块网卡至少配置一个或一个以上的IP地址。) 。

不论一台主机与哪种数据链路连接, 其IP地址的形式都保持不变。以太网、 无线局域网、 PPP等, 都不会改变IP地址的形式。网络层对数据链路层的某些特性进行了抽象。 数据链路的类型对IP地址形式透明, 这本身就是其中抽象化中的一点。

另外, 在网桥或交换集线器等物理层或数据链路层数据包转发设备中, 不需要设置IP地址(在用SNMP进行网路管理时有必要设置IP地址。不指定IP则无法利用IP进行网路管理。 ) 。 因为这些设备只负责将IP包转化为0、 1比特流转发或对数据链路帧的数据部分进行转发, 而不需要应对IP协议

4.2.2 路由控制

路由控制(Routing) 是指将分组数据发送到最终目标地址的功能。

■ 发送数据至最终目标地址

Hop译为中文叫“跳”。 它是指网络中的一个区间。 IP包正是在网络中一个个跳间被转发。 因此IP路由也叫做多跳路由。 在每一个区间内决定着包在下一跳被转发的路径。

■ 路由控制表

为了将数据包发给目标主机, 所有主机都维护着一张路由控制表(Routing Table) 。 该表记录IP数据在下一步应该发给哪个路由器。 IP包将根据这个路由表在各个数据链路上传输。

4.2.3 数据链路的抽象化

IP是实现多个数据链路之间通信的协议。数据链路根据种类的不同各有特点。 数据链路的地址可以被抽象化为IP地址。因此, 对IP的上一层来说, 不论底层数据链路使用以太网还是无线LAN亦或是PPP, 都将被一视同仁。

不同数据链路有个最大的区别, 就是它们各自的最大传输单位(MTU: Maximum Transmission Unit) 不同。 MTU的值在以太网中是1500字节, 在FDDI中是4352字节, 而ATM则为9180字节 。 IP的上一层可能会要求传送比这些MTU更多字节的数据, 因此必须在线路上传送比包长还要小的MTU。

为了解决这个问题, IP进行分片处理(IP Fragmentation) :将较大的IP包分成多个较小的IP包 。分片的包到了对端目标地址以后会再被组合起来传给上一层。 即从IP的上次层看, 它完全可以忽略数据包在途中的各个数据链路上的MTU, 而只需要按照源地址发送的长度接收数据包。 IP就是以这种方式抽象化了数据链路层, 使得从上层更不容易看到底层网络构造的细节。

4.2.4 IP属于面向无连接型

为什么IP要采用面向无连接呢?

主要有两点原因: 一是为了简化, 二是为了提速。 面向连接比起面向无连接处理相对复杂。 甚至管理每个连接本身就是一个相当繁琐的事情。 此外, 每次通信之前都要事先建立连接, 又会降低处理速度。 需要有连接时, 可以委托上一层提供此项服务。 因此, IP为了实现简单化与高速化采用面向无连接的方式。

4.3 IP地址的基础知识

4.3.1 IP地址的定义

IP地址(IPv4地址) 由32位正整数来表示。 TCP/IP通信要求将这样的IP地址分配给每一个参与通信的主机。 IP地址在计算机内部以二进制(二进制是指用0、 1表示数字的方法。 ) 方式被处理。 然而, 由于人类社会并不习惯于采用二进制方式, 需要采用一种特殊的标记方式。 那就是将32位的IP地址以每8位为一组, 分成4组, 每组以“.”隔开, 再将每组数转换为十进制数。

4.3.2 IP地址由网络和主机两部分标识组成

IP地址由“网络标识(网络地址) ”和“主机标识(主机地址) ”两部分组成(192.168.128.10/24中的“/24” 表示从第1位开始到多少位属于网络标识。 在这个例子中, 192.168.128之前的都是该IP的网络地址。)

网络标识在数据链路的每个段配置不同的值。 网络标识必须保证相互连接的每个段的地址不相重复。 而相同段内相连的主机必须有相同的网络地址。 IP地址的“主机标识”则不允许在同一个网段内重复出现。

由此, 可以通过设置网络地址和主机地址, 在相互连接的整个网络中保证每台主机的IP地址都不会相互重叠。 即IP地址具有了唯一性。

那么, 究竟从第几位开始到第几位算是网络标识, 又从第几位开始到第几位算是主机标识呢? 关于这点, 有约定俗成的两种类型。 最初二者以分类进行区别。 而现在基本以子网掩码(网络前缀) 区分。

4.3.3 IP地址的分类

IP地址分为四个级别, 分别为A类、 B类、 C类、 D类(还有一个一直未使用的E类。 ) 。 它根据IP地址中从第1位到第4位的比特列对其网络标识和主机标识进行区分。

■ A类地址

A类IP地址是首位以“0”开头的地址。 从第1位到第8位(去掉分类位剩下7位。 ) 是它的网络标识。 用十进制表示的话, 0.0.0.0~127.0.0.0是A类的网络地址。 A类地址的后24位相当于主机标识。 因此, 一个网段内可容纳的主机地址上限为16, 777,214个。

■ B类地址

B类IP地址是前两位为“10”的地址。 从第1位到第16位(去掉分类位剩下14位。 ) 是它的网络标识。 用十进制表示的话, 128.0.0.1~191.255.0.0是B类的网络地址。 B类地址的后16位相当于主机标识。 因此, 一个网段内可容纳的主机地址上限为65, 534个。

■ C类地址

C类IP地址是前三位为“110”的地址。 从第1位到第24位(去掉分类位剩下21位。 ) 是它的网络标识。 用十进制表示的话, 192.168.0.0~239.255.255.0是C类的网络地址。 C类地址的后8位相当于主机标识。 因此, 一个网段内可容纳的主机地址上限为254个 。

■ D类地址

D类IP地址是前四位为“1110”的地址。 从第1位到第32位(去掉分类位剩下28位。 ) 是它的网络标识。 用十进制表示的话, 224.0.0.0~239.255.255.255是D类的网络地址。 D类地址没有主机标识, 常被用于多播。

■ 关于分配IP主机地址的注意事项

在分配IP地址时关于主机标识有一点需要注意。 即要用比特位表示主机地址时, 不可以全部为0或全部为1。 因为全部为只有0在表示对应的网络地址或IP地址不可获知的情况下才使用。 而全部为1的主机地址通常作为广播地址。

因此, 在分配过程中, 应该去掉这两种情况。 这也是为什么C类地址每个网段最多只能有254(28 -2=254) 个主机地址的原因。

4.3.4 广播地址

广播地址用于在同一个链路中相互连接的主机之间发送数据包。 将IP地址中的主机地址部分全部设置为1, 就成为了广播地址。

■ 本地广播

在本网络内的广播叫做本地广播。 例如网络地址为192.168.0.0/24的情况下, 广播地址是192.168.0.255。 因为这个广播地址的IP包会被路由器屏蔽, 所以不会到达192.168.0.0/24以外的其他链路上。

■ 直接广播

在不同网络之间的广播叫做直接广播。 例如网络地址为192.168.0.0/24的主机向192.168.1.255/24的目标地址发送IP包。 收到这个包的路由器, 将数据转发给192.168.1.0/24, 从而使得所有192.168.1.1~192.168.1.254的主机都能收到这个包

4.3.5 IP多播

■ 同时发送提高效率

多播用于将包发送给特定组内的所有主机。 由于其直接使用IP协议, 因此也不存在可靠传输。

而随着多媒体应用的发展, 对于向多台主机同时发送数据包, 在效率上的要求也日益提高。 在电视会议系统中对于1对N、 N对N通信的需求明显上升。 而具体实现上往往采用复制1对1通信的数据, 将其同时发送给多个主机的方式。

在人们使用多播功能之前, 一直采用广播的方式。 那时广播将数据发给所有终端主机, 再由这些主机IP之上的一层去判断是否有必要接收数据。 是则接收, 否则丢弃。

然而这种方式会给那些毫无关系的网络或主机带来影响, 造成网络上很多不必要的流量。 况且由于广播无法穿透路由, 若想给其他网段发送同样的包, 就不得不采取另一种机制。 因此, 多播这种既可以穿透路由器, 又可以实现只给那些必要的组发送数据包的技术就成为必选之路了。

■ IP多播与地址

多播使用D类地址。 因此, 如果从首位开始到第4位是“1110”, 就可以认为是多播地址。 而剩下的28位可以成为多播的组编号。

从224.0.0.0到239.255.255.255都是多播地址的可用范围。 其中从224.0.0.0到224.0.0.255的范围不需要路由控制, 在同一个链路内也能实现多播。 而在这个范围之外设置多播地址会给全网所有组内成员发送多播的包(可以利用生存时间(TTL, Time To Live) 限制包的到达范围。 ) 。

此外, 对于多播, 所有的主机(路由器以外的主机和终端主机) 必须属于224.0.0.1的组, 所有的路由器必须属于224.0.0.2的组。 类似地,多播地址中有众多已知的地址, 它们中具有代表性的部分已在表4.1中列出。

利用IP多播实现通信, 除了地址外还需要IGMP(Internet GroupManagement Protocol) 等协议的支持。

4.3.6 子网掩码

■ 分类造成浪费?

一个IP地址只要确定了其分类, 也就确定了它的网络标识和主机标识。其中“1”的部分是网络地址部分, “0”的部分是主机地址部分。 将它们以十进制表示,C类为255.255.255.0

网络标识相同的计算机必须同属于同一个链路。 因此, 直接使用A类或B类地址, 确实有些浪费。 随着互联网的覆盖范围逐渐增大, 网络地址会越来越不足以应对需求, 直接使用A类、B类、 C类地址就更加显得浪费资源。 为此, 人们已经开始一种新的组合方式以减少这种浪费。

■ 子网与子网掩码

现在, 一个IP地址的网络标识和主机标识已不再受限于该地址的类别, 而是由一个叫做“子网掩码”的识别码通过子网网络地址细分出比A类、 B类、 C类更小粒度的网络。 这种方式实际上就是将原来A类、 B类C类等分类中的主机地址部分用作子网地址, 可以将原网络分为多个物理网络的一种机制。

自从引入了子网以后, 一个IP地址就有了两种识别码。 一是IP地址本身, 另一个是表示网络部的子网掩码。 子网掩码用二进制方式表示的话, 也是一个32位的数字。 它对应IP地址网络标识部分的位全部为“1”, 对应IP地址主机标识的部分则全部为“0”。 由此, 一个IP地址可以不再受限于自己的类别, 而是可以用这样的子网掩码自由地定位自己的网络标识长度。 当然, 子网掩码必须是IP地址的首位开始连续的“1”(最初提出子网掩码时曾允许出现不连续的子网掩码, 但现在基本不允许出现这种情况。 ) 。

另一种表示方式:它在每个IP地址后面追加网络地址的位数(这种方式也叫“后缀” 表示法。 ) 用“/”隔开。

4.3.7 CIDR与VLSM

于是, 人们开始放弃IP地址的分类,采用任意长度分割IP地址的网络标识和主机标识。 这种方式叫做CIDR(Classless InterDomain Routing)。由于BGP(Border Gateway Protocol, 边界网关协议) 对应了CIDR, 所以不受IP地址分类的限制自由分配

根据CIDR, 连续多个C类地址就可以划分到一个较大的网络内。 CIDR更有效地利用了当前IPv4地址, 同时通过路由集中降低了路由器的负担。

在CIDR被应用到互联网的初期, 网络内部采用固定长度的子网掩码机制。 也就是说, 当子网掩码的长度被设置为/25以后, 域内所有的子网掩码都得使用同样的长度。 然而, 有些部门可能有500台主机, 另一些部门可能只有50台主机。 如果全部采用统一标准, 就难以架构一个高效的网络结构。 为此人们提出组织内要使用可变长度的、 高效的IP地址分配方式。

于是产生了一种可以随机修改组织内各个部门的子网掩码长度的机制——VLSM(可变长子网掩码) (Variable Length Subnet Mask)。 它可以通过域间路由协议转换为RIP2以及OSPF实现。 根据VLSM可以将网络地址划分为主机数为500个时子网掩码长度为/23, 主机数为50个时子网掩码长度为/26。 从而在理论上可以将IP地址的利用率提高至50%。

有了CIDR和VLSM技术, 确实相对缓解了全局IP地址不够用的问题。 但是IP地址的绝对数本身有限的事实无法改变。 因此才会出现IPv6等IPv4以外的方法。

4.3.8 全局地址与私有地址

起初, 互联网中的任何一台主机或路由器必须配有一个唯一的IP地址。 一旦出现IP地址冲突, 就会使发送端无法判断究竟应该发给哪个地址。 而接收端收到数据包以后发送回执时, 由于地址重复, 发送端也无从得知究竟是哪个主机返回的信息, 影响通信的正常进行。然而, 随着互联网的迅速普及, IP地址不足的问题日趋显著。 如果一直按照现行的方法采用唯一地址的话, 会有IP地址耗尽的危险。

于是就出现了一种新技术。 它不要求为每一台主机或路由器分配一个固定的IP地址, 而是在必要的时候只为相应数量的设备分配唯一的IP地址。尤其对于那些没有连接互联网的独立网络中的主机, 只要保证在这个网络内地址唯一, 可以不用考虑互联网即可配置相应的IP地址。 不过, 即使让每个独立的网络各自随意地设置IP地址, 也可能会有问题。于是又出现了私有网络的IP地址。

包含在这个范围内的IP地址都属于私有IP, 而在此之外(A类~C类范围中除去0/8、 127/8。 ) 的IP地址称为全局IP(也叫公网IP。 ) 。

私有IP最早没有计划连接互联网, 而只用于互联网之外的独立网络。 然而, 当一种能够互换私有IP与全局IP的NAT技术诞生以后, 配有私有地址的主机与配有全局地址的互联网主机实现了通信。

现在有很多学校、 家庭、 公司内部正采用在每个终端设置私有IP,而在路由器(宽带路由器) 或在必要的服务器上设置全局IP地址的方法。 而如果配有私有IP的地址主机连网时, 则通过NAT进行通信。

全局IP地址基本上要在整个互联网范围内保持唯一(在使用任播的情况下, 多台主机或路由器可以配置同一个IP。 ) , 但私有地址不需要。 只要在同一个域里保证唯一即可。 在不同的域里出现相同的私有IP不会影响使用。

由此, 私有IP地址结合NAT技术已成为现在解决IP地址分配问题的主流方案。 它与使用全局IP地址相比有各种限制(例如在应用的首部或数据部分传递IP地址和端口号的应用程序来说, 直接使用私有地址会导致无法通信。 ) 。

4.3.9 全局地址由谁决定

在世界范围内, 全局IP由ICANN(Internet Corporation for Assigned Names and Numbers, 中文叫“互联网名称与数字地址分配机构” , 负责管理全世界的IP地址和域名。 ) 进行管理。 在日本则由一个叫做JPNIC(Japan Network Information Center, 负责日本国内IP地址与AS编号的管理。 ) 的机构进行管理, 它是日本国内唯一指定的全局IP地址管理的组织。

在互联网被广泛商用之前, 用户只有直接向JPNIC申请全局IP地址才能接入互联网。 然而, 随着ISP的出现, 人们在向ISP申请接入互联网的同时往往还会申请全局IP地址。 在这种情况下, 实际上是ISP代替用户向JPNIC申请了一个全局IP地址。 而连接某个区域网络时, 一般不需要联系提供商, 只要联系该区域网络的运营商即可。

对于FTTH和ADSL的服务, 网络提供商直接给用户分配全局IP地址, 并且用户每次重连该IP地址都可能会发生变化。 这时的IP地址由提供商维护, 不需要用户亲自申请全局IP地址。

一般只有在需要固定IP的情况下才会申请全局IP地址。 例如, 如果要让多台主机接入互联网, 就需要为每一台主机申请一个IP地址。

不过现在, 普遍采用的一种方式是, 在LAN中设置私有地址, 通过少数设置全局IP地址的代理服务器结合NAT的设置进行互联网通信。 这时IP地址个数就不限于
LAN中主机个数而是由代理服务器和NAT的个数决定。

如果完全使用公司内网, 今后不会接入互联网, 只要使用私有地址即可。

4.4 路由控制

发送数据包时所使用的地址是网络层的地址, 即IP地址。 然而仅仅有IP地址还不足以实现将数据包发送到对端目标地址, 在数据发送过程中还需要类似于“指明路由器或主机”的信息, 以便真正发往目标地址。保存这种信息的就是路由控制表(Routing Table) 。 实现IP通信的主机和路由器都必须持有一张这样的表。 它们也正是在这个表格的基础上才得以进行数据包发送的。

该路由控制表的形成方式有两种: 一种是管理员手动设置, 另一种是路由器与其他路由器相互交换信息时自动刷新。 前者也叫静态路由控制, 而后者叫做动态路由控制。 为了让动态路由及时刷新路由表, 在网络上互连的路由器之间必须设置好路由协议, 保证正常读取路由控制信息。

IP协议始终认为路由表是正确的。 然而, IP本身并没有定义制作路由控制表的协议。 即IP没有制作路由控制表的机制。 该表是由一个叫做“路由协议”(这个协议有别于IP) 的协议制作而成。

4.4.1 IP地址与路由控制

IP地址的网络地址部分用于进行路由控制。

路由控制表中记录着网络地址与下一步应该发送至路由器的地址。在发送IP包时, 首先要确定IP包首部中的目标地址, 再从路由控制表中找到与该地址具有相同网络地址的记录, 根据该记录将IP包转发给相应的下一个路由器。 如果路由控制表中存在多条相同网络地址的记录, 就选择一个最为吻合的网络地址。 所谓最为吻合是指相同位数最多的意思(也叫最长匹配。 ) 。 此外, 如果路由表中下一个路由器的位置记录着某个主机或路由器网卡的IP地址, 那就意味着“发送的目标地址属于同一个链路” 。

■ 默认路由

如果一张路由表中包含所有的网络及其子网的信息, 将会造成无端的浪费。 这时, 默认路由(Default Route) 是不错的选择。 默认路由是指路由表中任何一个地址都能与之匹配的记录。默认路由一般标记为0.0.0.0/0或default 。

■ 主机路由

“IP地址/32”也被称为主机路由(Host Route) 。 它的意思是整个IP地址的所有位都将参与路由。 进行主机路由, 意味着要基于主机上网卡上配置的IP地址本身, 而不是基于该地址的网络地址部分进行路由。

主机路由多被用于不希望通过网络地址路由的情况(不过, 使用主机路由会导致路由表膨大, 路由负荷增加, 进而造成网络性能下降。) 。

■ 环回地址

环回地址是在同一台计算机上的程序之间进行网络通信时所使用的一个默认地址。 计算机使用一个特殊的IP地址127.0.0.1作为环回地址。与该地址具有相同意义的是一个叫做localhost的主机名。 使用这个IP或主机名时, 数据包不会流向网络。

4.4.2 路由控制表的聚合

利用网络地址的比特分布可以有效地进行分层配置。 对内即使有多个子网掩码, 对外呈现出的也是同一个网络地址。 这样可以更好地构建网络, 通过路由信息的聚合可以有效地减少路由表的条目(路由表的聚合也叫路由汇总(Aggregation) 。 ) 。

能够缩小路由表的大小是它最大的优势。 路由表越大, 管理它所需要的内存和CPU也就越多。 并且查找路由表的时间也会越长, 导致转发IP数据包的性能下降。 如果想要构建大规模、 高性能网络, 则需要尽可能削减路由表的大小。

而且路由聚合可以将已知的路由信息传送给周围其他的路由器, 以达到控制路由信息的目的。

4.5 IP分割处理与再构成处理

4.5.1 数据链路不同, MTU则相异

每种数据链路的MTU之所以不同, 是因为每个不同类型的数据链路的使用目的不同。使用目的不同, 可承载的MTU也就不同。 鉴于IP属于数据链路上一层,它必须不受限于不同数据链路的MTU大小。

4.5.2 IP报文的分片与重组

任何一台主机都有必要对IP分片(IP Fragmentation) 进行相应的处理。 分片往往在网络上遇到比较大的报文无法一下子发送出去时才会进行处理。

经过分片之后的IP数据报在被重组的时候, 只能由目标主机进行。路由器虽然做分片但不会进行重组。

这样的处理是由诸多方面的因素造成的。 例如, 现实当中无法保证IP数据报是否经由同一个路径传送。 因此, 途中即使等待片刻, 数据包也有可能无法到达目的地。 此外, 拆分之后的每个分片也有可能会在途中丢失(在目标主机上进行分片的重组时, 可能有一部分包会延迟到达。 因此, 一般会从第一个数据报的分片到达的那一刻起等待约30秒再进行处理。 ) 。 即使在途中某一处被重新组装, 但如果下一站再经过其他路由时还会面临被分片的可能。 这会给路由器带来多余的负担, 也会降低网络传送效率。 出于这些原因, 在终结点(目标主机) 端重组分片了的IP数据报成为现行的规范。

4.5.3 路径MTU发现

分片机制也有它的不足。 首先, 路由器的处理负荷加重。 随着时代的变迁, 计算机网络的物理传输速度不断上升。 这些高速的链路, 对路由器和计算机网络提出了更高的要求。 另一方面, 随着人们对网络安全的要求提高, 路由器需要做的其他处理也越来越多, 如网络过滤(过滤是指只有带有一定特殊参数的IP数据报才能通过路由器。 这里的参数可以是发送端主机、 接收端主机、 TCP或UDP端口号或者TCP的SYN标志或ACK标志等。 ) 等。 因此, 只要允许, 是不希望由路由器进行IP数据包的分片处理的。

其次, 在分片处理中, 一旦某个分片丢失, 则会造成整个IP数据报作废。 为了避免此类问题, TCP的初期设计还曾使用过更小(包含TCP的数据限制在536字节或512字节。 ) 的分片进行传输。 其结果是网路的利用率明显下降。

为了应对以上问题, 产生了一种新的技术“路径MTU发现”(Path MTU Discovery(也可以缩写为PMTUD。 ) ) 。 所谓路径MTU(Path MTU) 是指从发送端主机到接收端主机之间不需要分片时最大MTU的大小。 即路径中存在的所有数据链路中最小的MTU。 而路径MTU发现从发送主机按照路径MTU的大小将数据报分片后进行发送。 进行路径MTU发现, 就可以避免在中途的路由器上进行分片处理, 也可以在TCP中发送更大的包。 现在, 很多操作系统都已经实现了路径MTU发现的功能。

路径MTU发现的工作原理如下:

首先在发送端主机发送IP数据报时将其首部的分片禁止标志位设置为1。 根据这个标志位, 途中的路由器即使遇到需要分片才能处理的大包, 也不会去分片, 而是将包丢弃。 随后, 通过一个ICMP的不可达消息将数据链路上MTU的值给发送主机(具体来说, 以ICMP不可达消息中的分片需求(代码4) 进行通知。 然而, 在有些老式的路由器中,ICMP可能不包含下一个MTU值。 这时, 发送主机端必须不断增减包的大小, 以此来定位一个合适的MTU值。 ) 。

下一次, 从发送给同一个目标主机的IP数据报获得ICMP所通知的MTU值以后, 将它设置为当前MTU。 发送主机根据这个MTU对数据报进行分片处理。 如此反复, 直到数据报被发送到目标主机为止没有再收到任何ICMP, 就认为最后一次ICMP所通知的MTU即是一个合适的MTU值。 那么, 当MTU的值比较多时, 最少可以缓存(缓存是指将反复使用的信息暂时保存到一个可以即刻获取的位置。 ) 约10分钟。 在这10分钟内使用刚刚求得的MTU, 但过了这10分钟以后则重新根据链路上的MTU做一次路径MTU发现。

前面是UDP的例子。 那么在TCP的情况下, 根据路径MTU的大小计算出最大段长度(MSS) , 然后再根据这些信息进行数据报的发送。 因此, 在TCP中如果采用路径MTU发现, IP层则不会再进行分片处理。

4.6 IPv6

4.6.1 IPv6的必要性

IPv6(IP version 6) 是为了根本解决IPv4地址耗尽的问题而被标准化的网际协议。 IPv4的地址长度为4个8位字节, 即32比特。 而IPv6的地址长度则是原来的4倍, 即128比特(因此IPv6的地址空间是IPv4的296=7.923×1028 倍。 ) , 一般写成8个16位字节。

从IPv4切换到IPv6极其耗时, 需要将网络中所有主机和路由器的IP地址进行重新设置。 当互联网广泛普及后, 替换所有IP地址会是更为艰巨的任务。

也是出于上述原因, IPv6不仅仅能解决IPv4地址耗尽的问题, 它甚至试图弥补IPv4中的绝大多数缺陷。 目前, 人们正着力于进行IPv4与
IPv6之间的相互通信与兼容性方面的测试(即IP隧道和协议转换 等) 。

4.6.2 IPv6的特点

  • IP地址的扩大与路由控制表的聚合

    IP地址依然适应互联网分层构造。 分配与其地址结构相适应的IP地址, 尽可能避免路由表膨大。

  • 性能提升

    包首部长度采用固定的值(40字节) , 不再采用首部检验码。 简化首部结构, 减轻路由器负荷。 路由器不再做分片处理(通过路径MTU发现只由发送端主机进行分片处理) 。

  • 支持即插即用功能

    即使没有DHCP服务器也可以实现自动分配IP地址。

  • 采用认证与加密功能

    应对伪造IP地址的网络安全功能以及防止线路窃听的功能(IPsec) 。

  • 多播、 Mobile IP成为扩展功能

    多播和Mobile IP被定义为IPv6的扩展功能。 由此可以预期, 曾在IPv4中难于应用的这两个功能在IPv6中能够顺利使用。

4.6.3 IPv6中IP地址的标记方法

如果将IPv6的地址像IPv4的地址一样用十进制数据表示的话, 是16个数字的序列(IPv4是4个数字的序列) 。 由于用16个数字序列表示显得有些麻烦, 因此, 将IPv6和IPv4在标记方法上进行区分。 一般人们将128比特IP地址以每16比特为一组, 每组用冒号(“: ”) 隔开进行标记。 而且如果出现连续的0时还可以将这些0省略, 并用两个冒号(“: : ”) 隔开。 但是, 一个IP地址中只允许出现一次两个连续的冒号。

4.6.4 IPv6地址的结构

Pv6类似IPv4, 也是通过IP地址的前几位标识IP地址的种类。

在互联网通信中, 使用一种全局的单播地址。 它是互联网中唯一的一个地址, 不需要正式分配IP地址。

限制型网络, 即那些不与互联网直接接入的私有网络, 可以使用唯一本地地址。 该地址根据一定的算法生成随机数并融合到地址当中,可以像IPv4的私有地址一样自由使用。

在不使用路由器或者在同一个以太网网段内进行通信时, 可以使用链路本地单播地址。

而在构建允许多种类型IP地址的网络时, 在同一个链路上也可以使用全局单播地址以及唯一本地地址进行通信。

在IPv6的环境下, 可以同时将这些IP地址全都配置在同1个NIC上,按需灵活使用。

4.6.5 全局单播地址

全局单播地址是指世界上唯一的一个地址。 它是互联网通信以及各个域内部通信中最为常用的一个IPv6地址。

全局单播地址的格式如图4.28所示。 现在IPv6的网络中所使用的格式为, n=48, m=16以及128-n-m=64。 即前64比特为网络标识, 后64比特为主机标识。

通常, 接口ID中保存64比特版的MAC地址的值。 不过由于MAC地址(称为IEEE EUI-64识别码。 ) 属于设备固有的信息, 有时不希望让对端知道。 这时的接口ID可设置为一个与MAC地址没有关系的“临时地址”。 这种临时地址通常随机产生, 并会定期更新。 因此, 从IPv6地址中查看定位设备变得没那么简单。 究竟会是哪种信息, 全由操作系统的具体装置决定(常被用作客户端的个人电脑中分配这种临时地址的情况多一些。 ) 。

4.6.6 链路本地单播地址

链路本地单播地址是指在同一个数据链路内唯一的地址。 它用于不经过路由器, 在同一个链路中的通信。 通常接口ID保存64比特版的MAC地址。

4.6.7 唯一本地地址

唯一本地地址是不进行互联网通信时所使用的地址。

设备控制的限制型网络以及金融机关的核心网等会与互联网隔离。为了提高安全性, 企业内部的网络与互联网通信时通常会通过NAT或网关(代理) 进行。 而唯一本地地址正是在这种不联网或通过NAT以及代理联网的环境下使用的。

唯一本地地址虽然不会与互联网连接, 但是也会尽可能地随机生成一个唯一的全局ID。 由于企业兼并、 业务统一、 效率提高等原因, 很有可能会需要用到唯一本地地址进行网络之间的连接。 在这种情况下, 人们希望可以在不改动IP地址的情况下即可实现网络的统一(全局ID不一定必须是全世界唯一的, 但是完全一致的可能性也不高。 ) 。

4.6.8 IPv6分段处理

IPv6的分片处理只在作为起点的发送端主机上进行, 路由器不参与分片。 这也是为了减少路由器的负荷, 提高网速。 因此, IPv6中的“路径MTU发现”功能必不可少。 不过IPv6中最小MTU为1280字节。 因此,在嵌入式系统中对于那些有一定系统资源限制(CPU处理能力或内存限制等。 ) 的设备来说, 不需要进行“路径MTU发现”, 而是在发送IP包时直接以1280字节为单位分片送出。

4.7 IPv4首部

■ 版本(Version)

由4比特构成, 表示标识IP首部的版本号。 IPv4的版本号即为4, 因此在这个字段上的值也是“4”。 关于IP版本的最新情况, 可以在以下网址发布的信息中查看:http://www.iana.org/assignments/version-numbers

■ 首部长度(IHL: Internet Header Length)

由4比特构成, 表明IP首部的大小, 单位为4字节(32比特) 。 对于没有可选项的IP包, 首部长度则设置为“5”。 也就是说, 当没有可选项时, IP首部的长度为20字节(4×5=20)

■ 区分服务(TOS: Type Of Service)

由8比特构成, 用来表明服务质量。

这个值通常由应用指定。 而且现在也鼓励这种结合应用的特性设定TOS的方法。 然而在目前, 几乎所有的网络都无视这些字段。 这不仅仅是因为在符合质量要求的情况下按其要求发送本身的功能实现起来十分困难, 还因为若不符合质量要求就可能会产生不公平的现象。因此, 实现TOS控制变得极其复杂。 这也导致TOS整个互联网几乎就没有被投入使用。 不过已有人提出将TOS字段本身再划分为DSCP和ECN两个字段的建议。

■ DSCP段与ECN段

DSCP(Differential Services Codepoint, 差分服务代码点) 是TOS(Type Of Service) 的一部分。 现在统称为DiffServ,用来进行质量控制。 如果3~5位的值为0, 0~2位则被称作类别选择代码点。 这样就可以像TOS的优先度那样提供8种类型的质量控级别。 对于每一种级别所采取的措施则由提供DiffServ的运营管理者制定。 为了与TOS保持一致, 值越大优先度也越高。 如果第5位为1, 表示实验或本地使用的意思

ECN(Explicit Congestion Notification, 显式拥塞通告) 用来报告网络拥堵情况, 由两个比特构成。 第6位的ECT(ECN-Capable Transport)用以通告上层TCP层协议是否处理ECN。 当路由器在转发ECN为1的包的过程中, 如果出现网络拥堵的情况, 就将CE位(Congenstion Experienced)设置为1。

■ 总长度(Total Length)

表示IP首部与数据部分合起来的总字节数。 该字段长16比特。 因此IP包的最大长度为65535(=216 ) 字节。 目前还不存在能够传输最大长度为65535字节的IP包的数据链路。 不过, 由于有IP分片处理, 从IP的上一层的角度看, 不论底层采用何种数据链路, 都可以认为能够以IP的最大包长传输数据。

■ 标识(ID: Identification)

由16比特构成, 用于分片重组。 同一个分片的标识值相同, 不同分片的标识值不同。 通常, 每发送一个IP包, 它的值也逐渐递增。 此外,即使ID相同, 如果目标地址、 源地址或协议不同的话, 也会被认为是不同的分片。

■ 标志(Flags)

由3比特构成, 表示包被分片的相关信息。

比特 含义
0 未使用。 现在必须是0。
1 指示是否进行分片(don't fragment) 0- 可以分片 1- 不能分片
2 包被分片的情况下, 表示是否为最后一个包(more fragment) 。 0- 最后一个分片的包 1- 分片中段的包

■ 片偏移(FO: Fragment Offset)

由13比特构成, 用来标识被分片的每一个分段相对于原始数据的位置。第一个分片对应的值为0。单位为8字节 。

■ 生存时间(TTL: Time To Live)

由8比特构成, 它最初的意思是以秒为单位记录当前包在网络上应该生存的期限。 然而, 在实际中它是指可以中转多少个路由器的意思。每经过一个路由器, TTL会减少1, 直到变成0则丢弃该包(TTL占8位,因此可以表示0~255的数字。 因此一个包的中转路由的次数不会超过28=256个。 由此可以避免IP包在网络内无限传递的问题。 ) 。

■ 协议(Protocol)

由8比特构成, 表示IP首部的下一个首部隶属于哪个协议。关于协议编号一览表的更新情况可以从以下网站获取:http://www.iana.org/assignments/protocol-numbers

■ 首部校验和(Header Checksum)

由16比特(2个字节) 构成, 也叫IP首部校验和。 该字段只校验数据报的首部, 不校验数据部分。 它主要用来确保IP数据报不被破坏。校验和的计算过程, 首先要将该校验和的所有位置设置为0, 然后以16比特为单位划分IP首部, 并用1补数(1补数 通常计算机中对整数运算采用2补数的方式。 但在校验和的计算中采用1补数运算方法。 这样做的优点在于即使产生进位也可以回到第1位, 可以防止信息缺失并且可以用2个0区分使用。 ) 计算所有16位字的和。 最后将所得到这个和的1补数赋给首部校验和字段。

■ 源地址(Source Address)

由32比特(4个字节) 构成, 表示发送端IP地址。

■ 目标地址(Destination Address)

由32比特(4个字节) 构成, 表示接收端IP地址。

■ 可选项(Options)

长度可变, 通常只在进行实验或诊断时使用。 该字段包含如下几点信息:

  • 安全级别
  • 源路径
  • 路径记录
  • 时间戳

■ 填充(Padding)

也称作填补物。 在有可选项的情况下, 首部长度可能不是32比特的整数倍。 为此, 通过向字段填充0, 调整为32比特的整数倍。

■ 数据(Data)

存入数据。 将IP上层协议的首部也作为数据进行处理。

4.8 IPv6首部格式

IPv6中为了减轻路由器的负担, 省略了首部校验和字段。因此路由器不再需要计算校验和, 从而也提高了包的转发效率。

此外, 分片处理所用的识别码成为可选项。 为了让64位CPU的计算机处理起来更方便, IPv6的首部及可选项都由8字节构成。

■ 版本(Version)

与IPv4一样, 由4比特构成。 IPv6其版本号为6, 因此在这个字段上的值为“6”。

■ 通信量类(Traffic Class)

相当于IPv4的TOS(Type Of Service) 字段, 也由8比特构成。 由于TOS在IPv4中几乎没有什么建树, 未能成为卓有成效的技术, 本来计划在IPv6中删掉这个字段。 不过, 出于今后研究的考虑还是保留了该字段。

■ 流标号(Flow Label)

由20比特构成, 准备用于服务质量(QoS: Quality Of Service) 控制。 使用这个字段提供怎样的服务已经成为未来研究的课题。 不使用QoS时每一位可以全部设置为0。

在进行服务质量控制时, 将流标号设置为一个随机数, 然后利用一种可以设置流的协议RSVP(Resource Reservation Protocol) 在路由器上进行QoS设置。 当某个包在发送途中需要QoS时, 需要附上RSVP预想的流标号。路由器接收到这样的IP包后先将流标号作为查找关键字, 迅速从服务质量控制信息中查找并做相应处理(采用QoS的路由器必须尽早转发所接受的包。 但是由于以何种质量发送包才合适还需要检索相应的质量控制信息, 因此有时可能会反而影响发送质量。 而流标号正是为“高速检索” 而是用的一种索引(Index) 。 它的值本身没有什么具体含义。 )。

此外, 只有流标号、 源地址以及目标地址三项完全一致时, 才被认为是一个流。

■ 有效载荷长度(Payload Length)

有效载荷是指包的数据部分。 IPv4的TL(Total Length) 是指包括首部在内的所有长度。 然而IPv6中的这个Playload Length不包括首部,只表示数据部分的长度。 由于IPv6的可选项是指连接IPv6首部的数据,因此当有可选项时, 此处包含可选项数据的所有长度就是Playload Length(该字段长度为16比特, 因此数据最大长度可达65535字节。 不过, 为了让更大的数据也能通过一个IP包发送出去, 便增加了大型有效载荷选项(Jumbo Payload Option) 。 该选项长度为32比特。 有了它IPv6一次可以发送最大4G字节的包。 ) 。

■ 下一个首部(Next Header)

相当于IPv4中的协议字段。 由8比特构成。 通常表示IP的上一层协议是TCP或UDP。 不过在有IPv6扩展首部的情况下, 该字段表示后面第一个扩展首部的协议类型。

■ 跳数限制(Hop Limit)

由8比特构成。 与IPv4中的TTL意思相同。 为了强调“可通过路由器个数”这个概念, 才将名字改成了“Hop Limit”。 数据每经过一次路由器
就减1, 减到0则丢弃数据。

■ 源地址(Source Address)

由128比特(8个16位字节) 构成。 表示发送端IP地址。

■ 目标地址(Destination Address)

由128比特(8个16位字节) 构成。 表示接收端IP地址

■ IPv6扩展首部

扩展首部通常介于IPv6首部与TCP/UDP首部中间。 在IPv4中可选项长度固定为40字节, 但是在IPv6中没有这样的限制。 也就是说, IPv6的扩展首部可以是任意长度。 扩展首部当中还可以包含扩展首部协议以及下一个扩展首部字段。

IPv6首部中没有标识以及标志字段, 在需要对IP数据报进行分片时, 可以使用扩展首部。

posted @ 2021-07-07 18:33  睿阳  阅读(1145)  评论(0编辑  收藏  举报