资讯动态

TCP三次握手抓包实验:Wireshark实操与协议原理详解

发布时间:2026/10/22 9:30:52 来源:尧图企业网站定制
1. 抓包实验到底在抓什么先搞清楚TCP的三次握手长什么样很多人第一次做TCP抓包实验打开Wireshark看到满屏滚动的数据包第一反应是懵的——这么多行哪一行才是我要的其实问题的根源不在工具在于你还没想清楚我要观察什么。TCP抓包实验的核心目标是让你亲眼看到那些课本上画了无数遍的握手、传输、挥手过程在真实网络里到底长什么样。TCP协议最基础也最核心的机制就是面向连接的可靠传输。所谓面向连接意思是通信双方在传数据之前必须先建立一条逻辑上的通道。这条通道的建立过程就是大名鼎鼎的三次握手Three-Way Handshake。你可以把它想象成打电话我拨号过去你接起来说喂我再说听到了双方确认线路通畅才开始正式聊天。TCP的握手逻辑几乎一模一样只不过它用的是SYN、SYN-ACK、ACK这三个标志位。为什么非要三次两次不行吗这个问题面试里也常问。核心原因在于TCP是全双工通信双方都要确认自己和对方的发送、接收能力都正常。两次握手只能让发起方确认对方能收能发但被动方无法确认发起方的接收能力。三次握手刚好让双方都完成我发了你能收到你发了我能收到的双向验证。抓包的时候你会看到客户端先发一个SYN包服务端回一个SYNACK包客户端再回一个ACK包三次交互完成后连接才正式建立。这个实验适合谁做我的判断是只要你在学计算机网络、准备面试、或者工作中需要排查网络问题这个实验都值得亲手做一遍。看十遍课本不如自己抓一次包因为真实网络里的细节远比课本复杂——有重传、有乱序、有窗口调整、有延迟确认这些东西只有亲眼看到才会真正理解。2. 实验环境怎么搭工具选型和参数配置的底层逻辑2.1 Wireshark的安装与网卡选择Wireshark是目前最主流的抓包分析工具跨平台支持Windows、macOS和Linux。安装过程没什么好说的官网下载对应版本一路下一步就行。但有一个关键点很多人会忽略安装时它会提示你是否安装NpcapWindows平台或ChmodBPFmacOS平台这个组件是抓包功能的底层依赖必须装。Windows上如果跳过这一步打开Wireshark会发现一个网卡都识别不到。安装完成后打开Wireshark你会看到一个网卡列表。这里有个实操经验不要选所有网卡或者随便选一个。如果你连的是WiFi就选无线网卡如果插的是网线就选有线网卡。选错了网卡抓到的包里根本看不到你的实验流量。怎么确认选对了看网卡后面的流量波形图有波动的那张就是正在用的。提示如果你在虚拟机里做实验比如VMware或VirtualBox网卡选择会更复杂。NAT模式下虚拟机的流量经过地址转换抓包看到的源IP可能不是你以为的那个。建议用桥接模式虚拟机直接接入物理网络抓到的包更干净。2.2 抓包过滤器的设置策略Wireshark的过滤器分两种抓包过滤器Capture Filter和显示过滤器Display Filter。这两个东西的作用时机完全不同新手最容易搞混。抓包过滤器是在抓之前设置的它决定Wireshark只抓哪些包没抓到的就永久丢失了。语法用的是BPFBerkeley Packet Filter语法比如host 192.168.1.100 and tcp port 80。显示过滤器是在抓完之后用的它只是把已有的包筛出来显示原始数据还在。语法是Wireshark自己的一套比如tcp.port 80 ip.addr 192.168.1.100。我的建议是抓包阶段尽量少过滤显示阶段再精细筛选。原因很简单——你永远不知道自己会需要什么包。如果抓包时就限死了条件回头想分析别的流量就得重新抓。除非流量特别大比如在核心交换机上抓否则抓包过滤器保持空白就行。2.3 实验目标的确定做TCP抓包实验你得先明确要观察哪种TCP行为。常见的有这几类实验目标典型场景关键观察点三次握手访问一个HTTP网站SYN、SYN-ACK、ACK三个包四次挥手关闭连接FIN、ACK、FIN、ACK数据传输下载文件Seq/Ack号递增、窗口大小超时重传模拟丢包相同Seq号的重复包流量控制大文件传输Window Size变化新手建议从三次握手开始因为过程短、特征明显、容易定位。等握手看明白了再去看数据传输和挥手。3. 三次握手抓包实操从打开Wireshark到看懂每一行3.1 抓包前的准备工作先确定一个目标服务器。最简单的办法是找一个HTTP网站因为HTTP默认走80端口明文传输方便观察。不要用HTTPS的网站因为TLS加密后你只能看到握手看不到后续的HTTP内容当然TCP层还是能看的但新手容易被加密流量搞晕。打开命令行先ping一下目标域名拿到IP地址。比如ping example.com记下返回的IP。然后打开Wireshark选中你的网卡在显示过滤器栏先什么都不填点击左上角的蓝色鲨鱼鳍图标开始抓包。这时候切换到浏览器访问那个目标网站。等页面加载完回到Wireshark点击红色方块停止抓包。现在你手里有一堆包了接下来就是筛选。3.2 用显示过滤器精准定位握手包在显示过滤器栏输入tcp.flags.syn 1 tcp.flags.ack 0这行过滤器的意思是只显示SYN标志位为1且ACK标志位为0的包。这正是三次握手的第一步——客户端发出的连接请求。你会看到过滤结果通常只有一两条因为浏览器可能同时发起多个连接。找到那条SYN包后右键点击它选择Follow - TCP Stream。Wireshark会自动把属于同一个TCP连接的所有包筛选出来并且按顺序排列。这时候你就能清晰地看到完整的三次握手过程了。3.3 逐包解读每个字段都在说什么点开第一个SYN包展开Transmission Control Protocol这一层你会看到一堆字段。新手最容易懵的就是这些字段我挑几个最关键的讲Source Port源端口客户端随机选择的一个端口号通常是49152到65535之间的高位端口。这个端口是操作系统临时分配的每次连接可能都不一样。Destination Port目的端口服务端监听的端口HTTP是80HTTPS是443。这个是你访问的服务决定的。Sequence Number序列号这是TCP可靠传输的核心。初始序列号是随机生成的不是从0开始。为什么随机主要是为了防止旧连接的延迟包干扰新连接。如果每次都从0开始一个延迟了很久的旧包突然到达接收方可能误以为是新连接的数据。Flags标志位SYN包只有SYN置1ACK包只有ACK置1SYN-ACK包两个都置1。这是区分握手三个阶段最直接的依据。Window Size窗口大小告诉对方我还能接收多少字节的数据。这个值直接关系到流量控制后面讲数据传输时会详细说。第二个包是服务端回的SYN-ACK。注意看它的Acknowledgment Number值等于第一个包的Sequence Number加1。这个1很关键——SYN和FIN标志位会消耗一个序列号虽然它们不携带实际数据。这是TCP协议的一个特殊设计很多人第一次看到会疑惑为什么不是直接等于。第三个包是客户端回的ACK。它的Sequence Number等于第一个包的Seq1Acknowledgment Number等于第二个包的Seq1。到这里三次握手完成连接建立。3.4 相对序列号让分析更直观Wireshark默认显示的是绝对序列号一长串随机数字看起来很不直观。有一个设置可以让它显示相对序列号Edit - Preferences - Protocols - TCP - Relative sequence numbers勾选上。勾选之后第一个SYN包的序列号会显示为0后续的序列号就是相对于初始值的偏移量。这样你在分析数据传输时能直接看出这是第几个字节而不是对着一堆大数字做减法。这个设置强烈建议打开尤其是做重传和乱序分析的时候。4. 数据传输与四次挥手连接建立之后发生了什么4.1 数据包的序列号与确认号变化规律三次握手完成后客户端开始发送HTTP请求。这时候你会看到一系列PSHACK的包。PSH标志位的含义是请尽快把数据交给应用层可以理解为别缓存了赶紧处理。观察这些数据包的Seq和Ack变化你会发现一个规律发送方的Seq等于上一次发送的Seq加上上一次发送的数据长度。比如第一个数据包Seq1携带了500字节数据那下一个包的Seq就是501。而Ack号始终等于我期望收到的下一个字节的序号也就是对方发来的最后一个字节的序号加1。这个规律是TCP可靠传输的基础。如果发送方发现某个包的Ack迟迟不来就会触发超时重传。如果接收方收到的包Seq号不连续就知道中间丢包了会发送重复的Ack催促发送方重传。4.2 窗口大小与流量控制的实际观察在数据传输过程中注意观察每个ACK包的Window Size字段。这个值不是固定不变的它会随着接收方缓冲区的剩余空间动态调整。举个例子如果接收方应用层处理数据很慢缓冲区快满了它就会在ACK里把Window Size调小告诉发送方你慢点发我快撑不住了。极端情况下Window Size会变成0这时候发送方必须停止发送直到接收方发来一个窗口更新包。这个机制叫滑动窗口是TCP流量控制的核心。抓包的时候你可以试着一边下载大文件一边观察Window Size的变化能直观感受到TCP是怎么根据接收方能力动态调整发送速率的。4.3 四次挥手的过程拆解数据传输结束后连接需要关闭。TCP的关闭过程是四次挥手主动关闭方发送FINACK表示我没数据要发了被动关闭方回ACK表示知道了被动关闭方发送FINACK表示我也没数据要发了主动关闭方回ACK表示知道了然后等待2MSL后彻底关闭为什么是四次而不是三次因为TCP是全双工的一方说我不发了不代表另一方也不发了。被动关闭方收到FIN后可能还有数据要发送所以它的ACK和FIN是分开发送的。如果被动方也没有数据要发ACK和FIN可能合并成一个包看起来就像三次挥手。抓包的时候用过滤器tcp.flags.fin 1就能筛出所有FIN包。注意看主动关闭方最后那个ACK发完之后连接并没有立即消失而是进入TIME_WAIT状态等待2MSLMaximum Segment Lifetime通常60秒。这个等待是为了确保最后的ACK能到达对方如果对方没收到会重发FIN主动方还能响应。5. 常见问题与排查技巧实录5.1 抓不到包怎么办这是新手遇到最多的问题。排查思路按顺序来第一确认网卡选对了。回到Wireshark首页看哪个网卡有流量波动。如果所有网卡都是平的说明你的网络流量没经过Wireshark监听的网卡。第二确认过滤器没写错。抓包过滤器如果写了host 192.168.1.100但你的实际IP是192.168.1.101那就什么都抓不到。先把抓包过滤器清空试试。第三确认权限足够。Linux和macOS上抓包需要root权限或者特定的用户组权限。如果Wireshark提示没有权限打开网卡用sudo wireshark启动试试。第四检查是不是走了本地回环。如果你访问的是本机上的服务流量走的是lo网卡127.0.0.1选物理网卡是抓不到的。5.2 序列号看起来乱七八糟如果你没开相对序列号看到的就是一长串随机数字这是正常的。开了相对序列号之后如果还是乱可能是以下原因乱序到达网络中存在多条路径包到达顺序和发送顺序不一致。Wireshark会标注TCP Out-of-Order。重传同一个Seq号出现多次Wireshark会标注TCP Retransmission。重复ACK接收方收到乱序包时会发重复ACKWireshark标注TCP Dup ACK。这些标注都是Wireshark的Expert Information功能在分析菜单里可以查看完整的专家信息列表它会自动帮你识别异常。5.3 常见问题速查表问题现象可能原因排查方法看不到任何包网卡选错/过滤器太严清空过滤器换网卡只有单向流量抓包位置不对换到网关或对端抓大量重传网络质量差/丢包检查链路看RTT窗口大小为0接收方处理不过来看应用层是否阻塞连接被RST端口未监听/防火墙检查服务状态握手不完整中间设备拦截看是否有SYN无响应5.4 几个容易被忽略的实操心得心得一善用标记功能。Wireshark里可以给包打标记右键 - Mark/Unmark分析复杂流量时先把关键包标记出来后面回看会方便很多。心得二导出特定包。File - Export Specified Packets可以把筛选后的包单独存成一个文件方便反复分析或者分享给别人。心得三时间显示格式。默认显示的是相对时间相对于第一个包但有时候你需要看绝对时间。View - Time Display Format里可以切换。分析延迟问题时用Seconds Since Previous Displayed Packet能直观看出两个包之间的间隔。心得四不要迷信自动分析。Wireshark的Expert Information很好用但它只是辅助。真正的分析还是要靠你对TCP协议的理解。比如它标注了Retransmission但你要判断这是真丢包还是伪重传比如ACK延迟导致的这需要结合RTT和窗口变化综合判断。心得五抓包文件会很大。长时间抓包可能产生几个G的文件建议设置环形缓冲区Capture - Options - Ring buffer限制单个文件大小和文件数量避免把磁盘写满。6. 从抓包实验延伸到真实排障场景做完基础的三次握手和四次挥手实验你其实已经掌握了TCP分析的核心方法。真实工作中的网络排障无非就是这些基础知识的组合应用。比如用户反馈网站打开慢你抓包后发现TCP握手正常但第一个数据包的响应时间特别长那问题可能出在服务端应用处理上而不是网络层。如果发现大量重传那就要检查链路质量。如果发现窗口频繁归零那可能是接收方应用处理能力不足。再比如连接偶尔失败抓包看到SYN发出去了但没收到SYN-ACK重传几次后超时。这种情况通常是中间有防火墙拦截或者服务端backlog满了。通过抓包能快速定位是网络问题还是服务问题避免盲目排查。我个人在实际操作中的体会是抓包分析最难的从来不是工具操作而是知道该看什么。Wireshark的按钮就那么几个半小时就能学会。但要从一堆包里看出问题所在需要你对协议行为有清晰的预期——正常的应该是什么样现在偏离了哪里偏离的原因可能是什么。这个能力只能靠反复练习和积累没有捷径。最后分享一个小技巧平时没事的时候可以随机抓一些自己上网的流量试着分析每个连接的握手、传输、挥手过程。见得多了遇到异常流量时你的直觉会告诉你这里不对劲。这种直觉才是抓包分析的真正价值。

读完文章,也想定制专属网站?

尧图设计师 24 小时内与您沟通定制方案

免费获取报价 →
↑