目录
三次握手:
三次握手即建立TCP会话。握手前,客户端和服务端处于关闭状态,客户端主动打开连接,服务端被动打开连接(客户端:closed,服务端:listen)。
第一次握手:由客户端率先向服务端发送连接请求(REQUEST),发送 SYN 报文,然后客户端处于SYN_SENT(同步已发送)状态。此时报文首部中的同部位SYN=1,同时选择一个初始序列号 seq=x,SYN 报文段(SYN=1的报文段)不能携带数据,但需要消耗掉一个序号。
第二次握手:服务器接收到由客户端发送的 SYN 报文后,如果同意连接,则发出确认(ACK)报文。确认报文中应该有ACK=1,SYN=1,此时服务器处于SYN_RCVD(同步收到)的状态。
第三次握手:客户端收到服务器发来的 ACK+SYN 报文后,客户端会向服务器端发送确认(ACK)报文。通过此告诉服务器已确认收到服务器端发来的报文,此时客户端处于ESTABLISHED(已建立连接)状态,服务端收到客户端发来的 ACK 后,也处于ESTABLISHED(已建立连接)状态,两者成功建立连接。
四次断开:
四次断开也叫四次挥手,即断开TCP会话。当数据传输结束后,双方释放连接时,客户端和服务器都是处于ESTABLISHED(已建立连接)状态,然后由客户端主动关闭,服务器被动关闭。
第一次挥手:首先由客户端发送一个 FIN 报文,报文中会指定一个序列号。此时客户端处于FIN_WAIT_1(终止等待1)状态。
第二次挥手:服务端接收到由客户端发送的 FIN 报文后,向客户端发送 ACK 报文,确认同意与客户端断开连接,此时服务端处于CLOSE_WAIT(关闭等待)状态。此时 TCP 处于半关闭状态,客户端收到服务端的 ACK 报文后,进入FIN_WAIT_2(终止等待2)状态,等待服务端发出的连接释放报文。
第三次挥手:再次由服务端向客户端发送 FIN 报文,且指定一个序列号。此时服务端处于LAST_ACK(最后确认)的状态,等待客户端确认。
第四次挥手:客户端收到 FIN 报文后,向服务端发送 ACK 确认报文,确认关闭连接,此时客户端处于TIME_WAIT(时间等待)状态。服务器只要收到了客户端发出的确认,立即进入CLOSED(关闭)状态。然后需要过一段时间以确保服务端收到自己的 ACK 报文之后才会进入CLOSED(关闭)状态。
总结:
三次握手(建立TCP会话):
(client)——>(server)
pc端——>(syn(同步)+request(请求))——>server端
pc端<——(ack(确认)+(syn+request))<——server端
pc端——>(ack)——>server端
四次断开(断开TCP会话):
pc端——>(fin)——>server端
pc端<——(ack)<——server端
pc端<——(fin)<——server端
pc端——>(ack)——>server端