又一轮认知TCP三次握手四次挥手

151 阅读3分钟

什么是三次握手什么是四次挥手?

TCP:传输层控制协议(TCP Transport Control Protocol),是一种面向连接的、可靠的、基于字节流的传输层通信协议,是为了在不可靠的互联网络上提供可靠的端到端字节流而专门设计的一个传输协议。是介于应用层和网络层之间的运输层协议。负责将数据报文分成一段一段的,然后给IP协议去发送给接收端的TCP。

image.png

三次握手(three-way Handshake):建立TCP连接时候,客户端和服务器之间传送共3个包。

过程:

  • 第一次握手:客户端发送一个SYN报文,指明了客户端初始化序列号ISN(c),然后进入SYN_SENT状态。

  • 第二次握手:服务器收到客户端的报文之后,会以自己的SYN报文作为应答,同时将ISN+1作为ACK的值,此时服务器处于SYN_RCVD状态。

  • 第三次握手:客户端收到SYN报文之后,会发送一个ACK报文,值为服务器的ISN+1,此时客户端处于ESTABLISHED状态。服务器收到ACK报文后,也处于ESTABLISHED状态,这就建立了连接了。

image.png

为什么不是2次握手? 因为第二次传送数据的时候,是服务器给客户端传送,那服务器怎么知道是否传送成功了呢?只有服务器传过去但是没有应答,就不知道有没有成功,于是就要第三次的握手。

并且两次握手的话, 客户端有可能因为网络阻塞等原因会发送多个请求报文,延时到达的请求又会与服务器建立连接,浪费掉许多服务器的资源

四次挥手:tcp终止一个连接,需要经过四次挥手

过程:

  • 第一次挥手:客户端发送一个 FIN 报文,报文中会指定一个序列号。此时客户端处于 FIN_WAIT1 状态,停止发送数据,等待服务端的确认

  • 第二次挥手:服务端收到 FIN 之后,会发送 ACK 报文,且把客户端的序列号值 +1 作为 ACK 报文的序列号值,表明已经收到客户端的报文了,此时服务端处于 CLOSE_WAIT状态

  • 第三次挥手:如果服务端也想断开连接了,和客户端的第一次挥手一样,发给 FIN 报文,且指定一个序列号。此时服务端处于 LAST_ACK 的状态

  • 第四次挥手:客户端收到 FIN 之后,一样发送一个 ACK 报文作为应答,且把服务端的序列号值 +1 作为自己 ACK 报文的序列号值,此时客户端处于 TIME_WAIT状态。需要过一阵子以确保服务端收到自己的 ACK 报文之后才会进入 CLOSED 状态,服务端收到 ACK 报文之后,就处于关闭连接了,处于 CLOSED 状态

image.png

为什么需要四次挥手?

服务端在收到客户端断开连接Fin报文后,并不会立即关闭连接,而是先发送一个ACK包先告诉客户端收到关闭连接的请求,只有当服务器的所有报文发送完毕之后,才发送FIN报文断开连接,因此需要四次挥手

三次握手和四次挥手总过程

image.png

参考链接

微信公众号:JS每日一题