三次握手
一开始时客户端处于closed状态,服务器处于listen状态。
第一次握手:客户端会给服务器发送一个SYN的报文,且说明自己的初始序列号ISN。这时客户端处于SYN_RCVD状态,服务器状态不变。
首部的同步位为SYN=1,初始序列号为seq=x
第二次握手:服务器收到客户端的SYN报文之后,也会发自己的SYN,且也会说明自己的初始序列号ISN,同时会把客户端的序列号ISN+1座位ACK值,表示自己已经收到客户端发的消息,此时服务器状态变为SYN_RCVD状态。
确认报文段中SYN=1,ACK=1,确认段ack=x+1,初始序号为seq=y
第三次握手:客户端收到服务器发的SYN之后,会发送一个 ACK 报文,当然,也是一样把服务器的 ISN + 1 作为 ACK 的值,表示已经收到了服务端的 SYN 报文,此时客户端处于 ESTABLISHED 状态。服务器收到 ACK 报文之后,也处于 ESTABLISHED 状态,此时,双方已建立起了连接。
确认报文段ACK=1,确认号ack=y+1,序号seq=x+1(初始为seq=x,第二个报文段所以要+1),ACK报文段可以携带数据,不携带数据则不消耗序号。
四次挥手
第一次挥手:客户端发送一个 FIN 报文,报文中会指定一个序列号。发出连接释放报文段(FIN=1,序号seq=u),并停止再发送数据,主动关闭TCP连接,进入FIN_WAIT1(终止等待1)状态,等待服务端的确认。
第二次挥手:服务端收到连接释放报文段后即发出确认报文段(ACK=1,确认号ack=u+1,序号seq=v),服务端进入CLOSE_WAIT(关闭等待)状态,客户端收到服务端的确认后,进入FIN_WAIT2(终止等待2)状态,等待服务端发出的连接释放报文段。
第三次挥手:服务端没有要向客户端发出的数据,服务端发出连接释放报文段(FIN=1ACK=1,序号seq=w,确认号ack=u+1),服务端进入LAST_ACK(最后确认)状态,等待客户端的确认。
第四次挥手:客户端收到服务端的连接释放报文段后,对此发出确认报文段(ACK=1,seq=u+1,ack=w+1),客户端进入TIME_WAIT(时间等待)状态。此时TCP未释放掉,需要经过时间等待计时器设置的时间2MSL后,客户端才进入CLOSED状态。(不等待的话怕服务器没有收到确认报文段然后不停发送)