继上一篇后,我们再来看一下四次挥手的过程


这里其实没有必要过多阐述,一张图胜过千言万语。

与三次握手一样,四次挥手的过程中也有许多扩展问题。

当然问的最多的还是:为什么要四次握手?为什么要等待2MSL的时间?

这个问题没必要死记硬背,只需要了解全双工的工作机制就好。

至于等待的2MSL(报文最大生存时间),一是保证传输的信息已经到达,二是防止无法收到确认报文段而不能进入CLOSED状态。

其他的扩展问题,只要想明白原理也很容易理解,比如:

1、两边同时断开TCP连接?

仍然是要四次挥手的。以下是RFC-793的说法:

    A simultaneous CLOSE by users at both ends of a connection causes
FIN segments to be exchanged. When all segments preceding the FINs
have been processed and acknowledged, each TCP can ACK the FIN it
has received. Both will, upon receiving these ACKs, delete the
connection.

2、二三次挥手能否合一?

可以。首先两个标志位FIN、ACK可以同时置为1,然后服务端收到断开请求时刚好没有数据可以传递,就可以合一。

如果还有数据,那就不能合一。

3、TIME_WAIT的问题?

短时间内关闭大量连接的化,必然出现大量TIME_WAIT状态的连接。这消耗了服务器的资源。

更重要的是它会占用客户端的本地端口和服务器的熟知端口。

大多数T C P实现(如伯克利版)强加了更为严格的限制。在2 M S L等待期间,
插口中使用的本地端口在默认情况下不能再被使用。

在连接处于2 M S L等待时,任何迟到的报文段将被丢弃。因为处于2 M S L等待的、由该插
口对(socket pair)定义的连接在这段时间内不能被再用,因此当要建立一个有效的连接时,来
自该连接的一个较早替身( i n c a r n a t i o n)的迟到报文段作为新连接的一部分不可能不被曲解

因此Linux提供了快速回收的机制。为了使得这个机制在不用TIME_WAIT的情况下安全运行,有些连接会被拒绝。

Linux同样提供了它的重用机制,具体可见https://studygolang.com/articles/10613

4、没有正常关闭?

客户端和服务端并不会使用应用级的定时器检测对方的活动状态,保活并不是TCP规范中的一部分。

但它仍然十分有用,以下是一个例子:

如果一个给定的连接在两个小时之内没有任何动作,则服务器就向客户发送一个探查报
文段(我们将在随后的例子中看到这个探查报文段看起来像什么)。客户主机必须处于以下4
个状态之一。
1) 客户主机依然正常运行,并从服务器可达。客户的T C P响应正常,而服务器也知道对
方是正常工作的。服务器在两小时以后将保活定时器复位。如果在两个小时定时器到时间之
前有应用程序的通信量通过此连接,则定时器在交换数据后的未来2小时再复位。
2) 客户主机已经崩溃,并且关闭或者正在重新启动。在任何一种情况下,客户的T C P都
没有响应。服务器将不能够收到对探查的响应,并在7 5秒后超时。服务器总共发送1 0个这样
的探查,每个间隔7 5秒。如果服务器没有收到一个响应,它就认为客户主机已经关闭并终止
连接。
3) 客户主机崩溃并已经重新启动。这时服务器将收到一个对其保活探查的响应,但是这
个响应是一个复位,使得服务器终止这个连接。
4) 客户主机正常运行,但是从服务器不可达。这与状态2相同,因为T C P不能够区分状态
4与状态2之间的区别,它所能发现的就是没有收到探查的响应。
服务器不用关注客户主机被关闭和重新启动的情况(这指的是一个操作员的关闭,而不
是主机崩溃)。当系统被操作员关闭时,所有的应用进程也被终止(也就是客户进程),这会
使客户的T C P在连接上发出一个F I N。接收到F I N将使服务器的T C P向服务器进程报告文件结
束,使服务器可以检测到这个情况。

现在,可以回到那张经典的TCP状态变迁图,回想TCP连接和断开的细节了。

注:

本文主要引自《TCP/IP详解 卷一:协议》,部分内容源于网上。

如有侵权,请告知。

TCP断开那些事的更多相关文章

  1. (转)TCP协议那些事

    (上) TCP是一个巨复杂的协议,因为他要解决很多问题,而这些问题又带出了很多子问题和阴暗面.所以学习TCP本身是个比较痛苦的过程,但对于学习的过程却能让人有很多收获.关于TCP这个协议的细节,我还是 ...

  2. TCP的那些事(转载)

    (转载本站文章请注明作者和出处 酷 壳 – CoolShell.cn ,请勿用于任何商业用途) TCP是一个巨复杂的协议,因为他要解决很多问题,而这些问题又带出了很多子问题和阴暗面.所以学习TCP本身 ...

  3. tcp断开连接,4次握手,为什么wireshark 只能抓到3个包?

    用wireshark 抓包,看看tcp 断开连接的过程.  以前书上说tcp断开连接,4次握手,可我为什么wireshark 只能抓到3个包? 百度一下,别人也有类似的疑问. [求助]书上和网上的资料 ...

  4. TCP的那些事-2

    这篇文章是下篇,所以如果你对TCP不熟悉的话,还请你先看看上篇<TCP的那些事儿(上)> 上篇中,我们介绍了TCP的协议头.状态机.数据重传中的东西.但是TCP要解决一个很大的事,那就是要 ...

  5. tcp断开的4次挥手

    http://blog.csdn.net/fw0124/article/details/7452695 由于TCP连 接是全双工的,因此每个方向都必须单独进行关闭.这原则是当一方完成它的数据发送任务后 ...

  6. TCP断开连接(四次挥手)

    四次挥手 ACK建立连接之后都为1. 1.A发送释放连接报文段,FIN=1. 2.B收到并回复确认,TCP进入半关闭状态,即此时B能向A发送,但是A无法向B发送数据. 3.当B传输完所有数据之后,发送 ...

  7. TCP协议那些事

    tcp三次握手                                     tcp四次挥手   tcp十种状态 tcp的2MSL问题 说明 2MSL即两倍的MSL,TCP的TIME_WAI ...

  8. tcp断开时分几步

    连接时是三次握手 断开时是四次握手,因为它是半关闭造成的

  9. [转载] tcp那些事1

    原文: http://coolshell.cn/articles/11564.html TCP是一个巨复杂的协议,因为他要解决很多问题,而这些问题又带出了很多子问题和阴暗面.所以学习TCP本身是个比较 ...

随机推荐

  1. 基于VC的MFC界面开发

    教你熟悉VC6.0创建一个可视化软件的过程 UpdateData(TRUE);//将输入数据赋给文本框变量. UpdateData(FALSE);//将内容显示在文本框中 AfxMessageBox( ...

  2. C语言经典题目

    回顾一下吧: 一. 有1.2.3.4个数字,能组成多少个互不相同且无重复数字的三位数?都是多少? 解析:可填在百位.十位.个位的数字都是1.2.3.4.组成所有的排列后再去 掉不满足条件的排列. 常规 ...

  3. jquery 第二章

    1.本章目标    css样式    选择器2.css样式    宽.高.边框.背景颜色.字体....... <html> <head> <style> div{ ...

  4. PHP游戏概率方法

    <?php function createRandomKey($randArr, $rateKey){ $total = 0; $chooseArr = array(); $pow = 0; / ...

  5. lintcode 447 Search in a Big Sorted Array(倍增+二分)

    题意:给一个按照升序排序的正整数数组.这个数组很大以至于只能通过固定的接口ArrayReader->get(k)来访问第k个数.并且也没有办法得知这个数组有多大.找到给出的整数target第一次 ...

  6. Python_queue单项队列

    队列(queue),实现程序间的松耦合 队列的三种类: class queue.Queue(maxsize)# 先进先出, maxsize 指定队列长度,线程安全的清况下,可以放入实例,对实例进行传输 ...

  7. seata-server安装、运行(ubuntu)

    seata-server为seata中的事务协调器. seata的wiki https://github.com/seata/seata/wiki/Home_Chinese 一.下载并安装 wget ...

  8. Imcash:比特币减半 四年机遇你能否抓住?

    减半到底是什么? 2010来,比特币已有4次下跌幅度达70%或更高. 2012年的11月份比特币减半,诞生了一次上涨10倍有余的超级牛市. 2016年7月,历史又是如此的相似,比特币产量又迎来了减半, ...

  9. [wordpress]WordPress地址(URL)错误,修改解决方案

    本人在修改Wordpress地址(URL)时,误操作使URL指向错误,后台无法进入. 解决方案 1.先利用Putty登陆到自己的服务器上(这里登陆方法我不再赘述): 2.登陆MySqL,并输入密码: ...

  10. JAVA篇<一> 继承extends(已转移到JAVA总结篇)

    前题:如果不经过指出继承,那么所有的类都继承了JAVA中的Object类. 正文: 继承的关键字是:extends,是所有面向对象语言的重要特性. 例public class TestExtends ...