IP协议
IP协议全称为"网际互连协议(Internet Protocol)",IP协议是TCP/IP体系中的网络层协议。
基本概念
网络层解决的问题
虽然TCP协议制定了保证数据可靠性和效率的"传输策略",但真正负责数据在网络中实际"搬运"工作的,是底层的网络层与链路层。
网络通信并非在双方传输层之间直接发生,而是遵循"垂直封装---水平传输---垂直解包"的流程:发送方将数据向下交付,层层封装;接收方收到后向上交付,层层解包。
这就好比两位住在不同大楼4层的人互送文件:

-
下楼(数据封装):发送者必须先从4楼下到1楼;
-
赶路(数据路由):在街道上规划路径,抵达对面楼下;
-
上楼(数据解包):最后上到4楼将文件交给接收者。
网络层要解决的问题就是,将数据从一台主机送到另一台主机,也就是数据的路由。
路径选择
数据进行跨网络传输时,必须经过多个路由器的中转。
路由的核心在于基于目的地寻找最优路径。由于数据包本身无法自主导航,它必须依赖路由器进行逐级指引。
路由器通过查询自身的路由表,为数据包提供正确的路径导向。通过不断地在路由器间进行转发和路径修正,数据包才能逐渐趋近并最终送达目标主机。

主机和路由器
- 主机:配有IP地址,但是不进行路由控制的设备。但实际现在几乎不存在不进行路由控制的设备了,就连你的笔记本也会进行路由控制。
- 路由器:既配有IP地址,又能进行路由控制。实际现在主流的路由器已经不仅仅具有路由的功能了,它甚至具备某些应用层的功能。
- 节点:主机和路由器的统称。
IP协议格式
IP协议格式如下:

- 4位版本号(version):指定IP协议的版本(IPv4/IPv6),对于IPv4来说,就是4。
- 4位首部长度(header length):表示IP报头的长度,以4字节为单位。
- 8位服务类型(Type Of Service):3位优先权字段(已经弃用),4位TOS字段,和1位保留字段(必须置为0)。4位TOS分别表示:最小延时,最大吞吐量,最高可靠性,最小成本。这四者相互冲突,只能选择一个。比如对于ssh/telnet这样的应用程序,最小延时比较重要,而对于ftp这样的程序,最大吞吐量比较重要。
- 16位总长度(total length):IP报文(IP报头+有效载荷)的总长度,用于将各个IP报文进行分离。
- 16位标识(id):唯一的标识主机发送的报文,如果数据在IP层进行了分片,那么每一个分片对应的id都是相同的。
- 3位标志字段:第一位保留,表示暂时没有规定该字段的意义。第二位表示禁止分片,表示如果报文长度超过MTU,IP模块就会丢弃该报文。第三位表示"更多分片",如果报文没有进行分片,则该字段设置为0,如果报文进行了分片,则除了最后一个分片报文设置为0以外,其余分片报文均设置为1。
- 13位片偏移(framegament offset):分片相对于原始数据开始处的偏移,表示当前分片在原数据中的偏移位置,实际偏移的字节数是这个值× 8 \times 8×8得到的。因此除了最后一个报文之外,其他报文的长度必须是8的整数倍,否则报文就不连续了。
- 8位生存时间(Time To Live,TTL):数据报到达目的地的最大报文跳数,一般是64,每经过一个路由,TTL -= 1,一直减到0还没到达,那么就丢弃了,这个字段主要是用来防止出现路由循环。
- 8位协议:表示上层协议的类型。
- 16位首部检验和:使用CRC进行校验,来鉴别数据报的首部是否损坏,但不检验数据部分。
- 32位源IP地址和32位目的IP地址:表示发送端和接收端所对应的IP地址。
- 选项字段:不定长,最多40字节。
IP报头在内核当中本质就是一个位段类型,给数据封装IP报头时,实际上就是用该位段类型定义一个变量,然后填充IP报头当中的各个属性字段,最后将这个IP报头拷贝到数据的首部,至此便完成了IP报头的封装。
IP报头与有效载荷的分离机制
IP采用与TCP相同的**"定长报头 + 自描述字段"**策略来进行解包,具体步骤如下:
-
提取固定头部 :IP层首先从报文中读取前 20字节。这是所有IP报文都必须具备的基本报头。
-
读取长度字段 :从这20字节中提取 4位首部长度 。该字段以 4字节 为单位描述报头大小。
-
计算与分离:
-
标准情况:如果该字段值为 5(即二进制 0101),则报头长度为 5 * 4 = 20 字节,意味着没有选项字段,剩下的即为有效载荷。
-
带选项情况:如果该字段值大于 5,则计算出总报头长度(最大为15 * 4 = 60 字节)。IP需继续读取剩余的选项字段,读取完毕后剩余部分即为有效载荷。
-
上层协议的分用(交付)策略
IP层支持多种传输层协议(如TCP、UDP等),因此在解包后必须精准判断将数据交付给谁。这一决策完全依赖于IP报头中的 8位协议 (Protocol) 字段 :
-
标记机制:发送端的IP层在封装数据时,会根据上层传来的数据类型(如TCP或UDP),在该字段中填充对应的协议编号。
-
分发机制:接收端的IP层在解包时,读取这8位协议字段的值。如果值为TCP的编号,则将有效载荷交付给TCP层处理;反之则交付给对应的其他协议。
源IP与目的IP的核心作用
IP报头中包含的 32位源IP地址 和 32位目的IP地址 ,在通信全过程中扮演着不同的角色:
-
目的IP地址(导航路标):这是数据传输的终点标识。网络中的路由器主要依赖目的IP地址来查找路由表,决定数据的下一跳方向,从而确立从源主机到目标主机的传输路径 。
-
源IP地址(响应凭证) :这是数据发送方的标识。它的主要作用是让接收端知道"是谁发来的数据"。这不仅用于身份识别,更是接收端构建响应报文(如TCP的ACK确认或回传数据)的必要依据,确保双向通信的闭环。
理解socket编程:
- 在进行socket编程的时候,当一端想要发送数据给另一端时,必须要指明对端的IP地址和端口号,也就是发送数据的目的IP地址和目的端口号。
- 其中这里的IP地址就是给网络层的IP用的,用于数据在网络传输过程中的路由转发,而这里的端口号就是给传输层的TCP或UDP用的,用于指明该数据应该交给上层的哪一个进程。
- 发送数据时我们不需要指明发送数据的源IP地址和源端口号,因为传输层和网络层都是在操作系统内核当中实现的,数据在进行封装时操作系统会自行填充上对应的源IP地址和源端口号。
8位生存时间
在复杂的网络环境中,报文可能因路由环路或目标主机不可达而无法送达,从而演变成占用带宽的"僵尸报文"。为了防止此类废弃报文在网络中无限循环,IP协议头设计了 8位生存时间字段 。
该字段定义了报文在网络中允许经过的最大路由跳数。报文每经过一个路由器进行转发,TTL值便会自动减 1。一旦 TTL 值递减至 0,该报文将被路由器直接丢弃 。这一机制有效地从网络中清除了无效流量,防止了资源耗尽。
网段划分
IP地址可以看作是"街道名 + 门牌号"的组合
区分区域(网络号):用来标识不同的网段(街道)。如果路由器连接了两个不同的网段,这两个网段必须拥有不同的网络号,以示区分 。
区分个体(主机号):用来标识同一网段内的不同设备(门牌)。在同一个网段内,大家的网络号都是一样的,但必须拥有互不冲突的主机号 。

我们通常在IP后面加上 /N,用来告诉机器:这个IP地址的前 N 位是它的"街道名"(网络号)。当我们把一台新电脑接入子网时,必须确保它的"街道名"是对的,且"门牌号"没被别人占用 。
DHCP协议
手动管理IP地址是一项极低效的工作:既要为新入网的主机分配地址,又要及时回收离线主机的IP以供循环使用 。为了解决这一痛点,DHCP (动态主机配置协议) 应运而生。
- 核心功能:DHCP主要应用于大型局域网,负责集中管理并动态分配IP地址、网关及DNS服务器地址,从而极大地提升了IP地址的利用率 。
- 技术实现:它是一个基于UDP的应用层协议。在日常生活中,一般的路由器都内置了DHCP功能,因此路由器本身就是一个DHCP服务器 。
当你连接WiFi时,通过密码验证仅仅是第一步。随后,路由器的DHCP服务会在后台为你动态分配一个IP地址,这才是你能正常上网的根本原因 。
路由策略:先找网络,再找主机
数据在进行跨网络传输时,遵循"先宏观定位网络,后微观定位主机"的逻辑。
-
分层查找 :数据的投递并不是一步直达目标主机。路由器首先会将数据发送到目标主机所在的目标网络,到达该网络后,再进一步寻址找到具体的主机。
-
效率至上:之所以不一开始就搜索具体主机,是因为效率太低。
-
排除法逻辑:找主机的本质是一个排除过程。如果直接在全网范围找主机,一次只能排除一个错误选项。
-
网段的作用:通过"先找网络",系统可以一次性排除掉所有非目标网段的海量主机。
-
这就是我们需要进行网段划分的根本原因------利用"批量排除"来大幅提高数据路由的检索效率。
IP地址的分类体系
早期互联网采用了一种固定的分层方案,将所有IP地址划分为五大类(A、B、C、D、E类)。判断一个IP地址属于哪一类,只需检查其二进制形式的前5位,看第几位最先出现"0"值即可。
具体分类与取值范围如下:

- A类 (首位为0):范围
0.0.0.0到127.255.255.255。 - B类 (前两位10):范围
128.0.0.0到191.255.255.255。 - C类 (前三位110):范围
192.0.0.0到223.255.255.255。 - D类 (前四位1110):范围
224.0.0.0到239.255.255.255(用于多播) 。 - E类 (前五位11110):范围
240.0.0.0到247.255.255.255(保留实验) 。
当要判断一个IP地址是属于哪一类时,只需要遍历IP地址的前五个比特位,第几个比特位最先出现0值,那么这个IP地址对应就属于A、B、C、D、E类地址。
子网划分与CIDR技术
上述分类面临的问题: 随着网络发展,分类方案的僵化导致了严重的资源浪费。例如,A类网络太少(网络号仅7位),而B类网络太大(主机号16位,允许65536台主机)。现实中很少有局域网能填满B类网络,申请B类地址往往意味着大量IP被闲置浪费 。
解决方案: 为了解决浪费,引入了 CIDR (无类别域间路由) 技术。它打破了固定的类別限制,通过借用主机号的位来充当网络号,从而实现更细粒度的子网划分 。
子网掩码: 为了区分哪部分是网络号,引入了子网掩码。它是一个32位整数,由一串连续的"1"后跟一串"0"组成 。
- 计算方法:将 IP地址 与 子网掩码 进行 按位与 (&) 操作,即可得到网络号 。
- 本质:这一操作保留了IP地址中网络号部分的位,并将主机号部分的位全部清零。
路由视角的层级变化: 子网划分是可以递归进行的。数据在路由过程中,随着其深入更具体的子网,匹配的网络号位数会不断增加(即子网掩码变长),而主机号位数相应减少。当数据最终到达目标网络时,网络号长度达到最大,路由器利用剩余的主机号精确定位目标主机,完成传输。
特殊的IP地址
并不是所有的IP地址都能够作为主机的IP地址,有些IP地址本身就是具有特殊用途的。
- 将IP地址中的主机地址全部设为0,就成为了网络号,代表这个局域网。
- 将IP地址中的主机地址全部设为1,就成为了广播地址,用于给同一个链路中相互连接的所有主机发送数据包。
- 127.*的IP地址用于本机环回(loop back)测试,通常是127.0.0.1。
也就是说,IP地址中主机号为全0的代表的是当前局域网的网络号,IP地址中主机号为全1的代表的是广播地址,这两个IP地址都是不能作为主机的IP地址的。因此在某个局域网中最多能存在的主机个数是 2^主机号位数 − 2
本机环回 (Loopback) 的核心机制
基本定义: 本机环回是指数据在网络协议栈中走了一圈然后返回。数据会自顶向下完整经过协议栈进行封装,但在IP层被折回,不再向下进入物理网卡,而是直接自底向上再次贯穿协议栈进行解包。
目的:主要用于测试本机网络协议栈的功能是否正常。
底层实现原理: 环回的本质是IP输出函数与IP输入函数的直接对接 。
- 当IP层准备发送数据时,如果检测到是环回程序:IP输出函数会将该数据直接写入IP输入队列。
- IP输入函数随后从该队列读取数据。此时,数据被伪装成"从链路层收到的数据",进而触发后续的解包和分用流程。
IP层的发送逻辑判断: 不是所有数据都会走网卡,IP层会按以下优先级处理数据流向:
- 情况A(环回程序):直接放入IP输入队列 。
- 情况B(广播/多播/发给自己):如果目的IP是广播/多播地址,或与本机IP一致,同样放入IP输入队列 。
- 情况C(发往外部):只有非环回且非本地的数据,才会调用ARP获取MAC地址,并通过网卡真正发送到网络中 。

IP地址的数量限制
IPv4地址枯竭的必然性
IPv4协议的物理极限决定了其总容量仅为 43亿 个地址。然而,TCP/IP协议强制要求每一台入网的主机都必须拥有独立的IP地址,这导致了严重的供需矛盾:
- 需求爆炸:全球70多亿人口带来的智能设备浪潮,加之智能家居(冰箱、洗衣机等)和物联网设备的普及,使得入网设备数量远超43亿 。
- 非线性消耗:IP地址消耗并非与设备数1:1对应。单台主机可能配置多个IP,且网络中的大量路由器、网关设备也需占用IP,加之部分特殊地址(如环回、广播)无法分配,实际可用地址更为稀缺 。
- CIDR的局限:虽然CIDR(无类别域间路由)通过子网划分提高了地址利用率,有效遏制了浪费,但它只能"节流",无法从根本上突破IPv4地址总量的物理上限 。
应对策略:缓解与根本解决
面对IP地址不足,目前主要采取以下三种技术手段:
- 动态分配:放弃一机一号的强绑定模式。只为当前接入网络的设备分配IP,设备离线即回收。这意味着同一个MAC地址在不同时间上网时,获取的IP地址可能不同,从而通过循环利用提高了资源周转率 。
- NAT技术 (网络地址转换): 这是一种复用策略。它允许不同局域网内部使用相同的私有IP地址,通过路由器对外映射公网IP。NAT不仅极大节省了公网IP资源,还因隐藏了内部网络结构,起到了防御外部攻击的安全屏障作用 。
- IPv6 : 通过将地址长度扩展至 128位,IPv6提供了近乎无限的地址空间。然而,IPv6并非IPv4的简单补丁,二者互不兼容。由于升级成本和兼容性问题,目前IPv6尚未完全普及 。
私网IP地址和公网IP地址
私网IP的定义与标准
虽然理论上任何IP地址都可用于组建内部局域网,但为了避免与互联网地址冲突,RFC 1918 协议明确规定了局域网专用的"私有IP地址"范围 。凡是处于以下范围内的IP均为私网IP,其余则被称为公网IP(或全局IP):
- 10.*.*.* :前8位为网络号。包含约 1677万 个地址(适合大型网络)。
- 172.16.*.* ~ 172.31.*.* :前12位为网络号。包含约 100万 个地址 。
- 192.168.*.* :前16位为网络号。包含约 6.5万 个地址(最常见的家用/小型网络)。
公网IP与私网IP的实际应用差异
我们在使用云服务器时,通常会遇到两种IP地址:
- 连接时:我们通过SSH连接的IP是公网IP,这是云服务器对外提供访问的"门牌号" 。

- 内部接口 :云厂商(如腾讯云)通常会在内部网络使用私有IP。例如,虽然你连接的是公网IP,但服务器内部实际配置的IP可能是
172.21.0.15,这正好属于第二类私网地址范围。
如何查看本机的私网IP
我们可以通过命令行工具查看当前设备的网络接口配置:
Linux系统 (ifconfig):
-
lo (Loopback):本地环回接口,用于本机测试 。
-
eth0 :物理网络接口,显示的通常是私网IP(例如云服务器上的
172.21.0.15)。

Windows系统 (ipconfig):
- 在cmd窗口运行此命令,通常会看到大量以
192.168开头的地址,这正是路由器分配给局域网设备的经典私网IP。
数据的逐级跃迁:NAT与路由器接口
路由器作为连接网络的枢纽,拥有两种关键接口:连接本地设备的 LAN口(子网IP)和连接外部网络的 WAN口(外网IP)。

数据从电脑发送到公网服务器的过程,实际上是一个层级递进的过程:
- 层级结构:我们的电脑连接家用路由器,家用路由器又是运营商路由器的子网节点,运营商路由器可能还有多级,直到最外层的WAN口拥有真正的公网IP 。
- NAT技术 (网络地址转换):由于私网IP不能在公网路由,数据包在向外发送时,每经过一级路由器,路由器都会将数据包头部的源IP地址替换成该路由器WAN口的IP地址 。
- 结果:通过这种逐级替换,数据包的源IP最终变成了公网IP,从而能够在互联网上被正确传输和返回。
为什么私网IP不能出现在公网当中?
私网IP被设计为仅在局域网内部使用,严禁出现在公网路由中,主要基于以下逻辑:
- 唯一性冲突:公网通信的基础是IP地址的全球唯一性。由于不同的局域网(如你家和我家)可以自由复用相同的私网IP(如都是192.168.1.1),如果在公网上使用这些IP,路由器将无法区分目标到底是谁。
- 缓解地址枯竭:这种"复用"机制恰恰是其优势。允许无数个局域网重复使用相同的私网IP空间,极大地缓解了IPv4地址不足的压力 。
- 运营商管控:数据必须经过运营商的网关进行NAT转换才能上网,这也确保了网络接入的可管理性(即"交网费"的凭证)。
跨局域网通信的"中间人"模式
两个位于不同局域网的主机(例如两台手机聊天),理论上无法直接"点对点"通信,原因在于:
- 地址不可达:你无法直接向对方的私网IP发送数据。
- 地址混淆:如果对方的私网IP和你一样(都是192.168.1.5),你的操作系统会误以为这是发给自己的数据,直接在本地拦截,不会发往网络。
因此,现代网络通信(如微信、QQ)通常采用服务器中转模式:
- 发送方将数据经过公网发送到具有公网IP的服务器 。
- 服务器接收后,再将数据转发给接收方所在的局域网。
注:虽然存在内网穿透技术可以实现类似直连的效果,但标准通信主要依赖公网服务器中转。
路由
数据在网络中的传输并不是一步直达的,而是一个一跳一跳的"问路"过程。

什么是"一跳"?
- 它指的是数据链路层中的一个传输区间 。
- 在以太网中,具体指从源MAC地址到目的MAC地址之间的这段距离。
路由器的决策逻辑: 每当IP数据包到达一个路由器,路由器会检查其目的IP地址 ,并根据路由表决定下一步怎么走。通常有三种结果:
- 下一跳子网:查询到明确的匹配子网,告知数据包去往下一个具体的路由器 。
- 默认路由:查不到匹配的子网,将数据包"甩"给默认路由,让下一台路由器去操心 。
- 直连投递:发现目标网络就是当前所在的网络,直接将数据交给目标主机 。
路由表查询的具体算法
路由器"认路"的核心在于内部维护的路由表 ,在Linux中可以通过 route 命令查看。

路由表关键字段如下 :
-
Destination:目的网络地址。
-
Gateway:下一跳地址。
-
Genmask:子网掩码。
-
Iface:发送接口(数据从哪个口出去)。
-
Flags:
-
U(Up):条目有效 -
G(Gateway):下一跳是路由器。如果没有G,说明是直连网络,不需要通过路由器转发
-
查询算法
- 运算:路由器将数据包的 目的IP 与路由表中每一行的 Genmask 进行"按位与" (&) 操作
- 比对:将运算结果与该行的 Destination 进行比对 。
- 命中 :如果一致,说明匹配成功,通过对应的
Iface发送出去。 - 兜底:如果所有条目都不匹配,则发送给 default (默认路由) 。
最终交付: 数据不断经过路由器转发,一旦到达目标网络,就不再看网络号,而是根据主机号直接定位并交付给目标主机。
路由表生成算法
路由可分为静态路由和动态路由:
- 静态路由:是指由网络管理员手工配置路由信息。
- 动态路由:是指路由器能够通过算法自动建立自己的路由表,并且能够根据实际情况进行调整。
路由表相关生成算法:距离向量算法、LS算法、Dijkstra算法等。