第三章 IP协议
3.1 IP地址
IP协议是TCP/IP协议族中的核心协议。所有的TCP、UDP、ICMP、IGMP数据都是以IP数据报格式传输。IP协议为高层提供不可靠、无连接的数据报通信。
IP协议提供的不可靠服务是指它不能保证IP数据报能成功地到达目的地。IP协议仅提供尽可能好的服务。如果发生错误,例如某个路由器暂时用尽了缓冲区,IP协议有一个简单的错误处理算法:丢弃数据报,然后向该数据报的源地址对应的主机发送ICMP报文。任何要求的可靠性必须由上层来提供。
无连接是指IP协议并不维护任何关于后续数据报的状态信息。每个数据报的处理是相互独立的,IP数据报可以不按发送顺序接收。
网络中的每个独立主机的每个接口必须有一个唯一的Internet 地址,也称为IP地址。对于IPv4,IP地址长度为32位。IP地址按照层次结构划分成五类,如图3-1所示。
7位24位A类B类C类D类E类010110网络号14位主机号16位网络号21位主机号8位网络号28位主机号111011110多播组号27位保留图3-1 IP地址分类
32位的IP地址通常写成点分的四个十进制数,其中每个十进制整数对应一个字节,这种表示方法称为“点分十进制表示法(Dotted decimal notation)”。例如,某个系统是一个C类地址,它可以表示为192.192.192.6。
区分各类地址的最简单方法是检查地址的第一个十进制数。表3-1列出了各类地址的起止范围。
对于网络中的一些专用设备,例如路由器,它具有多个接口,其中每一个接口都对应一个对立的IP地址。
表3-1 各类IP地址的范围
类型 A B C D E 范围 0.0.0.0 到127.255.255.255 128.0.0.0 到191.255.255.255 192.0.0.0 到223.255.255.255 224.0.0.0 到239.255.255.255 240.0.0.0 到247.255.255.255
由于Internet网络中每个接口具有一个唯一的IP地址,因此必须有一个管理机构来分配IP地址,这个机构就是互连网络信息中心(Internet Network Information Centre),简称InterNIC。InterNIC只分配网络号,主机号的分配由本地的网络管理员负责。事实上,InterNIC由三部分组成:注册服务(rs.internic.net)、目录和数据服务(ds.internic.net)和信息服务(is.internic.net)。
按照通信方式来分类,IP地址分为三类:单播地址(目的地址为单个主机)、广播地址(目的地址为指定网络上的所有主机)和多播地址(目的地址为同一组中的所有主机)。后面章节将分别讨论广播和多播通信的细节。
3.2 IP报文格式
IP数据报的格式如图11-3所示。如果不含有选项字段,IP报头长度为20字节。图3-2中IP报头,最高位在左边,记为0bit;最低位在右边,记为31bit。
4个字节的32bit值以下面的次序传输:首先是0—7bit,其次是8—15bit,然后是16—23bit,最后是24—31bit。这种传输次序称作big endian字节序。由于TCP/IP报头中所有的二进制整数在网络中传输时都必须按照这种次序,因此又把它称作网络字节序。以其它形式存储二进制整数的机器,如little endian格式,在传输数据之前必须把报头转换成网络字节序。
0 15 16 31 4位 版本 4位首 部长度 8位服务类型(TOS) 3位标志 8位生存时间(TTL) 8位协议 16位首部检查和 16位总长度(字节数) 16位标识 13位偏移量 20 字节 32位源IP地址 32位目的IP地址 选项(如果有) 数据 图3-2 IP数据报格式及报头中的各个字段
? 版本号。目前IP协议的版本号为4,因此也称为IPv4。随着Internet网络的发展,出现了新版的IP协议,称为IPv6。
? 报头长度。报头长度指的是报头占32bit字的数量,包括任选项。由于它是一个4比特字段,因此报头最长为60个字节。对于一般数据报(没有任何任选项),该字段的值为5,即报头长度为20字节。
? 服务类型。服务类型(TOS)字段包括一个3比特的优先权子字段,4比特的TOS子字段和1比特未用位但必须置0。4比特的TOS分别表示:最小延迟、最大吞吐量、最高可靠性和最小费用。4比特只能将其中1位置1。如果所有4比特均为0,则表示一般的服务。RFC1340描述了所有的标准应用如何设置这些服务类型。RFC1349则对RFC1340进行了修正,
更加详细地描述了TOS的特性。表3-2列出了对不同的网络应用建议的TOS值。
表3-2 不同网络应用对应的TOS值
应用 Telnet/Rlogin FTP 控制 数据 任意块数据 TFTP SMTP 命令阶段 数据阶段 DNS UDP查询 TCP查询 区域传输 ICMP 差错 查询 任何IGP SNMP BOOTP NNTP 最小延迟 1 1 0 0 1 1 0 1 0 0 0 0 0 0 0 0 最大吞吐量 0 0 1 1 0 0 1 0 0 1 0 0 0 0 0 0 最高可靠性 0 0 0 0 0 0 0 0 0 0 0 0 1 1 0 0 最小费用 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 16进制值 0x10 0x10 0x08 0x08 0x10 0x10 0x08 0x10 0x00 0x08 0x00 0x00 0x04 0x04 0x00 0x02 Telnet和Rlogin这两个交互应用程序要求最小的传输延迟,它们主要用于传输少量的交互数据。另一方面,FTP文件传输服务则要求最大的网络吞吐量。网络管理(SNMP)和路由选择协议要求最高可靠性。用户网络新闻(NNTP, Usenet news)是要求最小费用的应用。
以前的TCP/IP实现绝大多数都不支持TOS特性。自从BSD4.3以后的新版系统都对它进行了设置;另外,新的路由协议如OSPF等 都能根据这些字段的值进行相应的路由决策。
? 总长度。总长度字段是指整个IP数据报的长度,以字节为单位。利用报头长度字段和总长度字段就可以判断IP数据报中数据部分的起始位置和长度。由于该字段长度为16比特,所以IP数据报的最大长度可达65536字节。当数据报被分段处理时,该字段的值也随着变化。
尽管IP支持传输一个长达65536字节的数据报,但是,大多数的数据链路层都会对它进行分段处理;而且,主机也要求不能接受超过576字节的数据报。由于TCP把用户数据报划分为若干段,因此一般来说这一点不会影响TCP的使用。另外大量使用UDP的应用(RIP, TFTP, BOOTP, DNS, SNMP等等),它们都限制用户数据报长度为512字节,小于576字节,因此IP的这种限制也不会影响UDP的使用。
总长度字段是IP报头中的必要内容,因为有些数据链路(如以太网)需要填充一些数据以满足最小长度的要求。尽管以太网的最小帧长为46字节,但是IP数据报可能更短。如果没有总长度字段,那么IP层就不知道46字节中有多少是IP数据报的内容,从而导致混乱。
? 标识字段。标识字段在分段中使用。一个数据报在通过不同网络的时候,可能被分段以适应不同网络帧的大小。当这种情况发生的时候,同一数据报的每个分段将在这个域
中使用一个相同的序列号来识别,标识字段唯一地标识主机发送的每一个数据报。通常每发送一个报文,其值自动加1。RFC791认为标识字段应该由让IP发送数据报的上层来选择。假设有两个连续的IP数据报,其中一个是由TCP生成的,而另一个是由UDP生成的,那么它们可能具有相同的标识字段值。尽管这样也可以正常工作(由重组算法来处理),但是在大多数从伯克利派生出来的系统中,每发送一个数据报,IP层都要把一个内核变量的值加1,不管交给IP的数据报来自哪一层。内核变量的初始值根据系统引导时的时间来设置。
? 标志字段。3位标志位的第一位没有使用,第二位为DF为,该位被置1表示不要分段,它命令路由器不要将数据报分段,因为目的端不能重组分段。第3位是MF位,该位被置1表示该分段后还有进一步的分段,除了最后一个分段外的所有分段都设置了这一位,它是用来标志是否所有分段都已到达。
? 分段偏移。分段偏移说明该分段在当前数据报的什么位置。分段偏移以8字节为单位,这样偏移量1对应字节号8,这样偏移量2对应字节号16,依此类推。假设网络的MTU(最大传输单位)为1400字节,因此,路由器将把到达的一个4000字节的报文分为3段,第一段有1400字节数据,分段偏移为0;第二段有1400字节数据,分段偏移为175;第二段有1200字节数据,分段偏移为350。
? 生存时间。TTL(time-to-live)生存时间字段设置了数据报可以经过的最多路由器数量,它指定了数据报的生存时间。TTL的初始值由源主机设置(通常为32或64),一旦经过一个处理该数据报的路由器,它的值就减去1。当该字段的值为0时,该数据报被丢弃,并发送ICMP报文通知源主机。
? 协议字段。IP使用协议字段对数据报进行分类,根据它的值可以确定是哪个协议向IP发送数据报。如TCP为6、UDP为17、ICMP为1。
? 报头检查和字段。报头检查和字段是根据IP报头计算的检查和,它不对报头后面的数据进行计算。ICMP、IGMP、UDP和TCP在它们各自的报头中均含有同时覆盖报头和数据的检查和。
为了计算一个数据报的IP检查和,首先把检查和字段置为0;然后,对报头中的每个16比特进行二进制反码求和(整个首部看成是由若干个16比特的字组成),然后取反,结果存放在检查和字段中。当收到一个IP数据报后,同样对报头中每个16比特进行二进制反码的求和。由于接收方在计算过程中包含了发送方存在报头的检查和,因此,如果报头在传输过程中没有发生任何差错,那么接收方计算的结果应该为全1。如果结果不是全1(即检查和错误),那么IP就丢弃该数据报,但不生成差错报文,由上层去发现丢失的数据报并进行重传。
ICMP、IGMP、TCP和UDP都采用相同的检查和算法,尽管TCP和UDP除了本身的报头和数据外,在IP报头中还包含不同的字段。RFC1071介绍了关于计算Internet检查和的实现技术。由于路由器经常修改TTL字段(减1),因此当路由器转发一个数据报时可以增加它的检查和,而不需要对IP整个报头重新计算。这里需要注意的是标准的BSD实现在转发数据报时并不是采用这种增加的方法。
? 源IP地址和目的IP地址。每个数据报都包含源IP地址和目的IP地址,它们的长度都是32比特。
? 任选项。最后一个字段是任选项,是数据报中一个可变长度的可选信息。当前,这些选项定义如下:
1. 安全和处理限制(用于军事领域,详见RFC1108) 2. 记录路径(让每个路由器都记下该数据报的IP地址) 3. 时间戳(让每个路由器都记下该数据报的IP地址和时间) 4. 宽松的源站选路(为数据报指定一系列必须经过的IP地址)
5. 严格的源站选路(为数据报指定一系列必须经过的IP地址,但是要求只能经
过指定的这些地址,不能经过其他地址)
这些选项很少使用,并非所有的主机和路由器都支持这些选项。
选项字段都是以32比特作为界限,在必要的时候插入值为0的填充字节,这样就能保证IP首部始终是32比特的整数倍(这是首部长度字段要求的)。
3.3 IP路由
3.3.1 IP路由选择
对于网络中的主机来说,IP路由选择是很简单的。如果目的主机和源主机直接相连(点对点链路)或都在一个共享网络上(以太网或令牌环),那么IP数据报就直接送到目的主机上。否则,主机把数据报发往一个默认的路由器上,由该路由器负责转发该数据报。大多数主机都采用这种简单机制进行路由选择。
当今大多数多用户系统,包括几乎所有的Unix系统,都可以配置成路由器。我们可以为它指定主机和路由器都可以使用的简单路由算法。本质上的区别在于主机从不把数据报从一个接口转发到另一个接口,而路由器的主要功能是转发数据报。
在一般情况下,IP可以从IGMP、ICMP、TCP和UDP接收数据报(由本地主机上的高层产生的数据报)并进行发送,或者从一个网络接口接收数据报并进行发送。IP层在内存中维持一个路由表。当收到一个数据报并进行转发时,它都要对该路由表搜索一次。当数据报来自某个网络接口时,IP首先检查目的IP地址是否为本机的IP地址之一或者IP广播地址。如果是这样,该数据报就被送到由IP报头协议字段所指定的协议模块进行处理;否则,如果IP层被设置为路由器功能,那么就对数据报进行转发,如果IP层没有被设置为路由器功能,该数据报被丢弃。
路由表中的每一行都包含下面信息:
● 目的IP地址。它既可以是一个完整的主机地址,也可以是一个网络地址,由该表中的标志字段来指定。主机地址有一个非0的主机号,以指定某一特定的主机,而网络地址中的主机号为0,以指定网络中的所有主机。
● 下一跳路由器(next-hop router)的IP地址,或者有直接相连的网络IP地址。下一跳路由器是指一个在直接相连网络上的路由器,通过它可以转发数据报。下一跳路由器通常不是最终的目的,但是它可以把数据报转发到最终目的。
● 标志。其中一个标志指明目的IP地址是网络地址还是主机地址;另一个标志指明下一跳路由器是否为真正的下一跳路由器,还是一个直接相连的接口。
● 为数据报的传输指定一个网络接口。
IP路由选择是逐跳(hop-by-hop)进行的。从路由表信息可以看出,IP并不知道到达任何目的地址的完整路径(除了那些与主机直接相连的目的地址)。所有的IP路由选择只为数据报传输提供下一跳路由器的IP地址。它假定下一跳路由器相对发送数据报的主机更接近目的地址,而且下一跳路由器与该主机是直接相连的。
IP路由选择主要完成以下功能:
1. 检索路由表,寻找能与目的IP地址完全匹配的表项(网络号和主机号都要匹配)。如果找到,则把数据报发送给该表项指定的下一跳路由器或直接连接的网络接口(由标志字段值决定)。
2. 检索路由表,寻找能与目的网络号相匹配的表项。如果找到,则把数据报发送给该表项指定的下一跳路由器或直接连接的网络接口(由标志字段值决定)。目的网络上的所有