IT袋

当前位置:主页 > 经验教程 > 建站编程 >

为何TCP挥手是四次

为何TCP挥手是四次 TCP挥手为何需要四次握手?

时间:2024-01-15 22:24:08 来源:IT袋 作者:马勇
导读:为何TCP挥手是四次,您可能不了解为何TCP挥手是四次的内容,接下来就是全面介绍。 TCP是一种可靠的、面向连接的协议,用于实现可靠的数据传输。它通过确认机制、重传机制和流量控制机

为何TCP挥手是四次

您可能不了解为何TCP挥手是四次的内容,接下来就是全面介绍。

TCP是一种可靠的、面向连接的协议,用于实现可靠的数据传输。它通过确认机制、重传机制和流量控制机制等机制来保证数据的可靠传输。

那么TCP连接的销毁,为何是四次挥手,而不是三次挥手呢?今天我们一起聊一聊。

为何不使用三次挥手

我们来看看,采用如下的方式,进行三次挥手操作:

为何TCP挥手是四次

我们知道TCP握手是三次,那么挥手为何不采用三次的方式呢。

看上图,我们按照服务端ACK和FIN合并一起发送至客户端的方式,即在服务端收到客户端的FIN请求后,服务端一次性发起数据请求,确认客户端的FIN请求已收到,同时向客户端发起FIN请求。

此时,若服务端仍存在数据需要发送至客户端,因服务端已准备关联,不能再发数据,所以数据是无法发到客户端的。

例如:服务端需要给客户端的数据有三部分:A部分、B部分、C部分,在A部分和B部分发到客户端后,C部分还未发送,收到了客户端的FIN请求,服务端回复了客户端ACK确认和FIN请求,那么C部分的数据,是无法发送至客户端的,此时,客户端仅收到了A部分和B部分的数据,收到的数据不完整。

可见,直接采用三次挥手的方式,是存在明显的问题的。

四次挥手

先看看四次挥手的图示:

为何TCP挥手是四次

发起方:主动发起链路关闭的一方,一般为客户端,但也可能为服务端,上图是以客户端为发起方举例。

接收方:被动接受链路关闭的一方,一般为服务端,但也可能为客户端,上图接收方为服务端举例。

第一次挥手:发起方发起链路关闭请求,seq=a,代表发起方使用的请求序号为a,FIN请求发送后,发起方不能再发送数据到接收方,此时发起方状态变为FIN-WAIT1。

第二次挥手:接收方在收到发起方的第一次挥手后,向发起方发起第二次挥手操作,seq=b,代表接收方使用的请求序号为b;ack=a+1,即值为发起方请求序号+1。接收方发送第二次挥手后,状态变为CLOSE-WAIT状态,此时接收方仍可以发送数据到发起方。发起方在收到第二次挥手后,状态变为FIN-WAIT2。

第三次挥手:接收方等待一定的时长,一般最大时间TCP_DELACK_MAX=200MS,最短时间TCP_DELACK_MIN=40MS,具体时间根据何时有数据需发送而定。延时确认结束后,接收方向发起方发起第三次挥手,seq=b,代表接收方使用的请求需要序号为b;ack=b+1,即值为发起方请求序号+1。接收方在发起第三次挥手后,状态变为LASK-ACK。

第四次挥手:发起方在收到接收方的第三次挥手后,向接收方发起第四次挥手,seq=a+1,代表发起方使用的请求序号为a+1,即第一次发起挥手序号+1;ack=b+1,接收方第三次挥手的请求序号为b,所以确认时值为b+1。发起方发送完ACK请求后,状态变为TIME-WAIT,在等待两个MSL的时间后,状态再变为CLOSE。接收方在收到发起方的第四次挥手后,状态变为CLOSE。

ESTABLISHED状态:链路是正常的,可以发送数据和接收数据。发起方和接收方均有这个状态。

CLOSE状态:链路已关闭,原来占用的端口,可以被回收,重新使用。发起方和接收方均有这个状态。

发起方的三个专属状态:

FIN-WAIT1状态:发起方发送FIN请求后的状态,此时,发起方不能再向接收方发送数据。

FIN-WAIT2状态:发起方在收到接收方第二次挥手后的状态。

TIME-WAIT状态:发起方发起第四次挥手后的状态。接收方两个专属状态:

CLOSE-WAIT状态:接收方在收到发起方的第一次挥手,即接收到FIN请求后的状态。

LAST-ACK状态:接收方在发起第三次挥手,即发起FIN请求后的状态。另外还有个状态:

CLOSING状态:CLOSE之前的状态,时间较短,很难看到。此状态有种特殊的场景下会出现,即客户端和服务端同时发起第一次挥手操作的情况下,两边均进入FIN-WAIT1状态,期待接收到对方的ACK包,进入FIN-WAIT2状态,但却先接收到了对方的FIN包,这时就会进入CLOSING状态,然后给对方一个ACK,在收到对方的ACK包后,直接进入CLOSE状态。

四次挥手抓包

为何TCP挥手是四次

相关阅读

  • 一键部署Spring Boot到远程Docker容器

    一键部署Spring Boot到远程Docker容器

    IT袋网网小编为你介绍一键部署Spring的相关介绍,接下来IT袋网小编就来介绍。 在当今软件开发领域,应用程序的容器化部署已经成为一种流行的选择,Docker 提供了一个强大的容器化解决方案

  • js分割数组的方法 关于js数组转对象简单方法

    js分割数组的方法 关于js数组转对象简单方法

    今日重点为您介绍js分割数组的方法和关于js数组转对象简单方法的相关知识,很不错的方法小知识,建议收藏哦! 数组是JavaScript编程中最常用的结构之一,这也是为什么了解它的内置方法很

  • 魔兽世界金币交易网站用哪个 关于魔兽世界金币价格走势

    魔兽世界金币交易网站用哪个 关于魔兽世界金币价格走势

    小编为大家解答魔兽世界金币交易网站用哪个和关于魔兽世界金币价格走势的电脑方面的小经验,下面来一起了解一下吧。 08年才有了电脑接触网络游戏,第一款网游玩的是QQ三国,当时非常火

  • 图片素材库网站哪个最好用 买高清图片的网站推荐

    图片素材库网站哪个最好用 买高清图片的网站推荐

    全面的为您讲解图片素材库网站哪个最好用和买高清图片的网站推荐方面的介绍,继续往下看吧! 设计师经常会花大量的时间在相关网站上找素材、找灵感、找图片,但是有很多网站都会在一