IP协议详解:报头格式、主机定位、转发流程、网段划分与路由机制


🍑个人主页:Jupiter. 🚀 所属专栏:计算机网络高效通关之路 欢迎大家点赞收藏评论😊

目录


网络层

在复杂的网络环境中确定一个合适的路径.

IP协议

IP(Internet Protocol)协议,即互联网协议,是TCP/IP协议族中的核心协议之一,它的主要作用在于为互联网上的计算机提供统一的寻址和路由机制确保数据能够在全球范围内的计算机网络中从源地址传输到目的地址。具体来说,IP协议的作用包括以下几个方面:

  • 寻址(Addressing):IP协议为互联网上的每台设备分配了一个唯一的数字标识符,即IP地址。这个地址允许数据在网络中从一个节点(主机和路由器也叫节点)传输到另一个节点。IP地址可以是IPv4(32位)或IPv6(128位)格式,后者是为了解决IPv4地址耗尽问题而设计的。
  • 路由(Routing):IP协议定义了数据报(Datagram)的格式,这些数据报是网络上传输的信息包。当数据报从一个网络发送到另一个网络时,它可能需要通过多个路由器。IP协议负责将数据报从源主机发送到目的主机,即使这两个主机位于不同的物理网络上。这通过一系列路由器和网关的转发来实现,每个路由器都根据数据报的目的IP地址来决定最佳的下一跳。
  • 无连接服务(Connectionless Service):IP协议提供的是无连接服务,意味着它不保证数据报一定能够按顺序或无误地到达目的地址。数据报的发送和接收是独立的,每个数据报都被单独处理。这种服务方式使得IP协议非常灵活,但也可能导致数据丢失、乱序或重复。
  • 分片(Fragmentation):当较大的数据报需要通过MTU(Maximum Transmission Unit,最大传输单元)较小的网络时,IP协议能够自动将其分片成较小的数据报进行传输。在接收端,这些分片会被重新组合成原始的数据报。

IP协议头格式

  • 4 位版本号(version): 指定 IP 协议的版本, 对于 IPv4 来说, 就是 4.
  • 4 位头部长度(header length): IP 头部的长度是多少个 32bit, 也就是 length 4的字节数. 4bit 表示最大的数字是 15, 因此 IP 头部最大长度是 60 字节.
  • 8 位服务类型(Type Of Service): 3 位优先权字段(已经弃用), 4 位 TOS 字段, 和1 位保留字段(必须置为 0). 4 位 TOS 分别表示: 最小延时, 最大吞吐量, 最高可靠性, 最小成本. 这四者相互冲突, 只能选择一个. 对于 ssh/telnet 这样的应用程序, 最小延时比较重要; 对于 ftp 这样的程序, 最大吞吐量比较重要.
  • 16 位总长度(total length): IP 数据报整体占多少个字节.(报头+有效载荷)
  • 16 位标识(id):唯一的标识主机发送的报文. 如果 IP 报文在数据链路层被分片了, 那么每一个片里面的这个 id 都是相同的.
  • 3 位标志字段: 第一位保留(保留的意思是现在不用, 但是还没想好说不定以后要用到). 第二位置为 1 表示禁止分片, 这时候如果报文长度超过 MTU, IP 模块就会丢弃报文. 第三位表示"更多分片", 如果分片了的话, 最后一个分片置为 0, 其他是 1. 类似于一个结束标记.
  • 13 位分片偏移(framegament offset): 是分片相对于原始 IP 报文开始处的偏移. 其实就是在表示当前分片在原报文中处在哪个位置. 实际偏移的字节数是这个值 乘8得到的. 因此, 除了最后一个报文之外, 其他报文的长度必须是 8 的整数倍(否则报文就不连续了).
  • 8 位生存时间 : 数据报到达目的地的最大报文跳数. 一般是64. 每次经过一个路由, TTL -= 1, 一直减到 0 还没到达, 那么就丢弃了. 这个字段主要是用来防止出现路由循环.
  • 8 位协议: 表示上层协议的类型
  • 16 位头部校验和: 使用 CRC 进行校验, 来鉴别头部是否损坏.
  • 32 位源地址和 32 位目标地址: 表示发送端和接收端.
  • 选项字段(不定长, 最多 40 字节):

IP协议如何定位主机与报文转发的详细过程

一、IP协议定位主机

  • IP地址结构:
    • IP地址是网络中设备的唯一标识,它包含了网络段主机地址两部分。IPv4地址采用32位二进制表示,通常用点分十进制表示法(如192.168.1.1)。
    • IP地址通过子网掩码划分为网络部分和主机部分。子网掩码是一个与IP地址相同长度的二进制数,其中网络部分用1表示,主机部分用0表示。
  • 定位过程:
    • 当一个设备需要与其他设备通信时,它会首先检查目标IP地址。
    • 通过将目标IP地址与子网掩码进行逻辑与运算,可以确定目标IP地址的网络部分,从而判断目标设备是否位于同一子网内。
    • 如果目标设备在同一子网内,则可以直接通过局域网内的广播或单播方式发送数据。
    • 如果目标设备不在同一子网内,则需要将数据发送给默认网关(通常是路由器),由路由器进行进一步的转发。

二、IP协议报文转发

  • 报文结构:
    • IP报文由IP头部和数据部分组成。IP头部包含了源IP地址、目的IP地址、总长度、生存时间(TTL)、协议类型等关键信息。
  • 转发过程:
    • 当路由器收到一个IP报文时,它会首先检查报文的目的IP地址。
    • 路由器使用路由表来查找与目的IP地址相匹配的路由条目。路由表包含了网络地址、子网掩码、下一跳地址等信息
    • 路由器将目的IP地址与路由表中的网络地址进行逻辑与运算,找到匹配的路由条目。
    • 根据路由条目中的下一跳地址,路由器将IP报文转发给下一个路由器或目的主机。
    • 在转发过程中,IP报文的TTL值会逐跳递减。如果TTL值减至0,则报文将被丢弃,并向源主机发送ICMP超时消息
  • 分片与重组:
    • 如果IP报文的大小超过了网络的最大传输单元(MTU),则需要进行分片处理。
    • 分片后的每个报文片段都会包含原始报文的标识、偏移量和标志位等信息,以便在目的端进行重组。
    • 目的端收到所有报文片段后,会根据这些信息将报文片段重新组合成原始的IP报文。

综上所述,IP协议通过IP地址和子网掩码来定位主机,并通过路由表和TTL值来实现报文的转发和生存控制。同时,IP协议还提供了分片与重组机制来适应不同网络的最大传输单元限制。这些功能共同构成了IP协议在网络通信中的核心作用。

网段划分

IP 地址分为两个部分, 网络号和主机号

  • 网络号: 保证相互连接的两个网段具有不同的标识;
  • 主机号: 同一网段内, 主机之间具有相同的网络号, 但是必须有不同的主机号;
  • 不同的子网其实就是把网络号相同的主机放到一起.
  • 如果在子网中新增一台主机, 则这台主机的网络号和这个子网的网络号一致, 但是主机号必须不能和子网中的其他主机重复.

通过合理设置主机号和网络号, 就可以保证在相互连接的网络中, 每台主机的 IP 地址都不相同. 那么问题来了, 手动管理子网内的 IP, 是一个相当麻烦的事情.

  • 有一种技术叫做 DHCP(动态地址分配), 能够自动的给子网内新增主机节点分配 IP 地址, 避免了手动管理 IP 的不便.
  • 一般的路由器都带有 DHCP 功能. 因此路由器也可以看做一个 DHCP 服务器.能够自动的给子网内新增主机节点分配 IP 地址,路由器可以构建一个局域网。

过去曾经提出一种划分网络号和主机号的方案, 把所有 IP 地址分为五类, 如下图所示:

  • A 类 0.0.0.0 到 127.255.255.255
  • B 类 128.0.0.0 到 191.255.255.255
  • C 类 192.0.0.0 到 223.255.255.255
  • D 类 224.0.0.0 到 239.255.255.255
  • E 类 240.0.0.0 到 247.255.255.255

随着 Internet 的飞速发展,这种划分方案的局限性很快显现出来,大多数组织都申请 B 类网络地址, 导致 B 类地址很快就分配完了, 而 A 类却浪费了大量地址。

针对这种情况提出了新的划分方案, 称为 CIDR:

  • 引入一个额外的子网掩码(subnet mask)来区分网络号和主机号;
  • 子网掩码也是一个 32 位的正整数. 通常用一串 "0" 来结尾,那就是一串1开始的;
  • 将 IP 地址和子网掩码进行 "按位与" 操作, 得到的结果就是网络号;


  • 可见,IP 地址与子网掩码做与运算可以得到网络号, 主机号从全 0 到全 1 就是子网的地址范围;
  • IP 地址和子网掩码还有一种更简洁的表示方法,例如 140.252.20.68/24,表示 IP 地址为140.252.20.68, 子网掩码的高 24 位是 1,也就是 255.255.255.0

特殊的 IP 地址

  • 将 IP 地址中的主机地址全部设为 0, 就成为了网络号, 代表这个局域网;

  • 将 IP 地址中的主机地址全部设为 1, 就成为了广播地址, 用于给同一个链路中相互连接的所有主机发送数据包;

  • 127.* 的 IP 地址用于本机环回(loop back)测试,通常是 127.0.0.1

IP 地址的数量限制

我们知道, IP 地址(IPv4)是一个 4 字节 32 位的正整数. 那么一共只有 2 的 32 次方 个 IP地址, 大概是 43 亿左右. 而 TCP/IP 协议规定, 每个主机都需要有一个 IP 地址. 这意味着, 一共只有 43 亿台主机能接入网络么?

实际上, 由于一些特殊的 IP 地址的存在, 数量远不足 43 亿; 另外 IP 地址并非是按照主机台数来配置的, 而是每一个网卡都需要配置一个或多个 IP 地址. CIDR 在一定程度上缓解了 IP 地址不够用的问题(提高了利用率, 减少了浪费, 但是 IP地址的绝对上限并没有增加), 仍然不是很够用.

这时候有三种方式来解决:

  • 动态分配 IP 地址: 只给接入网络的设备分配 IP 地址. 因此同一个 MAC 地址的设备, 每次接入互联网中, 得到的 IP 地址不一定是相同的;

  • NAT 技术(后面会重点介绍);

  • IPv6: IPv6 并不是 IPv4 的简单升级版. 这是互不相干的两个协议, 彼此并不兼容; IPv6 用 16 字节 128 位来表示一个 IP 地址; 但是目前 IPv6 还没有完全普及;

私有 IP 地址和公网 IP 地址

如果一个组织内部组建局域网,IP 地址只用于局域网内的通信,而不直接连到 Internet 上, 理论上 使用任意的 IP 地址都可以,但是 RFC 1918 规定了用于组建局域网的私有 IP 地址

  • 10.*,前 8 位是网络号,共 16,777,216 个地址
  • 172.16.到 172.31.,前 12 位是网络号,共 1,048,576 个地址
  • 192.168.*,前 16 位是网络号,共 65,536 个地址

包含在这个范围中的, 都成为私有 IP, 其余的则称为全局 IP(或公网 IP);

  • 一个路由器可以配置两个 IP 地址, 一个是 WAN 口 IP, 一个是 LAN 口 IP(子网IP). 路由器可以组件局域网,当家里面的电脑手机连上家里面的路由器,路由器就给主机分配ip地址,就构成了一个子网。我们用户上网一般都是连接的家里的路由器,而家里的路由器一般都是连接的运营商组件好的局域网。
  • 路由器 LAN 口连接的主机, 都从属于当前这个路由器的子网中.
  • 不同的路由器, 子网 IP 其实都是一样的(通常都是 192.168.1.1,是该子网的第一台主机). 子网内的主机IP 地址不能重复. 但是子网之间的 IP 地址就可以重复了.
  • 每一个家用路由器, 其实又作为运营商路由器的子网中的一个节点. 这样的运营商路由器可能会有很多级, 最外层的运营商路由器,WAN 口 IP 就是一个公网 IP了.
  • 子网内的主机需要和外网进行通信时,路由器将 IP 首部中的 IP 地址进行替换(替换成 WAN 口 IP),这样逐级替换,最终数据包中的 IP 地址成为一个公网 IP. 这种技术称为 NAT(Network Address Translation,网络地址转换).
  • 如果希望我们自己实现的服务器程序,能够在公网上被访问到,就需要把程序部署在一台具有外网 IP 的服务器上.

上面图话有一点没有画,就是消息返回的时候,具体怎么到用户的主机的过程;

路由

在复杂的网络结构中,找出一条通往终点的路线。

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

IP 数据包的传输过程也和问路一样.

  • 当 IP 数据包, 到达路由器时, 路由器会先查看目的 IP;
  • 路由器决定这个数据包是能直接发送给目标主机, 还是需要发送给下一个路由器;
  • 依次反复, 一直到达目标 IP 地址;

那么如何判定当前这个数据包该发送到哪里呢? 这个就依靠每个节点内部维护一个路由表;

  • 路由表可以使用 route 命令查看
  • 如果目的 IP 命中了路由表, 就直接转发即可;
  • 路由表中的最后一行,主要由下一跳地址和发送接口两部分组成,当目的地址与路由表中其它行都不匹配时,就按缺省路由条目规定的接口发送到下一跳地址。

假设某主机上的网络接口配置和路由表如下:

  • 这台主机有两个网络接口,一个网络接口连到 192.168.10.0/24 网络,另一个网络接口连到 192.168.56.0/24 网络;
  • 路由表的 Destination 是目的网络地址,Genmask 是子网掩码,Gateway 是下一跳地址,Iface 是发送接口,Flags 中的 U 标志表示此条目有效(可以禁用某些 条目),G标志表示此条目的下一跳地址是某个路由器的地址,没有 G 标志的条目表示目的网络地址是与本机接口直接相连的网络,不必经路由器转发;

转发过程例 1: 如果要发送的数据包的目的地址是 192.168.56.3

  • 跟第一行的子网掩码做与运算得 到 192.168.56.0,与第一行的目的网络地址不符
  • 再跟第二行的子网掩码做与运算得 到 192.168.56.0,正是第二行的目的网络地址,因此从 eth1 接口发送出去;
  • 由于 192.168.56.0/24 正 是与 eth1 接口直接相连的网络,因此可以直接发到目的主机,不需要经路由器转发;

转发过程例 2: 如果要发送的数据包的目的地址是 202.10.1.2

  • 依次和路由表前几项进行对比, 发现都不匹配;
  • 按缺省路由条目, 从 eth0 接口发出去, 发往 192.168.10.1 路由器;
  • 由 192.168.10.1 路由器根据它的路由表决定下一跳地址;

相关推荐
BingoGo1 小时前
当你的 PHP 应用的 API 没有限流时会发生什么?
后端·php
JaguarJack1 小时前
当你的 PHP 应用的 API 没有限流时会发生什么?
后端·php·服务端
BingoGo1 天前
OpenSwoole 26.2.0 发布:支持 PHP 8.5、io_uring 后端及协程调试改进
后端·php
JaguarJack1 天前
OpenSwoole 26.2.0 发布:支持 PHP 8.5、io_uring 后端及协程调试改进
后端·php·服务端
Jony_2 天前
高可用移动网络连接
网络协议
chilix2 天前
Linux 跨网段路由转发配置
网络协议
JaguarJack2 天前
推荐 PHP 属性(Attributes) 简洁读取 API 扩展包
后端·php·服务端
BingoGo2 天前
推荐 PHP 属性(Attributes) 简洁读取 API 扩展包
php
JaguarJack3 天前
告别 Laravel 缓慢的 Blade!Livewire Blaze 来了,为你的 Laravel 性能提速
后端·php·laravel
郑州光合科技余经理4 天前
代码展示:PHP搭建海外版外卖系统源码解析
java·开发语言·前端·后端·系统架构·uni-app·php