Java教程

IP协议

本文主要是介绍IP协议,对大家解决编程问题具有一定的参考价值,需要的程序猿们随着小编来一起学习吧!

概述

IP是TCP/IP协议族中的核心协议。所有的TCP、UDP、ICMP和IGMP数据都通过IP数据报传输。IP提供了一种尽力而为、无连接的数据报交付服务。

“尽力而为”表示不保证IP数据报能成功到达目的地。虽然IP不是简单丢弃所有不必要的流量,但它也不对自己尝试交付的数据报提供保证。当某些错误发生时,例如一台路由器临时用尽缓冲区,IP提供一个简单的错误处理方法:通常丢弃最后到达的数据报。任何可靠性都必须由上层提供。

“无连接”意味着IP不维护网络单元中数据报相关的任何链接状态信息,每个数据报独立于其他数据报来处理。这也意味着IP数据报可不按顺序交付。如果一台主机向同一目的地发送两个连续的数据报,每个数据报可以通过不同的路径,且数据报的交付顺序未必按照数据报的真实顺序。除此之外,数据报在传输的过程中也可能改变内容而导致错误。这就需要IP之上的一些协议来处理这些问题,以提供无差错的交付。

头部字段

IPv4的头部字段如下:

正常的IPv4头部大小为20字节,除非存在选项。其中,各字段的解释如下:

  • 版本:4位。包含IP数据包的版本号,IPv4为4,IPv6为6。
  • IHL:即头部长度(Internet Head Length),保存IPv4头部中32位字的数量,包括任何选项。由于其只有4位,因此IPv4的头部被限制为最多15个32位字,即60字节。
  • DS:即区分服务字段。用于数据转发的特殊处理。
  • ECN:即显示拥塞通知字段或指示位。用于数据转发的特殊处理。
  • 总长度:IPv4数据报的总长度,以字节为单位。当一个IPv4数据报被分为多个更小的片时,每个分片自身仍是一个独立的IP数据报,该字段反应具体的分片长度。由于其大小为16位,所以IPv4数据报的最大长度为65535字节(包括头部)。
  • 标识:帮助标识由IPv4主机发送的数据报。为了避免将一个数据报分片和其他数据报分片混淆,发送主机通常每次发送数据报时都将一个内部计数器加1,并将该计数器值复制到IPv4标识字段。
  • 生存期:即TTL字段。用于设置一个数据报可经过的路由器数量的上限。发送方将他初始化为某个值,每台路由器在转发数据报时将该值减1。当这个字段达到0时,该数据报被丢弃,并使用一个ICMP消息通知发送方。注意:这样操作带来的结果是必须重新计算头部检验和
  • 协议:其标识数据报有效载荷部分的数据类型。最常用的值为17(UDP)和6(TCP)。这提供了多路分解的功能,以便IP协议可用于携带多种协议类型的有效载荷。
  • 头部校验和:该字段仅计算IPv4头部。这意味着IP协议并不检查IPv4数据报有效载荷的正确性。为了确保IP数据报有效载荷部分已正确传输,其他协议必须通过自己的数据完整性检验机制来检查重要数据。

1. 校验和

Internet校验和是一个16位的数字和,它能以相当高的概率确定接收的信息或其中的部分内容是否与发送的相匹配。注意,Internet校验和算法与常见的循环冗余检验(CRC)不同,后者提供了更强的保护功能

为了给输出的数据报计算IPv4头部校验和,首先将数据报的校验和字段值设置为0。然后对头部计算16位二进制反码和。这个16位二进制反码被存储在校验和字段中。二进制反码加法可通过循环进位加法实现:当使用传统的二进制补码加法产生一个进位时,这个进位以二进制值1加在高位。

如下图,为发送方计算校验和的过程,其中,二进制反码和就是对于补码和的计算结果,将溢出的数据与余下的16位数据相加而得到的。

对于接收方而言,为了检查一个包含校验和字段的数据报是否有效,需要对整个数据块(包括校验和字段)同样计算校验和。由于校验和本质上是其他数据校验和的反码,对正确接收的数据计算校验和应产生一个值0,如下图所示。

当发现一个头部出错(计算的校验和不为0)时,IPv4实现将丢弃接受到的数据报。但是,不会生成差错信息。更高层以某种方式检测丢失的数据报,并在必要时重新传输。

2. DS和ECN

IPv4头部的第3和第4字段分别是DS(DiffServ)字段(区分服务)和ECN字段,用于支持Internet上不同类型的服务。以前这两个字段称为ToS字段。

其中,DS字段用来设置IP数据报的转发优先级。而ECN字段是一个数据报的拥塞标识符,其设计思路是:当一个被标记的分组被目的节点接收时,有些协议(例如TCP)会发现分组被标记并将这种情况通知发送方,发送方随后会降低发送速度,这样可以在路由器因过载而被迫丢弃流量之前缓解拥塞。

如下图所示,为以前的8位ToS字段的示意图:

各字段的含义如下:

  • 优先级:用于表示哪些分组具有更高优先级,较大的值意味着有更高的优先级。
  • D:用于表示延时(Delay),值为1时表示低延时。
  • T:用于表示吞吐量(Throughput),值为1时表示高吞吐量。
  • R:用于表示可靠性(Reliability),值为1时表示高可靠性。

优先级子字段值如下:

优先级名称 优先级名称
000 常规 100 瞬间覆盖
001 优先 101 严重
010 立即 110 网间控制
011 瞬间 111 网络控制

现在的DS和ECN字段的示意图如下:

其中,DS字段中的数字称为区分服务代码点(DSCP),特定的DSCP值可通知路由器对接收的数据报进行转发或特殊处理。DSCP的默认值通常为0,对应于常规的尽力而为的Internet流量。

DS字段中的前3位,即类别部分,是用于兼容早期ToS字段中的IP优先级子字段。也就是说,前3位用来表示IP数据报的转发级别,数值越大则优先级越高;而后2位用于表示IP数据报的丢弃优先级,数值越小则越容易丢弃。

IP转发

IP转发的过程如下:如果目的地是直接相连的主机(例如点对点链路)或共享网络(例如以太网),IP数据报直接发送到目的地,不需要或者不使用路由器。否则,主机将数据包发送到一台路由器,由该路由器将数据报交付到目的地。

很多主机即可以配置为主机,也可以配置为路由器。但是主机与路由器处理IP数据报的区别在于:主机不转发那些不是由它生成的数据报,但是路由器会这样做

除此之外,在网络层中还包括一些位于内存中的信息,通常称为路由表转发表。每次转发一个数据报时都需要从中查找信息。

1. 转发表

IP协议标准没有规定转发表所需要的精确数据,但是至少需要包含以下几个关键信息:

  • 目的地:32位字段,用于与一个掩码操作结果相匹配。
  • 掩码:32位字段,用作数据报目的IP地址按位与操作的掩码。
  • 下一跳:下一个IP实体的32位的IPv4地址,数据报将被转发到该地址。
  • 接口:包含一个由网络层使用的标识符,以确定将数据报发送到下一跳的网络接口。

IP转发逐跳进行,路由器和主机不包含任何目的地的完整转发路径。IP转发只提供数据报发送的下一跳实体的IP地址。

2. IP转发过程

当一台主机或路由器中的IP层需要向下一条路由器或主机发送一个数据报时,它首先检查数据报中的目的IP地址,其值为D。然后在转发表中使用该值来执行最长前缀匹配算法:

  1. 在表中搜索具有以下属性的所有条目:D^m=d,其中m是当前行的掩码字段值,d是当前行的目的字段值。即将目的IP地址D与每个转发表条目中的掩码执行按位与,并将该结果与同一转发条目中的目的地比较。如果满足,则该行与目标IP地址相匹配。且掩码中设置为1的位数越多,则说明匹配结果越好。
  2. 选择匹配结果最好的条目,即掩码中设置为1的位数最多的条目,并将该条目中的下一条字段作为转发数据报的下一条IP地址。
  3. 如果在转发表中没有发现匹配的条目,则这个数据报无法交付。如果在本地出现无法交付的数据报,通常会向生成数据报的应用程序返回一个“主机不可达”错误。在路由器上,通常通过ICMP消息返回给发送数据报的主机。

如图,为最长前缀匹配的过程示意:

IP数据报的主机处理

虽然路由器在转发分组时通常不会考虑将哪个IP地址放在分组的源IP地址和目的IP地址字段中,但主机必须考虑它们。应用程序可能尝试连接一台指定的主机或服务器,它们也可能有多个地址。因此,发送数据报时使用哪个地址和IP版本就是一个值得探讨的问题。

主机模式

确定一个单播数据报是否匹配一个主机的IP地址并被处理,取决于接收系统的主机模式,以及它是否为最相关的多宿主主机,这里存在两种主机模式:

  • 强主机模式:只有当目的IP地址字段中包含的IP地址与数据报到达的接口配置的IP地址匹配时,才同意把数据报交付到本地协议栈。
  • 弱主机模式:只要一个数据报携带的目的地址与它到达的任何接口的任何本地地址匹配,无论它到达哪个网络接口,它都会被接受的协议栈处理。

如图所示,在这个例子中,两台主机(A和B)通过全球Internet连接,同时也可以通过本地网络连接。

如果主机A设置为强主机模式,它从Internet接收到的一个目的地为203.0.113.1的分组(即图中红色线条所示),或从本地网路接口中接收到一个目的地为192.0.2.1的分组(如图中绿色线条所示),这些分组都会被丢弃,因为强主机模式只要目的IP地址与数据报到达端口的IP地址完全匹配时,才会将数据交付到本地协议栈,而这两个数据报都未曾交付到应该交付的端口中去。此时,如果主机B设置为弱主机模式,它可能选择使用本地网络向192.0.2.1发送分组,但是由于主机A设置的是强主机模式,因此主机A会丢弃该分组。

对于主机B而言,如果其设置为弱主机模式,则存在一定的安全性问题。例如,恶意用户在Internet中生成一个目的地址为203.0.113.2的分组,且可能其源地址为203.0.113.1,如果Internet将这个分组交付到主机B,此时主机B中运行的应用程序可能被欺骗,相信它接收的流量来源于主机A。因为弱主机模式是只要数据报携带的目的地址与其任一接口的地址相匹配,则接收数据报。这就会带来一定的安全隐患。

地址选择

当一台主机发送一个IP数据报时,必须决定将它的哪个IP地址写入源IP地址字段,如果知道目的主机有多个地址时,也必须决定使用目的地址的哪个地址。

在当前的IP实现中,数据报的源IP地址和目的IP地址字段中使用的IP地址,是通过一组称为源地址选择程序目的地址选择程序获得的。

默认的地址选择规则是优先在相同范围内选择成对的源/目的地址,优先选择更小而不是更大的范围以避免在其他地址可用时使用临时地址,以及优先选择具有更长的通用前缀的成对地址

默认地址选择通过一个策略表来控制,它存在于每台主机中。它是一个最长匹配前缀查找表,类似一IP路由使用的转发表

抓包分析

通过Wireshark抓取的IP数据报如下:

观察底部可知,该IP头部长度为20字节,为正常的IPv4头部大小。各对应字段如下:

  • 首先是4位的版本号,图中为4,表示IPv4数据报。
  • 然后是4位的头部长度,保存了IPv4头部中32位字的数量,如图其值为5,表示IPv4头部长度为5*32=160位=20字节。
  • Differentiated Services Field表示DS和ECN字段,其中第一行为DSCP,其默认值为0;第二行为ECN字段。
  • Total Length表示IP数据报总长度,其单位为字节,如图所示值为40,表示该数据报总长度为40字节,减去IP头部的20字节,那么数据部分的长度为20字节。
  • Identification表示标识字段,为发送数据报时的内部计数器,用以数据报分片识别,该数据报的值为25129。
  • Flags字段为标志字段。
  • Fragment Offset字段为分片偏移字段。
  • Time to Live字段为TTL字段,即数据报的生存期,如图该数据报的TTL值为49。每经过一个路由器转发数据报则该值减1,直到其值为0则丢弃数据报。
  • Protocol字段为协议字段,如图该IP数据报使用的传输层协议是TCP,其值为6。
  • Header Checksum字段为头部检验和字段,如图该数据报值为0xc1e2。
  • 最后两行分别是源IP地址和目的IP地址
这篇关于IP协议的文章就介绍到这儿,希望我们推荐的文章对大家有所帮助,也希望大家多多支持为之网!