WireShark 分析 TCP 协议
TCP 三次握手
1. 三次握手示意图
2. 使用 WireShark 进行抓包
为了能够抓取到 TCP 三次握手建立连接的数据,我们可以通过 WireShark 在本地主机访问网页时开始抓取数据。抓取的数据量比较大,包括了此时段本地主机所有的通信数据包,为了方便我们的分析,我们可以使用 WireShark 的显示过滤规则来过滤掉不需要的数据而只显示本地主机与目标主机之间通信的数据包。
过滤规则如下:ip.src==源IP or ip.dst==目的IP
过滤结果如图所示:
3. 分析 TCP 三次握手
- 第一次 客户端发送 SYN 报文到服务器
- 第二次 服务器收到客户端的 SYN 报文,回复 SYN + ACK 报文
- 第三次,客户端接收到服务器的 SYN + ACK 报文后。回复ACK 报文
TCP 的四次挥手
1. 四次握手示意图
由于TCP连接是全双工的,因此每个方向都必须单独进行关闭。这个原则是当一方完成它的数据发送任务后就能发送一个FIN来终止这个方向的连接。收到一个 FIN只意味着这一方向上没有数据流动,一个TCP连接在收到一个FIN后仍能发送数据。首先进行关闭的一方将执行主动关闭,而另一方执行被动关闭。
TCP的连接的拆除需要发送四个包,因此称为四次挥手(four-way handshake)。客户端或服务器均可主动发起挥手动作,在socket编程中,任何一方执行close()操作即可产生挥手操作。
(1)客户端A发送一个FIN,用来关闭客户A到服务器B的数据传送。
(2)服务器B收到这个FIN,它发回一个ACK,确认序号为收到的序号加1。和SYN一样,一个FIN将占用一个序号。
(3)服务器B关闭与客户端A的连接,发送一个FIN给客户端A。
(4)客户端A发回ACK报文确认,并将确认序号设置为收到序号加1。
2. 分析数据包
- 第一次挥手 FIN + ACK
- 第二次挥手 ACK
- 第三次挥手 FIN + ACK
- 第四次挥手 ACK