TCP三次握手与四次挥手:
一、三次握手
第一次:客户端发给服务器:发送请求连接标志SYN=1,发送自己的字节流序号seq=x(服务器知道自己接收正常,客户端发送正常)
第二次:服务器收到后发给客户端:发送请求连接标志SYN=1,确认号ACK=1,客户端的确认号ack=x+1,自己的序号seq=y(客户端知道:自己发送正常,接收正常,服务器的发送正常,接收也正常)
第三次:客户端收到后回复服务器:发送确认号ACK=1,发送对方的确认号ack=y+1,发送自己的序号seq=x+1(服务器知道自己接收正常,发送正常,客户端的接收和发送也正常)
综上,需要三次握手双方才能知道自己和对方的接收发送都是正常的。(注:ACK=1表示确认号有效,ACK=0表示报文不含确认序号信息)
二、四次挥手
第一次:客户端发送释放连接标志FIN=1,自己的序列号seq=u,客户端进入FIN-WAIT-1状态
第二次:服务器收到后,向客户端发送确认号ACK=1,客户端的确认号ack=u+1,自己的序列号seq=v,进入CLOSE-WAIT状态
第三次:客户端收到服务器发来的确认号后,进入FIN-WAIT-2状态。此时,服务器发送释放连接标志FIN=1,客户端的确认序号ack=u+1,自己的序列号seq=w,服务器进入LAST-ACK状态。
第四次:客户端收到回复后,发送确认标志ACK=1,对方的确认序号ack=w+1,自己的序列号seq=u+1,客户端进入TIME-WAIT(时间等待状态)。客户端经过两个最长报文段寿命后CLOSE;服务器收到确认后,立刻CLOSE
注:客户端收到服务器的确认后,进入TIME-WAIT状态 为什么要等两个最长报文寿命后才CLOSE?
答:原因有两个(简):(1)客户端time-wait是等待最后一个确认报文能到达服务器,否则服务器收不到就会重新发送连接释放的请求报文。
(2)为了让本次连接持续时间内所产生的所有报文都从网络中消失,使得下一个连接中不会出现旧的连接中的请求报文