0
点赞
收藏
分享

微信扫一扫

OpenAI 最新发布的 GPT-4o mini 模型

寒羽鹿 2024-08-05 阅读 23

        本篇博客整理了 TCP/IP 分层模型中网络层的 IP 协议,旨在让读者更加深入理解网络协议栈的设计和网络编程。

目录

一、网络层

二、IP 报头

1)报头与有效载荷的分离

2)有效载荷的上交

3)源 IP 与目的 IP

4)生存时间

三、分片与组装

1)MTU 与分片、组装

2)分片的具体过程 

3)组装的具体过程

4)分片的丢包情况

补)相关面试题

四、 IP 地址与网段划分

1)IP 地址的构成

2)IP 地址的分配和具体作用

 3)网段划分

4)IP 地址的数量限制

5)特殊的 IP 地址

 6)私网 IP 和公网 IP

五、路由

1)数据路由

2)路由表查询的具体过程


一、网络层

        数据的传输离不开网络协议栈,而网络协议栈是分层的。

        在 TCP/IP 分层模型中主要包含了应用层、传输层、网络层、数据链路层。

        进行网络通信时,通信双方发送的数据并不是直接从一方的应用层,直接发送到了另一方的应用层,而是需要应用层将数据继续向下交付。

        待发送的通信数据,会先从主机的应用层拷贝至传输层,再继续向下贯穿,在网络层和链路层经过数据封装后,通过网络发送到对方主机;而对端主机在收到数据后,也同样需要在链路层和网络层进行数据解包,并上交给传输层,再继续上交至对端的应用层。

        其中,网络层主要负责的问题是,将数据从一台主机送到另一台主机,即数据的路由。网络层有能力将数据送到对方主机,虽然不能保证每次都能将数据成功送达,但因传输层的 TCP 协议的可靠性策略的存在,网络层最终一定能将数据可靠地发达。

        通信数据经历的网络传输,一般是跨局域网的,多个网络之间由路由器这个硬件设备连接起来,也就是说,  通信数据在网络中一定会经过多个路由器。

        既然如此,如何选择从源到目的的传输路径就十分重要了,而这就是数据路由的过程。 

        数据路由的目的是,在确定目标主机后,寻找最短的到达路径。

        确定目标主机是非常重要的,这直接决定了数据路由时的路径选择,也是数据能跨网络送达的根本。只有数据经过了较为正确的路径选择,才可能慢慢趋近于目标网络或目标主机。

        确定目标主机后,数据就可以在网络中进行路由了。数据自身无法进行路径选择,是不认路的,但好在网络中的一台台路由器可以进行路径选择,是认路的,于是数据在路由过程中,就可以不断地去找网络中的一台台路由器问路。

        路由器会将自己做好的路径选择都记录到路由表中,只要查询路由表,就可以找到去特定点的最短路径。而数据在路由时,也会通过路由器来不断进行路径选择,以逐步靠近目标网络或目标主机。

二、IP 报头

1)报头与有效载荷的分离

        IP 是通过这种“定长报头 + 自描述字段”的方式分离报头与有效载荷的。

         IP 报头由基本报头和选项字段组成,要分离报头与有效载荷,就要先从头读取完报文中的基本报头和选项字段。IP 报文的前 20 个字节是 IP 的基本报头,其中包含 4 位的首部长度,指明了 IP 报头的具体长度。从下层获取到一个报文后,IP 可以根据这 4 位的首部长度来报头与有效载荷。

  1. IP 从下层获取到一个报文后,首先读取报文的前 20 个字节,并从中提取出 4 位的首部长度,此时获得 IP 报头的大小 size(最大为 60 字节,最小为 20 字节)。
  2. 如果 size 大于 20 字节,则继续从报文中读取 size − 20 字节的数据,即 IP 报头中的选项字段(最大为 40 字节,最小为 0 字节)。
  3. 读取完 IP 的基本报头和选项字段后,剩下的就是有效载荷了。

2)有效载荷的上交

        基于 IP 协议的传输层协议不止一种,因此 IP 从下层获取到一个报文并将其解包后,需要知道应将分离后的有效载荷上交给哪一个协议,这会通过 IP 报头中的 8 位协议字段来完成。

          IP 报头中的 8 位协议字段,表示的是上层协议的类型,根据该字段就可以判定出应上交的协议。

        该字段是发送端的 IP 层从传输层获取到数据后所填充的,假设一份数据是由上层 TCP 交给 IP 的,那么其报文中的 8 位协议字段填充的就是 TCP 协议的编号。

3)源 IP 与目的 IP

        IP报头中的 32 位源 IP 地址和 32 位目的 IP 地址,分别表示的是报文的发送端 IP 地址、接收端 IP 地址。

        数据在网络传输中会经过一个个的路由器,来进行路由转发,以慢慢趋近于目标主机。路由器在帮助数据进行路由转发时,会提取出该数据 IP 报头中的目的 IP 地址,作为路由转发的重要依据。

         当接收端收到了发送端发来的数据后,也可能要给发送端发送数据,因此,发送端在发送数据时不仅需要指明该数据的目的 IP 地址,也需要指明该数据的源 IP 地址,以便接收端后续作出应答或发送其他重要的数据。

        特别地,在进行网络编程时,想要一端能发送数据给另一端,必须要指明对端的 IP 地址和端口号,也就是发送数据的目的 IP 地址和目的端口号。这个需指明的目的 IP 地址,其实就是传给网络层的 IP 协议,用于数据在网络中进行路由转发的,而这个需指明的端口号,是给传输层的 TCP协议或 UDP 协议,用于指明该数据应交给应用层的哪一个进程。而由于传输层和网络层都是在操作系统内核中实现的,因此在实际发送数据时,就无须指明发送数据的源 IP 地址和源端口号,数据在贯穿网络协议栈经历封装时,会被操作系统填充对应的源 IP 地址和源端口号。

4)生存时间

        报文在网络传输时,可能会由某些原因而送达目标主机,如果报文在路由时出现了环路路由的情况,或目标主机已经异常离线了,那么这个报文就成了一个废弃的游离报文。

        为了避免网络中出现大量的游离报文,IP报头中特别封装了一个字段,叫做 8 位生存时间,以表示报文到达目的地的最大报文跳数。每当报文经过一次路由,其生存时间就会自减 1,当生存时间减为 0 时,该报文就会被自动丢弃,然后在网络中消散。

三、分片与组装

        IP 能够将数据跨网络地从一台主机送到另一台主机,网络传输期间,数据需要经过一个个的路由器并进行路由转发,最终才能到达目标主机。

        IP 进行数据跨网络传送的前提是,需要先将数据从一个节点传送到和自己相连的下一个节点,而这实际是由网络层下数据链路层负责的。两个节点直接相连,也就意味着这两个节点在同一个局域网中,因此要探讨两个相邻节点的数据传送,实际探讨的就是局域网通信的问题。
 

1)MTU 与分片、组装

        MAC 帧是数据链路层中最典型的协议,它能将 IP 传下来的数据封装成数据帧,然后发送到网络中。

        但 MAC 帧携带的有效载荷,其最大长度是有限制的,也就是说,IP 交给 MAC 帧的报文不能超过某个值,而这个值就是最大传输单元 MTU(Maximum Transmission Unit),一般为 1500 字节。

        如果 IP 向下传输的报文超过了 1500 字节,那么就会在 IP 层经历分片,再交给下层的 MAC 帧进行发送;如果数据在发送时,在发送端的 IP 层进行了分片,那么送达对端后,数据也需要在对端的 IP 层进行组装,再向上交付给传输层。

        不过,在网络通信中,数据的分片并不是经常要做的,不分片其实才是常态。分片本身会带来一些潜在的问题,例如可能会增加丢包的概率等。此外, 在分片的数据中,每一个分片在 IP 层都会被添加上对应的 IP 报头,而传输层添加的报头只会出现在第一个分片中,因此网络中传输的数据包可能没有传输层的报头。

2)分片的具体过程 

        假设,IP 层要发送 4500 字节的数据。由于该数据超过了 MAC 帧规定的 MTU,即 1500 字节,因此 IP 需要先将该数据进行分片,然后再将一个个的分片交给 MAC 帧进行发送。4500 字节的数据,至少需要分为四个分片报文进行发送。

        另假设,IP 层添加的 IP 报头不携带选项字段,其长度为 20 字节,且 IP 层将数据分片以下四个分片报文:

        在对数据进行分片时,需要记录分片的信息,以便分片报文到达对端的 IP 层后被组装起来。

        IP报头中的 16 位标识、3 位标志和 13 位片偏移,就记录了数据分片的有关信息。

        由于四个分片报文是在同一台主机的 IP 层被分片的,因此它们的16位标识应是一样的。假设四个分片报文的 16 位标识都是 123,则这四个报文对应的 16 位标识、3 位标志中的“更多分片”和13 位片偏移分别如下: 

3)组装的具体过程

        MAC 帧会将从网络中获取的数据上交给 IP 层。但这些数据可能来自世界各地,可能是经过分片后发送的,也可能是没有经过分片直接发送的,因此,IP 必须要通过某种方式来区分收到的各个数据。

        通过 IP 报头中,记录了发送端的 IP 地址的 32 位源 IP 地址,可以区分数据来自哪一台主句。
        而通过 IP 报头中的 16 位标识,可以判断哪些报文是没有经过分片的独立报文,哪些报文是经过分片后的分片报文。具体来说,未分片数据的 16 位标识都是不同的,而由同一个数据分片得到的各个分片报文,其所对应的 16 位标识都是相同的。
        由此,通过 IP 报头中的 32 位源 IP 地址和 16 位标识,就可以将经过分片的数据各自聚合在一起进行组装。

        由同一个数据分片得到的各个分片报文,有以下相通的特点:

  • 第一个分片报文中,13 位片偏移的值一定为 0。
  • 最后一个分片报文中,“更多分片”标志位一定为 0。
  • 对于每一个分片报文来说,( 当前报文的 13 位片偏移 + 当前报文的数据字节数 ) ÷ 8  = 下一个分片报文的 13 位片偏移。

        根据分片报文的这三个相通的特点,就能够将分片报文合理的组装起来——先找到分片报文中 13 位片偏移为 0 的分片报文,提取出其 IP 报头中的 16 位总长度字段,并通过计算得出下一个分片报文的 13 位片偏移,然后重复此方式,依次将各个分片报文按顺序拼接起来,直到拼接到一个“更多分片”标志位为 0 的分片报文为止。

4)分片的丢包情况

        分片后的报文在网络传输时,也可能出现丢包问题,不过,接收端有能力判断是否收到了全部的分片报文。

        现假设某组分片报文对应的 16 位标识值为 x,分片报文丢包的情况可以大致分为以下三种:

  • 若第一个分片报文丢包了,则在接收端收到的分片报文中,就找不到对应16位标识为 x、13 位片偏移为 0 的分片报文。
  • 若最后一个分片报文丢包了,则在接收端收到的分片报文中,就找不到对应16为标识为 x、“更多分片”标志位为 0 的分片报文。
  • 若其它分片报文丢包了,则接收端在进行组装时,就会找不到那些 13 位片偏移为特定值的分片报文。

补)相关面试题

四、 IP 地址与网段划分

1)IP 地址的构成

        IP地址由网络号和主机号两部分构成:

  • 网络号:用于区分网络。保证相互连接的两个网段具有不同的标识。
  • 主机号:用于区分主机。同一网段内,主机之间具有相同的网络号,但必须有不同的主机号。

2)IP 地址的分配和具体作用

        当子网中每新增一台主机时,都需要为其分配一个 IP 地址,而当子网中每有一台主机断开网络时,又需要将它的 IP 地址回收,便于分配给新增的主机使用。这使得手动管理 IP 地址非常麻烦,而事实上对于 IP 地址的分配和回收一般不会手动进行,而是采用 DHCP(Dynamic Host Configuration Protocol,动态主机配置协议)技术。

        DHCP 是一个基于 UDP 的应用层协议,通常被应用在大型的局域网环境中,其主要作用就是集中地址管理、分配 IP 地址,不仅能使网络环境中的主机动态地获得 IP 地址、Gateway 地址、DNS 服务器地址等信息,还能提升地址的使用率。

        此外,一般的路由器也都带有 DHCP 功能,因此路由器其实也可以看作是一个 DHCP 服务器。例如连接 WiFi 时,,路由器需要验证账号和密码,验证通过后,路由器就会动态分配一个IP地址,通过这个 IP 地址就可以进行各种上网活动。

        IP 地址作为信标,在数据跨网络传输中起着至关重要的作用。但其实,IP 协议将数据跨网络地从一台主机发送到另一台主机,并不是直接将数据送达目标主机的,而是先将数据送达目标主机所在的网络,再送达目标主机的。

        也就是说,数据在路由时的第一目的,并不是找到目标主机,而是找到目标网络所在的网络,然后再在目标网络中找到目标主机。

        数据在路由时之所以不一开始就以找目标主机为目的,是因为这样效率太低了。找目标主机的过程本质是排除的过程,如果一开始就以找目标主机为目的,那么在查找的过程中,一次只能排除一个主机,而如果一开始先以找目标网络为目的,那么就能一次排除大量和目标主机不在同一网段的主机,这样就可以大大提高检索的效率。

        而为了提高数据路由的效率,前人对网络进行了网段划分。

 3)网段划分

        过去曾经提出一种划分网络号和主机号的方案,将所有 IP 地址按取值范围给分为五类。

        依此方案,要判断一个 IP 地址属于哪一类,只需要遍历 IP 地址的前 5 个比特位,其中第几个比特位最先出现 0 值,那么这个 IP 地址就对应地属于哪一类地址。

        但随着网络的飞速发展,这种划分方案很快就显现了局限性。

        由于 A 类地址的网络号只占 7个比特位,因此 A 类地址可申请的网络只有  2 ^ 7 个,这使得大多数组织,例如一些学校、公司、实验室等,只好选择申请 B 类地址。而 B 类地址的主机号占 16 个比特位,于是理论上一个 B 类网络中允许有 65536 台主机。但在实际网络架设中,一般一个局域网中不会存在这么多主机,如果存在,也就意味着,大量的 IP 地址会被浪费掉。

        为了避免大量 IP 地址被浪费,后来又提出了新的划分方案,被称为 CIDR(Classless Interdomain Routing,无类域间路由)。

         CIDR 并没有完全抛弃原先的方案,而是基于原有的五类网络的,继续进行子网划分,这也就意味着,需要借用主机号中的若干位来充当网络号,而为了区分 IP 地址中的网络号和主机号,又引入了子网掩码(subnet mask)的概念。
        子网掩码是一个 32 位的正整数,通常用一串 “0” 来结尾。每一个子网都有自己的子网掩码,将 IP 地址与当前网络的子网掩码进行“按位与”操作,就能够得到当前网络的网络号。

        随着一个网络被更细粒度地划分成一个个更小的子网,子网中 IP 地址对应的主机号也越来越短,使得子网中可用 IP 地址的个数也就越来越少,由此就避免了大量 IP 地址被浪费的情况。

        假设在某一子网中,将IP地址的前 24 位作为网络号,则该网络对应的子网掩码的前 24 位就为都 1,剩下的 8 位都为 0,将其用点分十进制表示就是 255.255.255.0。该子网中有一台主机,其 IP 地址是 192.168.128.10,将这个IP地址与该网络的子网掩码进行“按位与”操作后,就得到了 192.168.128.0,即这个子网的网络号。
        在用子网掩码与子网中主机的 IP 地址进行“按位与”操作时,本质就是保留了主机 IP 地址中前24 位的原貌,将剩下的 8 位的值清 0 了而已,换句话说,是将主机号清 0 了,于是“按位与”的结果就是该网络的网络号。

        另外,子网划分是能进行多次的,划分出来的子网还可以继续进行子网划分。因此,一个数据在路由时,随着数据不断路由进入更小的子网,其网络号的位数也是在不断变化的,更准确地说,其网络号的位数是不断在增加的。这也就意味着,IP 地址中的主机号,其位数在不断减少。于是,当数据路由到达目标主机所在的网络时,就可以在该网络中找到对应的目标主机,并顺利将数据交给该主机。

4)IP 地址的数量限制

        由于 IP 地址(以 IPv4 为例)是一个 4 字节、32 位的正整数,因此共有 2 ^ 32 个 IP 地址,也就是将近 43 亿个IP地址。

        TCP/IP 协议规定,每个主机都需要有一个 IP 地址。

         但现在不仅电脑需要 IP 地址,还有其他设备也需要 IP 地址。例如也可以上网的智能手机,现在全世界人口已经有 70 多亿了,就算只有一半人拥有智能手机,算下来也有 30 多亿了,而它们都需要一个唯一的 IP 地址。随着科技的发展,还有智能手表、智能冰箱、智能洗衣机等设备,它们如果要入网,就也需要 IP 地址。另外,一个主机可能还需要多个 IP 地址,更别谈还有很多组网的路由设备,也需要IP地址。
        所以,43 亿个 IP 地址其实早就不够用了,因此才提出了 CIDR。

        CIDR 对已经划分好的五类网络继续进行子网划分,其目的既是为了减少 IP 地址的浪费,也是解决 IP 地址不够用的问题。虽然这的确在一定程度上缓解了 IP 地址不够用的问题,但 IP 地址的绝对上限并没有增加。

5)特殊的 IP 地址

        其实,并非所有的 IP 地址都能够作为主机的 IP 地址,有些 IP 地址本身是具有特殊用途的。

  • 将 IP 地址中的主机地址全部设为 0,就成为了网络号,代表这个局域网。
  • 将 IP 地址中的主机地址全部设为 1,就成为了广播地址,用于给同一个链路中相互连接的所有主机发送数据包。 
  • 特别的,127.* 的 IP 地址用于本机环回(loop back)测试,通常是 127.0.0.1。

        主机号为全 0 代表的是当前局域网的网络号,主机号为全 1 代表的是广播地址,这两个 IP 地址都不能作为主机的 IP 地址。也就是说,在某个局域网中,最多能存在的主机个数其实是 2 ^ 主机号位数 - 2

 6)私网 IP 和公网 IP

        如果一个组织内部组建局域网,IP 地址只用于局域网内的通信,而不直接连入广域网中,则称这个 IP 地址是私有的。

 

五、路由

1)数据路由

        数据在网络传输中,会经历路由,也就是路径选择,从而到达目的主机。

        数据路由的过程,其实就是一跳一跳(Hop by Hop)“问路”的过程。所谓“一跳”,就是数据链路层中的一个区间,具体在以太网中指,从源 MAC 地址到目的 MAC 地址之间的帧传输区间。

        数据在网络传输中,会遇到很多路由器,这些路由器会帮助数据进行路由转发。每收到一个数据包,路由器都会查询路由表,找到该数据的目的 IP 地址,并告知该数据下一跳应该往哪跳。

 

2)路由表查询的具体过程

        每个路由器内部会维护一张路由表。

        当 IP 数据包到达路由器时,路由器就会用其中的目的IP地址,依次与路由表中的子网掩码 Genmask 进行“按位与”操作,然后将结果与子网掩码所对应的目的网络地址 Destination 进行比对,如果匹配,则说明该数据包下一跳就应该跳去这个子网,然后就会将该数据包,通过对应的发送接口 Iface 发出;如果没有找到匹配的目的网络地址,路由器就会将这个数据包发送到默认路由,也就是目标网络地址一项下的 default,可以看到,默认路由对应的 Flags 是 UG,实际就是将该数据转给了另一台路由器,让该数据在另一台路由器继续进行路由。

        数据包根据自己持有的目的 IP 地址中的网络号,不断经过路由器的路由后,最终会到达目标主机所在的目标网络,然后再根据目的 IP 地址中的主机号进行路由,最终会到达目标主机。

举报

相关推荐

Dify中接入GPT-4o mini模型

0 条评论