当前位置:首页 > 数码 > 深入剖析三次握手和四次挥手-Wireshark抓包分析TCP协议 (深入剖析三次的成语)

深入剖析三次握手和四次挥手-Wireshark抓包分析TCP协议 (深入剖析三次的成语)

admin5个月前 (05-04)数码10
TCP协议的三次握手和四次挥手 前言 在面试中,经常会被问到TCP协议的三次握手和四次挥手的过程。这是因为TCP协议是底层传输协议,负责在网络设备之间建立和管理通信会话。掌握TCP协议的工作原理对于理解网络通信至关重要。 Wireshark抓包分析TCP协议 为了更好地理解TCP协议,我们将使用Wireshark抓包工具来分析TCP协议的三次握手和四次挥手的过程。Wireshark可以让我们详细查看每个网络报文的信息。 TCP协议的三次握手过程 TCP建立连接需要经历三次握手,具体过程如下: 1. 客户端向服务器发送一个带有SYN(同步)标志的报文。SYN标志表明客户端希望建立连接。 2. 服务器向客户端发送一个带有SYN和ACK(确认)标志的报文。ACK标志表示服务器确认收到客户端的SYN请求。 3. 客户端向服务器发送一个带有ACK标志的报文。ACK标志表示客户端确认收到服务器的SYN和ACK报文。 Wireshark分析 下图展示了使用Wireshark抓取的TCP三次握手的报文示例: [图片:TCP三次握手报文] 第一次握手: Flags: SYN Sequence Number: 0 第二次握手: Flags: SYN, ACK Sequence Number: 0 Acknowledgment Number: 1 第三次握手: Flags: ACK Sequence Number: 1 Acknowledgment Number: 1 TCP协议的四次挥手过程 当数据传输完成后,客户端和服务器会断开连接。断开连接需要经历四次挥手,具体过程如下: 1. 客户端向服务器发送一个带有FIN(结束)标志的报文。FIN标志表示客户端已完成数据发送,准备结束连接。 2. 服务器向客户端发送一个带有ACK标志的报文。ACK标志表示服务器确认收到客户端的FIN报文。 3. 服务器向客户端发送一个带有FIN标志的报文。FIN标志表示服务器已完成数据发送,准备结束连接。 4. 客户端向服务器发送一个带有ACK标志的报文。ACK标志表示客户端确认收到服务器的FIN报文。 Wireshark分析 下图展示了使用Wireshark抓取的TCP四次挥手报文示例: [图片:TCP四次挥手报文] 第一次挥手: Flags: FIN 第二次挥手: Flags: ACK 第三次挥手: Flags: FIN 第四次挥手: Flags: ACK 为何是三次握手和四次挥手? TCP协议使用三次握手来建立连接以确保数据传输的可靠性。三次握手确保客户端和服务器在开始数据传输之前建立了同步并同意了连接参数。 TCP协议使用四次挥手来断开连接以确保所有数据都已正确传输并确认。四次挥手允许客户端和服务器在完全关闭连接之前互相确认数据传输已完成。 深入剖析三次握手和四次挥手

Wireshark浅析Tcp三次握手

我不想 一开始直接搬网络描述图来讲三次握手亦或试图用大量专业词汇让你熟悉它,而是想用 简单的描述 ,让大家对 三次握手 有个大概的印象。用 Wireshark 抓包工具分析TCP报文中大家比较关注的syn(Synchronize Sequence Numbers 同步序列号)和ack(ACKnowledge Character 确认字符)。

字面意思就是三次交互,也是三次 「TCP数据包」 的传输。交互的目的是 建立连接 ,让通信双方 确认 「对方」能够接收到自己发送的消息 。

下图简单描述了 三次握手 的过程:[^xr1]

有同学问我为什么要回复x+1,这就是 协议 的魅力所在了。协议本质上就是一种 约定 ,设计tcp的那群大佬们完全可以设计为x+2, 这不应该是我们纠结的点 。

tcp是 传输层 协议,握手的目的是 建立连接 。事实上四次,甚至更多次的握手更能保证通信的建立,但无疑也会增加网络开销。 「三次」 是一个 能够保证双方建立连接的最小通讯数。

下图为Tcp的报文构成,因本文主要讲述 三次握手 ,侧重点也主要放在序列号和确认应答号上,对TCP的报文感兴趣的可以 看看思否的这篇文章 。下面结合Wireshark,对应这张图浅析一下三次握手。<p></p>

三次握手也就是三次TCP的报文传输,这里可以注意到序列号和确认应答号都是 32位 。所以这也解释了ACK和SYN的取值范围是 0 - 2^32 -1即4,294,967,295。

简单介绍一下wireshark,它是一款优秀的 抓包 工具。可以抓取经过我们电脑网卡上的网络信息,当然也包括我们今天要抓取的TCP数据包。

以打开网络为例,首先需要确认网络的ip,可以通过ping命令获取:

注意这里使用 而不是 。记录下反馈的ip地址:180.101.49.12。这个ip因人而异,每个地区会有所不同。

打开wireshark界面:

【ps:建议打开前先退出浏览器。】

左侧对应你的电脑网卡,如果你不知道选择哪个,可以注意右侧的 折线图 ,有波动的就是你在使用的网卡。

因为我们的电脑的网络流量是实时在变的,所以需要在这里过滤出来自 的流量信息。

对应的过滤规则为:

注意这里的ip为上一步通过 ping 命令获取的ip。

输入后,回车。可以看到下面还是空的流量信息。 现在再打开网络首页 ,关注这里的流量信息,可以发现三次握手的流量包信息已经显示在下方了:

我们双击第一条报文,查看详情:

wireshark中显示报文格式为16(2^4)进制,即每个字符对应 4位 ,一共 8 个字符一共占用 4 * 8 = 32 位。和可以看 TCP报文 中syn序列号长度是一致的。16进制下的: e 即对应十进制的: 。

当然我们也可以查看原始的2进制数据包,32位的长度也会更加直接。只需要在下方空白处右击,选择: ‘... as bits即可。

接下来我们点击第二次数据包,即 第二次握手 ,也是网络服务器对我们的回复包:

可以看到网络回执ack确实为我们第一次握手中的syn+1( + 1)。另外自身生成的seq序列为: ,也对应文章一开始放的小红和小蓝对话图[^xr1]的第七步:

这里ack即对应响应ACK(y)值,seq对应服务器返回的 x 值。

接下来看第三次响应,也是客服端对网络的回执包信息:

可以看到最后的一次 握手 中,ack值为第二次握手回执的syn值+1。seq序列为二次握手中服务器回执的ack确认序列号。至此三次握手完成,连接建立完毕,可以开始进行数据的传输。

分析数据包虽然是个比较耗时的事情但确实可以加深我们的印象,也可以让抽象的描述具体化。

另外多说一句,虽然分析的过程比较久但tcp的建立时间是非常快的,我们在打开一个网站的瞬间就建立好了。四次挥手同理,有兴趣的话你可以试试用wireshark抓取4次挥手的数据包看看。欢迎关注,无限进步。

简述TCP连接三次握手四次挥手

1.第一次握手:A的TCP客户进程向B发出连接请求报文段(首部的同步位SYN=1,初始序号seq=x,SYN=1的报文段不能携带数据,但要消耗掉一个序号),此时TCP客户进程进入SYN-SENT(同步已发送)状态。 2.第二次握手:B收到连接请求报文段后,如同意建立连接,则向A发送确认报文(SYN=1,ACK=1,确认号ack=x+1,初始序号seq=y),B进程进入SYN-RCVD(同步收到)状态,A进入ESTABLISHED(已建立连接)。 3.第三次握手:A收到B的确认后,要向B发送确认收到确认的报文段(ACK=1,确认号ack=y+1,序号seq=x+1,初始为seq=x,第二个报文段所以要+1),ACK报文段可以携带数据,不携带数据则不消耗序号,TCP连接已经建立,当B收到A的确认后,也进入ESTABLISHED状态。 可以看到,三次握手过程中,A的状态变化为 CLOSED->SYN-SEND->ESTABLISHED。 B的状态变化为(CLOSED)LISTEN->SYNC-RECEIVED->ESTABLISHED,两者都经过3次状态变化。 为何需要最后的客户端应答(为什么需要第三次握手)?

免责声明:本文转载或采集自网络,版权归原作者所有。本网站刊发此文旨在传递更多信息,并不代表本网赞同其观点和对其真实性负责。如涉及版权、内容等问题,请联系本网,我们将在第一时间删除。同时,本网站不对所刊发内容的准确性、真实性、完整性、及时性、原创性等进行保证,请读者仅作参考,并请自行核实相关内容。对于因使用或依赖本文内容所产生的任何直接或间接损失,本网站不承担任何责任。

标签: Wireshark