<?xml version="1.0" encoding="utf-8" standalone="yes"?><rss version="2.0" xmlns:atom="http://www.w3.org/2005/Atom"><channel><title>网络协议 on 云雾海的博客</title><link>https://blog.yunwuhai.com/tags/%E7%BD%91%E7%BB%9C%E5%8D%8F%E8%AE%AE/</link><description>Recent content in 网络协议 on 云雾海的博客</description><generator>Hugo -- gohugo.io</generator><language>zh-cn</language><lastBuildDate>Wed, 15 Oct 2025 22:49:58 +0800</lastBuildDate><atom:link href="https://blog.yunwuhai.com/tags/%E7%BD%91%E7%BB%9C%E5%8D%8F%E8%AE%AE/index.xml" rel="self" type="application/rss+xml"/><item><title>WireShark抓包实验</title><link>https://blog.yunwuhai.com/posts/%E7%BD%91%E7%BB%9C%E5%AE%89%E5%85%A8/wireshark%E6%8A%93%E5%8C%85%E5%AE%9E%E9%AA%8C/</link><pubDate>Wed, 15 Oct 2025 22:49:58 +0800</pubDate><guid>https://blog.yunwuhai.com/posts/%E7%BD%91%E7%BB%9C%E5%AE%89%E5%85%A8/wireshark%E6%8A%93%E5%8C%85%E5%AE%9E%E9%AA%8C/</guid><description>&lt;img src="https://blog.yunwuhai.com/posts/%E7%BD%91%E7%BB%9C%E5%AE%89%E5%85%A8/wireshark%E6%8A%93%E5%8C%85%E5%AE%9E%E9%AA%8C/cover.jpg" alt="Featured image of post WireShark抓包实验" /&gt;&lt;h1 id="wireshark抓包实验"&gt;&lt;a href="#wireshark%e6%8a%93%e5%8c%85%e5%ae%9e%e9%aa%8c" class="header-anchor"&gt;&lt;/a&gt;WireShark抓包实验&#10;&lt;/h1&gt;&lt;h2 id="目标"&gt;&lt;a href="#%e7%9b%ae%e6%a0%87" class="header-anchor"&gt;&lt;/a&gt;目标&#10;&lt;/h2&gt;&lt;ol&gt;&#10;&lt;li&gt;掌握TCP/IP网络体系结构的网络接口层、网络层、传输层和应用层典型协议（Ethernet II、IP、TCP、ICMP、HTTP）的分析。&lt;/li&gt;&#10;&lt;li&gt;分析常用即时通讯软件的通信过程。&lt;/li&gt;&#10;&lt;/ol&gt;&#10;&lt;h2 id="实验内容"&gt;&lt;a href="#%e5%ae%9e%e9%aa%8c%e5%86%85%e5%ae%b9" class="header-anchor"&gt;&lt;/a&gt;实验内容&#10;&lt;/h2&gt;&lt;h3 id="抓包ping"&gt;&lt;a href="#%e6%8a%93%e5%8c%85ping" class="header-anchor"&gt;&lt;/a&gt;抓包PING&#10;&lt;/h3&gt;&lt;p&gt;Ping命令是一种常用的网络诊断工具，用于测试两台计算机之间的连通性。本次实验中我们通过Ping命令访问百度的网址，并对整个过程进行抓包分析。&lt;/p&gt;&#10;&lt;ol&gt;&#10;&lt;li&gt;&#10;&lt;p&gt;我们打开WireShark然后进入抓包界面，并开始抓包。&lt;/p&gt;&#10;&lt;/li&gt;&#10;&lt;li&gt;&#10;&lt;p&gt;我们打开命令行，然后输入指令&lt;code&gt;ping www.baidu.com&lt;/code&gt;。&lt;/p&gt;&#10;&lt;img alt="image-20251012211651131" class="gallery-image" data-flex-basis="645px" data-flex-grow="268" height="452" loading="lazy" sizes="(max-width: 767px) calc(100vw - 30px), (max-width: 1023px) 700px, (max-width: 1279px) 950px, 1232px" src="https://blog.yunwuhai.com/posts/%E7%BD%91%E7%BB%9C%E5%AE%89%E5%85%A8/wireshark%E6%8A%93%E5%8C%85%E5%AE%9E%E9%AA%8C/img/image-20251012211651131.webp" width="1215"&gt;&lt;/li&gt;&#10;&lt;/ol&gt;&#10;&lt;h3 id="分析dns"&gt;&lt;a href="#%e5%88%86%e6%9e%90dns" class="header-anchor"&gt;&lt;/a&gt;分析DNS&#10;&lt;/h3&gt;&lt;ol&gt;&#10;&lt;li&gt;&#10;&lt;p&gt;DNS查询报文：因为我们不知道百度的IP地址，所以我们使用域名进行访问，而这个过程中，Ping会向DNS服务器寻求百度的IP地址，然后DNS服务器会返回它的IP地址。我们可以在WireShark中可以发现这两个包。&lt;/p&gt;&#10;&lt;img alt="image-20251012215157514" class="gallery-image" data-flex-basis="9600px" data-flex-grow="4000" height="35" loading="lazy" sizes="(max-width: 767px) calc(100vw - 30px), (max-width: 1023px) 700px, (max-width: 1279px) 950px, 1232px" src="https://blog.yunwuhai.com/posts/%E7%BD%91%E7%BB%9C%E5%AE%89%E5%85%A8/wireshark%E6%8A%93%E5%8C%85%E5%AE%9E%E9%AA%8C/img/image-20251012215157514.webp" width="1400"&gt;&lt;p&gt;首先让我们分析一下请求包，首先我们可以从统计表中得知数据是从&lt;code&gt;172.20.*.*&lt;/code&gt;这个网址发出去的，这个就是我们的IP地址，根据网段不难得知这是一个私网网址。根据&lt;code&gt;Protocol&lt;/code&gt;可以得知这是一个DNS包，而通过&lt;code&gt;Info&lt;/code&gt;可以得知本次&lt;code&gt;DNS&lt;/code&gt;查询是一次标准查询，通讯ID号是&lt;code&gt;0x1c2d&lt;/code&gt;，而其中的&lt;code&gt;A&lt;/code&gt;表示查询记录类型是IPv4地址（因为我这里的网络没有通IPv6，如果是IPv6，则应该为&lt;code&gt;AAAA&lt;/code&gt;)，而后面跟的就是我们想要查询IP的网址&lt;code&gt;www.baidu.com&lt;/code&gt;。让我们看看报文内容。&lt;/p&gt;&#10;&lt;p&gt;首先让我们看看&lt;code&gt;Ethernet II&lt;/code&gt;，即以太网帧（其中不重要的内容还有隐私内容已被我打码，下同）：&lt;/p&gt;&#10;&lt;img alt="image-20251012220735873" class="gallery-image" data-flex-basis="1639px" data-flex-grow="682" height="205" loading="lazy" sizes="(max-width: 767px) calc(100vw - 30px), (max-width: 1023px) 700px, (max-width: 1279px) 950px, 1232px" src="https://blog.yunwuhai.com/posts/%E7%BD%91%E7%BB%9C%E5%AE%89%E5%85%A8/wireshark%E6%8A%93%E5%8C%85%E5%AE%9E%E9%AA%8C/img/image-20251012220735873.webp" width="1400"&gt;&lt;p&gt;我们可以在其中找到我们的以太网帧的帧头，这其中包含了目标MAC地址和源MAC地址，以及帧里面的数据包类型。在WireShark中，我们可以看到右边是实际发送的数据，左边是其解析的含义。&lt;/p&gt;&#10;&lt;p&gt;接着我们观察IPv4报头，这是属于网络层的内容：&lt;/p&gt;&#10;&lt;img alt="image-20251013105029977" class="gallery-image" data-flex-basis="786px" data-flex-grow="327" height="427" loading="lazy" sizes="(max-width: 767px) calc(100vw - 30px), (max-width: 1023px) 700px, (max-width: 1279px) 950px, 1232px" src="https://blog.yunwuhai.com/posts/%E7%BD%91%E7%BB%9C%E5%AE%89%E5%85%A8/wireshark%E6%8A%93%E5%8C%85%E5%AE%9E%E9%AA%8C/img/image-20251013105029977.webp" width="1400"&gt;&lt;p&gt;其中重要的就是我们的源IP地址和目标IP地址，这里我的主机也就是源IP是&lt;code&gt;172.20.*.*&lt;/code&gt;，目标IP是DNS服务器&lt;code&gt;61.139.2.69&lt;/code&gt;。不过我们也可以关注一下其它部分，首先开头的&lt;code&gt;45&lt;/code&gt;中&lt;code&gt;4&lt;/code&gt;代表IPv4，&lt;code&gt;5&lt;/code&gt;代表IP首部长度为&lt;code&gt;5x4=20&lt;/code&gt;字节。*Differentiated Services Field（区分服务字段）*则是用于改善流量转发效果的，此处&lt;code&gt;DSCP=00(CS0)&lt;/code&gt;让路由器默认处理该数据包，不改变其优先级，而&lt;code&gt;ECN=00(Not-ECT)&lt;/code&gt;则代表不支持ECN显式拥塞通知功能。而后的&lt;code&gt;3b&lt;/code&gt;代表IP数据包的总长度为59字节。而后&lt;code&gt;4c f8&lt;/code&gt;代表其标识符ID。再后面的&lt;code&gt;0000&lt;/code&gt;则依次代表&lt;code&gt;Flag(3bit)=0(可以分片但是没有分)&lt;/code&gt;，&lt;code&gt;Fragment Offset(13bit)=0(片偏移量为0)&lt;/code&gt;。而后&lt;code&gt;80&lt;/code&gt;代表该报文生存时间为128跳。后面的&lt;code&gt;11&lt;/code&gt;代表报文所用协议为&lt;code&gt;UDP&lt;/code&gt;。然后又是个&lt;code&gt;0000&lt;/code&gt;，代表首部校验和为0，用于校验IP头部的完整性。再然后就是源IP地址和目标IP地址了，前面已经说过。&lt;/p&gt;&#10;&lt;p&gt;再往下则是UDP的报文内容。&lt;/p&gt;&#10;&lt;img alt="image-20251013113324896" class="gallery-image" data-flex-basis="788px" data-flex-grow="328" height="426" loading="lazy" sizes="(max-width: 767px) calc(100vw - 30px), (max-width: 1023px) 700px, (max-width: 1279px) 950px, 1232px" src="https://blog.yunwuhai.com/posts/%E7%BD%91%E7%BB%9C%E5%AE%89%E5%85%A8/wireshark%E6%8A%93%E5%8C%85%E5%AE%9E%E9%AA%8C/img/image-20251013113324896.webp" width="1400"&gt;&lt;p&gt;UDP报文的内容包括源端口号（2byte）、目的端口号（2byte）、UDP报文长度（2byte）、校验和（2byte）。&lt;/p&gt;&#10;&lt;p&gt;然后后面就是我们的DNS报文了，这一部分根本目的是为了顺利获取到域名对应的IP地址：&lt;/p&gt;&#10;&lt;img alt="image-20251014194558517" class="gallery-image" data-flex-basis="728px" data-flex-grow="303" height="461" loading="lazy" sizes="(max-width: 767px) calc(100vw - 30px), (max-width: 1023px) 700px, (max-width: 1279px) 950px, 1232px" src="https://blog.yunwuhai.com/posts/%E7%BD%91%E7%BB%9C%E5%AE%89%E5%85%A8/wireshark%E6%8A%93%E5%8C%85%E5%AE%9E%E9%AA%8C/img/image-20251014194558517.webp" width="1400"&gt;&lt;p&gt;其事务ID（Transaction ID）为0x1c2d，代表该查询的唯一标识，这个查询报文对应的响应报文其事务ID也会是这个。Flags的值为0x0100，则代表了这是一个标准（Opcode=0)查询（Response=0）且授权应答位（Authoritative，在左侧未标注，但是可以观察到Opcode和Truncated中间有一个0，这一位只有在响应报文中有用）和截断位（Truncated）均未设置（=0），期望递归位已设置（Recursion desire=1，这个可以递归解析器，而不需要客户端自己去遍历根、TLD等服务器）、可递归位未设置（Recursion available，在Recursion desire和Z中间有一个0，这一位只有在响应报文中有用），保留位为0（Z=0），应答认证位（Answer authenticated，在Z和Non-authenticated data中间有一个0，表示服务器已经验证了DNSSEC签名，并确认数据是经过认证的，即来自权威源且未被篡改，这个只在响应报文中有用），禁用DNSSEC验证位（CD，即是否需要禁用前面的AD验证，0表示没有禁用，不过因为这里是查询报文，所以WireShark中显示的是Non-Authenticated data）。之后是连续4个2字节的计数字段分析，Questions=1代表报文中包含一个查询问题，后续三个都是在响应报文中才会出现的数据。至于Queries中的数据其实就是查询部分了，域名占用了13个字节（包括点号），不过我们仔细查看报文其实可以发现，这里的点号是用计数的方式来表示实现的，例如最开始的&lt;code&gt;03 77 77 77&lt;/code&gt;其实代表了&lt;code&gt;www&lt;/code&gt;，而&lt;code&gt;03&lt;/code&gt;其实代表的接下来的一个标签（也就是&lt;code&gt;www&lt;/code&gt;）长度为&lt;code&gt;3&lt;/code&gt;，后续的&lt;code&gt;baidu&lt;/code&gt;是&lt;code&gt;05&lt;/code&gt;，&lt;code&gt;com&lt;/code&gt; 是 &lt;code&gt;03&lt;/code&gt;也是同理，而最后面还需要跟一个&lt;code&gt;00&lt;/code&gt;作为结束符表示后面没有标签了。再后面的&lt;code&gt;00 01&lt;/code&gt;代表希望查询的IP类型是&lt;code&gt;A&lt;/code&gt;，即IPv4。最后的&lt;code&gt;00 01&lt;/code&gt;则代表Class是Internet类，即互联网，这是最常用的类别。至此我们对于DNS查询报文的分析完成。&lt;/p&gt;&#10;&lt;/li&gt;&#10;&lt;li&gt;&#10;&lt;p&gt;DNS响应报文：关于响应报文，前面的以太网帧头、IP报头、UDP协议包头都没有什么继续分析的必要了，因为本质上和查询报文没有区别，只是方向反过来而已。我们重点关注最后的DNS部分：&lt;/p&gt;&#10;&lt;img alt="image-20251014221115665" class="gallery-image" data-flex-basis="350px" data-flex-grow="145" height="959" loading="lazy" sizes="(max-width: 767px) calc(100vw - 30px), (max-width: 1023px) 700px, (max-width: 1279px) 950px, 1232px" src="https://blog.yunwuhai.com/posts/%E7%BD%91%E7%BB%9C%E5%AE%89%E5%85%A8/wireshark%E6%8A%93%E5%8C%85%E5%AE%9E%E9%AA%8C/img/image-20251014221115665.webp" width="1400"&gt;&lt;p&gt;首先事务ID和查询报文是一样的。其次，它的Flags中Response变为了1，代表是响应报文。Opcode为&lt;code&gt;0000&lt;/code&gt;，则仍代表该查询是标准查询。授权应答位Authoritative=0，代表该服务器不是该域名的权威服务器。Truncated为&lt;code&gt;0&lt;/code&gt;代表报文没有截断，完整返回。Recursion Desire为&lt;code&gt;1&lt;/code&gt;代表客户端希望递归查询。Recursion Desire为&lt;code&gt;1&lt;/code&gt;代表服务器支持递归查询，提供递归服务。Z是保留位为&lt;code&gt;0&lt;/code&gt;。Answer Authenticated为&lt;code&gt;0&lt;/code&gt;表示该答案部分没自由经过DNSSEC认证，Checking Disabled为&lt;code&gt;0&lt;/code&gt;代表没有禁用DNSSEC认证。Questions为&lt;code&gt;1&lt;/code&gt;表示查询部分包含1个问问题，Answer RRs为&lt;code&gt;3&lt;/code&gt;表示有三个资源记录，剩下两个都是0代表没有授权服务器信息和没有附加信息，全是字面意思。Queries和查询报文一样。我们重点还是看Answers部分，这是这个响应报文的核心部分。我们从Answer RRs中可以知道，我们有三个答案记录，而第一个记录的Name是&lt;code&gt;www.baidu.com&lt;/code&gt;，Type是&lt;code&gt;CNAME&lt;/code&gt;，Class是&lt;code&gt;Internet&lt;/code&gt;。我们应当注意的是，这里的Name在报文中显示的数据是&lt;code&gt;c0 0c&lt;/code&gt;，这里其实是代表的一个类似于指针的设置，用于指示重复的域名以缩减报文传输量，&lt;code&gt;c&lt;/code&gt;的二进制是&lt;code&gt;1100&lt;/code&gt;，其中&lt;code&gt;11&lt;/code&gt;其实代表的就是这是个指针，而后的&lt;code&gt;00&lt;/code&gt;以及后面的12bit，共同组成了偏移量，这样它就指示到了从DNS报文的0字节开始，往后第12字节开始的那个域名，正是&lt;code&gt;wwww.baidu.com&lt;/code&gt;，后面出现类似情况也是同理。然后我们注意这里的Type是&lt;code&gt;CNAME&lt;/code&gt;，也就是说它其实是检测到一个别名了，而这个别名的值是&lt;code&gt;www.a.shifen.com&lt;/code&gt;，这个是百度以前的一个广告系统的网址，看来百度是直接把它的&lt;code&gt;www.baidu.com&lt;/code&gt;域名连接到这个域名上了，它还可以将其它域名的别名也设置成这个，这样未来如果需要迁移地址，只需要迁移这个域名的地址就可以了。然后我们可以查看下面这个域名，检测到两个IP，分别是&lt;code&gt;183.2.172.177&lt;/code&gt;和&lt;code&gt;183.2.172.17&lt;/code&gt;，看样子百度用了多IP轮询机制来实现负载均衡或者容灾备份。最终从我们的Ping命令效果来看，我们最终应该是选用了第一个，或者说当时第一个就可以联通，不需要使用第二个备用IP了。&lt;/p&gt;&#10;&lt;/li&gt;&#10;&lt;/ol&gt;&#10;&lt;h3 id="分析icmp"&gt;&lt;a href="#%e5%88%86%e6%9e%90icmp" class="header-anchor"&gt;&lt;/a&gt;分析ICMP&#10;&lt;/h3&gt;&lt;ol&gt;&#10;&lt;li&gt;&#10;&lt;p&gt;ICMP报文：在获取到DNS响应报文后，程序即获得了IP地址，此时即可以通过ICMP报文与服务器通信。PING命令会连续发送四条ICMP报文，并根据返回报文计算连通性性和通信时间，我们只需要分析其中一对即可。&lt;/p&gt;&#10;&lt;img alt="image-20251015162525481" class="gallery-image" data-flex-basis="8000px" data-flex-grow="3333" height="42" loading="lazy" sizes="(max-width: 767px) calc(100vw - 30px), (max-width: 1023px) 700px, (max-width: 1279px) 950px, 1232px" src="https://blog.yunwuhai.com/posts/%E7%BD%91%E7%BB%9C%E5%AE%89%E5%85%A8/wireshark%E6%8A%93%E5%8C%85%E5%AE%9E%E9%AA%8C/img/image-20251015162525481.webp" width="1400"&gt;&lt;p&gt;ICMP报文由三部分组成：以太网帧头、IP报头和ICMP协议数据部分。其中前两者和DNS相比差不多，只是内容存在部分差异，我们就不重复详细分析了。重点针对ICMP协议数据部分进行讨论：&lt;/p&gt;&#10;&lt;img alt="image-20251015164123794" class="gallery-image" data-flex-basis="1059px" data-flex-grow="441" height="317" loading="lazy" sizes="(max-width: 767px) calc(100vw - 30px), (max-width: 1023px) 700px, (max-width: 1279px) 950px, 1232px" src="https://blog.yunwuhai.com/posts/%E7%BD%91%E7%BB%9C%E5%AE%89%E5%85%A8/wireshark%E6%8A%93%E5%8C%85%E5%AE%9E%E9%AA%8C/img/image-20251015164123794.webp" width="1400"&gt;&lt;p&gt;我们首先观察Type=&lt;code&gt;8&lt;/code&gt;，其代表了这是一个回显请求，即&lt;code&gt;ping&lt;/code&gt;的发送端。而Code=&lt;code&gt;0&lt;/code&gt;则代表了无特殊错误码，正常请求。Checksum=&lt;code&gt;0x4d2c&lt;/code&gt;是一个校验字段，用于验证报文完整性，已校验通过。Identifier(BE)=&lt;code&gt;1&lt;/code&gt;表示发送大端格式的进程标识符，通常是进程的ID或者PID，此处为1。Identifier(LE)=&lt;code&gt;256&lt;/code&gt;表示小端格式的进程标识符，对应了BE的值，本质上其实就是同一个值。Sequence Number(BE)=&lt;code&gt;47&lt;/code&gt;表示大端格式的序列号，LE=&lt;code&gt;12032&lt;/code&gt;表示小端格式的序列号，本质上就是同一个值。而后的Data部分有32个字节，根据ASCII码不难发现，其实发送的内容本质就是&lt;code&gt;abcdefghijklmnopqrstuvwabcdefghi&lt;/code&gt;，其目的其实就是为了填充数据，没有实际含义。接下来让我们查看响应报文：&lt;/p&gt;&#10;&lt;img alt="image-20251015165452997" class="gallery-image" data-flex-basis="985px" data-flex-grow="410" height="341" loading="lazy" sizes="(max-width: 767px) calc(100vw - 30px), (max-width: 1023px) 700px, (max-width: 1279px) 950px, 1232px" src="https://blog.yunwuhai.com/posts/%E7%BD%91%E7%BB%9C%E5%AE%89%E5%85%A8/wireshark%E6%8A%93%E5%8C%85%E5%AE%9E%E9%AA%8C/img/image-20251015165452997.webp" width="1400"&gt;&lt;p&gt;不难发现，其实内容也没有什么区别，只有Type变为了&lt;code&gt;0&lt;/code&gt;，代表这是回显应答，即&lt;code&gt;ping&lt;/code&gt;的响应端。校验和在值上发生了改变但是结果仍然正确没有问题。并且我们可以看到Response time=&lt;code&gt;35.251ms&lt;/code&gt;，与我们在终端看到的&lt;code&gt;35ms&lt;/code&gt;是对应的，这其实是抓包工具计算出的时间，并不在报文之中。&lt;/p&gt;&#10;&lt;/li&gt;&#10;&lt;/ol&gt;&#10;&lt;h3 id="分析http"&gt;&lt;a href="#%e5%88%86%e6%9e%90http" class="header-anchor"&gt;&lt;/a&gt;分析HTTP&#10;&lt;/h3&gt;&lt;ol&gt;&#10;&lt;li&gt;&#10;&lt;p&gt;HTTP报文：现在让我们分析一下方法百度的三次握手包。因为只是初次尝试，我们选择访问&lt;code&gt;HTTP&lt;/code&gt;的百度。通过在命令行中运行&lt;code&gt;nslookup baidu.com&lt;/code&gt;这个代码获取百度网页的ip地址。&lt;/p&gt;&#10;&lt;img alt="image-20251015172626691" class="gallery-image" data-flex-basis="587px" data-flex-grow="244" height="325" loading="lazy" sizes="(max-width: 767px) calc(100vw - 30px), (max-width: 1023px) 700px, (max-width: 1279px) 950px, 1232px" src="https://blog.yunwuhai.com/posts/%E7%BD%91%E7%BB%9C%E5%AE%89%E5%85%A8/wireshark%E6%8A%93%E5%8C%85%E5%AE%9E%E9%AA%8C/img/image-20251015172626691.webp" width="795"&gt;&lt;p&gt;应答中出现了两个地址，我们选择访问第一个试试，在此之前记得打开Wireshark：&lt;/p&gt;&#10;&lt;img alt="image-20251015172741106" class="gallery-image" data-flex-basis="404px" data-flex-grow="168" height="831" loading="lazy" sizes="(max-width: 767px) calc(100vw - 30px), (max-width: 1023px) 700px, (max-width: 1279px) 950px, 1232px" src="https://blog.yunwuhai.com/posts/%E7%BD%91%E7%BB%9C%E5%AE%89%E5%85%A8/wireshark%E6%8A%93%E5%8C%85%E5%AE%9E%E9%AA%8C/img/image-20251015172741106.webp" width="1400"&gt;&lt;p&gt;看来没问题，然后我们在Wireshark中添加过滤来找到这个访问，输入&lt;code&gt;ip.host == 39.156.70.37&lt;/code&gt;然后回车即可：&lt;/p&gt;&#10;&lt;img alt="image-20251015173409903" class="gallery-image" data-flex-basis="2196px" data-flex-grow="915" height="40" loading="lazy" sizes="(max-width: 767px) calc(100vw - 30px), (max-width: 1023px) 700px, (max-width: 1279px) 950px, 1232px" src="https://blog.yunwuhai.com/posts/%E7%BD%91%E7%BB%9C%E5%AE%89%E5%85%A8/wireshark%E6%8A%93%E5%8C%85%E5%AE%9E%E9%AA%8C/img/image-20251015173409903.webp" width="366"&gt;&lt;p&gt;然后我们就可以查看显示结果了：&lt;/p&gt;&#10;&lt;img alt="image-20251015185910439" class="gallery-image" data-flex-basis="2366px" data-flex-grow="985" height="142" loading="lazy" sizes="(max-width: 767px) calc(100vw - 30px), (max-width: 1023px) 700px, (max-width: 1279px) 950px, 1232px" src="https://blog.yunwuhai.com/posts/%E7%BD%91%E7%BB%9C%E5%AE%89%E5%85%A8/wireshark%E6%8A%93%E5%8C%85%E5%AE%9E%E9%AA%8C/img/image-20251015185910439.webp" width="1400"&gt;&lt;p&gt;可以发现，不知道为何，我们这里出现了两个三次握手，不过下面有一个HTTP报文，可以通过它来分析哪一个才是我们需要的。其中关于以太网帧和IP数据包的部分仍然可以忽略，让我们观察TCP部分：&lt;/p&gt;&#10;&lt;img alt="image-20251015190542901" class="gallery-image" data-flex-basis="239px" data-flex-grow="99" height="1400" loading="lazy" sizes="(max-width: 767px) calc(100vw - 30px), (max-width: 1023px) 700px, (max-width: 1279px) 950px, 1232px" src="https://blog.yunwuhai.com/posts/%E7%BD%91%E7%BB%9C%E5%AE%89%E5%85%A8/wireshark%E6%8A%93%E5%8C%85%E5%AE%9E%E9%AA%8C/img/image-20251015190542901.webp" width="1396"&gt;&lt;p&gt;TCP部分可以注意到其Source Port是59049，Destination Port是80，说明我们只需要找到上方同样通信Port是59049和80的报文就可以了，刚好有三个，可以组成三次握手。其它的都是一些传输信息，我们不需要太关注。HTTP报文中在TCP后面还有一个HTTP部分，这一部分其实就是该网页的一些基础信息，不同网页内容也不一样，这里我们也同样不关注。&lt;/p&gt;&#10;&lt;/li&gt;&#10;&lt;/ol&gt;&#10;&lt;h3 id="分析三次握手"&gt;&lt;a href="#%e5%88%86%e6%9e%90%e4%b8%89%e6%ac%a1%e6%8f%a1%e6%89%8b" class="header-anchor"&gt;&lt;/a&gt;分析三次握手&#10;&lt;/h3&gt;&lt;ol&gt;&#10;&lt;li&gt;&#10;&lt;p&gt;三次握手报文：在三次握手中，我们主要需要关注的还是TCP部分。&lt;/p&gt;&#10;&lt;p&gt;这是第一次握手的内容：&lt;/p&gt;&#10;&lt;img alt="image-20251015205007760" class="gallery-image" data-flex-basis="239px" data-flex-grow="99" height="1400" loading="lazy" sizes="(max-width: 767px) calc(100vw - 30px), (max-width: 1023px) 700px, (max-width: 1279px) 950px, 1232px" src="https://blog.yunwuhai.com/posts/%E7%BD%91%E7%BB%9C%E5%AE%89%E5%85%A8/wireshark%E6%8A%93%E5%8C%85%E5%AE%9E%E9%AA%8C/img/image-20251015205007760.webp" width="1396"&gt;&lt;p&gt;我们可以注意到其Flags的SYN标志被置为1了，这是而ACK仍为0，所以这显然是第一次握手的内容。而Sequence Number初始为0，因为这是当前客户端的第一个报文。Acknowledgment Number被设置为0，因为这是第一次握手。Options中则设置了包括分块等一系列设置，这会在前两次握手中出现。&lt;/p&gt;&#10;&lt;p&gt;现在我们观察第二次握手的报文：&lt;/p&gt;&#10;&lt;img alt="image-20251015205638328" class="gallery-image" data-flex-basis="252px" data-flex-grow="105" height="1329" loading="lazy" sizes="(max-width: 767px) calc(100vw - 30px), (max-width: 1023px) 700px, (max-width: 1279px) 950px, 1232px" src="https://blog.yunwuhai.com/posts/%E7%BD%91%E7%BB%9C%E5%AE%89%E5%85%A8/wireshark%E6%8A%93%E5%8C%85%E5%AE%9E%E9%AA%8C/img/image-20251015205638328.webp" width="1400"&gt;&lt;p&gt;这一次我们可以看到Flags中的ACK被置为1了，而Syn也仍然为1，可以判断这是第二次握手。Sequence Number也仍然为0，因为这是服务器的第一个报文。而Acknowledgment Number则为1，因为已经接收到一次报文了。Options仍然有一些反馈设置。&lt;/p&gt;&#10;&lt;p&gt;我们观察第三次握手报文：&lt;/p&gt;&#10;&lt;img alt="image-20251015205959870" class="gallery-image" data-flex-basis="269px" data-flex-grow="112" height="1245" loading="lazy" sizes="(max-width: 767px) calc(100vw - 30px), (max-width: 1023px) 700px, (max-width: 1279px) 950px, 1232px" src="https://blog.yunwuhai.com/posts/%E7%BD%91%E7%BB%9C%E5%AE%89%E5%85%A8/wireshark%E6%8A%93%E5%8C%85%E5%AE%9E%E9%AA%8C/img/image-20251015205959870.webp" width="1400"&gt;&lt;p&gt;在这一次中，Flags中只有ACK被置为1，同时Sequence Number变成了1，Acknowledgment Number也变成了1，符合我们的发送接收情况。同时我们可以注意这一次没有Options了。&lt;/p&gt;&#10;&lt;p&gt;至此，我们的三次握手分析完毕。&lt;/p&gt;&#10;&lt;/li&gt;&#10;&lt;/ol&gt;&#10;&lt;h3 id="分析微信"&gt;&lt;a href="#%e5%88%86%e6%9e%90%e5%be%ae%e4%bf%a1" class="header-anchor"&gt;&lt;/a&gt;分析微信&#10;&lt;/h3&gt;&lt;ol&gt;&#10;&lt;li&gt;&#10;&lt;p&gt;接下来我们简单分析一下微信的数据传输，首先我们需要确定微信通信的IP地址，这个过程非常简单，我们只需要打开资源管理器并选中网络部分，接着给文件传输助手发送一个比较大的文件，然后观察资源管理器中的变化就可以了。&lt;/p&gt;&#10;&lt;img alt="image-20251015215753890" class="gallery-image" data-flex-basis="201px" data-flex-grow="84" height="1400" loading="lazy" sizes="(max-width: 767px) calc(100vw - 30px), (max-width: 1023px) 700px, (max-width: 1279px) 950px, 1232px" src="https://blog.yunwuhai.com/posts/%E7%BD%91%E7%BB%9C%E5%AE%89%E5%85%A8/wireshark%E6%8A%93%E5%8C%85%E5%AE%9E%E9%AA%8C/img/image-20251015215753890.webp" width="1177"&gt;&lt;p&gt;显然，我们获知了微信的IP地址，现在让我们在筛选器中填入&lt;code&gt;ip.addr == 219.153.153.110&lt;/code&gt;就好了，接着我们会发现一大堆GQUIC报文：&lt;/p&gt;&#10;&lt;img alt="image-20251015221134577" class="gallery-image" data-flex-basis="1063px" data-flex-grow="443" height="316" loading="lazy" sizes="(max-width: 767px) calc(100vw - 30px), (max-width: 1023px) 700px, (max-width: 1279px) 950px, 1232px" src="https://blog.yunwuhai.com/posts/%E7%BD%91%E7%BB%9C%E5%AE%89%E5%85%A8/wireshark%E6%8A%93%E5%8C%85%E5%AE%9E%E9%AA%8C/img/image-20251015221134577.webp" width="1400"&gt;&lt;p&gt;关于QUIC的介绍可以参考《&lt;a class="link" href="https://zhuanlan.zhihu.com/p/405387352" target="_blank" rel="noopener"&#10; &gt;QUIC协议详解&lt;/a&gt;》，而gQUIC则是谷歌的版本，与其相对的是IETF版本的iQUIC。&lt;/p&gt;&#10;&lt;img alt="image-20251015220956982" class="gallery-image" data-flex-basis="436px" data-flex-grow="181" height="770" loading="lazy" sizes="(max-width: 767px) calc(100vw - 30px), (max-width: 1023px) 700px, (max-width: 1279px) 950px, 1232px" src="https://blog.yunwuhai.com/posts/%E7%BD%91%E7%BB%9C%E5%AE%89%E5%85%A8/wireshark%E6%8A%93%E5%8C%85%E5%AE%9E%E9%AA%8C/img/image-20251015220956982.webp" width="1400"&gt;&lt;p&gt;我们通过前面的介绍还有名字不难发现微信使用的QUIC协议本质上其实就是一种UDP的传输层协议，在协议中通过QUIC将实际需要发送的UDP数据加密打包发送。&lt;/p&gt;&#10;&lt;/li&gt;&#10;&lt;/ol&gt;&#10;&lt;h2 id="总结"&gt;&lt;a href="#%e6%80%bb%e7%bb%93" class="header-anchor"&gt;&lt;/a&gt;总结&#10;&lt;/h2&gt;&lt;p&gt;通过本次实验，我们完成了包括针对PING、三次握手、微信传输三个大流程中使用到的各个报文的抓包和协议解析，基本掌握了WireShark的操作方法和筛选技巧，以及针对具体应用（如微信）如何通过资源管理器进行限位，以快速找到通信IP地址实现抓包。&lt;/p&gt;&#10;</description></item><item><title>ARP协议分析</title><link>https://blog.yunwuhai.com/posts/%E7%BD%91%E7%BB%9C%E5%AE%89%E5%85%A8/arp%E5%8D%8F%E8%AE%AE%E5%88%86%E6%9E%90/</link><pubDate>Sat, 27 Sep 2025 15:07:00 +0800</pubDate><guid>https://blog.yunwuhai.com/posts/%E7%BD%91%E7%BB%9C%E5%AE%89%E5%85%A8/arp%E5%8D%8F%E8%AE%AE%E5%88%86%E6%9E%90/</guid><description>&lt;img src="https://blog.yunwuhai.com/posts/%E7%BD%91%E7%BB%9C%E5%AE%89%E5%85%A8/arp%E5%8D%8F%E8%AE%AE%E5%88%86%E6%9E%90/cover.jpg" alt="Featured image of post ARP协议分析" /&gt;&lt;h1 id="arp协议分析"&gt;&lt;a href="#arp%e5%8d%8f%e8%ae%ae%e5%88%86%e6%9e%90" class="header-anchor"&gt;&lt;/a&gt;ARP协议分析&#10;&lt;/h1&gt;&lt;h2 id="arp协议简介"&gt;&lt;a href="#arp%e5%8d%8f%e8%ae%ae%e7%ae%80%e4%bb%8b" class="header-anchor"&gt;&lt;/a&gt;ARP协议简介&#10;&lt;/h2&gt;&lt;p&gt;ARP全称为“Address Resolution Protocol”（地址解析协议）。其功能是将IP地址解析转换为MAC地址。因为IP地址工作在网络层，MAC地址工作在数据链路层，通常IP地址用于局域网之外的数据转发，而MAC地址用于局域网内的数据通信。当一台主机需要向同一局域网内的另一台主机发送数据时，它虽然知道对方的IP地址，但是最终数据需要以帧的形式在物理网络上传输，这个传输过程依赖于MAC地址，故需要一种机制将目标IP地址翻译成的对应的MAC地址。&lt;/p&gt;&#10;&lt;h2 id="为什么不能只用mac或ip"&gt;&lt;a href="#%e4%b8%ba%e4%bb%80%e4%b9%88%e4%b8%8d%e8%83%bd%e5%8f%aa%e7%94%a8mac%e6%88%96ip" class="header-anchor"&gt;&lt;/a&gt;为什么不能只用MAC或IP&#10;&lt;/h2&gt;&lt;p&gt;MAC地址工作在数据链路层，IP地址工作在网络层，它们其实负责的是不同板块的功能。MAC地址负责同一局域网内的数据定位，而IP则负责不同局域网之间的数据定位。如果只用MAC地址，因为MAC地址本身没有分层的结构，路由表将会变得极其庞大而难以管理。&lt;/p&gt;&#10;&lt;p&gt;而如果只用IP地址，因为IP地址已经包含了过多功能，在对IP数据包进行处理的时候会相对复杂，且路由器本身成本也更高，相比于使用一台路由器来管理，远不如用一台有硬件级MAC转发电路的交换机来得更为高效和划算，而且这也会导致路由器的角色混乱和性能下降。&lt;/p&gt;&#10;&lt;h2 id="arp工作流程"&gt;&lt;a href="#arp%e5%b7%a5%e4%bd%9c%e6%b5%81%e7%a8%8b" class="header-anchor"&gt;&lt;/a&gt;ARP工作流程&#10;&lt;/h2&gt;&lt;p&gt;ARP的工作流程简单讲就是&lt;strong&gt;先广播询问，后单播应答&lt;/strong&gt;。&lt;/p&gt;&#10;&lt;p&gt;假设两台设备在同一局域网内，A设备知道B设备的IP地址，但不知道它的MAC地址，此时就可以启动ARP协议：&lt;/p&gt;&#10;&lt;ol&gt;&#10;&lt;li&gt;检查缓存表：主机A先检查自己的ARP缓存表（该缓存表可以避免重复广播），查看是否已有主机B的MAC地址。如果存在，则直接使用该地址构造数据帧。如果不存在，则进入ARP请求过程。&lt;/li&gt;&#10;&lt;li&gt;广播ARP请求：主机A在局域网内广播一个ARP请求报文，该报文包含主机A的IP和MAC，以及主机B的IP，而该报文的目标MAC地址设置为&lt;code&gt;FF:FF:FF:FF:FF:FF&lt;/code&gt;用于广播，本地广播域内所有设备将会接收到这个请求。&lt;/li&gt;&#10;&lt;li&gt;单播ARP响应：只有主机B接收到广播并通过IP地址确定了该广播询问的是自己的MAC地址后，向主机A发送一个单播的ARP应答报文，里面包含了自己的MAC地址。&lt;/li&gt;&#10;&lt;li&gt;更新ARP缓存：主机B在接收到ARP请求后，就将主机A的MAC地址存入自己的ARP缓存。主机A在接受到主机B的应答报文后，也将主机B的MAC地址存入自己的ARP缓存。&lt;/li&gt;&#10;&lt;li&gt;正常通信：现在双方都知道了对方的MAC地址，就可以开始正常通信了，而在一段时间内，一因为双方ARP缓存都有对方的MAC地址，也无需要再次广播。&lt;/li&gt;&#10;&lt;/ol&gt;&#10;&lt;h2 id="arp报文格式"&gt;&lt;a href="#arp%e6%8a%a5%e6%96%87%e6%a0%bc%e5%bc%8f" class="header-anchor"&gt;&lt;/a&gt;ARP报文格式&#10;&lt;/h2&gt;&lt;p&gt;ARP时一个独立的三层协议，所以ARP报文在数据链路层不需要经过IP协议的封装，而是直接生成自己的报文。ARP报文可以分为ARP请求报文和ARP应答报文两种，但是它们的格式可以统一为同一种格式：&lt;/p&gt;&#10;&lt;table&gt;&#10;&#9;&lt;thead&gt;&#10;&#9;&#9;&#9;&lt;tr&gt;&#10;&#9;&#9;&#9;&#9;&#9;&lt;th&gt;名称&lt;/th&gt;&#10;&#9;&#9;&#9;&#9;&#9;&lt;th&gt;大小（字节）&lt;/th&gt;&#10;&#9;&#9;&#9;&#9;&#9;&lt;th&gt;功能&lt;/th&gt;&#10;&#9;&#9;&#9;&lt;/tr&gt;&#10;&#9;&lt;/thead&gt;&#10;&#9;&lt;tbody&gt;&#10;&#9;&#9;&#9;&lt;tr&gt;&#10;&#9;&#9;&#9;&#9;&#9;&lt;td&gt;硬件类型&lt;/td&gt;&#10;&#9;&#9;&#9;&#9;&#9;&lt;td&gt;2&lt;/td&gt;&#10;&#9;&#9;&#9;&#9;&#9;&lt;td&gt;表示ARP报文可以在哪种网络上传输，值为1时表示以太网地址。&lt;/td&gt;&#10;&#9;&#9;&#9;&lt;/tr&gt;&#10;&#9;&#9;&#9;&lt;tr&gt;&#10;&#9;&#9;&#9;&#9;&#9;&lt;td&gt;上层协议类型&lt;/td&gt;&#10;&#9;&#9;&#9;&#9;&#9;&lt;td&gt;2&lt;/td&gt;&#10;&#9;&#9;&#9;&#9;&#9;&lt;td&gt;表示硬件地址要映射的协议地址类型，映射IP地址时的值为0x0800。&lt;/td&gt;&#10;&#9;&#9;&#9;&lt;/tr&gt;&#10;&#9;&#9;&#9;&lt;tr&gt;&#10;&#9;&#9;&#9;&#9;&#9;&lt;td&gt;MAC地址长度&lt;/td&gt;&#10;&#9;&#9;&#9;&#9;&#9;&lt;td&gt;1&lt;/td&gt;&#10;&#9;&#9;&#9;&#9;&#9;&lt;td&gt;标识MAC地址长度，以字节为单位，此处为6。&lt;/td&gt;&#10;&#9;&#9;&#9;&lt;/tr&gt;&#10;&#9;&#9;&#9;&lt;tr&gt;&#10;&#9;&#9;&#9;&#9;&#9;&lt;td&gt;IP地址长度&lt;/td&gt;&#10;&#9;&#9;&#9;&#9;&#9;&lt;td&gt;1&lt;/td&gt;&#10;&#9;&#9;&#9;&#9;&#9;&lt;td&gt;标识IP得知长度，以字节为单位，此处为4。&lt;/td&gt;&#10;&#9;&#9;&#9;&lt;/tr&gt;&#10;&#9;&#9;&#9;&lt;tr&gt;&#10;&#9;&#9;&#9;&#9;&#9;&lt;td&gt;操作类型&lt;/td&gt;&#10;&#9;&#9;&#9;&#9;&#9;&lt;td&gt;2&lt;/td&gt;&#10;&#9;&#9;&#9;&#9;&#9;&lt;td&gt;指定本次ARP报文类型。1标识ARP请求报文，2标识ARP应答报文。&lt;/td&gt;&#10;&#9;&#9;&#9;&lt;/tr&gt;&#10;&#9;&#9;&#9;&lt;tr&gt;&#10;&#9;&#9;&#9;&#9;&#9;&lt;td&gt;源MAC地址&lt;/td&gt;&#10;&#9;&#9;&#9;&#9;&#9;&lt;td&gt;6&lt;/td&gt;&#10;&#9;&#9;&#9;&#9;&#9;&lt;td&gt;发送方的MAC地址。&lt;/td&gt;&#10;&#9;&#9;&#9;&lt;/tr&gt;&#10;&#9;&#9;&#9;&lt;tr&gt;&#10;&#9;&#9;&#9;&#9;&#9;&lt;td&gt;源IP地址&lt;/td&gt;&#10;&#9;&#9;&#9;&#9;&#9;&lt;td&gt;4&lt;/td&gt;&#10;&#9;&#9;&#9;&#9;&#9;&lt;td&gt;发送方的IP地址。&lt;/td&gt;&#10;&#9;&#9;&#9;&lt;/tr&gt;&#10;&#9;&#9;&#9;&lt;tr&gt;&#10;&#9;&#9;&#9;&#9;&#9;&lt;td&gt;目的MAC地址&lt;/td&gt;&#10;&#9;&#9;&#9;&#9;&#9;&lt;td&gt;6&lt;/td&gt;&#10;&#9;&#9;&#9;&#9;&#9;&lt;td&gt;接收方的MAC地址。若为请求报文，因为当前不知道该地址，则此时全为0，即&lt;code&gt;00:00:00:00:00:00&lt;/code&gt;，表示任意地址。&lt;/td&gt;&#10;&#9;&#9;&#9;&lt;/tr&gt;&#10;&#9;&#9;&#9;&lt;tr&gt;&#10;&#9;&#9;&#9;&#9;&#9;&lt;td&gt;目的IP地址&lt;/td&gt;&#10;&#9;&#9;&#9;&#9;&#9;&lt;td&gt;4&lt;/td&gt;&#10;&#9;&#9;&#9;&#9;&#9;&lt;td&gt;接受方的IP地址。&lt;/td&gt;&#10;&#9;&#9;&#9;&lt;/tr&gt;&#10;&#9;&lt;/tbody&gt;&#10;&lt;/table&gt;&#10;&lt;h2 id="arp帧格式"&gt;&lt;a href="#arp%e5%b8%a7%e6%a0%bc%e5%bc%8f" class="header-anchor"&gt;&lt;/a&gt;ARP帧格式&#10;&lt;/h2&gt;&lt;p&gt;ARP报文并非直接在网络层发送和使用的，还需要向下传输到数据链路层，此时需要再次封装。以以太网为例，ARP报文传输到以太网数据链路层后会形成ARP帧，ARP帧是在ARP报文前面添加了一个以太网帧头，以太网帧头如下表所示：&lt;/p&gt;&#10;&lt;table&gt;&#10;&#9;&lt;thead&gt;&#10;&#9;&#9;&#9;&lt;tr&gt;&#10;&#9;&#9;&#9;&#9;&#9;&lt;th&gt;名称&lt;/th&gt;&#10;&#9;&#9;&#9;&#9;&#9;&lt;th&gt;大小（字节）&lt;/th&gt;&#10;&#9;&#9;&#9;&#9;&#9;&lt;th&gt;功能&lt;/th&gt;&#10;&#9;&#9;&#9;&lt;/tr&gt;&#10;&#9;&lt;/thead&gt;&#10;&#9;&lt;tbody&gt;&#10;&#9;&#9;&#9;&lt;tr&gt;&#10;&#9;&#9;&#9;&#9;&#9;&lt;td&gt;目标MAC地址&lt;/td&gt;&#10;&#9;&#9;&#9;&#9;&#9;&lt;td&gt;6&lt;/td&gt;&#10;&#9;&#9;&#9;&#9;&#9;&lt;td&gt;接收方的MAC地址。若为请求报文，则为广播帧，设置为广播地址&lt;code&gt;FF:FF:FF:FF:FF:FF&lt;/code&gt;。&lt;/td&gt;&#10;&#9;&#9;&#9;&lt;/tr&gt;&#10;&#9;&#9;&#9;&lt;tr&gt;&#10;&#9;&#9;&#9;&#9;&#9;&lt;td&gt;源MAC地址&lt;/td&gt;&#10;&#9;&#9;&#9;&#9;&#9;&lt;td&gt;6&lt;/td&gt;&#10;&#9;&#9;&#9;&#9;&#9;&lt;td&gt;发送方的MAC地址。&lt;/td&gt;&#10;&#9;&#9;&#9;&lt;/tr&gt;&#10;&#9;&#9;&#9;&lt;tr&gt;&#10;&#9;&#9;&#9;&#9;&#9;&lt;td&gt;帧类型&lt;/td&gt;&#10;&#9;&#9;&#9;&#9;&#9;&lt;td&gt;2&lt;/td&gt;&#10;&#9;&#9;&#9;&#9;&#9;&lt;td&gt;表示帧封装的上层协议，ARP帧封装的ARP报文，所以此处填ARP的协议号0x0806。&lt;/td&gt;&#10;&#9;&#9;&#9;&lt;/tr&gt;&#10;&#9;&lt;/tbody&gt;&#10;&lt;/table&gt;&#10;</description></item></channel></rss>