在讨论TCP的三次握手与四次挥手之前,首先我们需要了解TCP报文格式:
这里面需要留意的有:
- 序列号:标识本次数据包的序号
- 确认号:对于发送发送方数据包的确认,值是收到的数据包的序列号+1,即下次期待收到的数据包序列号
- 标志位:
下图展示了三次握手以及四次回收的过程:
这里需要注意各个阶段的状态。
下面分别进行分析
三次握手阶段:
- 客户端向服务端发送SYN数据包,表示想和服务端建立连接
- 服务端收到这个数据包后,给予客户端回应,所以ACK=1,表示自己收到了客户端的数据包,同时它也想和客户端建立连接,所以在这里回传一个SYN
- 客户端收到这个ACK+SYN数据包后,表明它可以向服务端发送请求并接收响应,至此它单方面的连接已经建立起来了,可是对于服务端来说,它只是才发送了一个ACK+SYN包,还不知道自己能不能收到客户端的回应,所以客户端需要再回一个ACK表示客户端收到了服务端的ACK+SYN包,至此服务端也可以确定自己能向客户端发送请求并接收响应了,所以服务端这一方的连接也建立起来了,至此整个三次握手完成,连接建立。
所以回首上述过程,为什么是三次?因为前两次可以确保客户端可以正常发送请求和接收响应,后两次可以保证服务端可以发送请求和接收响应。
四次挥手阶段:
当客户端和服务端建立好连接并通信结束后,它俩就要说say goodbye了,那么怎么告别呢?
分手总有一个人先说再见,在四次挥手里,首先客户端发送一个FIN包,意思是“服务端,我已经说完了,你还有什么要说的吗?”此时客户端已经无fuck说,就看服务端还有什么要说的,客户端此时进入FIN_WAIT1状态。
服务端收到这个包后,知道客户端已经没有话对他讲了,但是万一他还有话对客户端讲呢?所以他先发一个ACK包给客户端,意思是“好的我知道了,但是我可能还有话要对你讲”。
然后呢服务端就进行最后的道别,说完最后一番话后,他发一个FIN包给客户端,意思是“我已经说完了,我们可以拜拜了”。
客户端收到这个FIN包后,回一个ACK包给服务端,意思是“好的我知道了,see you nala”,服务端收到这个包后就先行挂断了电话,客户端等一段时间后发现确实没音了自己也就挂了电话,至此四次握手结束。