wireshark抓包分析TCP三次握手和四次挥手的过程

1. TCP的通信过程

       TCP连接的建立需要经过三次握手,连接的关闭需要经过四次挥手。读TCP/IP协议不是很好理解,通过工具手动抓包分析会对协议有更深刻的理解。因为工作中经常用到wireshark,所以就通过wireshark来分析,记录自己的学习过程。

TCP的整个通信过程如下图所示:

wireshark抓包分析TCP三次握手和四次挥手的过程

2. TCP的三次握手过程

     下图是wireshark抓取的浏览器与web服务器之间的TCP通信过程,Filter是过滤框,图中是过滤的源IP和目的IP为1.192.194.198与客户端的通信。

wireshark抓包分析TCP三次握手和四次挥手的过程

(1)SYN 同步***,用来发起一个TCP连接,会携带一个随机序号seq=i,报文中的Flags值SYN=1,SYN=1的报文段不能携带数据,但是会消耗掉一个序号。此时客户端进入到SYN-SEND状态。

(2)服务器收到SYN之后,如果同意此次连接的建立会回复一个ACK,确认号ack=i+1,同时会选取一个***seq=j,报文中的Flags值SYN=1,ACK=1,此时服务器进入到SYN-RCVD状态。

(3)客户端收到服务器的确认后,还会向服务器发出一个确认报文,确认号ack=j+1,***seq=i+1,报文中的Flags值ACK=1,ACK报文可以携带数据,如果没有携带数据不会消耗序号,下一个报文的序号仍然是i+1。此时客户端进入到ESTABLISED状态,服务器收到确认报文后也进入到ESTABLISED状态。

在wireshark界面上点击任意一条报文可以看到报文携带的内容,从上到下依次是物理层、链路层、网络层、传输层的数据报头,在传输层协议里面可以看到sequence number、acknowledgment number和Flags等信息。

wireshark抓包分析TCP三次握手和四次挥手的过程

TCP客户端为什么最后要发送一次确认,通过三次握手建立连接?

主要是为了防止已经失效的连接请求报文又发送到了服务器,再次建立TCP连接产生错误。

在网络中有一种场景,客户端发送请求报文后,在网络中的某个节点滞留了一段时间,TCP客户端迟迟没有收到服务器的确认报文会重新向服务器发送这条报文,经过两次握手建立连接之后,传输数据,关闭连接。而之前滞留的请求报文到达服务器之后也会与服务器再次建立连接,如果是三次握手,客户端就不会发出确认报文,服务器收不到确认报文,就不会建立连接,减少不必要的错误。

3. TCP的四次挥手过程

TCP断开连接是通过发送FIN报文,来告诉对方数据已经发送完毕,可以释放连接了。

wireshark抓包分析TCP三次握手和四次挥手的过程

(1)当客户端的数据发送完毕之后,会向服务器端发送一个FIN=1的报文,告诉服务器端数据已经发送完了,可以释放连接了,此时客户端进入到FIN-WAIT-1状态去等待服务器端的ACK报文。

(2)当服务器端收到FIN报文后,会给客户端发送一个释放连接的确认报文ACK,此时服务器就处于CLOSE-WAIT状态,这个时候客户端到服务器的方向就释放了,但是服务器若有数据要发送,客户端还是要接收。

(3)客户端收到确认报文后就进入到FIN-WAIT-2状态等待服务器端发送FIN报文。

(4)当服务器端没有数据要发送时,就会向客户端发送FIN报文,等待客户端确认。

(5)客户端收到服务器的FIN报文后,必须发出ACK确认,此时客户端进入到TIME-WAIT状态,此时TCP连接还没有被释放,必须要经过2MSL(最长报文段寿命)的时间后,客户端撤销掉TCB后,才进入到CLOSED状态。(经过2MSL的原因是1.防止服务器端未收到ACK报文2.防止下一次占用该端口号的TCP连接收到上一次连接迟到的报文)

(6)服务器端收到ACK确认报文后,就进入到CLOSED状态,服务器端结束TCP连接会比客户端早一些。