ARTICLE DETAIL

资讯详情

深耕网站视觉设计与运营推广的一线实战洞察。

IP协议深度拆解:报文头、路由转发与GNS3抓包实验

IP协议深度拆解:报文头、路由转发与GNS3抓包实验 搞数据通信这些年我有个习惯只要有人问我“IP协议到底是个啥”我不急着背定义而是先丢一个GNS3实验给他做。不是装逼是真的只有你在抓包里亲眼看到源IP和目的IP从头到尾不变、源MAC和目的MAC却在每一跳都换你才会理解IP协议在整个TCP/IP体系里干的是什么活。在《数据通信》课程里IP协议是所有章节的地基在实际网络里一切跨网段通信都要靠它。这篇文章就围绕IP协议做一次深度拆解报文头字段、路由转发、ARP协作、分片机制然后用GNS3搭一个“两台路由器两台主机”的网络把IP报文转发的每一步抓出来看。适合正在学网络基础、备考数据通信、或者刚转行做网络运维的朋友看完能直接照着实验复现。1. 把IP协议放进数据通信的坐标系里1.1 IP协议到底解决什么问题先说一个容易混淆的点IP协议并不是TCP/IP协议栈里唯一的三层协议还有ICMP、ARP、IGMP这些但IP协议是绝对的核心因为它是承载数据的那个“信封”。数据通信的本质是把信息从一台机器搬到另一台机器。它搬到哪儿、走哪条路、跨多少个网段这个责任就在网络层具体由IP协议实现。你可以把IP协议想象成快递面单面单上写了发件地址和收件地址快递公司根据这些地址规划路线、分拣中转。你不需要给每个包裹提前订好一条“专线”每个中转站接到包裹后看一眼面单决定往哪个方向送这就是无连接服务的核心思想。为什么“无连接”这么重要因为它省掉了建连维护的成本。IP协议不为每个通信会话维护状态每个IP报文都是独立寻路、独立转发。这意味着网络里几千台设备不用记住“谁和谁在通信”路由表只管“下一跳往哪发”。代价就是IP协议提供的服务是尽力而为Best Effort它不保证不丢包、不保证不乱序、不保证不重复。可靠性的事交给上层TCP去确认、重传IP只负责把报文送到目的地或者至少努力送。这个“无连接尽力而为”的定位是理解IP协议一切行为的钥匙。在《数据通信》这门课里讲到IP协议时通常紧跟着就是地址、子网掩码、网关、路由表、ARP。这几个概念其实是同一个问题的不同侧面一个IP报文从源主机出发如何经过若干路由器到达目的主机。把这个问题彻底搞清楚了后面学路由协议RIP、OSPF、学访问控制列表ACL、学NAT都会顺很多。反过来如果IP层这关没过后面学什么都容易在“报文为什么到这个接口却没出那个接口”上卡住。1.2 IP在TCP/IP协议栈里的位置它和上下层怎么配合经常有同学把TCP/IP理解成“TCP和IP两个协议”这是不对的。TCP/IP是一整套协议族里面的分工非常清晰应用层HTTP、FTP、DNS负责把用户需求翻译成数据传输层TCP、UDP负责给应用数据标上端口号、提供可靠性或者低延迟网络层IP负责寻址和路由链路层以太网、Wi-Fi负责在同一条物理链路上做实际的帧传输。IP协议的位置决定了它必须同时和上下层打交道。对上层它用一个8比特的“协议号”字段表明自己携带的payload是谁——是ICMP协议号1、TCP协议号6、还是UDP协议号17。对下层它把整个IP报文交给以太网协议去封装成帧而此时帧头里的MAC地址才是真正在链路层驱动硬件完成收发的依据。这就是为什么每个IP报文在网络里传输时源IP、目的IP永远不变而每一跳的源MAC、目的MAC都在变。IP地址是逻辑地址MAC地址是物理地址路由器是这两者之间的翻译官。搞懂这个分工你就理解了大半的网络转发原理。再往深一层说这个“分层配合”还体现在封装与解封装上。应用层数据先被TCP/UDP加上传输层头再被IP加上网络层头最后被以太网加上帧头帧尾。接收方逐层剥掉头像拆俄罗斯套娃。数据通信这门课讲的“协议栈”本质上就是一套“每层只管自己那一块层与层之间有明确接口”的机制。IP协议看似只是套娃里的一层但它是唯一横跨整条转发路径的字段从源主机到目的主机每一台路由器都会剥离并重组链路层帧但IP层的报头始终是被处理的对象。所以学IP协议学的不是一个孤立的协议而是整套通信系统如何围绕“端到端寻址”运转。2. IP协议核心机制报文头、转发与分片2.1 IPv4报文头逐字段拆解抓包分析第一件事就是能盯着IPv4报文头说出每个字段的意思。IPv4的基础首部长20字节固定部分的标准结构是先是4比特的版本号和4比特的首部长度接着是服务类型字段和总长度字段中间是标识、标志、片偏移三兄弟然后是TTL、协议号、首部校验和最后跟着32比特的源IP和32比特的目的IP。字段不算多但每个都能延伸出一堆考点。我挑几个最容易出问题、也最影响排障的字段详细说Version版本号占4比特IPv4报文这里固定是4。如果是IPv6值就成了6。抓包时如果看到版本号不是4先别急着往下解析很可能抓包接口用的是IPv6或者报文本身有问题。IHL首部长度也是4比特以4字节为单位。标准首部没选项时值是5表示20字节。见到值比5大说明报文头里带了选项Options解析payload时要按实际头部长度往后偏移否则会把选项内容当成数据。Total Length总长度16比特单位是字节表示整个IP报文首部数据的长度最大是65535字节。以太网MTU才1500所以超过这个数的报文必须分片这就是后面要讲的分片机制的由来。Identification标识、Flags标志、Fragment Offset片偏移这三个字段是“分片三兄弟”协同工作让网络层能把一个大IP报文拆成多个小报文、到了目的地再重组。标识相同表示这些分片属于同一个原始报文Flags里的DF位为1表示“请不要分片”MF位为1表示“后面还有分片”片偏移以8字节为单位记录当前分片在原始报文数据部分里的位置。Time to LiveTTL8比特名字叫“生存时间”实际意思是“最多还能经过多少跳”。每经过一台路由器就减1减到0时路由器丢弃该报文并回送一个ICMP time exceeded。TTL存在的意义是防止路由环路把报文在网里无限反复转发。不同的操作系统默认值不一样Windows是128Linux是64Cisco路由器是255抓包时看到值能反推报文可能从哪里来。Protocol协议号8比特告诉IP层payload交给哪个上层协议处理。常见值1ICMP、6TCP、17UDP。防火墙的ACL里过滤协议用的就是这串数字。Header Checksum首部校验和16比特只校验首部不包括数据部分。关键在于因为每跳TTL会变所以这个校验和不是出发前算一次就完事而是每台路由器改写TTL之后都要重新计算。这就是为什么抓包时看到的校验和每次都不一样。Source Address 和 Destination Address各32比特就是源IP和目的IP。注意这里记录的是端到端的IP地址不管报文路上中转多少次这两个字段始终不变。我建议按这个顺序读一个IP报文先看总长度再算首部长度确认数据部分从哪开始然后看协议号知道后面跟的是TCP、UDP还是ICMP再看TTL判断它走了多少跳最后看源目的IP确认这个流量是谁发给谁。抓包做得多了这套顺序会变成肌肉记忆。2.2 转发决策的三张表路由表、ARP表、MAC表IP协议的工作核心是转发。一台主机或路由器收到一个IP报文要做的事可以归纳成三步拆开以太网帧拿到IP报文、查路由表决定下一跳、重新封装成帧发出去。整个决策过程涉及三张表它们缺一不可。路由表Routing TableIP层的决策依据。它记录“去往哪个网段交给哪个接口、下一跳是谁”。路由表里的条目可以是直连网段、静态路由也可以是RIP/OSPF等动态路由协议学来的。给定目的IP路由表要做的是找到最匹配的路由条目。判断匹配规则本质上是“最长前缀匹配”目的IP跟多条路由条目的掩码分别做与运算完全匹配的那条里掩码最长的一个就是最终选中的路由。ARP表ARP CacheIP地址到MAC地址的映射。路由器知道下一跳IP还不够因为链路层帧里的目的MAC必须填一个真实存在的网卡地址。ARP表就是干这个翻译活的靠广播请求和单播应答动态维护。表的条目有老化时间默认几分钟到几十分钟不等过期后会重新发ARP请求刷新。MAC表/CAM表交换机的FDB以太网交换机用来判断帧往哪个端口转发的表。虽然两台主机之间通信最终靠的是网络层路由和ARP但每一段链路上交换机是看不见IP层的东西的它只看帧头里的目的MAC。MAC表没学过帧就只会在收到帧的那个端口泛洪该去的地方去不了。三张表配合起来的流程才是完整的主机A要发往主机B先查路由表发现B不在本地网段于是把帧送给网关网关IP对应哪个MAC查ARP表没有就发ARP广播问拿到网关MAC后封装以太网帧发出去网关路由器收到剥离帧头看IP目的地址再查自己的路由表决定下一跳又查ARP表找到下一跳的MAC重新封装帧……一直到最后一跳路由器发现目的网段直连才把帧交给目的主机。这个链条里IP地址负责跨网段寻址MAC地址负责每一跳的物理投递两者互相配合缺一不可。2.3 分片与重组跨链路传输的关键约束不同物理链路的MTU最大传输单元不一样。最常见的以太网MTU是1500字节也就是说一个以太网帧的数据部分IP报文最大只能装1500字节。如果IP层要发送的报文比链路MTU还大就必须执行分片把一个大报文拆成多个小报文每个小报文带上相同的标识Identification、合适的片偏移和分片标志发给目的端目的端的IP层收齐所有分片后再按片偏移重组回原始报文。分片规则里最容易被考倒的一个点是片偏移字段的单位不是字节而是8字节。为什么因为13比特的片偏移字段最多能表示8191如果单位是字节那只能描述8191字节的报文而IP报文最大可以到65535字节不够用把单位放大到8字节13比特就能描述65535范围了。代价就是分片时每个分片的数据部分长度必须是8字节的整数倍除了最后一个分片。举个例子假设应用层要发送3000字节数据加上8字节ICMP头就是3008字节再加上20字节IP首部整个IP报文总长3028字节超过MTU 1500会被分成三片分片数据长度片偏移MF标志第1片1480字节00/81第2片1480字节1851480/81第3片48字节3702960/80三片的Identification完全相同目的端靠这个ID把它们归为一组第一、二片的MF1表示还有后续分片第三片MF0表示这是最后一片。接收端按片偏移从小到大把数据拼回去还原成3028字节的原始报文。这里要特别提醒分片是IP层的事重组只在目的端做中途的路由器只拆不装。所以分片会带来一个很现实的性能问题只要有一片在中途丢了整个报文都要由源端重传而且重传的又是分片报文。这就是为什么现代网络里大家都在尽量用PMTUD路径MTU发现或避免过大UDP包目的就是尽量避免在中间链路被分片。在后面的实验里我会带你看真正的分片报文长什么样。3. GNS3实验两台路由器之间的真实报文旅程3.1 实验拓扑与地址规划理论讲再多不如动手抓包。我们直接在GNS3里搭一个最经典的跨网段转发拓扑两台路由器各自接一台主机路由器之间用一条链路互联。结构非常简单PC1 --- (g0/0) R1 (g0/1) --- (g0/0) R2 (g0/1) --- PC2也就是PC1接R1的g0/0口R1的g0/1口连R2的g0/0口R2的g0/1口接PC2。两个主机分别在两个网段所以要通信必须经过R1、R2两台路由器这恰好能看清“IP地址不变、MAC地址每跳都变”的全过程。地址规划这样定设备接口IP地址网关PC1eth0192.168.1.10/24192.168.1.1R1g0/0192.168.1.1/24-R1g0/1192.168.12.1/24-R2g0/0192.168.12.2/24-R2g0/1192.168.2.1/24-PC2eth0192.168.2.10/24192.168.2.1这里面刻意把R1和R2之间的互联网段设成192.168.12.0/24目的就是让中间这段链路和两侧业务网段完全独立。等后面抓包时你会发现192.168.12.x这个地址只出现在路由器互联接口上主机是不知道它的存在的。GNS3的版本不同路由器镜像配置细节会有点差异。老版本常用c3725、c7200新版本用IOLIOS on Linux镜像更常见。不管哪种你要保证路由器有两个接口接口名可能是g0/0、g0/1千兆或者e0/0、e0/1快速以太网以你拖进拓扑后实际显示为准。主机节点我推荐用VPCS它启动快、配置简单、抓包也方便如果习惯用真实Linux虚拟机或者QEMU虚拟机也行只不过启动慢一些。Windows主机不建议在GNS3里直接跑等你配完网络会发现所有时间都花在等待开机上了。3.2 路由器和主机的具体配置路由器配置是整个实验的关键少敲一条命令都ping不通。R1上的完整配置如下enable configure terminal hostname R1 interface g0/0 ip address 192.168.1.1 255.255.255.0 no shutdown exit interface g0/1 ip address 192.168.12.1 255.255.255.0 no shutdown exit ip route 192.168.2.0 255.255.255.0 192.168.12.2R2上的配置对称enable configure terminal hostname R2 interface g0/0 ip address 192.168.12.2 255.255.255.0 no shutdown exit interface g0/1 ip address 192.168.2.1 255.255.255.0 no shutdown exit ip route 192.168.1.0 255.255.255.0 192.168.12.1最后两行静态路由特别关键R1知道自己的直连网段是192.168.1.0/24和192.168.12.0/24但对远端的192.168.2.0/24完全没概念必须显式告诉它“去192.168.2.0/24把报文交给下一跳192.168.12.2”。R2同理。我见过不少同学在配置阶段忘了写静态路由然后怎么排查都ping不通其实show ip route一眼就能看出来缺了条目。主机的配置更简单。VPCS命令行里输入ip 192.168.1.10 192.168.1.1 save第一条命令的意思是设置IP为192.168.1.10、网关为192.168.1.1。如果你的主机节点是真正的Linux用ip命令也行ip addr add 192.168.1.10/24 dev eth0 ip route add default via 192.168.1.1配置完成之后先做一件非常重要的事在R1和R2上分别执行show ip interface brief确认所有接口状态都是up。只有接口up了后续抓包才有意义。然后从PC1 ping PC2试试ping 192.168.2.10正常情况下应该通。如果通不了不要急着抓包先按顺序查路由表、ARP、接口状态把基础链路理清了再继续。3.3 抓包全过程ARP广播、IP转发与MAC重写实验通了之后重头戏来了。在GNS3里给三处链路分别开抓包PC1和R1之间、R1和R2之间、R2和PC2之间。操作方法是在链路的两个端点之间选择Start CaptureGNS3会自动拉起Wireshark。为了观察干净我建议先清空所有ARP缓存再执行ping。从PC1执行ping 192.168.2.10。整个过程可以拆成三个阶段第一阶段PC1到R1的链路上PC1判断目的IP 192.168.2.10不在自己的子网192.168.1.0/24里决定把报文发给网关192.168.1.1。但PC1不知道网关192.168.1.1的MAC地址于是先发一个ARP广播请求Who has 192.168.1.1? Tell 192.168.1.10。以太网帧里的目的MAC是全FFF:FF:FF:FF:FF:FF。R1收到广播发现问的是自己g0/0的IP于是用单播应答192.168.1.1 is at 路由器g0/0的MAC地址。PC1收到应答把网关的IP和MAC对应关系写进自己的ARP缓存然后封装IP报文源192.168.1.10、目的192.168.2.10和以太网帧源PC1的MAC、目的R1 g0/0的MAC发出去。第二阶段R1到R2的链路上R1收到PC1发来的帧目的MAC是自己于是剥离帧头看到IP目的地址192.168.2.10。R1查自己的路由表发现192.168.2.0/24的下一跳是192.168.12.2出接口g0/1。R1检查ARP缓存看有没有192.168.12.2的MAC。第一次实验肯定没有于是R1继续发ARP广播Who has 192.168.12.2? Tell 192.168.12.1。R2应答R1把192.168.12.2和对应MAC写进缓存。R1重新封装帧源MAC改为R1 g0/1的MAC目的MAC改为R2 g0/0的MAC源IP、目的IP都不变TTL减1。发出去。第三阶段R2到PC2的链路上R2收到帧同样剥离查路由表发现目的网段192.168.2.0/24是自己的直连网段出接口g0/1。R2需要知道PC2的MAC于是发ARP广播Who has 192.168.2.10? Tell 192.168.2.1。PC2单播应答。R2封装帧源MAC为R2 g0/1的MAC目的MAC为PC2的MACTTL再减1把报文送到PC2。PC2收到ICMP回显请求内核应答生成一个源为192.168.2.10、目的为192.168.1.10的ICMP回显应答报文再沿着R2、R1一路反向转发最终回到PC1。这个过程我建议你在Wireshark里反复Ping几次对比三份抓包文件。你会发现同一个ICMP echo request在三段链路上的帧头完全不一样源MAC和目的MAC每段都在变而IP层里的源IP、目的IP始终保持192.168.1.10和192.168.2.10。这就是那个核心认知逻辑地址不变物理地址逐跳变化。亲眼见过一次比背一百遍都管用。还有一个细节值得注意PC1第一个发出的ARP报文其实是广播帧Wireshark里Protocol列显示ARPInfo列显示 “Who has 192.168.1.1? Tell 192.168.1.10”。有人会问为什么不能直接发IP包让路由器自己决定怎么转发因为以太网是广播介质每一帧都必须有明确的目的MAC才能被正确的网卡接收。没有目的MAC交换机只能把它当广播发所有主机都会收到但只有目标网卡会处理。这是链路层一个很底层的设计约束理解它你就明白了“为什么必须要有ARP”。3.4 实验排障演练路由丢失、TTL变化与路径追踪实验做通了不算完再做一个故障注入实验把路由条目删掉观察报文的表现这样你脑子里就有了“报文遇到路由黑洞长什么样”的模板。在R1上执行no ip route 192.168.2.0 255.255.255.0 192.168.12.2然后再从PC1 ping PC2。R1收到目的192.168.2.10的报文后查路由表发现没有任何匹配条目也没有默认路由于是把它丢弃并给PC1回了一个ICMP目的地不可达报文具体类型是Destination network unreachable网络不可达Type 3Code 0。Wireshark里会清清楚楚显示ICMP 192.168.1.1 - 192.168.1.10 Destination network unreachable注意这个回包的源IP是R1收到请求的那个接口IP192.168.1.1不是R1的其他接口。这一点在各种教材里很少明说但排障时经常用看ICMP错误报文的源IP往往就能定位到丢包节点。如果你给R1配一条默认路由ip route 0.0.0.0 0.0.0.0 192.168.12.2那R1就会把任何未知网段的流量都丢给R2。默认路由在真实网络中天天见但它也是一把双刃剑配了它去往任何网段都能转发代价是可能把本应丢弃的流量也塞给了别人。建议实验时两种都试一遍体会一下“精确路由”和“默认路由”的差异。顺手还能做一个小实验验证TTL在PC1上用traceroute 192.168.2.10你会看到两跳设备第一跳192.168.1.1第二跳192.168.12.2。traceroute的原理就是利用TTL从1开始逐跳递增第一次发TTL1的包R1收到后TTL减到0丢弃并回ICMP time exceeded第二次发TTL2的包R1转发、R2收到后TTL减到0丢弃并回ICMP time exceeded第三次发TTL3的包才真正到达PC2。这个机制把“TTL逐跳递减”从概念变成了可看见的路径非常直观。4. 实战排错IP协议场景的常见问题与排查4.1 ARP解析失败与缓存过期实际网络里ARP类故障占了三层排障的半壁江山。最典型的症状是主机能ping通自己127.0.0.1网卡也是up但ping网关都不通。这时第一件事就是看ARP表能不能解析出网关MAC。在Windows下用arp -aLinux下用arp -n路由器用show arp。如果表里网关对应的MAC是incomplete解析失败那问题十有八九出在二层链路没插好、网线坏了、VLAN划错、或者对端设备接口shutdown了。还有一类是ARP缓存过期导致的“时通时不通”。比如网关做过主备切换MAC地址变了但主机ARP缓存里还留着旧MAC此时流量会被丢到一台已经不承担转发任务的设备上。处理办法很暴力但有效清ARP缓存重来。Windows下是arp -d *Linux下是ip neigh flush all然后在主机上再ping一次看它会不会发出新的ARP请求。生产环境里如果网络设备做了VRRP切换正常情况下设备会发免费ARPGratuitous ARP来刷新各主机的缓存但有时会有意外的丢包遇到问题先清ARP绝对是最低成本的排查手段之一。ARP协议本身还有个特点值得新人记住它是无认证的任何主机都可以应答别人的ARP请求这就是ARP欺骗能存在的根本原因。在企业网络里接入交换机上通常都会配动态ARP检测DAI或端口安全生产环境里别指望靠主机的信任来防ARP欺骗。另外强调一点ARP报文不经过路由器转发。路由器的每个接口都是独立的广播域ARP广播只在本地链路内传播。这就是为什么PC1永远问不到192.168.12.2的MAC因为它在完全不同的网段里。把这个概念想清楚你就不会犯“跨网段直接查ARP”的常识性错误。4.2 MTU与分片问题排查数据通信里有个经典故障“小包能通大包不通”。典型场景是ping通网关ping带大数据包的测式比如Windows的ping -l 1500就不通。这种问题十有八九和MTU有关。当IP报文超过链路MTU且报文的DF位不分片标志被置为1时路由器就不能对它分片只能丢弃并回送ICMP fragmentation needed报文。很多应用在建立隧道、传输大包时会设置DF1结果就是链路MTU比预期小比如PPPoE拨号链路MTU是1492比1500少8字节大包直接被扔了。排障方法很直观从大到小缩小ping包长度找到刚好能通过的临界值。Windows下可以用ping -f -l 1400-f表示设置DF不分片-l指定发送缓冲区大小如果通再逐步增大Linux下对应的命令是ping -M do -s 1400。注意ping的-l或-s参数填的是ICMP数据区的大小整个IP报文还要加上20字节IP头8字节ICMP头。所以在以太网MTU 1500的环境里如果ping -f -l 1472通了而-l 1473不通说明1500字节刚好是临界点如果你要测的是1450的MTU链路临界值就是1450-281422。这个“减28字节”的口诀在MTU排查中非常常用。在Wireshark里怎么看分片找到IPv4报文看Identification、Flags和Fragment Offset列。如果某个报文的多个分片有相同的Identification且MF位有1那就是分片了。还有一种情况同一对IP之间出现大量分片报文往往意味着两端之间某个链路的MTU比较小而且路径MTU发现PMTUD没生效。排查时先看两端接口的MTU设置再看中间有没有隧道设备把MTU统一调到链路允许的值问题通常就消失了。4.3 TTL超时与路由环路TTL的本质是防环。如果路由器配置了错误的静态路由形成环路比如R1认为去往某个网段的下一跳是R2R2又认为下一跳是R1报文就会在R1和R2之间无限转发每次TTL减1。直到TTL减到0某台路由器才会丢包并回ICMP time exceeded。用户侧看到的症状就是ping不通、或者延迟极不稳定用traceroute时能看到同一个IP反复出现。排查环路不需要太多技巧在路由器上执行show ip route看明细路由有没有互相指认的冗余条目执行traceroute如果第二跳和第三跳反复在同一组IP之间横跳基本就是环路。把错误的静态路由删掉或者让动态路由协议收敛问题就解决。生产网里路由环路一旦形成影响是全局的因为所有经过这条错误路径的流量都会被打满CPU也会被报文冲击。所以配置静态路由前建议先用ping验证下一跳的可达性再敲路由命令。顺带说一个抓包小技巧TTL还能用来判断报文经过了多少跳。比如某个源IP发来的报文TTL只剩5那它大概率是绕了很远的路才到你这儿或者源端故意设置了很小的TTL。抓包时看到异常的TTL递进关系往往能帮你发现一些隐蔽的中转节点。5. Wireshark速查实验抓包的正确打开方式5.1 抓包位置与过滤器实验里最常犯的错误是在错误的链路上抓包然后抱怨“怎么什么都没抓到”。抓包位置必须对应你要观察的现象现象抓包位置重点看的过滤器PC1如何找到网关PC1和R1之间arp路由器如何改写MAC转发R1和R2之间ip.addr 192.168.2.10 或 icmp目的主机如何收到报文R2和PC2之间icmp 或 arp路由黑洞/ICMP报错沿路径任意链路icmpWireshark里常用过滤器只看ARP就输入arp只看ICMP就输入icmp只看某个IP的流量就输入ip.addr 192.168.2.10想组合过滤还能写成icmp and ip.addr 192.168.1.10。我建议在主界面先设ip.addr 192.168.2.10再加icmp这样能同时看到ICMP请求应答和中间夹杂的ARP又不会混入无关的广播流量。5.2 看懂抓包里的IPv4和ARP字段真正熟练的排障者看Wireshark不是看Packet List里的Info摘要而是点开Packet Details面板逐级展开。看IPv4层时要关注五个字段的数值Total Length、Identification、Flags、TTL、Protocol。看ARP层时要理解Operation1请求2应答、Sender MAC/IP、Target MAC/IP。很多初级同学只看Protocol列写着ARP就跳过从不开包看里面到底在问谁、答谁。其实ARP报文结构很简单看一遍就再也忘不了请求时Target MAC是全0应答时Target MAC才有值请求是广播应答是单播。一个非常反直觉但很实用的细节在抓包里看到ARP应答帧的Sender MAC字段填的是“回答者自己的MAC”而Target MAC填的是“问问题的人”。这听起来像是在说废话但不少人确实会把这两个字段搞混结果在分析二层问题时看错数据。建议新手在Wireshark里打开一个ARP请求和一个ARP应答放在一起对比盯住Sender和Target四个字段的变化对比几遍就记住了。6. 数据通信考试里的高频易混点一起理清楚6.1 单播、广播、组播IP协议支持三种目的地址形式。单播就是一对一的点对点通信绝大多数业务流量都是单播广播是发给同一网段所有设备典型代表就是ARP请求和DHCP Discover目的IP是255.255.255.255或子网广播地址组播是一对多但只发给加入了特定组播组的设备视频会议、IPTV都用它。三种方式的差异决定了网络设备对报文的处理方式交换机对广播无条件泛洪对组播要看IGMP snooping对单播就查MAC表。理解了这个再看很多二层网络开销问题就通了。6.2 为什么说TCP/IP里的“可靠性”不在IP层我上课时经常问一个问题DNS查询用UDP为什么也不容易丢关键不在于IP保证可靠而在于上层应用自己有超时重传机制。TCP的可靠性来自序号、确认、重传、滑动窗口这些工作IP层一概不管。IP层甚至不保证报文按序到达乱序都不可能帮你排好。理解“IP层是无连接、尽力而为”这个定位你就不会在调试网络时把“丢包率高”的锅甩给IP协议而是去看是不是传输层重传超时、拥塞窗口缩了、还是链路本身误码率高。这个认知对于真实排障特别重要方向错了修为再高也白搭。6.3 IPv4地址结构分类、私有地址与网关的直觉还有一个高频考点是IPv4地址本身的结构。虽然现在CIDR无类别域间路由已经取代了老的A/B/C类地址分类但很多人还是习惯性地问“这是几类地址”。我的建议是把A类1.0.0.0-126.255.255.255、B类128.0.0.0-191.255.255.255、C类192.0.0.0-223.255.255.255作为历史知识了解即可真正要掌握的是私有地址段和子网掩码的直觉。私有地址段是10.0.0.0/8、172.16.0.0/12、192.168.0.0/16NAT技术主要就是围绕它们工作的。子网掩码的本质是告诉设备“哪些位是网络位、哪些位是主机位”两个IP在同一个子网意味着它们掩码后得到的网络号相同。这个直觉一旦建立你再看到192.168.1.10/24和192.168.2.10/24会瞬间知道它们必须靠路由器通信根本不需要去算复杂的二进制。我自己的体会是IP协议很长一段时间里被讲得太抽象了什么“网络层协议”“报文封装”这些词初学者听完第一反应都是“哦”而不是“原来如此”。所以我带人学数据通信时从来都是从GNS3抓包开始的先让他亲眼看到ARP广播怎么问、路由器怎么改写MAC、TTL怎么一跳跳减少再回头看报文头字段基本上半个小时就能打通“IP协议到底在干什么”这个关卡。最后再分享一个小技巧实验时别急着只抓一次包把三处链路同时开抓然后用Wireshark的显示过滤器分别对比同一个ICMP报文在每一跳上的封装修饰你会有一种把数据通信的最后一层窗户纸捅破的感觉。
返回列表