TCP四次握手释放连接

一、四次握手的过程


TCP需要三次握手才能建立连接,整个过程如下图所示:


假设A运行的是TCP客户端进程,而B运行的是TCP服务端进程。最开始的时候两端的TCP进程都处于ESTABLISHED(已建立连接)状态。

这时候,A主动关闭,请求释放连接。


(1)第一次握手  A→ B

A的TCP客户进程向B发出释放连接请求报文段,其中FIN(终止位)=1,seq(序号)=u

TCP规定,当报文段的FIN=1时,表明此报文段的发送方的数据已发生完毕,并要求释放连接;FIN报文段(FIN=1的报文段)不能携带数据,但是要消耗掉一个序号。

在A发送完毕之后,A的TCP客户端进程进入FIN-WAIT-1(终止等待1状态。


(2)第二次握手  B→A

B在收到连接释放连接请求报文段之后,随即向A发送确认报文段。其中ACK=1,seq=v,ack(确认号)=u+1

在B发送完毕之后,B的TCP服务端进程进入CLOSE-WAIT(关闭等待)状态。

TCP服务器进程这时应该通知高层应用经常,从A到B这个方向的连接就要释放了,这时的TCP连接处于半关闭(half-close)状态。

A在收到B的确认报文段之后,就进入FIN-WAIT-2(终止等待2)状态,等待B发出的连接释放报文段。


(3)第三次握手 B→A
若B已经没有要向A发送的数据,其应用进程就通知TCP释放连接。B向A发出释放连接报文段,其中FIN=1,ACK=1,seq=w,ack=u+1
TCP规定,当报文段的FIN=1时,表明此报文段的发送方的数据已发生完毕,并要求释放连接;FIN报文段(FIN=1的报文段)不能携带数据,但是要消耗掉一个序号。

在B发送完毕之后,B的TCP服务端进程进入LAST-ACK(最后确认状态。


(4)第四次握手 A→B

A在接收到B的释放连接请求报文段之后,必须对此发出确认。其中ACK=1,seq=u+1,ack=w+1


A在发送完毕之后,进入到TIME-WAIT(时间等待)状态。B在接收到A的确认之后,进入到CLOSED(关闭)状态。


在经过时间等待计时器设置的时间2MSL之后,A才进入到CLOSED状态。


以上就是所说的四次握手过程。



二、四次握手的原因


四次握手可以看成是两个二次握手,分别是A的TCP客户端进程请求释放连接和B的TCP服务端进程请求释放连接。


为什么A在发送最后一次确认报文段之后还需要等待2MSL时间呢?主要有两个原因,一是为了让B能够按照正常步骤进入CLOSED状态,二是为了防止已失效的请求连接报文段出现在下次连接中,因而产生错误。


原因如下:

第一,为了保证A发送的最后一个ACK报文段能够到达B。因为这个ACK报文段有可能丢失,这样B就无法接收到而进入CLOSED状态。于是B会重传请求释放连接的报文段,A在这段等待时间接收到了,重传ACK报文段,这样B还是会顺利接收到确认报文段,进入CLOSED状态。如果此时A已经关闭了,那么就无法收到B的请求报文段,也不会发送ACK报文段,这样B就无法进入CLOSED状态了。


第二,在这2MSL的等待时间内,本次连接的所有报文都已经从网络中消失,从而不会出现失效的报文出现在下次连接中。


参考资料:

1、TCP协议中的三次握手和四次挥手(图解) http://blog.csdn.net/whuslei/article/details/6667471

2、简析TCP的三次握手与四次分手 http://www.jellythink.com/archives/705

3、TCP三次握手详解及释放连接过程  http://blog.csdn.net/oney139/article/details/8103223




本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/312835.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

开源WPF控件库MaterialDesignInXAML推荐

今天介绍一个开源的C# WPF开源控件库,非常漂亮,重点是开源哦WPF做桌面开发是很有优势的,除了微软自带的控件外,还有很多第三方的控件库,比如收费的Dev Express For WPF、Telerik For WPF等,及Github上开源免…

TCP连续ARQ协议和滑动窗口协议

TCP协议通过使用连续ARQ协议和滑动窗口协议,来保证数据传输的正确性,从而提供可靠的传输。 一、ARQ协议 ARQ协议,即自动重传请求(Automatic Repeat-reQuest),是OSI模型中数据链路层和传输层的错误纠正协议之…

ASP.NET Core 集成测试中模拟登录用户的一种姿势

不管哪种用户验证方式,最终都是在验证成功后设置 HttpContext.User ,后续处理环节通过 HttpContext.User 获取用户信息。如果能直接修改 HttpContext.User ,就能达到模拟登录的目的,而 ASP.NET Core 的中间件(middlewa…

【NServiceBus】什么是Saga,Saga能做什么

前言Saga单词翻译过来是指尤指古代挪威或冰岛讲述冒险经历和英雄业绩的长篇故事,对,这里强调长篇故事。许多系统都存在长时间运行的业务流程,NServiceBus使用基于事件驱动的体系结构将容错性和可伸缩性融入这些业务处理过程中。 当然…

数据一致性基本知识

在分布式系统中,我们经常提及CAP定理,即一致性(Consistency)、可用性(Availability)和分区容忍性(Partition tolerance)。在本文中,我们将对数据一致性这一知识进行基本回…

分享一次与SharpDX坑爹Bug刚正面的过程

和SharpDX坑爹的Variant刚正面几个月前我写了这篇文章《.NET中生成动态验证码》文章,其实里面藏着一个大坑。运行里面的代码,会发现运行的 gif图片并没有循环播放: 细心的网友也注意到了这个问题:……但后来他备注说“已解决”&am…

EF Core 3.0查询

随着.NET Core 3.0的发布,EF Core 3.0也随之正式发布,关于这一块最近一段时间也没太多去关注,陆续会去对比之前版本有什么变化没有,本节我们来看下两个查询。分组我们知道在EF Core 3.0版本之前,对于分组查询是在客户端…

经典排序算法(1)——冒泡排序算法详解

冒泡排序(Bubble Sort)是一种典型的交换排序算法,通过交换数据元素的位置进行排序。 一、算法基本思想 (1)基本思想 冒泡排序的基本思想就是:从无序序列头部开始,进行两两比较,根据…

C++模版和C#泛型求同存异录(一)sizeof(T)

sizeof(T)从C的模板代码往C#代码移植的时候发现了一个小问题。在C模板代码中 sizeof(T)是一种有效的写法,最终在会编译器展开成sizeof(int),sizeof(float)或者sizeof(myclass),然后在运行时这个代码是有效的,能够执行的。于是我们看上去就可以计算在运行…

经典排序算法(2)——快速排序算法详解

快速排序(Quick Sort)也是一种典型的交换排序算法,通过交换数据元素的位置进行排序。 一、算法基本思想 (1)基本思想 快速排序的基本思想就是:通过一趟排序将要排序的数据分割成独立的两部分,其…

经典排序算法(3)——直接插入排序算法详解

直接插入排序(Insertion Sort)是一种插入排序算法,通过不断地将数据元素插入到合适的位置进行排序。 一、算法基本思想 (1)基本思想 直接插入排序的基本思想是:顺序地把待排序的序列中的各个元素按其关键字…

[ASP.NET Core 3框架揭秘] 异步线程无法使用IServiceProvider?

标题反映的是上周五一个同事咨询我的问题,我觉得这是一个很好的问题。这个问题有助于我们深入理解依赖注入框架在ASP.NET Core中的应用,以及服务实例的生命周期。一、问题重现我们通过一个简单的实例来模拟该同事遇到的问题。我们采用极简的方式创建了如…

经典排序算法(4)——折半插入排序算法详解

折半插入排序(Binary Insertion Sort)是一种插入排序算法,通过不断地将数据元素插入到合适的位置进行排序,在寻找插入点时采用了折半查找。 一、算法基本思想 (1)基本思想 折半插入排序的基本思想是&#x…

经典排序算法(5)——希尔排序算法详解

希尔排序(Shell Sort)是一种典型的插入排序算法,通过对原始序列进行分组进行排序。 一、算法基本思想 (1)基本思想 希尔排序是基于插入排序的以下两点性质而提出改进方法的: 插入排序在对几乎已经排好序的…

程序员修神之路--容器技术为什么会这么流行(记得去抽奖)

菜菜哥,你上次讲的kubernetes我研究了一下,你再给我讲讲docker呗docker可很流行呀kubernetes是容器编排技术,容器不就是指的docker吗?docker可不等于容器哦,docker只算是容器的一种吧,算了容器的典型代表容…

经典排序算法(6)——直接选择排序算法详解

直接选择排序(Straight Select Sort)是一种典型的选择排序算法,通过不断选择序列中最大(小)的元素。 一、算法基本思想 (1)基本思想 直接选择排序的基本思想就是:不断从未排序队列中…

一篇文章看懂Git是什么以及如何简单的上手Git

本文来自DotNET技术圈作者:显杰1.Git是什么Git是目前世界上最先进的分布式版本控制系统什么是版本控制系统?好比设计师从开始设计第一个版本的设计稿开始:Demo > Demo1 > Demo2 > ... >Demo1001 > Demo最终版本 > Demo最终…

[翻译] 使用 Serverless 和 .NET Core 构建飞速发展的架构

作者:Samuele RescaServerless 技术为开发人员提供了一种快速而独立的方式将实现投入生产。这种技术在企业的技术栈中日益流行,自 2017 年以来,它一直是 ThoughtWorks 技术雷达的实验级别的技术[译注:技术雷达是 ThoughtWorks 每半…

经典排序算法(7)——堆排序算法详解

堆排序(Heap sort)是指利用堆(最大堆、最小堆)这种数据结构所设计的一种排序算法。堆是一个完全二叉树的结构,并同时满足如下性质:即子结点的键值或索引总是小于(或者大于)它的父节点…

经典排序算法(8)——归并排序算法详解

归并排序(Merge sort),是创建在归并操作上的一种有效的排序算法,效率为O(nlog n)。该算法是采用分治法(Divide and Conquer)的一个非常典型的应用,且各层分治递归可以同时进行。 一、算法基本思…