IP数据报

IP(Internet Protocol)是TCP/IP协议族中的核心协议,所有TCP、UDP、ICMP和IGMP数据都通过IP数据报传输。在Internet中它是能使连接到网络上的所有设备实现相互通信的一套规则,它提供了一种尽力而为、无连接的数据报交付服务。“尽力而为”的含义是不保证IP数据报能成功到达目的地,任何可靠性必须由上层(例如TCP)提供;“无连接”意味着IP不维护网络单元(即路由器)中数据报相关的任何链接状态信息。

IP数据报头部

正常的IPv4数据报头部大小为20字节,除非存在选项(少见),而IPv6数据报头部长度固定为40字节,不存在选项,但IPv6数据报可以有扩展头部,可提供类似功能。IP数据报按高位优先字节序进行传输,这也是TCP/IP头部中所有二进制整数在网络中传输时遵循的字节顺序,因此它也被称为网络字节序。

IP头部字段

IPv4和IPv6的第一个字段是4位的版本字段,它包含IP数据报的版本号:IPv4为4,IPv6为6。IPv4头部和IPv6头部除版本字段位置相同外再无其他是一样的。因此,这两个协议不能直接互操作,主机或路由器必须分别处理IPv4或IPv6(或两者,称为双栈)。
IPv4的因特网头部长度(Internet Head Length,IHL)字段保存IPv4头部中32位字的数量。由于它是一个4位的字段,所以IPv4头部被限制为最多15个32位字,即60字节。IPv6中不存在这个字段,其头部长度固定为40字节。最初的规范指定了一个8位的服务类型(ToS)字段,由于它们从来没被广泛使用,因此最终将其分成两个部分:6位的区分服务字段(DS)和2位的显式拥塞通知(ECN)字段,这些字段被用于数据报转发时的特殊处理。
IPv4的总长度字段表示IPv4数据报的总长度(以字节为单位)。通过这个字段和IHL字段就可以知道数据报的数据部分是从哪里开始,以及它的长度。由于一些携带IPv4数据报的低层协议不能精确地表达自己封装的数据报大小,所以需要给出总长度字段。因为它是一个16位的字段,所以IPv4数据报的最大长度(包括头部)为65536字节。尽管可发送一个65536字节的IP数据报,但大多数链路层不能携带这么大的数据,除非将它拆分成更小的片。当一个IPv4数据报被分为多个更小的分片时,每个分片自身仍是一个独立的IP数据报,总长度字段反映具体的分片长度。IPv6头部不支持分片,其长度可由负载长度字段获得,这个字段提供IPv6数据报长度,不包括头部长度,但包括扩展头部,因此IPv6的负载长度限制为64KB。
IPv4的标识字段帮助标识由IPv4主机发送的数据报。为了避免将一个数据报分片和其他数据报分片混淆,发送主机通常在每次(从它的一个IP地址)发送数据时都将一个内部计数器加1,并将该计数器值复制到标识字段。在IPv6中,这个字段位于分片扩展头部中。
生存期(TTL)字段用于设置一个数据报可经过的路由器数量的上限。每台路由器在转发数据报时将该值减1,当这个字段值达到0时该数据报被丢弃,并使用一个ICMP消息通知发送方。这可以防止由于出现不希望的路由环路而导致数据报在网络中永远循环。
IPv4头部中的协议字段包含一个数字,表示数据报有效载荷部分的数据类型。最常用的是17(UDP)和6(TCP)。这提供了多路分解的功能,以便IP协议可用于携带多种协议类型的有效载荷。在IPv6头部中,“下一个头部”字段给出了IPv4中的协议字段,它用于指出IPv6头部之后的头部类型。
头部校验和字段仅存在于IPv4头部中,且仅计算头部,这意味着IP协议不检查有效载荷的正确性。为了确保IP数据报的有效载荷部分已正确传输,其他协议必须通过自己的数据完整性检验机制来检查重要数据。封装在IP中的几乎所有协议(ICMP、IGMP、TCP和UDP)在自己头部中都有一个涵盖其头部和数据的校验和,也涵盖它们认为重要的IP头部的某些部分(一种“违反分层”的形式)。
每个IP数据报都包含发送者的源IP地址和接收者的目的IP地址。这些针对IPv4的32位地址和针对IPv6的128位地址通常标识一台计算机的一个接口,但组播地址和广播地址不符合本规则。

Internet校验和

IPv4中的头部校验和算法也被用于大多数其他Internet相关协议中,因此有时也称之为Internet校验和或网际校验和(Internet CheckSum)。它能以相当高的概率确定接收的信息或其中的部分内容是否与发送的相匹配,Internet校验和算法与CRC不同,后者提供了更强的保护功能。
为了给输出的数据报计算IPv4头部校验和,首先将数据报的校验和字段值设置为0。然后对头部计算16位二进制反码,这个16位二进制反码被存储在校验和字段中。具体过程是将头部分为若干个16位组,如果数据的字节长度为奇数,则在数据尾部补一个字节的0以凑成偶数,将这些字节序列计算反码和后取反(一种实现是先将字节序求和,然后将结果加1得到反码和)即得到结果。
当一个IPv4数据报被接收时,对整个头部计算出一个校验和,包括校验和字段自身的值。即~(消息+校验和)。假设这里没有错误,计算出的校验和值为0(值FFFF的反码)。对于任何不正常的分组或头部,分组中的校验和字段值不为FFFF。因此通过反码加法得到的和不可能为0,除非所有字节都是0,这在任何合法IPv4头部中都不可能出现。

DS字段和ECN

区分服务(DS)字段又叫差分服务字段,标识了不同类型的服务(不只是尽力而为的服务)。区分服务(DiffServ)是一个框架和一组标准。IP数据报以某种方式(通过预定义模式设置某些位)被标记,使它们的转发不同于其他数据报,这体现在优先级和服务类型上。这样做可能导致网络中排队延时的增加或减少,以及出现其他特殊效果。DS字段中的数字称为区分服务代码点(DSCP),“代码点”指的是预定义的具有特定含义的位。
当通过一台具有内部排队流量的路由器时,头部中的2位用于为数据报标记拥塞标识符。当一个被标记的分组被目的节点接收时,有些协议(如TCP)会发现分组被标记并将这种情况通知发送方,发送方随后会降低发送速度,这样可在路由器因过载而被迫丢弃流量之前缓解拥塞。这种机制是避免或处理网络拥塞的方法之一。

DS字段的结构定义如下,前3位DSCP表示类别,接下来2位DSCP表示丢弃概率,这是为了与之前的服务类型(Type of Service,ToS)字段兼容。类别部分基于较早定义的服务类型的优先级子字段,路由器通常先将流量分为不同类别,相同类别还可能有不同的丢弃概率。不同类别的数据报其转发优先级也不同,另外对于相同类型不同丢弃概率的流量,丢弃概率部分的值越高则越先处理(即以较高优先级转发)。

DS字段
DS5 DS4 DS3 DS2 DS1 DS0(0) ECN (2位)

本文内容摘自《TCP/IP详解 卷1:协议(中文版)第2版》

猜你喜欢

转载自blog.csdn.net/qq_37653144/article/details/80625525