三次握手和四次挥手
- 三次握手
- 四次挥手
♠ \color{red}{\spadesuit} ♠
ok,上一篇介绍完TCP/IP的常见状态码,对TCP协议有一个大概的了解了,接下来进入TCP协议的(建立连接)三次握手和四次挥手(关闭连接)
三次握手
三次握手是指建立一个TCP连接时,需要客户端和服务端总共发送3个包,如图所示
第一次握手:建立连接时,客户端发送SYN包(SYN=1 Seq=x)到服务端,并进入SYN_SEND状态,等待服务器端的确认;
第二次握手:服务器端收到SYN包,由标志位SYN=1知道客户端请求建立连接,服务端将标志位SYN和ACK都置为1后,随机产生一个Seq=y,向客户端发送一个SYN包,即SYN+Ack包(SYN=1 Seq=y Ack=x+1),此时服务器进入SYN_RECV状态;
第三次握手:客户端收到服务器端的SYN+Ack包,确认收到的ACK是否为1,ack是否为x+1,若是,则将标志位ACK置为1,后向服务器端发送确认包ack(ACK=1 Seq=x+1 Ack=y+1),此包发送完毕后,客户端和服务器端进入ESTABLISHED(established)状态,完成三次握手。客户端和服务器端开始传送数据。
三次握手的目的
是连接服务器指定的端口,建立TCP连接,并同步连接双方的序列号和确认号并交换TCP窗口大小信息。
注意!不要将序列号Ack与标志位中的ACK混淆!
四次挥手
对于一个已经建立的连接,TCP使用改进的三次挥手来释放连接(使用一个带有FIN附加标记的报文段)
假设主动关闭方为主机A,被动关闭方为主机B,如图
第一次挥手:当主机A的应用程序通知TCP数据已经发送完毕时,TCP向主机B发送一个带有FIN附加标记的报文段,进入FIN_WAIT_1状态
第二次挥手:主机B收到该FIN报文段之后,并没有立刻用FIN报文段回复主机,而是先向主机A发送一个确认序号Ack,同时通知自身的相应应用程序:对方要求关闭连接,主机B进入CLOSE_WAIT状态,主机A成功收到主机B发送的ACK之后进入FIN_WAIT_2状态
(ps:思考一下,为什么要先向主机A发送Ack,而不是直接一起发送Ack+FIN包)
第三次挥手:主机B的应用程序告诉TCP,我要彻底关闭连接,TCP向主机A发送一个FIN报文段,主机B进入LAST_ACK状态
第四次挥手:主机A收到该报文段后,向主机B发动一个Ack,表示连接彻底释放,主机A进入TIME_WAIT状态(为什么要进入等待状态而不是直接关闭?面试题常考哦~)
以上两个问题可查看我的另一篇博文介绍你不可不知的经典面试题集锦