TCP连接的建立与释放
  TCP是面向连接的,在传输报文段之前先要建立连接。发起连接请求的一方叫客户端,响应连接请求的一方叫服务端。 
 三次握手
  第一次握手:  
   客户端向服务端发送请求连接报文(SYN);其中报头控制位SYN=1,初始序号seq=x。并进入SYN_SENT状态,等待服务器确认; 
   第二次握手:  
   服务端收请求连接报文(SYN)后,向客户端发送确认报文(SYN+ACK)。确认报文段的首部中,ACK=1、SYN=1。确认序号:ack=x 1,同时为自己选择一个初始序号seq=y。此时,服务器进入SYN_RCVD状态; 
   第三次握手:  
   客户端收到服务器的确认报文(SYN+ACK)后,还要再向服务端发送一个确认报文(ACK)。该确认报文段首部中,ACK=1,确认号是ack=y 1,自己的序列号是seq=x 1。此包发送完毕,客户端进入ESTABLISHED状态,服务端收到确认报文后,也进入ESTABLISHED状态。 
   至此TCP连接建立。 
   三次握手过程中传送的包里不携带数据。三次握手完毕后,客户端与服务端才正式开始传输数据。理想状态下,TCP连接一旦建立,在通信双方中的任何一方主动关闭连接之前,TCP 连接都将被一直保持下去。 
 四次挥手
  断开一个TCP连接则需要“四次挥手”。 
   此处,客户端——主动关闭方,服务端——被动关闭方。
 
   第一次挥手:  
   此时两端还都处于ESTABLISHED状态,客户端停止发送数据,并发送一个请求断开连接报文(FIN)。 
   该报文首部中,FIN=1,序列号seq=u。 
   服务端接收到请求报文后,进入CLOSE_WAIT(关闭等待)状态。 
   也就是告诉服务端,我的数据发送完了,不会再给你发数据了。
 
   (另,在FIN包发送之前发送出去的数据,如果没有收到服务端对应的ACK确认报文,主动关闭方依然会重发这些数据);此时,客户端还可以接受数据。 
   第二次挥手:  
   服务端收到请求断开连接报文(FIN)后,回复确认报文(ACK),确认号:ack=u 1,序列号seq=v。 
   客户端收到确认报文(ACK)后,进入FIN-WAIT-1(终止等待-1)状态。 
   现在TCP连接处于半开半闭状态,服务端如果继续发送数据,客户端依然接收。
 
   第三次挥手:  
   服务端发送一个请求断开连接报文(FIN),用来终止服务端到客户端的数据传送。 
   该报文段首部中,FIN=1,ACK=1,确认序列号ack=u 1,序列号seq=w。 
   客户端接收到确认断开连接报文(ACK、FIN)后,进入FIN-WAIT-2(终止等待-2)状态。
 
   也就是告诉客户端,我的数据也发送完了,不会再给你发数据了。 
   第四次挥手:  
   客户端收到确认断开连接报文(ACK、FIN)后,回复确认报文(ACK)给服务端。 
   确认序号ack=w 1。序列号=u 1。 
   然后进入TIME_WAIT(时间等待)状态。
 
   注意:  
   此时,TCP连接还没有被释放,需要时间等待状态结束后(4min),两端才会进入CLOSED状态。 
   设置时间等待是因为——最后一个确认报文(ACK)可能会丢失,而需要重传。
 
 
查看9道真题和解析

