当前位置: 首页 > article >正文

路由与寻址:从IP数据报到Nginx反向代理,一个Java开发者的网络通关笔记

简历里写着“熟悉TCP/IP”可线上环境一条错误的路由规则就让整个微服务链路超时——这是很多后端人踩过的坑。今天我们从IP协议、路由表、最长前缀匹配一路聊到Nginx反向代理和Docker网络模式把计网八股变成真正能帮你排查问题的工程思维。写在前面在开发智荟知识库系统和知识汇教育平台的过程中我踩过不少“网络层”的坑用SpringCloud开发微服务时网关路由配置错误导致服务之间调不通用Nginx做反向代理因为不熟悉proxy_pass末尾的斜杠规则静态资源404用Docker部署Python的FastAPI和Java的SpringBoot容器间通信全靠--link和自定义网络。回头再看408里那些枯燥的IP、路由表、ARP忽然觉得它们全都“活”了。所以这篇博客不背概念而是从一个后端开发者的视角重新理解IP协议、路由与寻址并且告诉你它们在Nginx、Docker、微服务网关里到底是怎么体现的。一、IP协议不只是“门牌号”1.1 为什么我们离不开IPIP协议的核心职责就两件事编址封装。编址给每个联网设备一个唯一的IP地址比如你的服务器内网IP172.17.0.2。封装把上层数据TCP/UDP报文塞进IP数据报再扔给链路层。面试时常问IP和MAC地址都唯一为什么不能只用一个我的理解MAC地址像身份证号一辈子不变但无法“寻路”IP地址像你现在的住址可以随网络位置变化并且路由器根据IP前缀就能快速决定往哪个方向扔。快递员不会拿着你的身份证号送货他看的是地址。1.2 IPv4 / IPv6 与子网掩码在实际开发中你配过最多的就是192.168.x.x和10.x.x.x这类私有地址。子网掩码决定了一个IP的“网络部分”和“主机部分”敲黑板同一个子网内的设备可以不经过路由器直接通信通过ARP协议找MAC地址。不同子网之间通信必须经过网关通常是路由器。工程关联Docker容器默认的桥接网络模式会给每个容器分配一个172.17.0.0/16网段的IP容器之间可以直接通信但要从宿主机访问容器端口需要做-p 8080:8080端口映射——这就是一种网络地址转换。你在application.yml里配置的server.address如果不小心填错了网段可能导致服务只在某个虚拟网卡上监听外部死活连不上。1.3 IP数据报里藏着什么一个IP包长这样头部20~60字节后面是数据| 版本 | 首部长度 | 服务类型 | 总长度 | | 标识 | 标志 | 片偏移 | | TTL | 协议 | 首部校验和 | | 源IP地址 | | 目的IP地址 | | 选项如果有 | | 数据TCP/UDP报文等 |对开发有用的两个字段TTL生存时间每经过一个路由器减1变成0就丢弃。ping命令返回的ttl64说明目标大概率是Linux系统默认初始TTL 64如果ttl128则是Windows。协议字段值为6表示上层是TCP17表示UDP。抓包时靠这个区分。一个小实验在Linux上traceroute baidu.com能看到每一跳的路由器IP原理就是利用TTL递增来触发ICMP超时报文。二、路由与寻址路由器是怎么“问路”的2.1 路由表每台设备的决策依据不只是路由器有路由表你的电脑、你的云服务器也都有。查看本机路由表# Linux / macOS ip route show # 示例输出 default via 192.168.1.1 dev eth0 proto static metric 100 192.168.1.0/24 dev eth0 proto kernel scope link src 192.168.1.105 metric 100 172.17.0.0/16 dev docker0 proto kernel scope link src 172.17.0.1解释一下default via 192.168.1.1默认路由所有不在直连网段的目标IP都交给192.168.1.1你的家用路由器/网关。192.168.1.0/24直连路由发往这个网段的包直接通过eth0发出不需要网关。172.17.0.0/16Docker网桥宿主机和容器通信走这条路。开发中的实际场景你在云服务器上配了VPN或者用Docker启动了多个容器网络路由表会动态变化。有一次我的SpringBoot应用无法访问外部的Redis排查半天发现是容器路由被覆盖所有流量被指向了错误的网关。2.2 最长前缀匹配路由器怎么选“最精确”的路假设路由表里有这两条192.168.1.0/24 via 10.0.0.1 192.168.1.128/25 via 10.0.0.2现在要转发目标IP为192.168.1.130的包。两条规则都匹配但第二条的掩码是/25255.255.255.128比第一条/24更精确所以选择10.0.0.2。工程隐喻这就像你在微服务网关里配置路由——/order/**和/order/query/**同时存在时更具体的路径会优先匹配。2.3 路由是如何一步步完成的简化版主机A发出一个IP包目标IP为8.8.8.8。主机A查自己的路由表发现不在任何直连网段于是交给默认网关192.168.1.1。网关路由器收到包查自己的路由表可能包含去往8.0.0.0/8的边界路由转发给下一跳。每一跳重复这个过程直到到达目标主机所在的子网。最后一跳路由器通过ARP找到目标主机的MAC地址把IP包封装成帧发送过去。这就是“路由”的本质逐跳转发每个路由器只知道下一跳不需要知道整条路径。三、这些计网知识在Java后端开发中到底有什么用3.1 Nginx 路由与反向代理你每天都在配置的路由表Nginx 的location指令本质上就是一个基于URI的路由表匹配规则和IP路由的最长前缀匹配如出一辙server { listen 80; # 精确匹配 location /health { return 200 OK; } # 前缀匹配类似 /24 location /api/ { proxy_pass http://backend_java_app:8080/; } # 正则匹配更具体 location ~* ^/api/v2/order { proxy_pass http://order_service:8081/; } }反向代理的“反向”是什么意思传统正向代理是代理客户端比如你翻墙反向代理是代理服务器——客户端不知道真正提供服务的是哪台机器。Nginx收到请求后根据location规则类似于路由表把请求转发到后端的Java应用、Python服务或者静态文件目录。坑点提醒proxy_pass末尾的斜杠很重要。proxy_pass http://backend/会把/api/user代理到backend/api/userproxy_pass http://backend无斜杠会把/api/user代理到backend//api/user多一个斜杠可能导致路径错误这不就是字符串拼接版的“路由前缀匹配”吗3.2 Docker 网络模式IP和路由的容器化演绎Docker默认的bridge网络模式会在宿主机创建一个docker0虚拟网桥每个容器分配一个172.17.x.x的IP。容器间通信靠的是宿主机的路由转发和iptables规则。你可以通过docker network create --subnet10.0.0.0/24 mynet自定义一个网段然后让容器加入这个网络——这就相当于在宿主机内部建了一个小的“局域网”。实战经验在知识汇教育平台项目中我用Docker Compose同时启动了SpringCloud微服务、Elasticsearch、MinIO和RabbitMQ。如果不在同一个自定义网络里服务之间只能通过暴露端口宿主机IP访问非常别扭。把它们都加入同一个backend_net比如172.20.0.0/16就可以直接用容器名作为主机名互相访问——背后的原理就是Docker内置的DNS解析和路由规则。3.3 微服务网关企业级路由和寻址在SpringCloud Gateway中路由配置更加声明式spring: cloud: gateway: routes: - id: order_route uri: lb://order-service predicates: - Path/order/** - id: user_route uri: lb://user-service predicates: - Path/user/**这里的Path匹配规则类似于IP路由中的前缀匹配而lb://负载均衡则是在多个服务实例之间做“下一跳选择”——这不就是一个七层的路由器吗3.4 一个真实的排错故事之前做企业级AI知识库系统Java后端SpringBoot调用Python的FastAPI嵌入服务。一开始直接用的http://localhost:8000一切正常。后来我把两个服务都放进Docker容器Java容器里访问localhost:8000就变成了访问Java容器自己显然不对。排查后发现容器之间的通信必须通过容器IP或容器名并且要在同一个自定义网络里。我执行docker network inspect看了路由表和IP分配最终用docker-compose的links和自定义网络解决。那一刻我突然明白了计网书上讲的“不同子网之间通信需要路由器”在容器世界里就是“不同网络之间的容器无法直接通信需要加入同一个网络或者做端口映射”。四、总结把八股变成肌肉记忆下次你再配置Nginx反向代理、调试Docker容器网络、或者写微服务网关路由的时候不妨想一想“我正在写的就是一张七层的路由表而IP层的那张表正在我的Linux内核里默默地为我工作。” 互动思考题你在 Linux 服务器上用 Docker 部署了两个容器容器 AJava SpringBoot 应用端口 8080容器 BRedis端口 6379两个容器都在默认的bridge网络中IP 分别为172.17.0.2和172.17.0.3。现在容器 A 需要通过redis://172.17.0.3:6379访问容器 B一切正常。问题如果你在宿主机上执行ip route show会看到一条关于172.17.0.0/16的路由。请问这条路由的作用是什么如果手动删除这条路由容器 A 还能 ping 通容器 B 吗为什么欢迎在评论区留下你的答案和排查思路 —— 下一篇我会专门讲讲 Docker 网络模式与 Linux 路由表的关系。

相关文章:

路由与寻址:从IP数据报到Nginx反向代理,一个Java开发者的网络通关笔记

简历里写着“熟悉TCP/IP”,可线上环境一条错误的路由规则就让整个微服务链路超时——这是很多后端人踩过的坑。 今天我们从IP协议、路由表、最长前缀匹配一路聊到Nginx反向代理和Docker网络模式,把计网八股变成真正能帮你排查问题的工程思维。写在前面在…...

深入理解ART库字体系统:ASCII与非ASCII字体的完美融合

深入理解ART库字体系统:ASCII与非ASCII字体的完美融合 【免费下载链接】art 🎨 ASCII art library for Python 项目地址: https://gitcode.com/gh_mirrors/ar/art ART库是一款功能强大的Python ASCII艺术生成工具,它通过创新的字体系统…...

DAMO-YOLO手机检测系统健康检查脚本:curl+shell自动化巡检

DAMO-YOLO手机检测系统健康检查脚本:curlshell自动化巡检 1. 项目背景与需求 在实际生产环境中,手机检测系统的稳定运行至关重要。这个基于DAMO-YOLO和TinyNAS技术的检测系统虽然具有"小、快、省"的特点,专门适配手机端低算力、低…...

智慧树刷课插件终极指南:5分钟实现自动化学习

智慧树刷课插件终极指南:5分钟实现自动化学习 【免费下载链接】zhihuishu 智慧树刷课插件,自动播放下一集、1.5倍速度、无声 项目地址: https://gitcode.com/gh_mirrors/zh/zhihuishu 还在为智慧树平台的繁琐操作而烦恼吗?智慧树刷课插…...

彻底搞懂Redis 3.0数据结构编码转换:优化存储与性能的终极指南

彻底搞懂Redis 3.0数据结构编码转换:优化存储与性能的终极指南 【免费下载链接】redis-3.0-annotated 带有详细注释的 Redis 3.0 代码(annotated Redis 3.0 source code)。 项目地址: https://gitcode.com/gh_mirrors/re/redis-3.0-annotat…...

SQL报表临时表过大问题_临时表生成机制优化

临时表过大主因是SQL写法不当致中间结果膨胀,优化方向为减少冗余计算、避免全量关联、控制中间结果生命周期;典型场景包括多层嵌套未下推WHERE、JOIN大表未先筛选、GROUP BY字段不精准、ORDER BY窗口函数无过滤等。临时表过大通常不是因为数据量本身爆炸…...

美胸-年美-造相Z-Turbo部署避坑指南:常见xinference启动失败原因与修复

美胸-年美-造相Z-Turbo部署避坑指南:常见xinference启动失败原因与修复 1. 引言:为什么你的模型服务启动失败了? 最近有不少朋友在部署“美胸-年美-造相Z-Turbo”这个文生图模型时遇到了麻烦。明明按照步骤操作,但xinference服务…...

DownKyi哔哩下载姬:终极免费B站视频下载解决方案

DownKyi哔哩下载姬:终极免费B站视频下载解决方案 【免费下载链接】downkyi 哔哩下载姬downkyi,哔哩哔哩网站视频下载工具,支持批量下载,支持8K、HDR、杜比视界,提供工具箱(音视频提取、去水印等&#xff09…...

别再为高光谱图像噪声发愁了!手把手教你用Python实现张量分解去噪(附代码与数据集)

高光谱图像去噪实战:Python张量分解从入门到精通 遥感图像处理中,高光谱数据因其丰富的光谱信息而备受青睐,但噪声问题始终是困扰研究者的难题。今天我们将抛开复杂的数学推导,直接进入实战环节,教你用Python中的Tenso…...

别再死记硬背了!用D触发器搭个8分频电路,手把手教你理解Verilog时序逻辑

从零构建8分频电路:用D触发器玩转Verilog时序逻辑 第一次接触数字电路设计时,我被各种触发器、寄存器绕得晕头转向。直到导师扔给我一块FPGA开发板:"别光看理论,先搭个分频电路试试"。那次实践让我恍然大悟——原来抽象…...

告别发热焦虑:手把手教你用PCIe ASPM给设备省电(实测L1.1/L1.2功耗对比)

深度解析PCIe ASPM:从L1.1到L1.2的实战节能指南 当你的笔记本在膝上发烫,或是服务器机房电表疯狂跳动时,是否想过那些看似微小的PCIe设备正在悄悄吞噬能源?本文将带你穿透技术表象,直击ASPM电源管理的核心逻辑。不同于…...

Qwen3-TTS声音设计模型场景应用:为你的APP添加多语言语音播报功能

Qwen3-TTS声音设计模型场景应用:为你的APP添加多语言语音播报功能 1. 引言:全球化应用中的语音交互需求 在移动应用开发领域,语音交互已成为提升用户体验的关键功能。无论是导航应用的路况播报、教育应用的多语言学习,还是电商应…...

终极魔兽争霸III优化秘籍:4个步骤让经典游戏在现代系统完美运行

终极魔兽争霸III优化秘籍:4个步骤让经典游戏在现代系统完美运行 【免费下载链接】WarcraftHelper Warcraft III Helper , support 1.20e, 1.24e, 1.26a, 1.27a, 1.27b 项目地址: https://gitcode.com/gh_mirrors/wa/WarcraftHelper 你是否怀念在魔兽争霸III中…...

VLC播放器美化终极指南:VeLoCity皮肤打造专属影音空间

VLC播放器美化终极指南:VeLoCity皮肤打造专属影音空间 【免费下载链接】VeLoCity-Skin-for-VLC Castom skin for VLC Player 项目地址: https://gitcode.com/gh_mirrors/ve/VeLoCity-Skin-for-VLC 还在忍受VLC播放器单调的默认界面吗?每天面对同样…...

Gemma-3-12B-IT WebUI应用场景:代码生成、写作辅助全解析

Gemma-3-12B-IT WebUI应用场景:代码生成、写作辅助全解析 1. 引言:为什么选择Gemma-3-12B-IT? 在众多开源大语言模型中,Google的Gemma系列一直以轻量高效著称。最新发布的Gemma-3-12B-IT版本,在保持120亿参数适中规模的…...

LiuJuan20260223Zimage辅助数据库课程设计:从ER图到SQL优化

LiuJuan20260223Zimage辅助数据库课程设计:从ER图到SQL优化 1. 引言 每到学期末,计算机相关专业的学生们就要开始头疼数据库课程设计了。从理解模糊的业务需求,到画出逻辑清晰的ER图,再到编写一堆建表语句和复杂查询&#xff0c…...

终极指南:如何使用罗技鼠标宏在PUBG中实现精准压枪控制

终极指南:如何使用罗技鼠标宏在PUBG中实现精准压枪控制 【免费下载链接】logitech-pubg PUBG no recoil script for Logitech gaming mouse / 绝地求生 罗技 鼠标宏 项目地址: https://gitcode.com/gh_mirrors/lo/logitech-pubg 你是否在PUBG中因为后坐力控制…...

NS-USBLoader实战手册:一站式解决Switch游戏安装难题

NS-USBLoader实战手册:一站式解决Switch游戏安装难题 【免费下载链接】ns-usbloader Awoo Installer and GoldLeaf uploader of the NSPs (and other files), RCM payload injector, application for split/merge files. 项目地址: https://gitcode.com/gh_mirror…...

Windows任务栏美化终极指南:5分钟让桌面焕然一新的TranslucentTB完全教程

Windows任务栏美化终极指南:5分钟让桌面焕然一新的TranslucentTB完全教程 【免费下载链接】TranslucentTB A lightweight utility that makes the Windows taskbar translucent/transparent. 项目地址: https://gitcode.com/gh_mirrors/tr/TranslucentTB 想要…...

3步搞定绝地求生压枪难题:罗技鼠标宏让你的射击更稳定

3步搞定绝地求生压枪难题:罗技鼠标宏让你的射击更稳定 【免费下载链接】logitech-pubg PUBG no recoil script for Logitech gaming mouse / 绝地求生 罗技 鼠标宏 项目地址: https://gitcode.com/gh_mirrors/lo/logitech-pubg 还在为绝地求生中AKM的后坐力而…...

PyPortfolioOpt性能优化终极指南:用cProfile快速找出投资组合代码瓶颈

PyPortfolioOpt性能优化终极指南:用cProfile快速找出投资组合代码瓶颈 【免费下载链接】PyPortfolioOpt Financial portfolio optimisation in python, including classical efficient frontier, Black-Litterman, Hierarchical Risk Parity 项目地址: https://gi…...

YOLO ROS 单元测试与持续集成:Jenkins 自动化部署指南

YOLO ROS 单元测试与持续集成:Jenkins 自动化部署指南 【免费下载链接】darknet_ros YOLO ROS: Real-Time Object Detection for ROS 项目地址: https://gitcode.com/gh_mirrors/da/darknet_ros YOLO ROS 作为实时目标检测的 ROS 节点,其稳定性和…...

Hunyuan模型适合中小企?HY-MT1.8B轻量部署实战验证

Hunyuan模型适合中小企?HY-MT1.8B轻量部署实战验证 1. 开篇:中小企业翻译需求与痛点 中小企业做跨境业务时,最头疼的就是语言障碍。请专业翻译成本高,用免费工具又担心质量差,买个企业级翻译系统动不动就几十万&…...

【RAG架构剖析】从原始论文到实战:解析检索增强生成的核心组件与协同机制

1. RAG架构的诞生背景与核心价值 想象一下你正在参加一场知识竞赛,主持人问了一个冷门问题:"19世纪法国印象派画家的代表作品有哪些?"如果只靠大脑记忆,你可能只能说出莫奈的《睡莲》。但如果你手边有本艺术史百科全书&…...

如何构建高效JSON:API数据备份:完整导出与恢复方案指南

如何构建高效JSON:API数据备份:完整导出与恢复方案指南 【免费下载链接】json-api A specification for building JSON APIs 项目地址: https://gitcode.com/gh_mirrors/js/json-api JSON:API是一种用于构建JSON API的规范,它定义了客户端应如何请…...

如何在家中轻松实现跨设备游戏串流?Sunshine游戏串流服务器完整指南

如何在家中轻松实现跨设备游戏串流?Sunshine游戏串流服务器完整指南 【免费下载链接】Sunshine Self-hosted game stream host for Moonlight. 项目地址: https://gitcode.com/GitHub_Trending/su/Sunshine 你是否曾经想过,在客厅的智能电视上玩书…...

Chart.js项目实战:AI未来社会形态预测监控系统

Chart.js项目实战:AI未来社会形态预测监控系统 【免费下载链接】awesome A curated list of awesome Chart.js resources and libraries 项目地址: https://gitcode.com/GitHub_Trending/awesome/awesome Chart.js作为一款功能强大的开源数据可视化库&#x…...

掌握Zotero引用插件的3个实战场景:从安装到高效写作

掌握Zotero引用插件的3个实战场景:从安装到高效写作 【免费下载链接】zotero-citation Make Zoteros citation in Word easier and clearer. 项目地址: https://gitcode.com/gh_mirrors/zo/zotero-citation Zotero Citation是一款专为学术写作优化的开源插件…...

nli-distilroberta-base实战教程:3步部署句子关系判断Web服务

nli-distilroberta-base实战教程:3步部署句子关系判断Web服务 1. 项目概述 自然语言推理(Natural Language Inference, NLI)是NLP领域的重要任务,用于判断两个句子之间的逻辑关系。nli-distilroberta-base是基于DistilRoBERTa模型的轻量级NLI服务&…...

终极Gumbo-Parser文档注释指南:Doxygen规范与最佳实践全解析

终极Gumbo-Parser文档注释指南:Doxygen规范与最佳实践全解析 【免费下载链接】gumbo-parser An HTML5 parsing library in pure C99 项目地址: https://gitcode.com/gh_mirrors/gum/gumbo-parser Gumbo-Parser是一个纯C99实现的HTML5解析库,它提供…...