TCP三次握手及四次挥手详解

424 阅读3分钟

「这是我参与11月更文挑战的第8天,活动详情查看:2021最后一次更文挑战」。

TCP三次握手概念

TCP即是传输层控制协议,TCP是主机对主机层的传输控制层协议,提供可靠的连接服务,采用三次握手确认建立一个连接。

TCP连接6种标识

SYN(synchronous):建立连接

ACK(acknowledgement):确认

PSH(push):传送

FIN(finish):结束

RST(reset):重置

URG(urgent):紧急

Sequence number:顺序号码

数据是被拆成多个数据包来发送,序列号就是对每个数据包进行编号,这样接受方才能对数据包进行再次拼接。

Acknowledge number:确认号码,代表下一个数据包编号

三次握手过程

image.png

  • 第一次握手:主机A向主机B发送位码SYN=1,以及发送随机的顺序号码seq,B主机接收到SYN知道A请求建立链接

  • 第二次握手:主机B要确认连接信息,向主机A发送SYN=1,ACK=1,ack number确认号码(seq+1),以及随机产生的seq

  • 第三次握手:主机A收到后检查ack_number是否正确,以及位码 ACK是否为1,如果信息正确,主机A向主机B发送ack_number(主机B的seq+1),ack=1,主机B收到后确认ACK以及ack_number,信息正确则连接建立成功

为什么需要三次握手

如果只有两次请求,服务端不确定客户端是否收到确认请求,有可能这个确认消息由于某些原因丢失。第三次握手,客户端收到确认请求,再发出一个确认(ACK)消息,意思是告诉服务端客户端是通的,然后客户端和服务端就可以建立连接通信了。

TCP四次挥手

image.png

四次挥手过程

  • 第一次挥手:当客户端主动要求断开连接时,客户端会向服务端发送标识位 FIN=1,以及随机seq=u,此时客户端进入FIN-WAIT-1状态(不能发送数据,但可以接收数据,应答数据)

  • 第二次挥手:当服务端接收到客户端的断开请求FIN时,并不会立即断开连接,而是先向客户端回复客户端的断开请求,表示已经接收到,会向客户端发送ACK=1,随机v,以及ack_number=u+1,于此同时服务端会进入close-wait状态,客户端接收到服务器请求进入FIN-WAIT-2状态

  • 第三次握手

服务端确认传输到客户端的数据已经结束后,就会向客户端请求断开连接,向客户端发送标识位FIN=1,ACK=1,ack_number=u+1,seq=z,服务端状态变为LAST-ACK

  • 第四次握手

客户端接收到服务端断开请求后,会回复服务端断开请求,FIN=1,ACK=1,ack_number=z+1,seq=h,h为客户端随机生成,此时客户端会进入TIME-WAIT状态,要经过2MSL时间才能真正释放。服务端在接到客户端断开请求回复后立即释放

为什么需要四次挥手

因为TCP连接是全双工的网络协议,允许同时通信的双方同时进行数据的收发,同样也允许收发两个方向的连接被独立关闭,以避免client数据发送完毕,向server发送FIN关闭连接,而server还有发送到client的数据没有发送完毕的情况。所以关闭TCP连接需要进行四次握手,每次关闭一个方向上的连接需要FIN和ACK两次握手