TCP断开那些事
继上一篇后,我们再来看一下四次挥手的过程
这里其实没有必要过多阐述,一张图胜过千言万语。
与三次握手一样,四次挥手的过程中也有许多扩展问题。
当然问的最多的还是:为什么要四次握手?为什么要等待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断开那些事的更多相关文章
- (转)TCP协议那些事
(上) TCP是一个巨复杂的协议,因为他要解决很多问题,而这些问题又带出了很多子问题和阴暗面.所以学习TCP本身是个比较痛苦的过程,但对于学习的过程却能让人有很多收获.关于TCP这个协议的细节,我还是 ...
- TCP的那些事(转载)
(转载本站文章请注明作者和出处 酷 壳 – CoolShell.cn ,请勿用于任何商业用途) TCP是一个巨复杂的协议,因为他要解决很多问题,而这些问题又带出了很多子问题和阴暗面.所以学习TCP本身 ...
- tcp断开连接,4次握手,为什么wireshark 只能抓到3个包?
用wireshark 抓包,看看tcp 断开连接的过程. 以前书上说tcp断开连接,4次握手,可我为什么wireshark 只能抓到3个包? 百度一下,别人也有类似的疑问. [求助]书上和网上的资料 ...
- TCP的那些事-2
这篇文章是下篇,所以如果你对TCP不熟悉的话,还请你先看看上篇<TCP的那些事儿(上)> 上篇中,我们介绍了TCP的协议头.状态机.数据重传中的东西.但是TCP要解决一个很大的事,那就是要 ...
- tcp断开的4次挥手
http://blog.csdn.net/fw0124/article/details/7452695 由于TCP连 接是全双工的,因此每个方向都必须单独进行关闭.这原则是当一方完成它的数据发送任务后 ...
- TCP断开连接(四次挥手)
四次挥手 ACK建立连接之后都为1. 1.A发送释放连接报文段,FIN=1. 2.B收到并回复确认,TCP进入半关闭状态,即此时B能向A发送,但是A无法向B发送数据. 3.当B传输完所有数据之后,发送 ...
- TCP协议那些事
tcp三次握手 tcp四次挥手 tcp十种状态 tcp的2MSL问题 说明 2MSL即两倍的MSL,TCP的TIME_WAI ...
- tcp断开时分几步
连接时是三次握手 断开时是四次握手,因为它是半关闭造成的
- [转载] tcp那些事1
原文: http://coolshell.cn/articles/11564.html TCP是一个巨复杂的协议,因为他要解决很多问题,而这些问题又带出了很多子问题和阴暗面.所以学习TCP本身是个比较 ...
随机推荐
- WebService - 术语介绍
一.WebService是什么? 1. 基于Web的服务:服务器端整出一些资源让客户端应用访问(获取数据) 2. 一个跨语言.跨平台的规范(抽象) 3. 多个跨平台.跨语言的应用间通信整合的方案(实际 ...
- 【easy】88. Merge Sorted Array 合并两个有序数组
合并两个有序的list 把排序好的nums2插入nums1中,假设nums1这个vector的空间永远是够的 思路:倒序!! class Solution { public: void merge(v ...
- 【原创】大叔问题定位分享(7)Spark任务中Job进度卡住不动
Spark2.1.1 最近运行spark任务时会发现任务经常运行很久,具体job如下: Job Id ▾ Description Submitted Duration Stages: Succeed ...
- 小程序引入百度api天气预报
先看下最终的效果(默认可以获得未来三天数据): 第一:首先准备条件(必须): 1.小程序已认证,有appID 2.必须把https://api.map.baidu.com 添加到小程序的合法域名列表中 ...
- vue ajax返回html代码不渲染解决
<span v-html='lists.html'></span>
- python基础之常用关键字总结
前言 到python3.6为止,python内置的关键字有33个,比python2.7的版本多了2个.下面总结一下python3的关键字的使用. python内置关键字 解释器在加载上下文的时候,如果 ...
- vue-cli 打包编译 -webkit-box-orient: vertical 被删除解决办法
前言 -webkit-box-orient: vertical在本地开发环境运行都没问题,一旦打包以后就会丢失 正文 原因: -webkit-box-orient: vertical 这个属性被 o ...
- mysql group by 过滤字段 只能在SELECT 后面出现,不能写其他字段 报错解决 关键字 sql_mode=only_full_group_by
1:报错 关键字 sql_mode=only_full_group_bymysql> select uuid,ip,count(*) from dbname_report.t_client_i ...
- VMware虚拟机下安装ubuntu操作系统
安装tools:
- 20172328 2018-2019《Java软件结构与数据结构》第六周学习总结
20172328 2018-2019<Java软件结构与数据结构>第六周学习总结 概述 Generalization 本周学习了第十章:非线性集合与数据结构--树.主要讨论了树的使用和实现 ...