三次握手
- 第一次握手:建设连贯时,客户端发送syn包(syn=x)到服务器,并进入SYN_SENT状态,期待服务器确认;SYN:同步序列编号(Synchronize Sequence Numbers)。
- 第二次握手:服务器收到syn包,必须确认客户的SYN(ack=x+1),同时本人也发送一个SYN包(syn=y),即SYN+ACK包,此时服务器进入SYN_RECV状态;
- 第三次握手:客户端收到服务器的SYN+ACK包,向服务器发送确认包ACK(ack=y+1),此包发送结束,客户端和服务器进入ESTABLISHED(TCP连贯胜利)状态,实现三次握手。
为什么不能两次握手
TCP是一个双向通信协定,通信单方都有能力发送信息,并接管响应。如果只是两次握手, 至少只有连贯发起方的起始序列号能被确认, 另一方抉择的序列号则得不到确认
四次挥手
- 客户端过程收回连贯开释报文,并且进行发送数据。开释数据报文首部,FIN=1,其序列号为seq=u(等于后面曾经传送过去的数据的最初一个字节的序号加1),此时,客户端进入FIN-WAIT-1(终止期待1)状态。 TCP规定,FIN报文段即便不携带数据,也要耗费一个序号。
- 服务器收到连贯开释报文,收回确认报文,ACK=1,ack=u+1,并且带上本人的序列号seq=v,此时,服务端就进入了CLOSE-WAIT(敞开期待)状态。TCP服务器告诉高层的利用过程,客户端向服务器的方向就开释了,这时候处于半敞开状态,即客户端曾经没有数据要发送了,然而服务器若发送数据,客户端仍然要承受。这个状态还要继续一段时间,也就是整个CLOSE-WAIT状态继续的工夫。
- 客户端收到服务器的确认申请后,此时,客户端就进入FIN-WAIT-2(终止期待2)状态,期待服务器发送连贯开释报文(在这之前还须要承受服务器发送的最初的数据)。
- 服务器将最初的数据发送结束后,就向客户端发送连贯开释报文,FIN=1,ack=u+1,因为在半敞开状态,服务器很可能又发送了一些数据,假设此时的序列号为seq=w,此时,服务器就进入了LAST-ACK(最初确认)状态,期待客户端的确认。
- 客户端收到服务器的连贯开释报文后,必须收回确认,ACK=1,ack=w+1,而本人的序列号是seq=u+1,此时,客户端就进入了TIME-WAIT(工夫期待)状态。留神此时TCP连贯还没有开释,必须通过2∗∗MSL(最长报文段寿命)的工夫后,当客户端撤销相应的TCB后,才进入CLOSED状态。
- 服务器只有收到了客户端收回的确认,立刻进入CLOSED状态。同样,撤销TCB后,就完结了这次的TCP连贯。能够看到,服务器完结TCP连贯的工夫要比客户端早一些
为什么连贯的时候是三次握手,敞开的时候却是四次握手
因为当Server端收到Client端的SYN连贯申请报文后,能够间接发送SYN+ACK报文。其中ACK报文是用来应答的,SYN报文是用来同步的。然而敞开连贯时,当Server端收到FIN报文时,很可能并不会立刻敞开SOCKET,所以只能先回复一个ACK报文,通知Client端,"你发的FIN报文我收到了"。只有等到我Server端所有的报文都发送完了,我能力发送FIN报文,因而不能一起发送。故须要四步握手。