目录
一、什么是IP协议
在正式开始介绍IP协议之前,我们先要了解几个基本概念。
主机:配有IP地址,也要进行路由控制的设备;
路由器:既配有IP地址,又能进行路由控制;
节点:主机和路由器的统称;

IP协议分为IPv4和IPv6,下面我们主要讲解日常使用更广泛的IPv4协议。
1.1 IP 的作用
前面我们介绍的传输层协议,负责两台主机之间的数据交互。但两台主机无法直接把报文发给对方,中间要经过网络里多台路由器转发,报文会一跳一跳经过各个路由器,最终送达目标主机。
主机B可以直接和路由器F转发数据,就说明主机B与路由器F处于同一个子网。同理,能直接转发数据的相邻主机和路由器,必然属于同一子网。
那主机B向主机C发送数据,为什么只能走图里这条固定线路? 根源在于目的IP具备明确寻址指向,设备会依据目的IP完成路径挑选。IP协议的核心作用,就是跨不同子网完成路由选择,让报文跨网段转发。
1.2 IP 地址的构成
IP 地址拥有固定结构,IPv4 由 32 个二进制比特位组成。 IP 地址 = 目标网络号 + 目标主机号 发送数据时流程分为两步:先通过网络号找到目标网段,报文抵达目标子网后,再依靠主机号在内网转发给目标主机。
1.3 TCP vs IP
IP协议主要提供的是将数据从主机A跨网络,经过路径选择,路由转发,可靠地传送到主机B的能力。
而TCP协议只是一套可靠传输控制策略,而这套策略真正的底层传输,全部依靠IP协议来落地实现。
IP协议本身不具备任何可靠传输能力,报文丢失、乱序、损坏它都不会处理。所以传输过程中所有可靠性保障逻辑,全部由上层TCP协议来提供。
二、IP协议头格式

4 位版本号 (version): 指定IP协议的版本,对于IPv4来说,就是4。
4 位头部长度 (header length)。IP协议这里的4位首部长度与TCP协议的一致。IP字段也可以带上选项字段。一旦启用了选项字段,报头长度就会变为 20+n 字节(n为选项长度)。
而IP协议中为了兼容这种变长报头设计,在报头中专门设置了一个4 位首部长度字段。
该字段取值范围为二进制0000~1111,对应十进制0~15。需要注意的是,这个字段的单位不是字节,而是4字节:写入数值时需要乘以4换算为实际字节长度,读取解析时需要除以4还原数值。
报头最小长度为20字节、最大长度为60字节,换算后首部长度字段的有效取值范围为5~15(20/4=5、60/4=15)。
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 位分片偏移 (fragment offset): 是分片相对于原始 IP 报文开始处的偏移。其实就是在表示当前分片在原报文中处在哪个位置。实际偏移的字节数是这个值 * 8 得到的。因此,除了最后一个报文之外,其他报文的长度必须是 8 的整数倍 (否则报文就不连续了)。
8 位生存时间 (Time To Live, TTL): 数据报到达目的地的最大报文跳数,一般是 64。数据包每经过一台路由器,TTL数值就会减 1,一旦减到0,路由器会直接丢弃该报文,并向源端返回 ICMP 超时报文, 一直减到 0 还没到达,那么就丢弃了。这个字段主要是用来防止出现路由循环。
8 位协议:表示上层协议的类型。
16 位头部校验和:使用 CRC 进行校验,来鉴别头部是否损坏。
2.1 IP报头与有效载荷的分离
由于IP协议中存在16位总长度用于记录整个报文的长度,而IP协议的报头又是固定20字节大小(不带选项),所以只要用总长度减去报头长度就是有效载荷的长度。这也就是为什么IP报文叫做IP数据报的原因。IP数据报里承载的有效载荷,就是从传输层传递下来的TCP/UDP报文。
2.2 IP协议有效载荷的分用
IP协议头部存在一个名为Protocol的8位协议字段,这个8位协议号由发送方提前填写,该字段用于标识IP数据包载荷里封装的上层协议。路由器转发报文时只会解析源与目的IP完成转发,不会解析此字段,只有目标主机内核网卡协议栈会读取该字段,以此识别内部承载的数据属于哪一类上层协议。
收到报文后就能准确将完整IP包或分片数据向上交付给对应的传输层协议处理,例如承载 TCP 报文时 Protocol 填 6,承载 UDP 报文则填 17。下面就是一些常用的标准协议号:
| 协议号 | 协议名称 | 英文全称 | 用途场景 |
|---|---|---|---|
| 0 | HOPOPT | IPv6 Hop-by-Hop | IPv6 逐跳扩展头(IPv4 不使用) |
| 1 | ICMP | Internet Control Message Protocol | IPv4 网络控制、ping、差错报告 |
| 2 | IGMP | Internet Group Management Protocol | 组播管理(视频直播、IPTV) |
| 4 | IP-in-IP | IP Encapsulation within IP | IP 隧道封装(VPN 底层) |
| 6 | TCP | Transmission Control Protocol | 可靠传输:HTTP/HTTPS/FTP/SSH |
| 8 | EGP | Exterior Gateway Protocol | 老旧外部网关路由协议(淘汰) |
| 17 | UDP | User Datagram Protocol | 无连接:DNS/DHCP/ 流媒体 / 游戏 |
| 41 | IPv6 | IPv6 over IPv4 隧道 | 6to4 隧道封装 IPv6 报文 |
| 47 | GRE | Generic Routing Encapsulation | 通用隧道协议(企业 VPN) |
| 50 | ESP | Encapsulating Security Payload | IPsec 加密隧道 |
| 51 | AH | Authentication Header | IPsec 完整性校验 |
| 58 | ICMPv6 | ICMP for IPv6 | IPv6 ping、邻居发现 NDP |
| 88 | EIGRP | Enhanced Interior Gateway Routing Protocol | 思科私有路由协议 |
| 89 | OSPF | Open Shortest Path First | 企业主流动态路由协议 |
| 112 | VRRP | Virtual Router Redundancy Protocol | 网关冗余备份(双机热备) |
| 132 | SCTP | Stream Control Transmission Protocol | 电信信令、5G、WebRTC |
三、IP网段划分*

我们知道 IP 地址分为网络标识和主机标识。网段划分,就是把一个大的网络,切割成多个独立的小子网。而路由器的核心功能之一就是划分、构建子网。在日常生活中,当我们的手机连接WIFI时,本质就是接入路由器搭建的子网,连接完成后路由器会为手机分配一个该子网内可用的IP地址。
我们结合上面这张图来理解网段划分。IP地址分为网络标识和主机标识,/24表示IP前 24 位是网络标识。在同一个子网内,所有设备的网络标识都是一致,但主机标识不能重复;而被路由器隔开的不同网段,网络标识一定不相同。 图里路由器连接了两个子网,192.168.128.0/24和192.168.144.0/24,路由器分别在两个子网中各有一个IP(主机号一般为 1)。同一网段设备可以直接通信;而跨网段的数据,则依靠路由器完成转发。
那为什么要进行网段划分呢?
进行网段划分是为了让主机向目标主机发送数据时,路由器依靠网络号在公网中查找目标网段更加快捷。同时它还能隔离广播域,避免广播风暴。
网段划分的出现也能方便网络运维管理,并且可以实现不同网段之间的隔离,提升网络安全性。
那么路由器是如何进行网段划分的呢?
过去曾经提出一种划分网络号和主机号的方案——分类划分法(有类编址),即把所有 IP 地址分为五类,如下图所示:

- A 类地址:
- 网络号占 8 位,主机号占 24 位
- 最高位固定为
0 - 地址范围:
1.0.0.0~126.255.255.255(0和127为特殊地址)
- B 类地址:
- 网络号占 16 位,主机号占 16 位
- 最高两位固定为
10 - 地址范围:
128.0.0.0~191.255.255.255
- C 类地址:
- 网络号占 24 位,主机号占 8 位
- 最高三位固定为
110 - 地址范围:
192.0.0.0~223.255.255.255
- D 类地址:
- 最高四位固定为
1110 - 地址范围:
224.0.0.0~239.255.255.255 - 多用于组播通信
- 最高四位固定为
- E 类地址:
- 最高四位固定为
1111 - 地址范围:
240.0.0.0~255.255.255.255 - 保留用于研究 / 测试
- 最高四位固定为
分类划分法强制将IP划分为 A、B、C三类固定大小网段,会造成巨大的IP地址浪费。这种方法导致没有中间档位可选,需求几百台设备的企业只能占用数万主机位的B类网段,绝大多数地址会被闲置,造成资源的浪费和加速IPv4地址的消耗。
正因为分类编址存在诸多问题,业界推出了一种名为无类CIDR网段划分的新方案。
这个方案引出了一个新的概念,叫做子网掩码。子网掩码的作用是区分 IP 地址中的网络号与主机号,它的二进制格式有固定规律:左侧连续全部为1,右侧连续全部为0。我们常写的/24前缀,对应的子网掩码二进制就是1111 1111 1111 1111 1111 1111 0000 0000。将 IP 地址和子网掩码做按位与运算,就能算出这台主机对应的子网网络地址。举个例子,IP 地址192.168.1.1与/24对应的子网掩码执行按位与运算,最终结果为192.168.1.0,这个地址就是该主机所在子网的网络标识。
而/24网段主机位共8比特位,十进制取值范围0~255,合计256个地址。其中主机位全部为0的是子网网络地址、主机位全部为1的是子网广播地址,这两个地址不能分配给终端设备使用,因此实际可分配给主机的地址数量为256-2=254。
IP地址和子网掩码还有一种更加简洁的表示方式,即192.168.1.1/24,表示IP地址位192.168.1.1,子网掩码的高24位为1,即255.255.255.0。
在CIDR无类网段划分体系下,网络号与主机号的划分和 IP 本身属于A、B、C哪一类地址没有任何关系。我们不再被固定的分类前缀束缚,可以自由自定义掩码位数,按需切分网络位与主机位,这也是它相比传统有类划分最关键的优势。
四、IP地址的数量限制
我们知道,IPv4地址是4字节共32位的数字,理论上总地址数量为2^32,大约43亿个。TCP/IP协议要求每一台接入网络的主机都配备IP地址,那是不是意味着全网最多只能接入43亿台主机?
答案是否定的。一方面,网络中存在诸如网段网络地址、广播地址、私网地址、保留地址等大量特殊IP无法分配给普通终端,实际可用的地址远远少于43亿;另一方面,IP 地址是以网卡为单位分配,一张网卡就能绑定一个或多个 IP,一台多网卡设备会占用多个 IP,这就会进一步加剧地址消耗。
CIDR无类划分虽然优化了地址分配方式,减少传统有类编址带来的地址浪费、提升 IP 利用率,但它只是更高效地利用现有32位地址池,并没有提升IP地址总上限,IPv4地址资源依旧紧张。目前主要依靠三种方案缓解地址枯竭的问题:
1.动态分配IP地址:借助 DHCP 仅为当前在线设备临时分配 IP,设备下线后地址回收复用,同一台设备每次上线获取的 IP 可能不同;
2.NAT网络地址转换技术:通过内网私网地址共享少量公网 IP 访问互联网,大幅减少对公网 IP 的消耗;
3.IPv6协议:IPv4与IPv6是两套相互独立、互不兼容的网络协议,不存在简单升级关系;IPv6采用 16字节128位地址空间,地址总量极其庞大,但现阶段全网普及度仍较低。
五、公网IP地址和私网IP地址
如果一个组织内部组建局域网,IP 地址只用于局域网内的通信,而不直接连接到 Internet 上,理论上使用任意的 IP 地址都可以,但是 RFC 1918 规定了用于组建局域网的私有 IP 地址段:
1、10.0.0.0/8:10.0.0.0 ~ 10.255.255.255 前8位是网络号,共有16777216个地址
2、172.16.0.0/12:172.16.0.0 ~ 172.31.255.255 前12位是网络号,共有1048576个地址
3、192.168.0.0/16:192.168.0.0 ~ 192.168.255.255 前16位是网络号,共有65536个地址
这类私有地址不能在公网路由,只能在内网里面通信。而路由器具有搭建局域网的能力,设备接入路由器后会被分配RFC1918规范的私有内网 IP。但是内网主机如果想要访问互联网,就必须借助前面提到的NAT技术,把内网私有IP转换成公网IP进行报文收发,这也是家庭路由器上网的核心原理。
而不在这个范围内的IP我们才称作公有IP(全局IP)。

路由器有两种IP,一种是LAN口的子网IP,一种是WAN口的公网IP。WAN口的公网IP用来连接广域网,和互联网上其他设备通信;LAN口的子网IP是内网网关IP,负责给局域网里的设备分配私有 IP,内网主机的流量都要经过这个网关,再由路由器做NAT转换,把内网私有IP替换成WAN口公网 IP,才能访问外网。
上图里接入广域网的这台运营商路由器,我们把它叫做出入口路由器。从图中可以观察到,路由器和主机之间构成一个局域网,路由器与路由器之间,同样也属于一个局域网。
路由器的WAN口和另一台路由器相连,它们处在同一个网段,本质上就是一个局域网。所以局域网不只是电脑和路由器组成的本地网络,路由器之间互联的网段,同样属于局域网。
所以我们家庭使用的局域网,大多选用192.168.0.0/16这个私有网段,也就是我们常看到的192.168.1.x;而运营商在地区层面搭建的大型局域网,一般会选用10.0.0.0/8这个 A 类私有网段,它的地址空间更大,适合接入大量路由器与设备。
也就是说,我们所有人都不可能直接连接公网。而是先连接到局域网当中,再通过局域网连接到公网。
而局域网的IP使用的私网IP地址是可以重复的,这也就大大缓解IP不足问题了!
在内网访问公网的过程中,报文每经过一个路由器,途经的路由器会把报文里的源IP替换成自身 WAN口IP。一旦报文进入公网之后,就不会再做源IP替换。这种IP替换的工作,只会在内网转发的环节执行,在公网中不会执行。而这种替换IP的技术,就是我们之前一直频繁提到的NAT技术。
转载自 CSDN-专业IT技术社区
原文链接:https://blog.csdn.net/wairuigood/article/details/165725613




