IP是TCP/IP协议族中的核心协议。所有的TCP、UDP、ICMP和IGMP数据都通过IP数据报传输。IP提供了一种尽力而为、无连接的数据报交付服务。
“尽力而为”表示不保证IP数据报能成功到达目的地。虽然IP不是简单丢弃所有不必要的流量,但它也不对自己尝试交付的数据报提供保证。当某些错误发生时,例如一台路由器临时用尽缓冲区,IP提供一个简单的错误处理方法:通常丢弃最后到达的数据报。任何可靠性都必须由上层提供。
“无连接”意味着IP不维护网络单元中数据报相关的任何链接状态信息,每个数据报独立于其他数据报来处理。这也意味着IP数据报可不按顺序交付。如果一台主机向同一目的地发送两个连续的数据报,每个数据报可以通过不同的路径,且数据报的交付顺序未必按照数据报的真实顺序。除此之外,数据报在传输的过程中也可能改变内容而导致错误。这就需要IP之上的一些协议来处理这些问题,以提供无差错的交付。
IPv4的头部字段如下:
正常的IPv4头部大小为20字节,除非存在选项。其中,各字段的解释如下:
Internet校验和是一个16位的数字和,它能以相当高的概率确定接收的信息或其中的部分内容是否与发送的相匹配。注意,Internet校验和算法与常见的循环冗余检验(CRC)
不同,后者提供了更强的保护功能。
为了给输出的数据报计算IPv4头部校验和,首先将数据报的校验和字段值设置为0。然后对头部计算16位二进制反码和。这个16位二进制反码被存储在校验和字段中。二进制反码加法可通过循环进位加法
实现:当使用传统的二进制补码加法产生一个进位时,这个进位以二进制值1加在高位。
如下图,为发送方计算校验和的过程,其中,二进制反码和
就是对于补码和的计算结果,将溢出的数据与余下的16位数据相加而得到的。
对于接收方而言,为了检查一个包含校验和字段的数据报是否有效,需要对整个数据块(包括校验和字段)同样计算校验和。由于校验和本质上是其他数据校验和的反码,对正确接收的数据计算校验和应产生一个值0,如下图所示。
当发现一个头部出错(计算的校验和不为0)时,IPv4实现将丢弃接受到的数据报。但是,不会生成差错信息。更高层以某种方式检测丢失的数据报,并在必要时重新传输。
IPv4头部的第3和第4字段分别是DS(DiffServ)
字段(区分服务)和ECN
字段,用于支持Internet上不同类型的服务。以前这两个字段称为ToS
字段。
其中,DS字段用来设置IP数据报的转发优先级。而ECN字段是一个数据报的拥塞标识符,其设计思路是:当一个被标记的分组被目的节点接收时,有些协议(例如TCP)会发现分组被标记并将这种情况通知发送方,发送方随后会降低发送速度,这样可以在路由器因过载而被迫丢弃流量之前缓解拥塞。
如下图所示,为以前的8位ToS字段的示意图:
各字段的含义如下:
延时(Delay)
,值为1时表示低延时。吞吐量(Throughput)
,值为1时表示高吞吐量。可靠性(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协议标准没有规定转发表所需要的精确数据,但是至少需要包含以下几个关键信息:
IP转发逐跳进行,路由器和主机不包含任何目的地的完整转发路径。IP转发只提供数据报发送的下一跳实体的IP地址。
当一台主机或路由器中的IP层需要向下一条路由器或主机发送一个数据报时,它首先检查数据报中的目的IP地址,其值为D。然后在转发表中使用该值来执行最长前缀匹配
算法:
如图,为最长前缀匹配的过程示意:
虽然路由器在转发分组时通常不会考虑将哪个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头部大小。各对应字段如下: