Wireshark抓包分析TCP三次握手
为什么需要三次握手和四次挥手
三次握手的原因
- 第一次握手:客户端向服务端发出SYN数据包;确认了客户端的发送能力。
- 第二次握手:服务端收到客户端SYN数据包,向客户端发送SYN + ACK数据包;服务端确认了自己的接收能力和发送能力,以及客户端的发送能力。
如果仅有这两次握手,服务端无法确认客户端的接收能力。 - 第三次握手:客户端收到服务端的SYN + ACK数据包,发送ACK数据包;服务器收到客户端的ACK数据包后,可确认客户端的接收能力。
三次握手主要为了防止客户端已失效的请求数据包又发送到了服务端而产生连接的误判
四次挥手的原因
-
第一次挥手:客户端 发送一个[FIN+ACK],表示自己没有数据要发送了,想断开连接,并进入FIN_WAIT_1状态(不能再发送数据到服务端,但能够发送控制信息ACK到服务端)。
-
第二次挥手:服务端收到FIN后,知道不会再有数据从客户端传来,发送ACK进行确认,确认序号为收到序号+1(与SYN相同,一个FIN占用一个序号),服务端进入CLOSE_WAIT状态。
-
第三次挥手:服务端发送FIN给对方,表示自己没有数据要发送了,服务端进入LAST_ACK状态,然后直接断开TCP会话的连接,释放相应的资源。
-
第四次挥手:客户端收到了服务端对FIN的ACK后,进入FIN_WAIT2状态(等待服务端完成资源释放的一系列工作:然后释放你为创建这个连接所分配的资源,并通知我你关闭了); 客户端收到了服务端的FIN信令后,进入TIMED_WAIT状态,并发送ACK确认消息。客户端在TIMED_WAIT状态下,等待2MSL一段时间,没有数据到来的,就认为对面已经收到了自己发送的ACK并正确关闭了进入CLOSE状态,自己也断开了到服务端的TCP连接,释放所有资源。当服务端收到客户端的ACK回应后,会进入CLOSE状态,并关闭本端的会话接口,释放相应资源。TIME_WAIT状态持续2MSL(MSL是数据分节在网络中存活的最长时间)。
seq是什么意思
(SYN - 创建一个连接
FIN - 终结一个连接
ACK - 确认接收到的数据)
TCP三次握手连接建立过程
- Step1:客户端发送一个SYN=1,ACK=0标志的数据包给服务端,请求进行连接,这是第一次握手;
- Step2:服务端收到请求并且允许连接的话,就会发送一个SYN=1,ACK=1标志的数据包给发送端,告诉它,可以通讯了,并且让客户端发送一个确认数据包,这是第二次握手;
- Step3:服务端发送一个SYN=0,ACK=1的数据包给客户端端,告诉它连接已被确认,这就是第三次握手。TCP连接建立,开始通讯。
使用sokit建立一个带有TCP地址的服务端和客户端
TCP四次挥手分析
- 第一次挥手:客户端发起一个FIN,表示客户端希望断开连接。
- 第二次挥手:服务端返回一个ACK,表示对客户端断开请求的应答。
- 第三次挥手:服务端发起一个FIN,表示服务端希望断开连接。
- 第四次挥手:客户端返回一个ACK,表示对服务端断开请求的应答。
TCP四次挥手示意图