TCP/IP详解03-网络层:IP:网际协议

TCP/IP详解03-网络层:IP:网际协议

IP是 TCP/IP 协议族中最为核心的协议。所有的 TCP、UDP、ICMP及 IGMP 数据都以 IP 数据报格式传输。IP 提供不可靠、无连接的数据报传送服务。

不可靠(unreliable)的意思是它不能保证 IP 数据报能成功地到达目的地。IP 仅提供最好的传输服务。如果发生某种错误时,如某个路由器暂时用完了缓冲区,IP有一个简单的错误处理算法:丢弃该数据报,然后发送 ICMP 消息报给信源端。—任何要求的可靠性必须由上层来提供(如TCP)。

无连接(connectionless)这个术语的意思是 IP 并不维护任何关于后续数据报的状态信息。每个数据报的处理是相互独立的。这也说明,IP 数据报可以不按发送顺序接收。如果一信源向相同的信宿发送两个连续的数据报(先是 A,然后是B),每个数据报都是独立地进行路由选择,可能选择不同的路线,因此 B可能在A到达之前先到达。

1. IP 首部

这里写图片描述

选项说明
4位版本(version)IP协议版本号, IPv4此字段值为4, IPv6此字段值为6
4位首部长度(header length)是指包括任何选项在内的整个IP首部的32位字长度。取值范围5(0101)~15(1111), 单位为4字节,包括固定部分(20字节)和可选部分, 因此首部最长为60字节, 最短为20字节(不包括选项和填充部分)。
8位服务类型历史性的8位服务类型字段已被替换为两个字段:6位区分服务码点(Differentiated Services Code Point,DSCP)和2位显示拥塞通知(Explicit Congestion Notification,ECN)
16位总长度(total length)该字段长度为16位, 以字节为单位, 总长度包含IP的头部和数据部分, IP数据报最大长度为65535字节, 但是注意最大不要超过MTU的长度。
当数据报被分片时,该字段的值也随着变化。
利用首部长度字段和总长度字段,就可以知道 IP数据报中数据内容的起始位置和长度。
本字段是必需的,因为有些数据链路要求把帧垫补成某个最小长度(例如以太网),因而有效IP数据报的大小有可能小于数据链路的最小长度
16位标识(identification)该字段由Ip模板为每个IP数据报设置成不同的值,用于分片和重组。
如果分组不会被分片(如设置了DF位),那么就不需要设置此字段。
3位标志3位标志中第一位不使用,
第二位为DF(Don`t Fragment不分片), 如果该位为1, 并且传输的数据报超过最大传输单元(MTU), 则该数据报会被丢弃, 并发送一个ICMP差错报文;
第三位MF(More Fragment更多分片),表示是否有更多的分片, 如果该位为1, 则说明后续还有分片, 最后一片MF为0
13位片段偏移(fragment offset)用以指出该分段的第一个数据字节在原始数据报中的偏移位置(以8字节为单位),IP分片后每一个分组都具有自己的首部, 而且标志位相同, 但是片偏移值不同, 通过片偏移值接收端可以重新组装IP包
8位存活时间(time-to-live,TTL)该字段由本IP数据报的发送者设置,表示数据报最多可经过的路由器的数量. 取值0~255,每经过一个路由器, TTL值减1,为0时被丢弃, 并发送ICMP报文通知源主机, TTL可以避免数据报在路由器之间不断循环(Tranceroute程序的实现原理)
8位协议(protocol)指明IP层上承载的是哪个高级协议, 在分用的过程中, 协议栈知道该交给上层的哪个协议处理, 如1为ICMP, 2为IGMP, 6为TCP, 17为UDP等.
16位首部校验和(header checksum)只对IP首部(包括任何选项)进行计算,不包括数据部分。
这样做的目的有二:
一是所有将数据封装在IP数据包中的高层协议均含有覆盖整个数据的校验和,因此IP数据报没有必要再对其所承载的数据部分进行校验。
二是每经过一个路由器,IP数据报的头部要发生改变(如TTL),而数据部分不变,这样只对发生改变的头部进行校验,显然不会浪费太多的时间。为了减少计算时间,一般不用CRC校验码,而是采用更简单的网际校验和(Internet Checksum)。
选项与填充增加首部的可变部分是为了增加IP数据报的功能, 如支持排错, 测量以及安全等, 选项长度从1到40字节不等, 取决于所选择的项目(选项为4字节整数倍,否则用0填充); 但这样就增加了每一个路由器处理数据的开销, 实际上这些选项很少被使用, 很多路由器都并不考虑IP首部的选项字段;

首部校验和

IP 只对IP首部(包括任何选项)进行计算,不包括数据部分。ICMP、IGMP、UDP 和 TCP 在它们各自的首部中均含有同时覆盖首部和数据检验和码。

为了计算一份数据报的 IP 检验和,首先把检验和字段置为 0。然后,对首部中每个 16 bit 进行二进制反码求和(整个首部看成是由一串 16 bit 的字组成),结果存在检验和字段中当收到一份 IP 数据报后,同样对首部中每个 16 bit 进行二进制反码的求和。由于接收方在计算过程中包含了发送方存在首部中的检验和,因此,如果首部在传输过程中没有发生任何差错,那么接收方计算的结果应该为全 1。如果结果不是全 1(即检验和错误),那么 IP 就丢弃收到的数据报。但是不生成差错报文,由上层去发现丢失的数据报并进行重传。

2. IP地址相关知识

IP地址的编址方法,共经历了三个历史阶段。这三个阶段是:

  • 1)分类的 IP 地址。这是最基本的编址方法;
  • 2)划分子网。这是对最基本的编址方法的改进;
  • 3)构成超网。这是比较新的无分类编址方法,提出后很快得到推广, 并沿用至今;

IP路由选择

路由表中的每一项都包含下面这些信息:

  • 目的IP地址。它既可以是一个完整的主机地址,也可以是一个网络地址,由该表目中的标志字段来指定(如下所述)。主机地址有一个非0的主机号,以指定某一特定的主机,而网络地址中的主机号为0,以指定网络中的所有主机(如以太网,令牌环网)。
  • 下一站(或下一跳)路由器( next-hop router)的IP地址,或者有直接连接的网络 IP 地址。下一站路由器是指一个在直接相连网络上的路由器,通过它可以转发数据报。下 一站路由器不是最终的目的,但是它可以把传送给它的数据报转发到最终目的。
  • 标志。其中一个标志指明目的 IP 地址是网络地址还是主机地址另一个标志指明下一站路由器是否为真正的下一站路由器,还是一个直接相连的接口(我们将在 9.2节中详细介绍这些标志)。
  • 为数据报的传输指定一个网络接口。

IP路由选择是逐跳地(hop-by-hop)进行的。

IP路由选择主要完成以下这些功能:

  • 1) 搜索路由表,寻找能与目的 IP 地址完全匹配的表目(网络号和主机号都要匹配)。如果找到,则把报文发送给该表目指定的下一站路由器或直接连接的网络接口(取决于标志字段的值)。
  • 2) 搜索路由表,寻找能与目的网络号相匹配的表目。如果找到,则把报文发送给该表目指定的下一站路由器或直接连接的网络接口(取决于标志字段的值)。目的网络上的所有主机都可以通过这个表目来处置。例如,一个以太网上的所有主机都是通过这种表目进行寻径的。这种搜索网络的匹配方法必须考虑可能的子网掩码。
  • 3) 搜索路由表,寻找标为“默认( default)”的表目。 如果找到, 则把报文发送给该表目指定的下一站路由器。
  • 4) 如果上面这些步骤都没有成功,那么该数据报就不能被传送。如果不能传送的数据报来自本机,那么一般会向生成数据报的应用程序返回一个“主机不可达”或“网络不可达”的错误。

完整主机地址匹配在网络号匹配之前执行。只有当它们都失败后才选择默认路由。 默认路由,以及下一站路由器发送的 ICMP 间接报文(如果我们为数据报选择了错误的默认路由),是IP路由选择机制中功能强大的特性。

为一个网络指定一个路由器,而不必为每个主机指定一个路由器,这是 IP 路由选择机制的另一个基本特性。这样做可以极大地缩小路由表的规模。

2.1 分类的 IP 地址

这里写图片描述

IP分类

为了适应不同网络规模的需求,将IP地址进行分类,不同类型IP地址拥有的主机数不一样。两级的 IP 地址可以记为:

IP 地址 ::= { <网络号>, <主机号>}
特殊情况的 IP 地址

现在介绍 7个特殊的 IP 地址,如下图所示。在这个图中,0表示所有的比特位全为0;-1表示所有的比特位全为 1;netid、subnetid 分别表示不为全 0 或全 1 的对应字段。子网号栏为空表示该地址没有进行子网划分。

这里写图片描述

  • 表中的头两项是特殊的源地址,网络号为 0,如主机使用BOOTP协议确定本机IP地址时只能作为初始化过程中的源地址出现。
  • 中间项是特殊的环回地址,没有进行子网划分。
  • 最后四项是广播地址。【后续补充第12章】
IP地址的重要特点
  • 1)IP 地址是一种分等级的地址结构。分两个等级的好处是:
    • a. IP 地址管理机构在分配 IP 地址时只分配网络号,而剩下的主机号则由得到该网络号的单位自行分配。这样就方便了 IP 地址的管理。
    • b. 路由器仅根据目的主机所连接的网络号来转发分组(而不考虑目的主机号), 这样就可以使路由表中的项目数大幅度减少,从而减小了路由表所占的存储空间。
  • 2)实际上 IP 地址是标志一个主机/路由器和一条链路的接口。
    • 当一个主机同时连接到两个网络上时,该主机就必须同时具有两个IP 地址,其网络号 net-id 必须是不同的; 由于一个路由器至少应当连接到两个网络(这样它才能将 IP 数据报从一个网络转发到另一个网络),因此一个路由器至少应当有两个不同的 IP 地址。
  • 3)用转发器或网桥连接起来的若干个局域网仍为一个网络,因此这些局域网都具有同样的网络号 net-id。
  • 4)所有分配到net-id 的网络, 无论是范围很小的局域网,还是覆盖很大地理范围的广域网,都是平等的。

2.2 划分子网

一个拥有许多物理网络的单位,可将所属的物理网络划分为若干个子网。划分子网纯属一个单位内部的事情。本单位以外的网络看不见这个网络是由多少子网组成,因为这个单位对外仍然表现一个网络。

划分子网的方法是从网络的主机号借用若干位作为子网号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(最常见)

不同的子网掩码可以得出相同的网络地址, 但不同的掩码的效果是不同的.

这里写图片描述
上图是一个B类地址的两种不同的子网掩码格式。

变长子网

这里写图片描述

背景:如上图所示,问题是我们在子网 13 中有两个分离的网络:一个以太网和一个点对点链路(硬件连接的 SLIP 链路)(点对点链接始终会带来问题,因为它一般在两端都需要 IP 地址)。将来或许会有更多的主机和网络,但是为了不让主机跨越不同的网络就得使用不同的子网号。

把子网号从 8 bit扩充到 11 bit,把主机号从 8 bit 减为 5 bit。这就叫作变长子网,因为 140.252 网络中的大多数子网都采用 8 bit 子网掩码,而我们的子网却采用 11 bit 的子网掩码。作者子网中的IP地址结构如下图所示,11 位子网号中的前 8 bit 始终是 13。在剩下的3 bit 中,我们用二进制 001 表示以太网,010 表示点对点 SLIP 链路。

140.252.13子网中的所有接口的子网掩码是 255.255.255.224,或0xffffffe0。从而将作者所在的子网140.252.13进一步划分为140.252.13.64 和 140.252.13.32 。

这里写图片描述

2.3 构成超网:无类型域间选路(CIDR)

无类型域间选路(CIDR:Classless InterDomain Routing)是在变长子网掩码的基础上提出的一个消除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查找路由表的方法: 为了进行更加有效地查找最长前缀匹配, 通常是将无分类编址的路由表存放在一种层次的数据结构中, 然后自上而下地按层次进行查找, 这就是最常用的二叉线索;

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值