Wireshark浅析Tcp三次握手

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了Wireshark浅析Tcp三次握手相关的知识,希望对你有一定的参考价值。

参考技术A

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

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

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

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

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

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

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

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

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

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

打开wireshark界面:

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

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

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

对应的过滤规则为:

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

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

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

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

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

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

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

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

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

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

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

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

007_wireshark分析TCP的三次握手和四次断开

要想进行抓包分析,必须先了解TCP的原理。这里介绍了TCP的建立连接的三次握手和断开连接的四次握手。

一、前言:介绍三次握手之前,先介绍TCP层的几个FLAGS字段,这个字段有如下的几种标示

SYN表示建立连接,
FIN表示关闭连接,
ACK表示响应,
PSH表示有 DATA数据传输,
RST表示连接重置。

二、三次握手的步骤

(1)第一次握手:主机A发送位码为syn=1,随机产生seq number=1234567的数据包到服务器,主机B由SYN=1知道,A要求建立联机;

(2)第二次握手:主机B收到请求后要确认联机信息,向A发送ack number=(主机A的seq+1),syn=1,ack=1,随机产生seq=7654321的包;

(3)第三次握手:主机A收到后检查ack number是否正确,即第一次发送的seq number+1,以及位码ack是否为1,若正确,主机A会再发送ack number=(主机B的seq+1),ack=1,主机B收到后确认seq值与ack=1则连接建立成功。
 完成三次握手,主机A与主机B开始传送数据。
从抓包分析中可以很清晰的看到TCP三次握手,下图就是完整的三次握手,客户端41826端口和服务器的80端口建立了连接

 技术分享图片

三、tcp断开连接的四次握手

(1)tcp断开连接有两种方式,第一种是正常的四次握手断开的,第二种是RST异常断开的.

技术分享图片

假设Client端发起中断连接请求,也就是发送FIN报文。Server端接到FIN报文后,意思是说"我Client端没有数据要发给你了",但是如果你还有数据没有发送完成,则不必急着关闭Socket,可以继续发送数据。
所以你先发送ACK,"告诉Client端,你的请求我收到了,但是我还没准备好,请继续你等我的消息"。这个时候Client端就进入FIN_WAIT状态,继续等待Server端的FIN报文。当Server端确定数据已发送完成,
则向Client端发送FIN报文,"告诉Client端,好了,我这边数据发完了,准备好关闭连接了"。Client端收到FIN报文后,"就知道可以关闭连接了,但是他还是不相信网络,怕Server端不知道要关闭,
所以发送ACK后进入TIME_WAIT状态,如果Server端没有收到ACK则可以重传。“,Server端收到ACK后,"就知道可以断开连接了"。Client端等待了2MSL后依然没有收到回复,
则证明Server端已正常关闭,那好,我Client端也可以关闭连接了。Ok,TCP连接就这样关闭了!

(2)用抓包来看断开连接的四次握手

下图中的四个箭头就是标准的四次握手了。

1.首先服务器80端口想41826端口发出FIN的断开连接请求
2.然后第二个箭头41826收到请求之后想服务器80端口回复了一个ACK
3.接着第三个箭头41826向服务器80端口发送断开请求FIN
4.最后第四个箭头,服务器80向客户端发送断开的回复ACK
这样四次握手之后,服务器和客户端都确认了断开连接,可以看到断开连接是双向的。

技术分享图片

(3)RST异常关闭连接

有时候也会出现异常断开连接的情况,也就是RST,比如说下图,服务器80向客户端32875发送断开请求FIN,客户端也通过这条链路回复了ACK,但是此时还有数据需要发送,所以没有急着回复FIN,
而是先将get请求发送出去,发送了get请求之后再发送的断开请求FIN,但是此时服务器不知道什么原因在没有确认客户端的确认前就断开了,所以在接到get请求之后,返回了一个RST,异常断开了这条链路。

技术分享图片

 

Reference:

https://osqa-ask.wireshark.org/questions/20423/pshack-wireshark-capture

TCP三次握手wireshark抓包分析{https://blog.csdn.net/u014530704/article/details/78842000}

  

 

  

  

 



以上是关于Wireshark浅析Tcp三次握手的主要内容,如果未能解决你的问题,请参考以下文章

Wireshark分析TCP三次握手过程

WireShark如何抓包,各种协议(HTTPARPICMP)的过滤或分析,用WireShark实现TCP三次握手和四次挥手

007_wireshark分析TCP的三次握手和四次断开

使用wireshark抓取Tcp三次握手

使用wireshark抓取Tcp三次握手

使用wireshark抓取Tcp三次握手