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


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

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

当然问的最多的还是:为什么要四次握手?为什么要等待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. Mac环境下的mongodb的安装

    1.安装MongoDB brew install mongodb 这个是默认安装最新版本的 mogodb,如果想安装指定版本可以先查看 mongodb 版本 brew search mongodb m ...

  2. 写给自己看的vue

    学习过程:自学(个人demo驱动),论坛,qq群多少听到vue,react(很抱歉只弄了hello world demo 虚拟dom 也是概念 到目前也没弄清楚)这类框架(工作经历前后端都折腾,老板指 ...

  3. kafka知识点详解

    第一部分:kafka概述 一.定义(消息引擎系统) 一句话概括kafka的核心功能就是:高性能的消息发送与高性能的消息消费. kafka刚推出的时候是以消息引擎的身份出现的,它具有强大的消息传输效率和 ...

  4. 【原创】大数据基础之Kafka(1)简介、安装及使用

    kafka2.0 http://kafka.apache.org 一 简介 Kafka® is used for building real-time data pipelines and strea ...

  5. R leaflet

    setRepositories()#1 chooseCRANmirror()#2 ibrary(leaflet)#学习地址:http://rstudio.github.io/leaflet/marke ...

  6. Python的单例模式

    一.何为单例模式 单例模式:保证一个类仅有一个实例,并提供一个访问他的全局访问点. 实现某个类只有一个实例的途径: 1.让一个全局变量使得一个对象被访问,但是他不能防止外部实例化多个对象. 2.让类自 ...

  7. javac编译后运行提示找不到或无法加载主类

    第一种常见错误: package demo_01; public class hello { public static void main(String[] args) { System.out.p ...

  8. 饮冰三年-人工智能-Python-18Python面向对象

    1 类与实例对方法和属性的修改 class Chinese: # 这是一个Chinese的类 #定义一个类属性,又称为静态数据或者静态变量,相当于C#中的static country="Ch ...

  9. ~/Library/MobileDevice/Provisioning Profiles

    ~/Library/MobileDevice/Provisioning Profiles

  10. ionic 3 热更新 Hot Code Push

    最近用ionic 3 做的app业务做的差不多了,突然想到以后app如果有更新该怎么搞?想到我们的app后期更新应该不大,,最多就是改改bug和增加下用户体验,如果只有一些小的更新,然后提交各个应用商 ...