计算机网络 -- IP 协议

引言

IP 是 TCP/IP 协议族中最为核心的协议,所有的TCP、UDP、ICMP及IGMP数据都以IP数据报格式传输,并且IP向上层提供不可靠、无连接的数据传送服务,不可靠(unreliable)的意思是它不能保证IP数据报能成功的到达目的地。IP仅提供最好的传输服务。如果发生某种错误时,如某个路由器暂时用完了缓冲区,IP有一个简单的错误处理算法:丢弃该数据报,然后发送ICMP消息报给信源端。任何要求的可靠性必须由上层来提供(如TCP)。无连接(connectionless)这个术语的意思是IP并不维护任何关于后续数据报的状态信息。每个数据报的处理的相互独立的。这也说明,IP数据报可以不按发送顺序接收。如果一信源向相同的信宿发送两个连续的数据报(先是A,然后是B),每个数据报都是独立地进行路由选择,可能选择不同的路线,因此B可能在A到达之前先到达。

IP首部

IP数据报的格式如下图所示。普通的IP首部长为 20 字节,除非含有选项字段。

ip-header

版本

占4位,表示IP协议的版本。通信双方使用的IP协议版本必须一致。目前广泛使用的IP协议版本号是 4,即 IPv4.

首部长度

占4位,可表示的最大十进制数值是 15。这个字段所表示数的单位是 32 位字长(1个32位字长时4字节)。因此,当IP的首部长度为 1111 时(即10进制的15),首部长度就达到60字节。当IP分组的首部长度不是4字节的整数倍时,必须利用最后的填充字段加以填充。数据部分永远在4字节的整数倍开始,这样在实现IP协议时较为方便。首部长度限制为60字节的缺点是,长度有时可能不够用,之所以限制长度为60字节,是希望用户尽量减少开销。最常用的首部长度就是20字节(即首部长度为 0101)。

区分服务(tos)

也被称为服务类型,占8位,包括一个3bit的优先权子字段(现已被忽略),4bit的TO S子字段和1bit未用位但必须置0.4bit的TOS分别代表:最小时延、最大吞吐量、最高可靠性和最小费用。4bit中只能置其中1bit。如果所有的4bit均为0,那么就意味着是一般服务。

总长度 (totlen)

首部和数据之和,单位为字节,总长度字段为16位,因此数据报的最大长度为 2^16 - 1 = 65535 字节。 尽管可以传送一个65535字节的IP数据报,但是大多数的链路层都会对它进行切片。而且,主机也要求不能接收超过576字节的数据报。由于TCP把用户数据分成若干片,因此一般来说这个限制不会影响TCP。

标识(identification)

用来标识数据报,占16位。IP协议在存储器中维持一个计数器。每产生一个数据报,计数器就加 1,并将此值赋值给标识字段。当数据报的长度超过网络的 MTU,而必须分片时,这个标识字段的值就被复制到所有的数据报的标识字段中。具有相同的标识字段值的分片报文会被重组成原来的数据报。

标志(flag)

占3位,第一位未使用,其值为0,第二位称为DF(不分片),表示是否允许分片。取值为0时,表示允许分片;取值为1时,表示不允许分片。第三位称为MF(更多分片),表示是否还有分片正在传输,设置为0时,表示没有更多分片需要发送,或数据报没有分片。

片偏移(offsetfrag)

占13位,当报文被分片后,该字段标记该分片在原报文中的相对位置。片偏移以8个字节为偏移单位。所以,除了最后一个分片,其他分片的偏移量都是8字节(64位)的整数倍。

生存时间(TTL)

表示数据报在网络中的寿命,占8位。该字段由发出数据报的源主机设置。其目的是防止无法交付的数据报无限的在网络中传输,从而消耗网络资源。 路由器在转发数据报之前,先把TTL值减1,若TTL值减少到0,则丢弃这个数据报,不再转发。因此,TTL指明数据报在网络中最多可经过多少路由器。TTL的最大数值为255.若把TTL的初始值设置为1,则表示这个数据报只能在本局域网中传送。

协议

表示该数据报文所携带的数据使用的协议类型,占8位。该字段可以方便目的主机的IP层知道按照什么协议来处理数据部分。不同的协议有专门不同的协议号。

例如:TCP的协议号是6,UDP的协议号是17,ICMP的协议号是1。

首部检验和(checksum)

用于校验数据报的首部,占16位。数据报每经过一个路由器,首部的字段都可能发生变化(如TTL),所以需要重新校验。而数据部分不发生变化,所以不用重新生成校验值。

源地址

表示数据报的源IP地址,占32位

目的地址

表示数据报的目的IP地址,占32位。该字段用于校验发送是否正确。

可选字段

该字段用于一些可选的报头设置,主要用于测试、调试和安全的目的。这些选项包括严格源路由(数据报必须经过指定的路由)、网际时间戳(经过每个路由器时的时间戳记录)和安全限制

填充

由于可选字段中的长度不是固定的,使用若干个0填充该字段,可以保证整个报头的长度是32位的整数倍。

数据部分

表示传输层的数据,如保存TCP,UDP,ICMP或IGMP的数据,数据部分的长度不固定。

IP路由选择

从概念上说,IP路由选择是简单的,特别对于主机来说。如果目的主机与源主机直接相连(如点对点链路)或都在一个共享网络上(以太网或令牌环网),那么IP数据报就直接送到目的主机上。否则,主机把数据报发往一默认的路由器上,由路由器来转发该数据报。大多数的主机都是采用这种简单机制。

IP层既可以配置成路由器的功能,也可以配置成主机的功能。当今的大多数多用户系统,包括几乎所有的Unix系统,都可以配置成一个路由器。我们可以为它指定主机和路由器都可以使用的简单路由算法。本质上的区别在于主机从不把数据报从一个接口转发到另一个接口,而路由器则要转发数据报。内含路由器功能的主机应该从不转发数据报,除非它被设置成那样。

在一般的体制中,IP可以从TCP、UDPICMP和IGMP接收数据报(即在本地生成的数据报)并进行发送,或者从一个网络接口接收数据报(待转发的数据报)并进行发送。IP层在内存中有一个路由表。当收到一份数据报并进行发送时,它都要对该表搜索一次。当数据报来自某个网络接口时,IP首先检查目的IP地址是否为本机的IP地址之一或者IP广播地址。如果确实是这样,数据报就被送到由IP首部协议字段所指定的协议模块进行处理。如果数据包的目的地不是这些地址,那么:

  1. 如果IP层被设置为路由器的功能,那么就对数据报进行转发(也就是说,像下面对待发出的的数据报一样处理);
  2. 数据报被丢弃。

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

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

IP路由选择是逐跳地(hop-by-hop)进行的。从这个路由表信息可以看出,IP并不知道任何目的的完整路径(当然,除了那些与主机直接相连的目的)。所有的IP路由选择只为数据包传输提供下一站路由器的IP地址。它假定下一跳路由器比发送数据包的主机更接近目的,而且下一跳路由器与该主机是直接相连的。

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

  1. 搜索路由表,寻找能与目的IP地址完全匹配的表目(网络号和主机号都要匹配)。如果找到,则把报文发送给该表目指定的下一跳路由器或者直接连接的网络接口(取决于标志字段的值)。
  2. 搜索路由表,寻找能与目的网络号相匹配的表目,如果找到,则把报文发送给该表目指定的下一站路由器或直接连接的网络接口(取决于标志字段的值)。目的网络上的所有主机都可以通过这个表目来处置。例如,一个以太网上的所有主机都是通过这种表目进行寻径的。这种搜索网络的匹配方法必须考虑可能的子网掩码。关于这一点我们在下一节中进行讨论。
  3. 搜索路由表,寻找标为“默认(default)”的表目。如果找到,则把报文发送给该表目指定的下一站路由器。如果上面这些步骤都没有成功,那么该数据报就不能被传送。

如果不能传送的数据报来自本机,那么一般会向生成数据报的应用程序返回一个“主机不可达”或“网络不可达”的错误。

Licensed under CC BY-NC-SA 4.0
皖ICP备20014602号
Built with Hugo
Theme Stack designed by Jimmy