网络基础:浅析IP协议

时间:2024-05-22 12:34:59

IP协议概念

IP协议是将多个包交换网络连接起来,它在源地址和目的地址之间传送一种称之为数据包的东西,它还提供对数据大小的重新组装功能,以适应不同网络对包大小的要求。
IP协议不提供可靠的传输服务,它不提供端到端的或(路由)结点到(路由)结点的确认,对数据没有差错控制,它只使用报头的校验码,它不提供重发和流量控制。

IP协议报头格式

网络基础:浅析IP协议

逐一介绍各个字段的含义:

  • 4位版本号:指定IP协议的版本,对于IPv4来说就是4。
  • 4位首部长度:IP首部长度是多少个四字节。这里默认为0101也就是5。四位最大表示值为15,也就是说IP报头最大长度为60字节。
  • 8位服务类型:这里的八位前三位表示优先权字段(已经弃用),中间四位TOS字段,最后一位保留字段,其中保留字段必须设置为0。中间四位TOS字段分别表示:最小延时、最大吞吐量、最高可靠性、最小成本。(这里可见,这中间四位是以位位图的形式代表不同的情况)这四者冲突,只能选择一个,根据应用场景选择。
  • 16位总长度:IP数据报整体占多少字节
  • 8位生存时间(TTL):这里的生存时间指的是一个IP报文到达目的地的最大报文跳数。所谓报文跳数,就是从一个网络跳至另一个网络。每进行一次跳转,TTL的值就会减一。默认TTL的值为64。如果一个数据报的TTL减到0了还没有到达目的网络,么直接丢弃这个报文。引入生存时间的主要目的是防止在网络中有无限循环跳转的报文存在。
  • 8位协议:这里指的是IP层交付给上层的哪个协议。
  • 16位头部校验和:使用CRC进行校验,鉴别头部数据是否异常。
  • 32位源IP地址与目的IP地址:表示发送端及接收端。
接下来,重点讲述一下IP报头中第二行的三个字段。

在数据链路层,所能处理的最大数据包的大小是有限制的,类似于发快递时对包裹的尺寸大小限制。数据链路层以MTU来限制最大传输数据包的大小,如果在IP层的数据包大于MTU,那么发送端IP层会对数据包进行分片,一旦发送端对数据包进行分片了,那么接收端的IP层就会进行组装。既然要分片还得组装,那么同一个数据包分成多个片,这些片就得需要标识来确认它们是同一个包。而IP报头中的第二行的三个字段就是为了处理这个问题的。

16位标识:来自同一个数据包的不同片,它们的16位标识都是相同的,用16位标识来标记来自相同的数据包的分片。

3位标志:第一位保留,第二位设置为 1 的话,表示禁止分片,这个时候如果报文的长度超过了MTU就直接丢弃该报文。第三位更多分片,其实含义很简单,这个标志的作用是为了让接收端在进行组装的时候,判断一个数据包最后一片是什么。最后一片的此位设置为 1,其它的设置为 0。类似于结束标记。

13位片偏移:片偏移是分片相对于原始IP数据报的偏移量,也就是该片处于原始数据报的什么位置。实际偏移的字节数是这个数值 * 8得到的。也就是说除了最后一个报文以外,其它的分片报文长度必须是 8 的倍数,否则无法组装。

网段划分

由于网络的大量普及,以及发展,大量的网络产品产生。为了方便管理以及查找,必须要进行网段的划分。
IP地址分为两个部分,网络号与主机号。网络号保证两个相连的网段具有不同的标识。而主机号标识同一个网段内部不同的主机其主机号都不相同,但是其网络号相同。一个子网就是把相同网络号的所有主机放在一起,如果在子网中添加一个新的主机,那么这个主机的网络号与子网的网络号一致,主机号与子网内其它主机都不重复。

这样通过合理的设置主机号和网络号,就可以保证在相互连接的网络中,每台主机的IP地址都不相同。由于手动管理分配IP地址不方便,于是引入一种叫做DHCP的技术,这种技术能够自动给子网内新加的主机划分IP地址,一般的路由器都有DHCP功能。

子网掩码划分网络号与主机号

子网掩码是一个32位的正整数,通常以一串“0” 结尾,将IP地址与子网掩码进行按位与操作,得到的结果就是网络号。网络号与主机号的划分只与子网掩码有关,与其它无关。
网络基础:浅析IP协议

由此可见,IP地址与子网掩码按位与后得到网络号,主机号从全0到全1就是子网的地址范围。

特殊的 IP 地址

如果一个网络内的 IP 地址主机号为 0 ,那么这个时候代表网络号,该网络内的路由设备的 IP 地址的主机号是 1 。如果主机地址全部设置为 1 ,也就是主机号那里是 255 ,这个时候的 IP 地址就成为了广播地址,用于个同一个链路中相互连接的所有主机发送数据包。

如今计算机飞速发展,而使用IPv4 进行IP地址的划分是远远不够的,再加上前面的说的某些特殊的IP地址占用,IPv4仅今天四个字节,最多能表示43亿左右个IP地址,这肯定是不够的。那么该如何解决这个问题呢?前面说到利用 CIDR 进行网段的划分能够有效的环节了IP地址不够用的问题,但是实质上对于IP地址来说,其个数并没有增加,IP地址仍然不够用,如何解决?

解决方法主要有以下三种:
1. 动态分配IP地址:所谓动态分配IP地址就是说只给连接到网络中的主机分配IP地址,一但主机离开网络段,那么回收其IP地址。也就是说同一台MAC地址的主机设备,每次连接到网络当中,它的IP地址不一定都是相同的。
2. NAT技术:NAT技术又叫网络地址转换,实际上就是在进行网络连接时,进行IP地址的替换。所有使用本地地址的主机在和外界通信时,都要在NAT路由器上将其本地地址转换成全球IP地址,才能和因特网连接。
3. IPv6:既然四字节的IPv4不够用那么就创建一个更大的来表示 IP 地址,IPv 6 占16 个字节,也就是128个比特位。这个相比于 IPv4 来说就大得多,但是目前 IPv6 并没有普及。

私有IP地址与公网IP地址

如果一个区域内部有自己的局域网,并且IP地址只用于内部网络通信,那么按道理来说它们的 IP 地址可以是任意的,因为并不会对外网有任何的影响,但是 RFC 1918 规定了用于组建局域网内私有 IP地址的范围,如下:

  • 10.*,前八位是网络号,总共 16,777,216个地址
  • 172.16 到 172.31.,前 12 位时网络号,共 1,048,576 个地址
  • 192.168.*,前十六位是网络号,总共65,536 个地址,包含在这个范围内的都是私有IP,其余的都是公网 IP

NAT技术

每个路由器都可以配置两个 IP 地址,一个表示路由器的子网 IP 地址(LAN),另一个则是外网地址(WAN)。路由器(LAN)口连接的主机都属于这个路由器的子网当中,而不同的路由器它们的子网IP都是一样的,子网内的各个主机的 IP地址不能重复,但是不同子网内的IP地址是可以重复的。

要实现两台跨网段主机之间的通信,必须得经过路由器路由,每个路由器都可以看做网络运营商路由器的子网中一个个的节点。而两主机之间通信的时候,由主机局域网内的路由器开始路由,首先将主机IP地址进行替换,LAN口IP地址替换成该路由的 WAN 口 IP地址。接下来的路由又可以看做成一个主机,依次替换下去,最终到达公网。而在公网又可以根据路由替换IP地址,最终替换到目的主机,这种技术就是NAT技术。

网络基础:浅析IP协议

以这个图为例,主机A与主机E要进行通信,我们可以看到A与E处于不同的局域网,并且A与E的IP地址是一样的,这也证明了在不同局域网内的IP地址是可以相同的。
A要与E通信,首先经过IP替换,将A的IP地址替换为路由的WAN地址,此时的IP变成了10.1.1.2,此时的路由器相当于运营商路由局域网内部的一个主机,而这个时候继续替换,由运营商路由进行替换,将普通路由的IP地址替换为运营商的WAN口IP地址,即122.77.241.3,这个时候,到达了广域网。此时的主机A与主机E的运营商路由处于同一个局域网内部,这个时候再进行替换,只不过是将此时的IP地址替换成E运营商路由的LAN口地址,依次类推,直到主机E。整个这个过程就是IP的替换,也叫作NAT技术。

路由

前面说到NAT技术进行IP地址替换的时候是由路由器完成的,而路由器究竟是什么呢?

其实路由就是一个网络中的每个站点,IP数据包在传输的过程中会到达每个站点,每到一个站点都会检查一遍是否到达了,如果到达,就可以将IP数据包交付给目的主机,进而完成一系列操作;如果没有到达,那么就转接给下一个站点,也就是下一个路由器。循环往复,直至到达目的主机,或是IP数据包生命周期结束。

如果是到达目的主机的局域网,那么很简单;但是如果没有到达,此时路由如何判断下一个站点是哪里呢?会不会有一种可能,就是将IP数据包越传越远离目的局域网?换句话说就是,路由器怎么能够知道它将现在的这个IP数据包传到哪个路由?

其实在每个路由器内部都维护了一个路由表。在Linux下可以用 route指令来查看路由表。
网络基础:浅析IP协议

表中 Destination 是目的网络地址, Genmask 是子网掩码, Gateway 是下一跳的地址,其中 Flags 标志位中的G表示此条目的下一跳的地址是某个路由器的地址。如果没有 G 标志位的条目,那么意味着这个条目不需要转发路由,就在于本机接口相连的网络。如果路由器不知道该数据包往哪个路由转发时,那么就会跳转至default 选项的网络。

路由转发的这个过程类似于问路,在问路时,你会听到三种回答:

  1. XXX 路已经到了就在这里
  2. 要到 XXX 路,应该先直走,再左转,再……
  3. 我也不清楚 XXX 路怎么走,你可以问问前面那个交警

如果一个数据包经过多次路由后到达目的主机,那么所有这个数据包经过的路由器都会在自己的内部暂时保存一个新的条目,下次再有来自与相同主机的数据时路由器可直接快速转接。

路由表又分为两类:

  • 静态路由表:静态路由是由管理员在路由器中手动配置的固定路由,路由明确地指定了包到达目的地必须经过的路径,除非网络管理员干预,否则静态路由不会发生变化。静态路由不能对网络的改变作出反应,所以一般说静态路由用于网络规模不大、拓扑结构相对固定的网络。特点是:它允许对路由的行为进行精确的控制、减少了网络流量、是单向的、配置简单。
  • 动态路由表:动态路由表是指动态路由协议(如RIP)自动建立路由表,当你去掉一条连线时,它会自动去掉其路由。路由器的每一个接口对应不同网络,而一条连接两个路由器连线的两个端点IP应该属于同一网络。 设置的IP地址时,如果路由器的其它端口已有这个网络了,则提示已有这个网络,并显示对应的端口。特点是:节点增删时工作量少、网络拓扑变化,协议自动调整、配置不易出错、对网络扩容性好、需要占用路由器资源。

欢迎大家共同讨论,如有错误及时联系作者指出,并改正。谢谢大家!