深入解析IP协议:无连接与不可靠数据传输的最佳传输服务
介绍
IP协议是TCP/IP协议族中的核心协议。所有TCP、UDP、ICMP、IGMP等协议均以IP数据报的格式传输。 IP协议提供了最好的传输服务,它提供了无连接且不可靠的数据传输。也许这句话听起来很矛盾。为什么说是最好的传输服务,但同时却并不可靠?
最好的传输可以认为IP协议会尽一切努力到达目的主机。如果中途发生错误,无法到达目的主机,则会返回ICMP错误信息。机器收到IP协议返回的错误消息后,就知道该消息没有成功到达目的主机。接下来的传输可靠性,即重传,不属于IP协议的范畴,而是由TCP协议(或者自行实现的应用层协议)来保证。
不可靠是指即使传输过程中出现错误,IP协议也不负责处理报文重传,而是将其交给上层协议处理。
无连接是指IP协议的报头不保存或维护后续数据报的任何相关状态信息。
3.2.IP头
IP数据报的格式如图3-1所示:
3-1
Version:IP协议的版本号,IPV4为4
标头长度:包含任何选项,长度为 32 位字。由于是4位字段,因此可以看出IP头的最长长度为16*4字节,即64字节。
服务类型:包括3位优先级子字段(现在被忽略)、4位TOS子字段和1位未使用但必须设置为0的子字段。4位TOS分别表示:最小延迟和最大吞吐量。 ,最高的可靠性和最低的成本。 4 位中只能设置 1 位。如果4位全部为0,则表示服务正常。
总长度:表示IP数据包的总长度(包括协议头和后续携带的用户数据)。由于它有16位,单位是字节数,所以可以看出IP数据报的总长度是65536字节。然而,虽然IP报头允许其传输如此大量的字节,但以太网封装的链路层却不允许。以太网封装链路层允许的最大IP数据报长度为1500字节。并且还要求主机不能接收超过576字节的数据报。这个限制不会影响TCP协议,因为TCP协议会主动对数据包进行分片传输。
标识:唯一标识主机发送的每个数据报。通常每发送一个数据报就加1,在IP分片中起到顺序重组的作用。
Flag:标记数据包类型,表示该数据包是否为IP分片中的分片数据包
分片偏移量:分片消息中指定的偏移量
Time to Live TTL:设置数据报可以通过的路由跳数。每经过一条路由,就会减1。如果减到0,仍然到达目的主机,则该报文将被丢弃。它可以解决黑洞路由和数据包始终占用带宽的问题。最大 TTL 值为 255。
Protocol:表示IP头后携带的协议类型,如ICMP/IGMP/TCP/UDP等,该字段前面提到过。
报头校验和:仅包括IP数据报报头的校验和。校验和的计算不包括IGMP/ICMP及其承载的其他协议的报文内容。校验和可以检查IP数据报在传输过程中报头是否有错误。 RFC 1071 包含如何计算校验和的方法。如果您有兴趣,可以了解更多。
源IP地址:上面提到的32位互联网地址,它代表消息的始发主机。
目的IP地址:表示报文的目的主机。
Option:是可选选项,可以用作以下字段,但很少使用。
这些选项很少使用,并且并非所有主机和路由器都实现它们。值得注意的是,选项字段必须是32位的整数倍,因为头长度是32位的整数倍。如果没有达到32位的整数倍,可以用0填充。
3.3.IP路由选择
IP协议提供的最基本的服务之一是数据包的路由功能。
IP层的路由功能有两种模式,一种是路由器模式,一种是主机模式。一般来说,主机不用于路由器模式。
路由器模式和主机模式的本质区别在于系统是否转发从网络端口收到的数据包。如果配置为主机模式,系统将丢弃目的IP不是本机的数据包,并且路由器将查找路由表(提供路由信息的转发表)。如果找到,数据包将从相应的目的地删除。需要转发报文的网络接口。在转发之前,需要更改数据包的源和目的MAC地址,并且TTL为-1(如上所述,为了防止黑洞路由占用带宽)。如果TTL减为0,则会被丢弃,不转发。在这两种模式下,对于目的IP属于本机或者是广播地址(广播地址是上述五类Internet地址中主机号全1的Internet地址)的数据包,数据报被发送到IP 标头中的协议字段。处理指定的协议模块。
包含路由信息的路由表一般包括以下信息:
目的IP地址:可以是主机地址(即完全屏蔽的IP地址,主机号包含非零值,这称为主机路由),也可以是网络地址(即非全屏蔽IP地址,主机号全为0,这称为网络路由)
下一跳路由器的IP地址或直连IP的网络地址:下一跳路由器的IP地址是报文需要转发到的下一个网络接口的IP地址(该网络接口是直接连接到当前路由器);与直连IP地址相连的网络地址将直接指示该网段IP地址的路由出口,报文将直接从该出口转发(前提是报文的目的IP必须存在,可以通过ARP报文检测来验证)。
Flag:表示路由的类型,例如该路由是直连网络地址还是真正的下一跳地址,是OSPF协议计算地址还是BGP协议在路由时学习到的地址等。
网络接口:指定用于数据报传输的网络接口。
IP 路由是在逐跳的基础上完成的。从这个路由表信息可以看出,IP不知道到达任何目的地的完整路径(当然,那些直接连接到主机的目的地除外)。所有IP路由仅提供下一个路由器的IP地址用于数据报传输。它假设下一跳路由器比发送数据报的主机更接近目的地,并且下一跳路由器直接连接到主机。
IP路由主要完成以下功能:
在路由表中搜索与目标 IP 地址完全匹配的条目(网络号和主机号都必须匹配)。如果找到,则将数据包发送到该条目指定的下一站路由器或直接连接的网络接口(取决于标志字段的值)。在路由表中搜索与目标网络号匹配的条目。如果找到,则将数据包发送到该条目指定的下一站路由器或直接连接的网络接口(取决于标志字段的值)。目标网络上的所有主机都可以通过此条目进行寻址。例如,以太网上的所有主机都通过此条目进行路由。这种搜索网络的匹配方法必须考虑可能的子网掩码。我们将在下一节讨论这个问题。在路由表中搜索标记为“默认”的条目。如果找到,则将数据包发送到该条目指定的下一站路由器。
如果上述步骤均不成功,则无法传送数据报。如果无法投递的数据报来自本地机器,则通常会向生成该数据报的应用程序返回“主机不可达”或“网络不可达”错误(即IP协议附加的ICMP协议消息)。
图3-2是在路由器上查看路由表的结果:
3-2
S表示该路由是静态配置的,不是通过协议生成的。重点关注标记的三个路由,即主机路由、网络路由和默认路由。查表时首先查找主机路由表。如果匹配,则根据查表结果直接转发数据包。如果没有匹配,则继续查找网络路由表。如果网络路由匹配,则根据查表结果进行转发。如果仍然无法匹配,请检查是否存在默认路由。如果存在,则匹配默认路由进行转发。如果它们都不匹配,则丢弃该数据包。
例如,如果目标IP为200.1.1.2的数据包进来,它将直接命中主机路由表。根据查表结果,数据包将直接转发到下一跳网络接口IP为192.168.3.1的路由器。如果传入数据包的目的 IP 是 200.1.1.3,则它不会命中主机路由表,而是命中网络路由表,然后将其转发到下一跳网络接口 IP 地址为 192.168.4.1 的路由器。如果传入数据包的目的IP是100.1.1.2,则既不会命中主机路由表,也不会命中网络路由表,只能命中默认路由。然后转发到下一跳网络接口IP为101.0.0.1的路由器。
看到这里有些人可能会疑惑。显然主机路由可以匹配得更准确。直接使用主机路由就可以了。为什么我们需要网络路由?这里主要考虑的是资源容量的问题。硬件资源是有限的,路由表不可能无限大以容纳如此多的主机路由。因此,网络路由是必要的,网络路由的存在大大降低了对路由表容量的要求。
值得注意的是,在这个转发过程中,报文中的目的IP地址永远不会被修改(使用源路由选项时会被修改,但这种情况很少发生),所有的路由决策都是通过这个目的IP来做出的做出决定。
3.4.子网寻址和子网掩码
所有主机现在都需要支持子网寻址 (RFC 950)。互联网IP地址不再简单地被视为由网络号和主机号组成。而是将主机号再次划分。主机号分为两部分:子网号和主机号。这样做的主要优点是它使 Internet 地址的使用更加灵活,因为通常一个网络号无法使用这么多主机。例如,B 类 Internet 地址有一个 16 位主机号,可以包含 2^16 个主机。数量,而且往往这个网络号下没有那么多主机,这是一个巨大的浪费。图 3-3 显示了 B 类地址的子网寻址方法。
3-3
这种B类地址的子网划分是一种典型的划分方法。这种方法在使用点分十进制表示IP地址时可以很容易地区分子网号和主机号。大多数Internet地址的划分都分为B类Internet地址。其实C类地址也是可以划分的,但是C类地址本身的主机号只有8位,可用于划分的位数较少。不仅C类地址,A类地址也经常被划分。
综上所述,这种划分子网的方式非常灵活,并不一定需要整个8位划分。通过子网掩码可以准确地划分为特定的位。例如A类地址表示为40.40.40.2/24,那么24表示前24位属于网络号+子网号,而我们知道A类地址的网络号只有8位,所以我们可以知道地址的网络号是前24位。 8位数字,即40,而子网号有16位,即40.40,主机号为2。掩码有一种常用的表达方法。 40.40.40.2/24也可以等价表示为40.40.40.2 255.255.255.0,其中255.255.255.0就是我们所说的真实子网掩码。
3.5.ifconfig命令和netstat命令
既然我们已经了解了所谓的IP地址和子网掩码,那么我们如何查看我们主机上网络接口的IP地址和对应的子网掩码呢?
在unix系统和类unix系统(linux)上,可以使用ifconfig命令查看对应的IP地址。图3-4是在linux系统上使用该命令的结果。
3-4
可以看到有多个网络接口,分别分配了B类地址、C类地址和环回地址。 Netmask 是子网掩码。您可以找到该主机上的子网掩码和 Internet 地址的网络号。位数是相同的。同时可以发现每个网络接口的最大MTU值为1500(上面在链路层提到过,以太网接口的IP数据报MTU范围为46-1500),而环回的MTU接口是65536,这是IP头可以携带的最大数据报字节数。这是因为Loopback接口收到的数据包是本机发送的,不需要通过网络传输(前面TCP/IP介绍中提到过,MTU限制与传输时延有关),所以可以发送的最大IP数据报。
除了ifconfig可以查询本地网络接口的信息外,还可以使用netstat -in查看主机的网络接口和IP地址。
3.6.概括
这篇文章主要讲的是
IP头的具体格式,以及各个字段的用途的初步介绍。 IP路由的重要功能描述了路由的原理,即根据报文的目的IP查找路由表,决定最终的报文出口。它还简要描述了主机和路由器在处理数据包方面的差异。介绍子网和子网掩码的概念,并描述用于检查系统上主机网络接口的两个重要命令 ifconfig 和 netstat。