1.三次握手
第一次握手:客户端给服务端发一个 SYN 标志位的数据包,请求建立连接,并指明客户端的初始化序列号 seq。此时客户端处于SYN_SENT 状态。首部的同步位SYN=1,初始序号seq=x,SYN=1的报文段不能携带数据,但要消耗掉一个序号。
第二次握手:服务端收到客户端的SYN标志位数据包之后,也会给客户端发送一个SYN标准位数据包作为应答,表示同意建立连接。还指明了自己的初始化序列号seq。并且会把客户端的seq+1(x+1)作为ACK的值,表明自己已经接收到了客户端的SYN,此时的服务器处于SYN_RCVD的状态。
第三次握手:客户端收到SYN标志位数据包之后,会发送一个ACK标志位数据包,也会把服务端的初始序列号seq+1(y+1)作为自己的确认号ACK的值,表示收到了服务端的SYN标志位数据包。此时,客户端处于ESTABLISHED状态。
最后: 服务器收到确认标志位数据包,服务器状态由syn_received变为ESTABLISHED(完成连接)。这样双方就建立起了连接。
1.四次断开(挥手)
第一次断开:客户端发送一个FIN的标准位数据包给服务器端,会在报文中会指定一个序列号seq=u,并停止发送数据,主动关闭TCP连接。此时的客户端处于FIN_WAIT1的状态,等待服务端的确认。
第二次断开:服务端收到FIN标志位数据包之后,会给客户端发送ACK报文,表明已经收到客户端的报文了,这个报文中是把客户端的序列号值进行加一作为确认ACK报文的序列号值,同时也会生成一个初始序列号seq=v。此时的服务器端处于 CLOSE_WAIT (关闭等待)状态。
第三次断开:如果服务器也想断开连接了,就会和客户端的第一次挥手一样,会给客户端发送一个FIN报文,并且随机指定一个序列号seq=w。此时的服务端处于 LAST_ACK (最后确认)的状态,等待客户端的确认。
第四次断开:客户端收到FIN报文之后,一样的发送一个ACK报文作为应答,并且把服务端的序列号值+1作为自己ACK报文的序列号值。此时的客户端处于TIME_WAIT (时间等待)状态,需要经过一段时间以确保服务端收到自己的ACK报文之后才会进入CLOSED状态,服务器端收到ACK报文之后,就处于关闭连接了,处于CLOSED状态。