尧图网站设计 尧图网站设计YAOTU DESIGN
ARTICLE DETAIL

资讯详情

深耕网站设计与一线实操的经验洞察。

用VMware搭三层网络架构,拆解TCP/IP数据包通信全过程

用VMware搭三层网络架构,拆解TCP/IP数据包通信全过程 最近用 Windows VMware Workstation 把 TCP/IP 通信全过程、网络设备层次和局域网三层架构完整跑了一遍算是把以前一知半解的知识点彻底串起来了。以前看书总觉得“数据包”是个抽象概念三层架构也就记个核心层、汇聚层、接入层的名字直到自己动手搭出多网段拓扑、抓包看到三次握手和路由跳转才真正理解这些技术到底是怎么协同工作的。这篇复盘我会从实验环境搭建讲起沿着“一个数据包从应用层产生到跨网段到达目标服务器”的过程拆解每一层干了什么再把企业网络为什么要分层、各个层次用什么设备以及在 VMware 里如何模拟三层架构一次讲清楚。适合正在学网络基础、准备考网工认证或者想用虚拟机做实验验证 TCP/IP 原理的朋友参考。1. 实验环境搭建Windows VMware 的多网段拓扑思路1.1 为什么选 VMware Workstation 作为实验平台先说说为什么选 VMware Workstation而不是直接在物理机上拉几台电脑或者用其他虚拟化方案。物理机方案最直观但成本高、布线麻烦而且想模拟多个隔离网段几乎不现实。Hyper-V 是 Windows 自带的虚拟化平台功能不弱但虚拟交换机的配置界面对初学者不太友好尤其是自定义网络隔离和多网卡绑定操作起来绕。VMware Workstation 的优势在于“虚拟网络编辑器”这个功能可以自由创建 VMnet2、VMnet3 这种自定义虚拟网络每个 VMnet 相当于一台独立的虚拟二层交换机虚拟机之间可以做到真正的二层隔离。我在 VMware Workstation 17 上建了四台虚拟机用了四五个不同的 VMnet 网段整个过程没有动过物理机的网络配置。另外一个很关键的优势是快照功能。做路由配置、改防火墙策略之前打一个快照配错了直接回滚不用重装系统这对反复做实验来说太重要了。补充一点实验里我全部使用静态 IP关掉了自定义 VMnet 的 DHCP 服务。如果开着 DHCP虚拟机重启后 IP 可能漂移路由表、网关配置全部跟着乱套排错的时候会把自己搞疯。1.2 实验拓扑与网段规划目标是模拟一个简化版的企业网络两台终端 PC 分别属于不同 VLAN对应不同网段一台汇聚层设备做 VLAN 网关一台核心层设备连接服务器区最终实现两个终端都能访问同一台 Web 服务器。我的虚拟机规划表如下虚拟机操作系统网卡数量接入 VMnetIP 地址角色PC1Windows 101VMnet2192.168.10.10/24接入层终端VLAN10PC2Windows 101VMnet3192.168.20.10/24接入层终端VLAN20DISTWindows Server 20163VMnet2、VMnet3、VMnet5192.168.10.1/24、192.168.20.1/24、10.0.0.2/30汇聚层设备/网关COREWindows Server 20162VMnet5、VMnet610.0.0.1/30、192.168.100.1/24核心层设备WEBWindows Server 20161VMnet6192.168.100.10/24Web 服务器各网段角色192.168.10.0/24办公区 VLAN10网关是汇聚设备上的 192.168.10.1192.168.20.0/24研发区 VLAN20网关是汇聚设备上的 192.168.20.1192.168.100.0/24服务器区网关是核心设备上的 192.168.100.110.0.0.0/30汇聚层到核心层的互联链路这是一个只容纳两个可用 IP 的极简网段专门用来连接两台路由设备这个设计尽量贴近真实企业网络。路由器之间互联的网段通常用 30 位掩码因为这一段只需要两个地址不需要给广播和主机预留空间。1.3 路由与远程访问的启用两台 Windows Server 虚拟机默认不是路由器。要让它们转发跨网段的数据包必须开启“路由和远程访问”RRAS。操作路径是服务器管理器 → 添加角色和功能 → 选择“远程访问”→ 勾选“DirectAccess 和 VPN (RAS)”和“路由”子组件 → 安装完成后在“工具”里打开“路由和远程访问”右键服务器 → 配置并启用路由和远程访问 → 选择“自定义配置”→ 勾选“LAN 路由”。这里有一个容易忽略的地方RRAS 配置完成后Windows 防火墙可能会拦截转发流量。如果实验中发现跨设备 ping 不通先看路由器和防火墙策略不要一门心思去配置什么复杂的路由协议。实验环境下直接把虚拟机防火墙关掉是最省事的做法。开启 RRAS 之后还需要检查各台 Windows Server 的“路由和远程访问”服务是否设为自动启动。否则服务器重启之后转发功能可能不会自动恢复。2. 从数据包开始TCP/IP 通信全过程复盘2.1 应用层的发起过程一次跨网段 Web 请求现在从最顶层的视角看一次完整的通信。我在 PC1 的浏览器地址栏输入http://192.168.100.10按回车。浏览器作为应用层程序做的工作是构造一个 HTTP GET 请求告诉 Web 服务器“我要访问根路径”。应用层本身不关心底层网络长什么样它只是生成了一段数据。这段数据会交给传输层做进一步封装。这里要特别理解一点应用层只负责定义数据的内容和语义比如 HTTP 定义了请求头、请求行、状态码这些规范但它不负责把数据送到对方机器上。真正“送信”的活儿是下面几层的事。所以学 TCP/IP 一定要把“数据内容”和“数据送达”两件事分开理解。实验里我在 WEB 服务器上装了一个极简的 HTTP 服务监听 80 端口就是为了验证这个完整过程。如果只想快速测试用 Python 的python -m http.server 80起一个临时 Web 服务完全够用。2.2 传输层端口寻址、三次握手与可靠传输应用层的数据传到传输层后TCP 协议会为它加上端口信息和控制信息。源端口是 PC1 上的一个随机端口比如 56678目标端口是 80也就是 Web 服务监听的端口。为什么需要端口因为一台服务器上可能同时跑着 Web 服务、数据库服务、远程桌面服务IP 地址只能找到这台主机端口才能找到主机上的具体进程。可以通俗理解IP 地址是“门牌号”端口是“房间号”。TCP 要做的另一件大事是建立可靠连接。三次握手的过程是PC1 发送 SYN 包同步序列号序列号 Seq0进入 SYN_SENT 状态WEB 服务器收到后回复 SYNACK 包表示“我收到你的同步请求并且我也同步自己的序列号”Seq0Ack1PC1 收到后再发一个 ACK 包Ack1连接建立三次握手解决了什么问题核心是双方各自确认自己的“收发能力”正常并且同步初始序列号。为什么是三次而不是两次因为只有两次的话服务器无法确认客户端是否收到自己回复的 SYNACK。如果客户端根本没收到它就不会开始发送数据服务器还傻等资源共享连接就处于半开状态。抓包的时候看这三个包的 Flags 分别是 SYN、SYNACK、ACK每一步都有明确含义。2.3 网络层IP 封装、默认网关与路由决策TCP 段封装完成之后网络层要给它加上 IP 头源 IP 是 192.168.10.10目的 IP 是 192.168.100.10。关键在于PC1 怎么知道这个数据包该交给谁PC1 检查自己的 IP 192.168.10.10 和目标 IP 192.168.100.10发现不在同一个网段子网掩码是 255.255.255.0一个是 10 网段一个是 100 网段于是它决定把数据包交给默认网关。默认网关是网络层最核心的概念之一。PC1 的默认网关配置为 192.168.10.1也就是汇聚设备 DIST 上连接办公区的那个接口。PC1 认为“凡是我不认识的网段全部丢给网关处理”。DIST 收到数据包后解开 IP 头发现目的 IP 是 192.168.100.10。DIST 查看自己的路由表发现自己直连了三个网段192.168.10.0/24、192.168.20.0/24、10.0.0.0/30没有 192.168.100.0/24。这时 DIST 需要在路由表里找到一条指向目标网段的条目。我在 DIST 上手动添加了一条静态路由目标网络192.168.100.0 子网掩码255.255.255.0 下一跳10.0.0.1 接口10.0.0.2CORE 收到来自 10.0.0.2 的数据包后发现目标网段 192.168.100.0/24 是自己的直连网段于是直接转发给 WEB 服务器。这里值得多想想数据包在每一跳都要重新查一次路由表每次转发都是一次“决策”。如果 DIST 上没有配置到 192.168.100.0/24 的路由数据包就会被丢弃。最典型的现象是 PC1 ping 网关能通但 ping 服务器不通问题几乎都出在中间设备的路由表上。2.4 数据链路层ARP、MAC 封装与交换机转发网络层把 IP 包交给数据链路层之后真正在以太网上传输的是“帧”。帧的格式大致是目的 MAC 源 MAC 类型字段0x0800 表示上层是 IPv4 IP 数据包 校验位。这里就引出了 ARP地址解析协议。PC1 要把 IP 包发给网关 192.168.10.1但在以太网上传输需要知道网关的 MAC 地址。PC1 会先查本地的 ARP 缓存表如果缓存里没有 192.168.10.1 对应的 MAC就发送一个 ARP 广播内容大概是“谁是 192.168.10.1请告诉我你的 MAC 地址”。这个广播会到达 DIST 的接口。DIST 发现自己的 IP 是 192.168.10.1就回复一个 ARP 单播告诉 PC1“我的 MAC 是 00:0C:29:xx:xx:xx”。PC1 把这个映射记入 ARP 缓存然后把帧的目的 MAC 填成网关的 MAC发送出去。等一下这里有个很多初学者容易迷惑的点PC1 发送的帧目的 MAC 是网关 DIST 的 MAC那么交换机在这中间扮演什么角色交换机收到 PC1 发来的帧后会查看帧头里的目的 MAC 地址。它维护着一张 MAC 地址表记录“哪个 MAC 从哪个端口学到的”。根据目的 MAC交换机把帧从对应端口转发出去。如果交换机的 MAC 地址表里还没有这个条目它会向除接收端口外的所有端口泛洪flood也就是广播转发。还有一个关键点数据包在跨网段传输时每经过一个三层设备源 MAC 和目的 MAC 都会重写。PC1 发往 DIST 的帧源 MAC 是 PC1 的 MAC目的 MAC 是 DIST 的 MAC当 DIST 决定把这个包转发给 CORE 时它会重新封装一个新帧源 MAC 变成本身与 CORE 相连的接口 MAC目的 MAC 变成 CORE 接口的 MAC。但是 IP 报文里的源 IP 和目的 IP 在整个传输过程中从头到尾不变。这就是“MAC 地址逐跳变化IP 地址端到端不变”的本质。2.5 用 Wireshark 验证一次完整通信理论讲完一定要动手抓包验证。我在 PC1 上打开 Wireshark选定 PC1 连接 VMnet2 的那块网卡设置过滤条件host 192.168.100.10 and tcp.port 80然后在浏览器里访问 Web 服务器。抓包结果里前三帧清晰地显示了三次握手1 0.000000 192.168.10.10 192.168.100.10 TCP 56678 → 80 [SYN] Seq0 Win64240 2 0.002155 192.168.100.10 192.168.10.10 TCP 80 → 56678 [SYN, ACK] Seq0 Ack1 3 0.002189 192.168.10.10 192.168.100.10 TCP 56678 → 80 [ACK] Seq1 Ack1第四帧是 HTTP GET 请求第五帧开始往下是数据包和数据 ACK。如果去掉端口过滤条件还能看到 PC1 发送的 ARP 广播请求网关 MAC 的过程。看抓包时要学会切换“相对序列号”和“绝对序列号”视图。Wireshark 默认显示相对序列号看起来方便但很多教程里的 Seq0 并不是真实线上的序列号。理解这一点看各种 TCP 原理文章时就不会产生错乱感。3. 网络设备层次与局域网三层架构解析3.1 一张企业网为什么需要三层很多人第一次进公司看到机房的设备会疑惑为什么不能所有电脑都接在一台交换机上全都用同一个网段这样不是更简单吗如果只有十台电脑这种做法没问题。但企业网通常有几百上千台终端如果全部放在同一个二层广播域里会带来一系列问题广播风暴消耗带宽、安全隔离做不了、故障排查范围大、扩展性差。一台电脑中了 ARP 病毒可能干扰全网。三层架构解决的核心问题是“职责分离”和“故障域隔离”。每层只干自己那层该干的事规模扩大时只需要在对应层增加设备出了故障也能快速定位到某一个区域。我用一个交通比喻帮助理解核心层是城市环路负责高速通过汇聚层是区域主干道负责连接环路和各个小区接入层是小区门口的支路负责把人从家门口接出来。支路堵了只影响一个小区环路堵了整个城市都瘫痪所以环路设计要冗余而且不能让人在环路上随便停车掉头。3.2 各层职责与设备选型层次常见设备核心职责典型特性接入层二层交换机终端接入、VLAN 划分、端口安全、PoE 供电端口密度高、成本低汇聚层三层交换机VLAN 间路由、ACL访问控制列表、DHCP、路由汇总支持三层转发、策略控制核心层高端三层交换机/路由器高速转发、园区网间路由、冗余设计高吞吐、高可用接入层不负责跨网段路由所以用二层交换机就够了把钱花在端口密度上。终端、打印机、AP 都接在接入交换机上按部门或区域划分 VLAN把终端隔离在不同广播域里。汇聚层是策略执行的核心位置。VLAN 间的网关一般放在汇聚层终端跨 VLAN 访问时数据包先到达汇聚层网关由汇聚层决定怎么转发。ACL访问控制列表也通常在汇聚层做比如“市场部不能访问财务部服务器”这种规则写在这里最合适。如果所有控制都放在核心层核心设备压力大配置也复杂。核心层只做一件事高速转发。企业网内部不同汇聚区域之间的流量、访问互联网和服务器区的流量都要经过核心层。为了保障可靠性核心层通常用双核心两条链路跑 ECMP等价多路径或者堆叠。3.3 在 VMware 中落地三层架构的完整过程现在回到我的实验环境。在这个简化拓扑里DIST 承担了汇聚层的角色CORE 承担核心层角色。我在 DIST 和 CORE 上配置的静态路由如下在 DIST 上添加到达服务器区的路由route add 192.168.100.0 mask 255.255.255.0 10.0.0.1 -p在 CORE 上添加到达两个终端网段的路由route add 192.168.10.0 mask 255.255.255.0 10.0.0.2 -p route add 192.168.20.0 mask 255.255.255.0 10.0.0.2 -p-p参数是永久路由的意思重启不丢失。如果不加重启之后路由条目就没了。两个 Windows Server 上都启用了 RRAS 的 LAN 路由。然后我在 PC1 上执行ping 192.168.100.10。第一次 ping 可能会超时原因是 PC1 的 ARP 缓存里没有网关 MAC需要先广播解析后面就对通了C:\ping 192.168.100.10 正在 Ping 192.168.100.10 具有 32 字节的数据: 来自 192.168.100.10 的回复: 字节32 时间1ms TTL126TTL126 很有讲究。Windows 系统的初始 TTL 通常是 128每经过一次路由转发减 1。数据包从 PC1 出发到 WEB 服务器路径是 PC1 → DIST → CORE → WEB经过两个三层转发所以 TTL 从 128 减到 126。这从侧面证明了数据包确实经过了“汇聚层”和“核心层”两次路由。3.4 网络设备层次中的硬件角色与常见误区很多人在学习时容易把交换机和路由器的概念搞混。二层交换机只能根据 MAC 地址转发帧不识别 IP 地址三层交换机在硬件层面集成了路由能力可以理解成“能干路由活儿的交换机”。路由器的主要用途是连接不同网络尤其是不同类型的网络比如内网到运营商网络。在企业网络中路由器通常出现在园区网出口、专线接入等位置。防火墙不是路由器但很多人误以为它就是路由器。防火墙的核心能力是安全策略控制在允许数据包通过之前基于五元组源 IP、目的 IP、源端口、目的端口、协议做逐包检查。企业里防火墙通常部署在核心层和出口路由器之间或者数据中心前面。还有一个常见误区认为“划分了 VLAN 就能完全隔开两个部门”。其实 VLAN 隔离的是二层广播域如果汇聚层设备上启用了 VLAN 间路由两个 VLAN 之间照样能通信。真正要做到部门间隔离必须靠 ACL 等三层策略。4. Windows 下的核心排查命令与 Wireshark 验证技巧4.1 必须刻进 DNA 的五个 Windows 网络命令我在这次实验里反复用到了几个 Windows 自带命令每一个都有明确的验证目的。ipconfig /all是最基础的。它会列出所有网卡的 IP 地址、子网掩码、默认网关、DNS 服务器、MAC 地址等。在 VMware 实验里首先要确认虚拟机每块网卡绑定的是不是预期的 VMnet并且 IP 是否在规划好的网段内。ping用来验证连通性。但 ping 通不等于业务通。我习惯把 ping 分成三步先 ping 自己确认网卡正常再 ping 网关确认二层路径和网关地址最后 ping 目标地址确认三层路由。哪一步断了问题就定位在哪一段。tracert -d用于跟踪路由路径。-d参数避免反向解析域名速度更快。它利用 TTL 机制客户端先发送 TTL1 的数据包第一跳路由器丢弃并返回 ICMP Time Exceeded 信息然后 TTL 加 1以此类推。执行tracert -d 192.168.100.10能直观看到 PC1 → 192.168.10.1DIST 网关→ 10.0.0.1CORE→ 192.168.100.10WEB的完整路径。如果某一跳显示*或超时就说明那一段有问题。route print查看路由表。重点是看默认路由、直连路由和静态路由是否存在。如果路由缺失数据包会被回退到默认网关或者直接丢弃。arp -a查看 ARP 缓存。当跨网段通信异常时先确认是否存在网关的 MAC 条目。如果网关的 MAC 一直在变或者出现多条相同 IP 对应不同 MAC 的记录说明可能存在 ARP 攻击或配置冲突。netstat -ano也是排查利器。当端口连接建立之后用netstat -ano | findstr 80能看到 PC1 到 WEB 服务器的 TCP 连接状态包括本地地址、外部地址和状态ESTABLISHED、SYN_SENT、TIME_WAIT 等。4.2 Wireshark 抓包的几个实用习惯抓包不是打开 Wireshark 点开始那么简单。如果网卡选错了抓到的全是无关数据。我建议先用ipconfig /all确认虚拟机的网卡对应关系再在 Wireshark 里选对应的接口进而在过滤栏里写host 192.168.100.10可以搭配tcp.port 80限定 HTTP 流量。抓包窗口最好自定义显示列我习惯把 Time、Source、Destination、Protocol、Length、Info 这几列留下来。看 TCP 连接要用“统计 → 流图”功能Wireshark 会把整个 TCP 会话的不同阶段用时间线画出来比手动看几十个包直观得多。还有一个重要习惯时刻注意自己抓包的点位。数据包从 PC1 到 WEB 服务器经过 DIST 和 CORE。在 PC1 上抓包能看到 PC1 发出的 IP 包是源 192.168.10.10 到目的 192.168.100.10但看不到 DIST 与 CORE 之间的链路是什么样的帧。如果你在两个地方同时抓包对比同一时刻的数据包就能更深入理解“每跳改写 MAC、但不改 IP”这个原理。4.3 抓包结果里那些常见信号的解读抓包经常会看到这些现象只看到 TCP SYN 不停重传没有 SYNACK。这通常是对端主机不可达或者对端防火墙丢弃了 SYN目标进程可能根本没在监听端口。用netstat -ano在目标主机上看一眼有没有监听端口就能确认。流量中有大量 ARP 广播。可能是因为某个设备的 ARP 缓存表超时后不断重建也可能是广播域过大主机数量太多。这正好印证了为什么要划分 VLAN。出现 ICMP Time-to-live exceeded。这是 tracert 命令主动产生的属于正常现象。但如果在非 tracert 流量中出现说明有路由环路数据包在里面转圈直到 TTL 耗尽。大量 TCP Duplicate ACK 或重传。一般都是链路质量差或拥堵造成的丢包需要检查链路带宽和端口错误计数。5. 实验中遇到的高频问题与避坑记录5.1 问题速查表这次实验我在多个虚拟机上反复折腾踩了不少坑整理成表格方便对照。现象可能原因排查顺序PC1 能 ping 通网关ping 不通 WEB 服务器DIST 或 CORE 上缺少到目标网段的路由在 DIST 和 CORE 上执行 route print确认路由条目两个终端互相 ping 不通汇聚层网关没配置或 RRAS 未启用检查 DIST 的三个接口 IP 和 RRAS 状态虚拟机重启后路由丢失用 route add 时没加 -p 参数或 RRAS 服务未自动启动重新添加永久路由检查 RRAS 服务启动类型跨网段访问时 FTP/HTTP 卡顿VMnet 网段和实际规划不一致用 ipconfig /all 核对每台虚拟机的 IP 和网关抓包看到 ARP 大量重复请求网关 MAC 一直在刷新检查是否有虚拟机配置了重复 IP防火墙拦截跨网段转发Windows 防火墙阻断转发流量实验环境临时关闭防火墙或用 netsh advfirewall 放行规则5.2 我踩过的几个典型坑第一个坑是 RRAS 启用后没有自动启动。我配置完静态路由后重启了一次服务器结果 PC1 ping 又不通了。排查半天才发现“路由和远程访问”服务被设成了手动启动服务器重启之后服务没有起来。建议配置完 RRAS 后把RemoteAccess服务的启动类型改成自动。第二个坑是回程路由缺失。我只顾着在 DIST 上添加到达服务器区的路由忽略了 WEB 服务器回包需要 CORE 知道怎么回到 192.168.10.0/24。好在数据包是 PC1 主动发起的WEB 回包到了 CORE 之后如果 CORE 没有回程路由就会直接丢弃现象是 PC1 发出去的数据没有响应。在做路由实验时一定要时刻记住路由是双向的。不同品牌设备的网络就是最典型的多层协同系统。我建议每个做了实验的人都做一次“复盘”把数据包每一跳的变化画出来再对着抓包结果验证很快就能形成自己的网络排错思路。
返回列表