三次握手
首先,根据下图来看一下TCP建立连接的过程。
目的
TCP协议是一种1面向连接、可靠的数据传输协议。
为了保证客户端与服务器的可靠连接,TCP建立连接时必须要进行三次握手,也叫做三次会话。
进行三次握手的目的是为了确认服务器喝客户端双方的接收能力和发送能力是否正常。
状态转换
|
|
CLOSED |
|
LISTEN |
监听状态,表示服务器做好准备,等待建立传输链接 |
SYN RECV |
|
状态转换详解:
最开始的时候,客户端和服务器都处于CLOSED状态。其中,主动进行连接的是客户端,被动进行连接的是服务器。
第一次握手
:客户端的应用进程主动打开,并且向服务器发送出请求连接报文段。报文段的首部中存在:SYN=1,seq=x。其中SYN为1表示当前报文为”同步报文段“,同时选择一个初识序列号seq=x,这时,TCP客户端进程进入SYN-SENT状态。
第二次握手
:TCP服务器收到请求报文后,如果TCP服务器同意连接,则向客户端发出一个确认报文。该确认报文中,ACK=1,SYN=1,确认号是ack=x+1,同时,TCP服务器也为自己初始化一个序列号seq=y。此时,TCP服务器进入SYN-RCVD状态。
第三次握手
:TCP客户端收到确认报文后,再次向服务器给出确认。确认报文的ACK=1,ack=y+1,TCP客户端的序列号seq=x+1.此时,TCP连接建立成功。客户端进入ESTABLISHED(已建立连接状态)。
为什么要进行第三次握手?
主要目的是为了防止已经失效的连接请求报文突然又传送到了服务器,从而产生错误。
-
第一次握手:客户端向服务器发送报文,说明客户端发送能力OK~
-
第二次握手:服务器接收客户端发送的报文,并向客户端发送报文,说明服务器的接收能力OK~发送能力OK~
-
第三次握手:客户端接收服务器报文,并向服务器发送报文,说明客户端的接收能力OK~
这三次握手之后,我们才能确定客户端和服务器的接受能力和发送能力都OK~
采用两次握手会出现什么情况?
若采用两次握手,当第二次握手后就建立连接的话,此时客户端知道服务器能够正常接收到自己发送的数据,而服务器并不知道客户端是否能够收到自己发送的数据。
四次挥手
TCP建立连接需要三次握手,而断开连接需要四次挥手。
TCP四次挥手的过程如下图所示:
最开始的时候,客户端和服务器都处于ESTABLISHED状态,数据传输完毕后,客户端主动关闭,服务器被动关闭。
由于TCP连接是全双工的,因此需要每个方向都单独进行关闭。双方各自向对方发送了FIN(结束报文)请求,并且各自给对方一个ACK确认报文。才能完全释放连接。
第一次挥手:客户端发出连接断开报文(连接释放报文),并且客户端停止发送数据。此时释放数据报文首部FIN=1,其序列号为seq=u,此时,客户端进入CLOSE-WAIT状态,等待彻底关闭连接。
第二次挥手:服务器收到连接释放报文后,向客户端发送一个ACK确认报文,此时ACK=1,ack=u+1。此时,服务器就进入了CLOSE-WAIT状态,等待彻底关闭连接。
第三次挥手:客户端收到服务器发送的确认报文后,客户端将会进入FIN-WAIT-2状态,等待服务器发送连接释放报文,服务器将要传输的最后的数据传输完毕后,向客户端发送连接释放报文,此时,服务器进入到LAST-ACK状态,等待客户端的确认。
第四次挥手:客户端收到服务器的连接释放报文后,发出确认报文,该报文中ACK=1,ack=w+1.此时客户端进入到TIME-WAIT状态。要注意此时的连接还未完全终止,必须等待2MSL之后,当客户端经过这2MSL之后,才会进入到CLOSED关闭状态。而服务器接收到确认报文后,会马上进入CLOSED关闭状态。这时,TCP连接就彻底断开了。
至此,四次挥手结束。
为什么客户端要等待2msl?
TIME-WAIT必须等待2MLS是因为等待2MLS可以保证客户端最后一个报文段能够到达服务器,如果未到达,服务器则会超时重传连接释放报文段,使得客户端、服务器都可以正常进入到CLOSE关闭状态。
TIME-WAIT 是一种 TCP 状态。
time-wait开始的时间为tcp四次挥手中主动关闭连接方发送完最后一次挥手,也就是ACK=1的信号结束后,主动关闭连接方所处的状态。
然后time-wait的的持续时间为2MSL. MSL是Maximum Segment Lifetime,译为“报文最大生存时间”,可为30s,1min或2min。2msl就是2倍的这个时间。工程上为2min,2msl就是4min。但一般根据实际的网络情况进行确定。
状态转换
状态 |
描述 |
ESTABLISHED |
链接正常建立之后进入数据传输阶段 |
FIN WAIT 1 |
主动发送第一个FIN报文之后进入该状态 |
FIN WAIT 2 |
已经收到第一个FIN的确认信号,等待对方发送关闭请求 |
TIME WAIT |
完成双向链接关闭,等待分组消失 |
CLOSE WAIT |
收到对方的关闭请求并进行确认进入该状态 |
LASTACK |
等待最后一次确认关闭的报文 |