开启掘金成长之旅!这是我参与「掘金日新计划 · 12 月更文挑战」的第19天,点击查看活动详情
TCP协议中的三次握手和四次握手
介绍
在TCP协议中有三次握手和四次握手,三次握手是建立连接,四次握手是断开连接。
三次握手
三次握手是指在建立一个TCP连接时,客户端和服务端需要发送总共3个包来确认两边的发送数据和接收数据功能都是正常,都是正常的情况下最终建立连接。
- 第一次握手,客户端给服务端发送一个SYN报文,此时SYN为1,并且还会生成序列号seq=x,此时客户端会进入
SYN_SENT状态,等待服务器的消息。 - 第二次握手,服务器在收到客户端的报文后,会给客户端返回确认报文,确认报文中包含SYN、ACK、ack、seq,其中SYN是1,ACK是1,ack为客户端发送过来的报文中的seq+1,也就是x+1,报文最后的seq是服务端自己生成的序列号seq=j,发送完确认报文后,服务端会进入
SYN_RCVD状态,等待客户端的响应。 - 第三次握手,客户端收到服务端返回的报文后,首先会检查ack是不是自己生成的seq+1,也就是x+1,如果是的,则将ACK设置为1,ack设置为服务端报文中的seq+1,也就是j+1,再将确认报文发送给服务端,服务端接收到报文后,检查ACK是不是1,ack是不是第二次握手报文中seq+1,也就是检查是不是j+1,如果是,则建立连接成功,客户端和服务端都会进入
ESTABLISHED状态,之后就可以进行传输数据了。
ACK和ack并不是一个意思,ACK指的是确认位,ack指的是确认号,如果收到报文,并进行确认操作,则ACK置为1,ack则是收到报文中的seq+1。
四次握手
四次握手是用于数据传输完成后,客户端和服务端断开连接使用。
- 第一次握手,客户端主动关闭,会给客户端发送给FIN报文,生成序列号seq=x,告诉服务端,客户需要关闭了,此时客户端会进入
FIN-WAIT-1状态。 - 第二次握手,服务端收到报文后,会给出响应,会将ACK置为1,ack为第一次握手报文的seq+1,即x+1,并且会生成自己的序列号seq=j,此时是告诉客户端,服务端在处理,稍等一下。此时可能处于半关闭的状态,因为此时服务端知道客户端已经传输完毕,准备关闭,但是很有可能,服务端需要传输数据给客户端,此时服务端就会将数据传输给客户端,此时连接还没有断掉,此时服务端会进入
CLOSE-WAIT状态,客户端收到报文后会进入FIN-WAIT-2状态。 - 第三次握手,在服务端处理结束或者数据传输完成之后,会发送FIN报文给客户端,此时FIN为1,ACK为1,ack为x+1,生成自己的序列号seq=k,此时服务器端会进入
LAST-ACK状态。 - 第四次握手,客户端在收到服务端的报文后,会发送报文给服务端,此时ACK为1,ack=k+1,seq=x+1,服务端在收到报文后,连接关闭,注意,此时客户端还未关闭连接,客户端会进入
TIME-WAIT状态,需要经过2MSL的时间,才会关闭连接,MSL为报文段最大生存时间。