TCP/IP协议中四次挥手的过程及原因是什么

发布时间:2021-11-20 09:47:59 作者:柒染
来源:亿速云 阅读:359

本篇文章给大家分享的是有关TCP/IP协议中四次挥手的过程及原因是什么,小编觉得挺实用的,因此分享给大家学习,希望大家阅读完这篇文章后可以有所收获,话不多说,跟着小编一起来看看吧。

四次挥手都做什么?

TCP的连接是全双工的,所以连接的拆除需要单独将两个通道分别拆除,而四次挥手所做的事情就是拆除两条通道和释放资源。

TCP 提供了连接的一端结束他的发送后,还能接收来自另一端数据的能力,也就是所谓的半关闭。

TCP/IP协议中四次挥手的过程及原因是什么

TCP/IP详解卷I

这里以Client作为主动发起端,Server作为被动关闭端。

第一步,Client主动发起一个Req给Server,里面包含FIN标识位=1,CLient的Seq序列号N,表示的是当前Client在该连接上的当前序列号。

第二步,Server端在收到这个含有FIN的Req消息之后,校验无误之后会立马回复ACK消息给CLient端,消息内部包含ACK标志位为1,同时Seq号码是FIN的请求消息的Seq号+1。此时的Sever同时会主动发个结束标识给Server上面的应用层程序,应用层程序可以决定是立马结束,还是等到服务器上面的该连接中的数据处理完了之后,在发送FIN消息给Client来关掉另外的一半连接。

第三步,Server端在处理完该连接上面的Pending住的数据之后,应用程序会close这个连接。Client会主动发起FIN的Req消息给Client端。消息内部带有,FIN=1的结束符标识位,以及Server端的Seq序列号。

第四步,Client端在收到对应的FIN消息之后,会主动通知应用层程序,告知这个连接现在需要关闭了。然后,Client会回复ACK消息给Server,以便断开另外一个方向的通道,这个消息包含ACK=1的标识位和FIN的REQ带过来的Seq+1。

为什么需要四次挥手?

因为TCP是一个全双工协议,必须单独拆除每一条信道。4次挥手的目的是终止数据传输,并回收资源,此时两个端点两个方向的序列号已经没有了任何关系,必须等待两方向都没有数据传输时才能拆除虚链路,不像初始化时那么简单,发现SYN标志就初始化一个序列号并确认SYN的序列号。因此必须单独分别在一个方向上终止该方向的数据传输。

如果是三次挥手,会怎么样?三次的话,被动关闭端在收到FIN消息之后,需要同时回复ACK和Server端的FIN消息。如果Server端在该连接上面并没有Pending的消息要处理,那么是可以的,如果Server端还需要等待一段时间才可以关闭另外一个方向的连接,那么这样的三次挥手就不能满足条件。

四次挥手的状态转换?

Client端:

ESTABLISHED---发送FIN给Server-->FIN_WAIT_1---接收到Server端的FIN对应的ACK-->FIN_WAIT_2---收到Server端发送过来的FIN消息-->FIIN_WAIT--2MSL之后会进入-->CLOSED

Server端:

ESTABLISHED---接收到Client端的FIN->CLOSED_WAIT--Server端的应用程序关闭发送FIN--> LAST_ACK---收到Client对于FIN的ACK响应-->FIIN_WAIT---->CLOSED

TCP/IP协议中四次挥手的过程及原因是什么

Tcp/ip详解 卷I

其中四次挥手与Scoket函数的对应关系如下所示:

TCP/IP协议中四次挥手的过程及原因是什么

图片来自网络,如有侵权请告知,会及时删除

四次挥手失败了会怎么样?

四次挥手里面,最经典的场景,是Client处于TIME_WAIT之后的2MSL的时间处理。(备注:MSL是TCP报文里面最大生存时间,它是任何报文段被丢弃前在网络内的最长时间。)

设置2MSL的目的是为了处理,Server端在重传最后一个FIN的时候,Client能够发送最后一个ACK的时间。

这个时间段内,不管是Client端还是Server端,最好都不要重用这个TCP的端口,否则的话,可能会导致根据这个端口新建立的连接被错误的关掉,详细情况如下所示:

step1:Server发送给Client的最后一个FIN,Client收到了,也发了ACK给Server,但是Server并没有收到这个ACK。step2:于是CLient复用了这个Port号,于是新建了一条连接,这里假设叫newConnection。step3:Server在此过程中已经发送了重传的FIN给Client,Client上面刚建立完成的newConnection就会再次被关掉。

以上就是TCP/IP协议中四次挥手的过程及原因是什么,小编相信有部分知识点可能是我们日常工作会见到或用到的。希望你能通过这篇文章学到更多知识。更多详情敬请关注亿速云行业资讯频道。

推荐阅读:
  1. python如何实现TCP包注入
  2. 如何解决TCP半开连接数限制问题

免责声明:本站发布的内容(图片、视频和文字)以原创、转载和分享为主,文章观点不代表本网站立场,如果涉及侵权请联系站长邮箱:is@yisu.com进行举报,并提供相关证据,一经查实,将立刻删除涉嫌侵权内容。

tcp ip

上一篇:Go单元测试的基本用法

下一篇:Java控制树莓派GPIO口的Pi4J有什么功能

相关阅读

您好,登录后才能下订单哦!

密码登录
登录注册
其他方式登录
点击 登录注册 即表示同意《亿速云用户服务条款》