十年匠心定制 · 商业建站与技术教学双线并行 咨询热线:400-886-1026 service@lmnt.cn
ARTICLE DETAIL

资讯详情

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

IP协议分析实战:从IPv4报文头部到十六进制数据拆解

IP协议分析实战:从IPv4报文头部到十六进制数据拆解 这两年带《计算机网络》课程每次安排学生到Educoder平台做“IP协议分析”实验答疑区都会冒出同一类问题IP协议原理听懂了头部格式也背过但一拿到十六进制报文就不知道从哪里下手。尤其是在线实验平台给的都是“原始字节”不像Wireshark那样已经把字段给你拆好了很多同学当场卡壳。这篇文章我想从实际做实验的视角把IP协议分析这件事彻底讲透——从IP头部结构、字节序规则到Educoder上这类实验的通用拆解思路再到我这些年带实验、抓包验证时踩过的坑一次性梳理清楚。不管你现在是被“Educoder计算机网络实验”卡住交不了作业还是期末复习想补一块网络层基础又或者纯粹想把IP报文看懂这篇文章都值得你花十分钟读完。核心只有一个把一串看起来毫无规律的十六进制数据翻译成你脑子里那张IPv4报文格式表。1. IP协议为什么值得专门做一次实验1.1 它在网络课程里的真实位置在计算机网络的知识体系里IP协议属于网络层地位很特殊。往上看它要承接TCP、UDP这些传输层协议往下看它要依托以太网、Wi-Fi等链路层技术。你可以把它想象成一个“快递分拣中心”TCP负责把大包裹拆成小包裹并编号IP则负责在包裹面单上写好“从哪里来、到哪里去”然后交给底层的公路、铁路、航空去运输。这也是为什么几乎所有《计算机网络》课程都会在讲完物理层、数据链路层之后紧接着安排IP协议分析实验。Educoder上的这个实验本质上就是要你手动扮演一次“快递分拣员”——拿到一个IP数据报的原始字节把头部里每一个字段读出来判断这个报文是谁发的、要发到哪、上层是什么协议、能不能分片、还能存活几跳。这个能力不是背概念而是真正的“解码能力”。1.2 这类实验真正考察的三种能力我观察了不少学生的做题过程发现能顺利通过实验的人往往不是背得最熟的人而是具备以下三种能力的人。第一种是对报文格式的肌肉记忆。不是说你要把整个头部表格每个字节的偏移位置倒背如流但至少看到开头第一个字节应该条件反射地去拆“版本”和“首部长度”看到第9个字节条件反射地想到“这是协议号”。这种敏感度靠多读几遍报文就能练出来。第二种是十六进制和十进制之间的快速转换。IP分析里充满了0x003c、0x4000这样的数据你不能每次都用计算器慢慢按得能一眼看出0x40是64、0x06是6、0x1c46大概是多少。做实验的时候速度和准确率都靠这个。第三种是字段含义与实际语义的对应。比如看到标志位DF1要能想到“这个报文不允许分片如果超过MTU就要丢弃”看到TTL64要能意识到“发送端可能是Linux或macOS因为Windows常见TTL是128”。这才是IP协议分析里“分析”二字的真正含义。1.3 没读懂IP头后面的实验都会吃亏很多同学觉得IP协议分析只是一道独立实验题考完就忘了。实际上后续的TCP协议分析、UDP协议分析、路由协议实验全都建立在IP头部的阅读能力之上。比如TCP报文分析题你第一步永远是先解析外层IP头确认源目IP和协议号之后才能确定那20字节TCP头从哪里开始。再比如后来学IPv6、学ICMP、学NAT理解的前提依然是你会不会从字节流里迅速定位IP层信息。换句话说这个实验是后面一堆实验的“地基”。地基没打牢后面看什么都像看天书。2. IP报文头部逐字段拆解——读报文的“语法手册”2.1 IPv4头部结构总览做IP协议分析之前脑子里必须有一张清晰的IPv4头部结构表。标准的IPv4头部固定部分是20字节不加选项的情况下所有字段顺序如下。字节偏移字段长度作用说明00.5版本号4位IPv4填4IPv6填60.51首部长度IHL4位以4字节为单位常见值为5表示20字节1服务类型TOS/DSCP1字节早期用于优先级现在主要拆为DSCP和ECN23总长度2字节IP报文总长度包含头部和数据单位是字节45标识2字节用于分片重组同一报文的分片标识相同67标志和片偏移2字节前3位是标志后13位是片偏移单位8字节8生存时间TTL1字节每经过一台路由器减1减到0则丢弃9协议1字节标识上层协议如6TCP、17UDP、1ICMP1011首部校验和2字节只校验IP头部不含数据部分1215源IP地址4字节发送端IP1619目的IP地址4字节接收端IP20选项和填充可变一般很少使用总长度必须是4字节的倍数这张表看着简单但实际做题时最容易出问题的地方恰恰是那些“单位”和“位数”的细节。比如首部长度字段的单位是“4字节”所以如果字段值是7首部长度就是7×428字节再比如片偏移字段的单位是“8字节”不是1字节也不是4字节这个我后面专门讲。2.2 网络字节序为什么你要“反着读”地址读IP报文时很多初学者会被一个细节搞晕报文里显示的十六进制字节和我知道的IP地址顺序好像不太一样这里涉及网络字节序的概念。IP协议规定多字节数值一律用“大端序”传输也就是高位字节在前。一个典型例子目的IP地址如果是172.16.10.12换算成十六进制是AC 10 0A 0C报文里你看到的就是AC 10 0A 0C顺序是一致的直接逐字节翻译就行。但有些题目为了增加难度可能给你的是“主机字节序”的地址也就是四字节反过来。你如果不先判断题目里的字节序直接把0C 0A 10 AC读成172.16.10.12那就完全反了。我的习惯是先做一次“合法性判断”IPv4地址每一位十进制范围是0到255如果按某个顺序读出来出现了大于255的数字比如256、300那一定读反了赶紧换顺序。2.3 从一段十六进制串逆推IP头部光讲表格没感觉我们来动一次手。假设题目给了下面这段十六进制数据要求分析IP头部信息45 00 00 3c 1c 46 40 00 40 06 b1 e6 ac 10 0a 63 ac 10 0a 0c我们按字节顺序逐个拆。第一个字节45高四位是4说明是IPv4低四位是5说明首部长度是5个4字节单位也就是20字节没有选项字段。第二个字节00服务类型为0说明DSCP和ECN都是零这是一个普通优先级的数据报。第2到第3字节00 3c这是总长度十六进制0x003c等于十进制的60说明整个IP报文是60字节。现在知道头部是20字节那么后面的数据部分是40字节。第4到第5字节1c 46标识字段0x1c46等于十进制的7254。如果这是一个分片报文同一个原始报文的其他分片也会带相同的标识。第6到第7字节40 00这是标志片偏移。先把0x4000转换成16位二进制0100 0000 0000 0000。前三位是标志位依次是保留位、DF位、MF位。这里DF1MF0说明“不允许分片”后13位全0说明片偏移为0这是第一个分片或者根本没有分片。第8个字节40TTL是0x40也就是64。常见的TTL初始值有64、128、255这个值大概率说明发送端是Linux、macOS或者某些网络设备因为Windows的初始TTL常见是128。第9个字节06协议号6说明上层协议是TCP。第10到第11字节b1 e6首部校验和。如果你只想判断报文是否合法可以手动重算也可以先放着最后再验证。第12到第15字节ac 10 0a 63转换成十进制是172.16.10.99这是源IP地址。第16到第19字节ac 10 0a 0c转换成十进制是172.16.10.12这是目的IP地址。解析完整个报文的信息其实已经很清楚了一台172.16.10.99的主机向172.16.10.12发送了一个60字节的TCP报文TTL设置为64报文不允许分片。这就是IP协议分析实验里最常见的一类题。2.4 首部校验和到底怎么算很多实验会在最后一步让你验证“校验和是否正确”或者干脆给你一个校验和字段为0的“半成品报文”让你把正确的值填上去。这里需要掌握计算方法。IPv4首部校验和的计算规则是这样的把IP头部看成一系列16位的二进制数全部用“二进制反码求和”再把求和结果取反填进校验和字段。校验时把包括校验和在内的所有16位字再次反码求和如果结果是0xFFFF就说明校验通过。我以上面那段报文为例去掉校验和字段也就是把它当作0来计算4500 003c 1c46 4000 4006 0000 ac10 0a63 ac10 0a0c逐步相加过程中每出现一次高位的进位就把它加到最低位循环进位最后得到一个结果。这个结果的“反码”就是0xb1e6正好和报文里的校验和字段一致。这说明这个IP头部没有被篡改过。实际做题的时候如果只是判断校验和是否正确可以偷个懒把包括校验和字段在内的所有16位字加起来如果得到0xFFFF基本就是正确的。实验里有时候会考这个变形所以最好把两种算法都练一遍。3. 在Educoder平台上完成IP协议分析实验——实操路径拆解3.1 平台实验的基本打开方式Educoder这类在线实训平台通常把整个实验拆成若干个小的“任务关卡”。你登录后进入对应实训项目首先看到的是一段任务描述里面会告诉你本关要实现什么目标然后是一段“相关知识”或“实验原理”文本这部分会把IP头部结构、分析方法重新讲一遍最后才是“测试要求”和“待填答案”。很多同学的错误是跳过前面直接做题结果连题目里给的报文格式都没看明白。我的建议是哪怕你已经很熟悉IP协议也务必把任务描述和知识提示完整读一遍因为在线平台经常会在同一道题里混入“IPv6扩展头”、“分片标志”这类你可能忽略的点后面的测试内容不一定只考IPv4基础。3.2 拿到原始数据后的“四步分析法”题型万变但分析方法可以固定下来。我总结了四步分析法照着做不容易漏字段。第一步确定IP头部的边界。看第一个字节高四位是版本号低四位是首部长度。首部长度值乘以4得到的就是IP头部的字节数。这一步最重要的作用是告诉你“IP头在哪结束、上层数据从哪开始”。如果是20字节后面紧接的就是传输层头如果大于20说明带了选项字段解读上层字段时要跳过这些选项。第二步抓取报文级别的关键参数。依次读总长度、标识、标志、片偏移同时根据总长度减去首部长度算出数据部分的长度。这部分信息决定了你对“这个报文大不大、要不要分片、是不是分片”的整体判断。第三步解析传输层关联信息。读TTL、协议号、源IP、目的IP。协议号决定了你下一步要去找TCP还是UDP还是ICMP源目IP决定了通信双方。如果后面还有TCP/UDP分析题这一步的数据就是你定位传输层头部的钥匙。第四步交叉验证。如果有选项题重点检查总长度和首部校验和是否合理如果题目里给的是抓包截图可以把报文和前两关的分析结果对比一下防止自己把标志位读反或者把IP地址顺序搞错。我用上面“45 00 00 3c 1c 46 40 00 40 06 b1 e6 ac 10 0a 63 ac 10 0a 0c”这段报文作为例子四步走完结果如下版本IPv4、头部20字节、总长度60字节、标识7254、DF1、TTL64、协议TCP、源地址172.16.10.99、目的地址172.16.10.12。3.3 分片计算题片偏移的单位是8字节Educoder实验里分片相关题目绝对是重灾区因为“片偏移单位是8字节”这句话很多人只是背过做题时却忘得一干二净。我来构造一个典型场景假设有一个原始IP数据报头部20字节要发送的IP数据总长度为1500字节也就是数据部分有1480字节。现在要通过一个MTU为576字节的链路那么单个IP报文总长不能超过576字节扣除20字节IP头每片最多携带556字节数据。但片偏移字段要求偏移量必须是8字节的整数倍556不符合这个要求所以实际每片携带的数据量要取552字节也就是552/869每个后续分片的偏移量都是69的倍数。于是三个分片的结果就是第一个分片数据552字节偏移0MF1总长572字节第二个分片数据552字节偏移69MF1总长572字节第三个分片数据376字节偏移138MF0总长396字节。三个分片的数据加起来是5525523761480字节正好等于原始报文的数据长度。做这种题最容易犯的两个错误一是没用8字节对齐直接按556字节去切导致后面分片偏移出现小数二是忘记前三片MF都应该是1只有最后一个分片MF才是0。你在Educoder上碰到分片计算题做完之后建议用手上的数据反向验算一遍最后一个分片的偏移值加上数据长度应该能回到原始数据总长度。3.4 关于提交答案与通过评测的提醒在线平台的评测规则通常比较直接你在一关里填写完答案系统会拿着你的结果和预设值比对全对才放你过关。这里有几个细节容易被坑到。一是进制问题。题目如果要求填十进制你填了十六进制哪怕数字本身算对了也会判错。建议先在草稿纸上把确定的字段统一转成题目要求的进制再往平台上填。二是多字段答案的顺序。有的关卡会让你一次性填多个值比如“源IP目的IP协议号”顺序错了会直接判错。三是注意IP地址的书写方式有的题要带点分十进制有的题要写成十六进制无点形式这个必须看清题目要求。还有一个经验在线平台如果判错通常不告诉你具体哪个字段错了只显示“测试未通过”。这时候别一团乱麻地全改而是把自己拆好的字段表拿出来逐项核对——尤其是标志位和片偏移这两个是重灾区。多数情况下你离正确答案就差一个字段。4. 常见报错与“一错错半天”的排查心得4.1 高频错误速查表带实验这几年我几乎每年都能在答疑区看到相似的翻车现场。这里整理一份高频错误表格你可以直接存下来对照自查。错误类型现象原因与解决办法首部长度算错总长度和上层协议定位全乱首部长度单位是4字节不是1字节。读到的值是5就乘4得到20字节总长度忘加头部数据部分长度偏小总长度字段是“IP头数据”不是“纯数据长度”分片偏移没有乘8重组位置算错偏移值不合法片偏移字段存的是“偏移量/8”的结果实际偏移要乘以8标志位拆错DF和MF判断反了将标志片偏移整体转二进制后只取前3位作为标志位IP地址顺序读反出现大于255的数字或者源目地址颠倒先判断字节序非法值出现时立刻换个方向重读校验和验证方法记混结果差一个反码校验时包括校验和字段做反码求和结果应为0xFFFF4.2 我在带实验时反复强调的三条忠告第一条不要只盯着答案要把“单位和位宽”写进草稿。每一个字段是什么单位、占几位题目可以变着花样考。你只要在草稿纸上把每个字段的单位标注出来比如“片偏移/8”就基本不会犯低级错误。第二条做分片题画一张小表。不要心算把每个分片的“序号、数据长度、偏移、MF”列出来检查完最后一个分片的偏移加数据长度能不能对上原始值再往答案里填。这个习惯救了我很多学生。第三条提交前重新看一遍任务描述。有时候你没过关不是算错了而是题目要求的格式和你填的不一样比如要求大写十六进制、要求补前导零。别小看这些格式要求在线评测系统很死板格式不合就是不给过。4.3 分清“分片”和“分段”避免概念混用这里我想额外多说一个概念问题。很多人在做IP分片计算时会不自觉地把“分片”和TCP的“分段”混在一起。这是两个不同的概念IP分片发生在网络层是因为链路MTU太小一个IP数据报太大装不下于是IP层把它拆成多个IP报文独立发送而TCP分段发生在传输层是因为TCP要把应用层的大块数据按MSS切成适合发送的小段。从报文上看IP分片会导致多个IP头字段标识、标志、片偏移发生变化而TCP分段不会改变IP头只是每个TCP段有各自的序号和确认号。实验里那些标识相同、偏移递增的报文是IP分片那些看TCP序号连续排列的是传输层的分段。这个区别如果搞混后续TCP实验会非常痛苦。5. 平行对照用Wireshark把实验结论落地到真实网络5.1 用一次Ping包完成本地“IP头体检”Educoder上的实验是“人工拆包”但在真实网络里解析报文的工作早就被Wireshark自动完成了。为了验证你在实验里学到的东西我强烈建议课后做一次实战对照。最简单的场景是抓一个ICMP报文。打开Wireshark选择你当前上网的网卡先输入过滤条件icmp然后另开一个终端执行ping -c 4 你的网关IP等抓包结束后在列表里双击一条ICMP请求报文展开中间那个“Internet Protocol Version 4”的树形节点。你会看到版本、首部长度、总长度、标识、标志位、TTL、协议、源地址、目的地址和我刚才手动拆解的结果完全一样。唯一不同的是Wireshark已经把“分片偏移”的原始值自动乘了8换算成了绝对偏移量显示这正是实验里手动计算要做的步骤。5.2 抓包和做题之间的差异亲手抓过包之后你会发现真实报文和实验题有一些差别。真实网络里大部分TCP/IP报文的总长度常常不是整数十因为应用层数据大小不固定TTL初始值也不是只有64、128、255这三档经过不同设备转发后TTL会呈现各种中间值很多操作系统默认会给TCP报文设置DF1用来做路径MTU发现所以你在Wireshark里看到带DF标志的报文比不带DF的要多得多。如果你用的是Linux也可以在命令行借助tcpdump快速查看IP头关键信息sudo tcpdump -i eth0 -nn icmp -c 10 -v输出里的ttl 64、id 7254、proto ICMP、172.16.10.99 172.16.10.12其实就是实验里需要你从十六进制字节中还原出来的结论。工具帮你做了转化但你要明白它转化的依据这正是这个实验存在的意义。5.3 为什么建议实验之后补一次抓包验证很多人觉得在线实验做过一遍知识点就算学完了。但从我带课的经验来看从“会做平台题”到“真正理解IP协议”中间还差一次“自己抓包验证”的距离。平台题目为了出题方便通常会给相对干净的报文不涉及复杂选项、不涉及奇怪的TTL值而你一旦打开Wireshark抓真实网络流量会立刻遇到TTL不标准、校验和显示“incorrect”、分片混乱等各种情况。这时候你被迫回头去查头部格式、去理解网络字节序、去研究校验和算法反而是学习效果最好的时候。我个人带实验的体会是每次讲完IP协议分析我都会让学生先完成平台任务再用Wireshark抓一个ping包、抓一个TCP连接包对照着把IP头字段抄一遍。做过这一步的人后面再看TCP三次握手基本不会弄丢“IP协议号6”这条线索。这个习惯也推荐给你实验做完了别急着退出来打开抓包工具亲手“看一眼”IP长什么样很多疑问会在一瞬间解开。
返回列表