【Linux第二十四章】IP协议

张开发
2026/4/17 11:38:33 15 分钟阅读

分享文章

【Linux第二十四章】IP协议
前言 学到IP协议时很多人会觉得它不像TCP、HTTP那样“有明显流程”反而像是一堆分散概念IP地址、子网划分、路由表、TTL、分片、ARP、NAT、ICMP、代理、内网穿透……每个词单独看都能理解一点但一旦放到完整通信过程里就容易混乱到底谁负责找路谁负责找机器谁负责找网卡谁负责跨网谁负责一跳谁又只是辅助排错其实这部分内容有一条非常清晰的主线IP协议要解决的核心问题是如何让数据跨越多个网络从源主机一路送到目标主机。为了完成这件事它必须同时处理地址表达、路径选择、报文寿命、分片重组以及与链路层、传输层之间的协作关系。这篇文章就围绕这条主线把这份《IP协议》笔记重新整理起来先看IP在协议栈中的职责再看IP报头与地址结构接着把子网、路由、ARP、NAT、ICMP、代理和内网穿透这些内容串到同一个通信框架里。一.IP协议到底在负责什么 IP属于网络层协议它最核心的能力不是“可靠传输”也不是“端口管理”而是把数据包从源主机跨网络送到目标主机。也就是说IP关心的是“数据该往哪里走”而不是“数据一定按顺序到达”或“交给哪个进程”。后两者分别是TCP/UDP和端口号所关心的问题。1.1 协议栈中的分工从协议栈角度看通信过程大致是这样协作的应用层产生真正的业务数据传输层用TCP或UDP封装提供不同传输语义网络层加上IP头负责跨网络寻址与路由数据链路层完成某一跳上的帧传输所以你可以把TCP/UDP和IP的关系理解成TCP/UDP解决“怎么把数据组织成可传输的上层单元”IP解决“这些单元跨多个网络时应该怎么被送过去”1.2TCP是策略IP是能力边界上的基础支撑笔记中有一句很有代表性的表述tcp是策略从A可靠的传输到B是能力。更准确地说TCP是在IP提供的网络可达能力之上继续叠加可靠性、确认、重传、流控等机制而IP本身只负责让数据尽量按目标地址被转发不承诺可靠性。 避坑指南不要把IP和TCP混成一层逻辑。IP负责“送到目标主机”TCP负责“尽量可靠地送到目标主机上的目标进程”。二.IP地址为什么要由网络号和主机号组成 如果网络里只有几台机器那直接给每台主机一个全局编号也许还能勉强管理但真实互联网规模极大不可能靠“平铺编号”完成高效寻址。于是IP地址被设计成两部分网络号表示主机属于哪个网络主机号表示主机在该网络中的具体身份2.1 为什么要这样拆这种拆分的好处是路由器在转发时可以先按“网络”做粗粒度定位而不必一开始就关心每台具体主机。等数据进入目标网络之后再由更接近终点的设备继续处理更细粒度的投递问题。这个思想非常像“城市 景点”的关系城市对应网络号景点对应主机号先确定数据应该去哪个“城市”再进一步找到城市里的具体“景点”。2.2 主机一定属于某个子网任何一台主机都不可能脱离网络直接存在它一定归属于某一个子网。也正因为如此子网是IP网络中最基本的归属单元。三.IP报头在表达什么信息 IP协议要让路由器知道“这包是什么、从哪来、到哪去、还能活多久、需不需要分片”就必须把这些控制信息写进报头。3.1IPv4报头中的关键字段从这份笔记来看IPv4报头里最重要的字段包括版本首部长度服务类型TOS总长度标识标志片偏移TTL协议首部校验和源IP目的IP3.2 版本与首部长度版本字段用于标识当前是IPv4还是其他版本协议。首部长度字段则说明IP报头有多长单位是4 字节。标准IPv4报头通常是20字节如果带选项字段则会更长。3.3 总长度与协议字段总长度表示整个IP报文的总字节数也就是IP首部 有效载荷而协议字段则告诉接收方这个IP报文里封装的是哪种上层协议。例如TCPUDPICMP这样接收方网络层在解出IP报文后才能继续把数据交给正确的上层模块。3.4TTL为什么必须存在TTL生存时间本质上是限制报文在网络中最多还能经过多少跳。每经过一个路由器TTL通常减1。一旦减到0报文就会被丢弃。这样设计的目的非常直接防止报文因为路由错误或环路而在网络中无限转发。 避坑指南TTL不是为了“估算距离”它最核心的作用是防止报文在网络里死循环。四. 子网划分为什么一张大网还要继续切小 ️如果所有主机都放在一个大广播域里网络管理、查找、广播开销和安全性都会越来越差。因此实际网络都会继续做子网划分。4.1 子网划分在做什么所谓子网划分就是在原本的地址空间中再拿出更多位作为“网络位”从而把一个较大的网络切成多个更小的子网。这样做的结果是每个子网内部更容易管理广播范围更小地址利用率更高路由定位更高效4.2 子网掩码在表达什么子网掩码的作用就是明确告诉系统哪些位属于网络号哪些位属于主机号例如/24对应255.255.255.0表示前24位是网络位后8位是主机位4.3 一个具体例子笔记中给出了这样一个例子IP140.252.20.68子网掩码255.255.255.240也就是/28由于/28表示前28位是网络位那么最后4位属于主机位。把IP和子网掩码按位与就能得到网络号140.252.20.64因为主机位只有4位所以整个子网地址范围共有2^4 16个地址从140.252.20.64到140.252.20.79。五. 私有 IP、公网 IP 与CIDR地址到底是怎么组织起来的 5.1 私有 IP 为什么存在IPv4地址有限不可能给每台家庭设备、企业内网设备都直接分一个全球可达的公网地址。因此专门保留了一些地址段供局域网内部使用。根据笔记中的整理常见私有地址范围有三类10.0.0.0/8172.16.0.0/12到172.31.255.255192.168.0.0/16这些地址只能在局域网内部使用不能直接作为公网可路由地址在互联网中传输。5.2 公网 IP 的特点除了私有地址范围之外的可全球路由地址可以理解为公网IP。它们在公网环境里需要具备全局唯一性才能让数据真正被互联网中的路由器逐级转发到正确位置。5.3CIDR为什么重要现代IP地址分配已经不再只靠传统 A/B/C 类网络而更多依赖CIDR无类别域间路由这种更灵活的前缀表示方式。CIDR的价值在于可以按需划分大小不同的地址块可以做路由聚合提高地址利用效率降低路由表规模例如/8表示非常大的地址块/16表示更细一层/20、/24又可以继续细分六. 路由表IP报文到底如何一步步找到路 仅有目标IP地址还不够网络层还必须回答另一个现实问题当前这台主机或路由器应该把报文先交给谁6.1 路由表的作用路由表就是用来回答“下一跳该走哪”的。系统会根据目标地址和路由表中的条目进行匹配找到最合适的下一跳或出口接口。6.2 缺省路由是什么当目标地址没有命中任何更具体的路由条目时系统会使用缺省路由default作为兜底方案。它的含义不是“万能直接到达”而是“我不知道更具体的路径了那就先交给默认网关让它继续处理”。6.3 特定网络路由是什么如果目标地址明确属于某个已知网络例如192.168.10.0/24那就可以通过对应的接口直接在该网络范围内通信而不必先交给默认网关。6.4 路由聚合为什么能简化路由表如果多个更小的子网连续且可以归并那么就可以聚合成更大的前缀块从而减少路由表项数量。例如多个/20子网可以在合适条件下聚合成/16这样路由器记忆和匹配路径的成本就会降低。七. 一跳通信和端到端通信不是同一回事 这份笔记里有一个非常关键的区分数据链路层负责一跳IP层负责端到端7.1 数据链路层只解决当前链路数据链路层关心的是“当前这一段物理或逻辑链路怎么传”比如主机到交换机、交换机到路由器、路由器到路由器之间。7.2IP层解决跨多个网络的投递IP层不关心每一跳的具体物理细节它关心的是从源主机出发跨越多个路由器后最终是否能到达目标主机所在网络并继续投递过去。所以端到端不是“一次发过去”而是依赖很多次一跳转发拼出来的。八.MAC和IP为什么要同时存在 很多初学者刚接触网络时最容易混淆的就是既然已经有IP地址了为什么还要MAC地址8.1IP负责全路径定位IP地址用于网络层定位目标主机源和目的IP在绝大多数转发过程中都保持不变用来表达“最终要从哪到哪”。8.2MAC负责当前这一跳交付MAC地址工作在数据链路层主要用于当前链路中的帧交付。每经过一个网络设备帧头都会被重新封装因此源和目的MAC会随着每一跳而变化。8.3 可以把它理解成两套坐标体系IP从哪里来到哪里去MAC当前在这一跳里要交给谁 避坑指南IP表示终点MAC表示当前这一跳的下一站。这两套地址不冲突反而是分层设计中最典型的配合关系。九.ARP局域网里如何从IP找到MAC在局域网内要把以太网帧真正发出去最终还是得知道目标设备的MAC地址。可应用层和网络层通常只知道目标IP不知道对方网卡地址这就需要ARP来做映射。9.1ARP的核心作用ARP是一种用来把IP地址解析成MAC地址的协议。它本质上解决的是已知对方IP怎么拿到对方当前的MAC。9.2ARP请求流程笔记中给出的标准流程非常典型主机 A 要找ipE对应的MAC先发一个广播ARP请求目标IP为ipE的主机收到后单播回ARP应答主机 A 记录下ipE - macE的映射9.3 请求与应答在帧层面的表现ARP请求通常表现为目的MACFF:FF:FF:FF:FF:FF源MAC请求方MAC类型0806而ARP应答则是单播回请求方目的MAC请求方MAC源MAC应答方MAC类型08069.4ARP缓存为什么要有过期时间如果每次发包前都重新广播问一次MAC效率会很差所以主机会把解析结果缓存起来。但缓存不能永久有效因为设备可能更换网卡网络结构可能变化IP-MAC绑定关系可能更新所以ARP缓存既要提高效率又必须具备过期刷新能力。十.ARP欺骗为什么能成为中间人攻击入口 ⚠️ARP的设计很实用但也存在一个明显弱点它本身并不验证应答的真实性。10.1 欺骗是怎么发生的攻击者可以伪造ARP应答谎称路由器的IP对应自己的MAC某台主机的IP对应自己的MAC一旦两边都相信了这个假映射原本应该直达或经网关转发的数据就会先流到攻击者机器上。10.2 本质问题是什么本质上ARP欺骗并不是“把协议玩坏了”而是利用了ARP缺乏身份认证的天然弱点从而篡改局域网里的IP-MAC映射关系改变正常的数据转发路径。十一.NAT私网为什么也能访问公网 ️私有IP无法直接出现在公网中但现实里家庭、企业内网设备明明都可以访问互联网这就依赖NAT网络地址转换。11.1NAT在做什么当内网设备把数据发到路由器时路由器会把原本的源私有IP甚至源端口替换成自己的公网IP和某个可区分的端口再把报文继续发向外网。11.2 为什么有时端口也要改如果多个内网主机同时访问外部同一个服务仅靠替换源IP还不够因为它们都被映射成了同一个公网出口地址。这时就必须进一步用不同端口把各自连接区分开来。11.3 为什么NAT能把回包再找回来因为路由器内存里会维护一张NAT映射表记录内网地址与端口对应映射出去的公网地址与端口当响应报文回来时路由器就能根据这张表再把数据正确转发回原来的内网主机。11.4NAT解决了什么现实问题最直接的现实意义就是缓解公网IP不足问题让多个私网设备共享一个或少量公网地址。 避坑指南NAT不只是“改个IP”很多时候还是IP 端口的双重转换。十二.ICMP与ping网络层如何反馈问题 网络传输失败时总得有人出来说清楚到底出了什么问题。这个“反馈机制”很多时候就依赖ICMP。12.1ICMP的定位ICMP位于网络层主要负责传递网络错误信息控制信息状态诊断信息它不是像TCP/UDP那样承载常规应用业务数据的协议而更像网络层的“诊断与反馈通道”。12.2ping为什么没有端口号ping使用的是ICMP请求 / 应答报文它直接封装在IP报文里不经过传输层所以没有端口号这个概念。12.3ICMP在排错中的价值当数据报文无法正常到达时中间路由器或目标网络边界设备可能会返回ICMP应答告诉源端目标不可达超时路径有问题这也是为什么ping、traceroute这类工具在网络排障中非常常见。十三. 分片机制为什么IP报文有时必须拆开 网络层还有一个特别重要、也特别容易考的点分片。13.1 为什么会发生分片因为下层链路会有限制也就是MTU最大传输单元。如果一个IP报文太大超过了当前链路允许承载的最大帧大小就必须拆成多个分片分别传输。13.2 分片发生在哪一层重组发生在哪一层这份笔记明确给出的结论是分片发生在网络层重组发生在对方的网络层13.3 分片报头里的关键字段为了支持分片与重组IP报头里专门准备了三组关键字段标识id属于同一原始报文的所有分片id相同标志位控制是否允许分片以及是否还有后续分片片偏移说明当前分片在原始报文中的相对位置13.4 为什么片偏移要按 8 字节为单位片偏移字段记录的不是直接字节数而是以8字节为单位的偏移值。因此除了最后一个分片外其他分片的数据长度通常都需要是8的整数倍便于正确定位与拼接。13.5 一个典型分片例子笔记里给了一个很直观的例子一个3000字节的IP报文在MTU 1500的链路上会被拆成多个分片。由于每个分片都必须带自己的IP首部所以实际可装的数据量要扣掉首部空间。13.6 为什么分片要尽量避免分片会带来两个明显问题丢任意一个分片整份报文就可能无法正确重组增加协议处理复杂度和网络开销也正因为如此实际系统往往会尽量通过上层控制报文大小减少IP分片出现的概率。十四.MSS和MTU为什么TCP不会无限制往下塞数据 笔记里特别提到TCP在发送报文时不能只盯着接收方窗口还得考虑下层链路是否会导致分片。14.1MTU是链路层限制MTU决定单个链路层帧最多能承载多少字节。14.2MSS是传输层为了适配MTU而做的约束例如在典型以太网环境里MTU 1500IP首部约20TCP首部约20那么TCP常见的MSS就会取1460这样做的目的就是让单个TCP数据段尽量一次就能被下层完整承载而不是交给IP再去拆分。十五. 从浏览器输入 URL 到页面出现这些协议是怎么协作的 笔记后半部分专门把“浏览器输入URL后发生的事”串起来了这正好能把IP放回完整网络通信流程中理解。整个过程可以概括为URL 解析浏览器拆出协议、域名、路径DNS 解析把域名解析成目标IP建立连接HTTP走TCP三次握手HTTPS在TCP基础上再做TLS握手发送请求请求报文经传输层、网络层、链路层层层封装发送服务器处理返回响应报文浏览器渲染解析HTML/CSS/JS并显示页面在这个过程中IP层始终承担“跨网送达”的基础职责而MAC、ARP、路由表、NAT、TCP、DNS等则共同配合完成完整访问链路。十六. 代理、反向代理、VPN 与内网穿透这些和IP/NAT有什么关系 ⚠️16.1 正向代理正向代理位于客户端和目标服务器之间代理客户端向外部服务器发请求。客户端需要主动配置代理信息。它的典型作用包括代替客户端访问外部资源隐藏客户端真实IP缓存外部资源对访问行为做控制与审计16.2 反向代理反向代理则位于客户端和后端真实服务器之间对外表现为统一入口。客户端通常感知不到后端真实服务器的存在。它的价值主要包括合理调度内网资源隐藏后端真实结构做负载均衡增加安全防护16.3NAT和代理不是一回事虽然两者都可能“隐藏真实地址”但它们不在同一层次NAT更偏底层网络地址转换代理更偏应用层中间转发与控制16.4 VPN 在这里可以怎么理解按这份笔记的表述VPN利用加密与代理通道把外部访问流量重新包起来从而绕过中间路径上的直接可见性可以视作一种更复杂的正向代理形态。16.5 内网穿透与frp当内网主机无法直接暴露到公网时可以借助具备公网IP的中间服务器建立映射关系把外部请求再转发回内网服务。笔记里用frp做了说明frps部署在公网服务器上负责入口与映射frpc部署在内网主机上把本地服务暴露给frps外部访问者访问frps的公网地址和映射端口frps再把请求转给对应的frpc最终打到内网服务这类方案本质上就是借助公网中介和既有连接把本来无法从公网直接访问的内网服务重新“引出来”。总结 IP协议这一章真正要建立起来的不是“背下几个字段名字”而是一条完整主线网络层负责让数据跨网络到达目标主机。围绕这个目标IP需要做的事情依次展开用IP地址表达“在哪个网络里的哪台主机”用子网与掩码提高地址管理与路由效率用路由表决定下一跳用TTL防止死循环用分片机制适配下层MTU用ARP在局域网内把IP映射成MAC用NAT让私网设备共享公网出口用ICMP反馈网络层错误与状态再与TCP/UDP、DNS、代理和内网穿透方案一起拼成完整通信链路所以从学习角度看IP不是一个只会“贴地址标签”的简单协议而是整个跨网络通信体系的基础转发层。当这条主线建立起来之后后面再看路由器转发、抓包分析、ping/traceroute、NAT设备行为、代理与内网穿透就不会觉得它们是散乱的专题而会自然落到同一套网络层理解框架里。

更多文章