4.3设置TIME_WAIT状态的目的

TIME_WAIT状态是TCP中最容易被人误解的特性之一。因为很多的标准文档都没有对该状态做一个详细的说明和解释。设置TIME_WAIT状态的原因主要有以下两个:

  • 用来实现全双工的连接关闭;
  • 它使过时的重复报文段作废;

下面我们对这两个原因做详细的说明。

4.3.1 实现TCP全双工连接的关闭

下图(图4-4)给出了一般情况下关闭连接时的报文交互流程,也就是我们常说的四次挥手过程;同时也给出了两端连接的状态变迁和服务器端测得的RTT值。

服务器端和客户端都可以是断开连接的发起端,这里我们使用的是客户端作为发起端

  • 关于是由服务器端发起还是客户端发起是很有讲究的,因为首先发起FIN报文(断开连接)的一端会进入TIME_WAIT状态,此状态会占用CPU、内存等资源,对于繁忙的服务器来说可能是很大的负担,因此很多服务器都尽量避免使自己进入TIME_WAIT状态

​ 现在我们假设最后一个报文段(最后一个ACK)丢失时会发生什么现象。我们把这个现象的结果也以图形的方式显示出来:


​ 从图4-5我们可以看出最后一个ACK报文丢失时,服务器端会重新传输FIN报文。如果是最后一个FIN包丢失,服务器端也会重新传输FIN报文,因为服务器无法确定是FIN丢失还是ACK丢失,他们的处理方法是相同的。

序号 情形 解决方式
1 最后一个ACK丢失 服务器端重传FIN
2 最后一个FIN丢失 服务器端重传FIN

​ 上图从可以得出以下结论:

  • TIME_WAIT状态要出现在执行主动关闭的一端

该端发出最后一个ACK报文段,而如果这个ACK丢失或是最后一个FIN丢失了,那么另一端将超时并重传最后的FIN报文段。因此,在主动关闭的一端保留连接的状态信息,这样它才能在需要的时候重传最后的确认报文段;否则,它收到最后的 FIN报文段后就无法重传最后一个 ACK,而只能发出RST报文段,从而造成虚假的错误信息。

  • TIME_WAIT状态定时器重新启动

在主动关闭的一端仍然处于TIME_WAIT状态时, 如果收到对端超时重传的FIN报文,主动关闭的一端不仅会重新传输ACK报文,也会重新启动TIME_WAIT定时器(时间重新设置为2倍的报文段最大生存时间:2MSL)

  • TIME_WAIT时间应该持续多久?

这个加倍等待时间取决于RTO, 而RTO取决于链路的RTT。这里常使用指数退避算法来使RTO值比上次重传的值更大来实现。RFC 793 指出MSL为2分钟, TIME_WAIT时间为2MSL。然而,实现中的常用值是30秒,1分钟, 或2分钟。

总结下第一个用途如下:
主动关闭的一端为了应对(因最后的FIN或ACK丢失导致的)超时重传,而进入TIME_WAIT阶段以备超时重传。最终目的是为了正常关闭全双工的连接

4.3.2 使过时的重复报文段失效

​ 设置TIME_WAIT状态的第二个原因是为让过时的重复报文段失效。TCP协议的运行基于一个基本的假设:互联网上的每一个IP报文都有一个生存期限。 我们将这个生存期限定义为报文段的最大生存时间(MSL),并规定该值为2分钟。 最后RFC793规定TIME_WAIT时间为MSL的2倍

​ 图4-6给出的是一个连接关闭后在TIME_WAIT状态保持了 2 倍报文段最大生存时间( 2MSL),然后发起建立新的连接情景:

总结下第二个原因:

由于新的连接必须在前一个连接关闭 2MSL之后才能再次发起,且前一个连接的过时重复报文段在 TIME_WAIT状态的第 1个MSL里就已经消失,因此我们可以保证前一次连接的过时重复报文段不会在新的连接中出现,也就不可能被误认为是第二次连接的报文段

4.3.3 TIME_WAIT状态的自结束

RFC 793 中规定,处于TIME_WAIT状态的连接在收到RST后变迁到CLOSE状态,这称为TIME_WAIT状态的自结束。 RFC 1337 [Braden 1992a] 中则建议不要用RST过早地结束TIME_WAIT状态。

4.3.4 TIME_WAIT状态的影响(补充)

处理的原则是:当TCP执行一个主动关闭,并发送最后一个ACK,该连接必须在TIME_WAIT状态停留的时间为 2倍的MSL。这样可让TCP再次发送最后的ACK以防这个ACK丢失(另一端超时并重发最后的FIN)。

重新发送ACK并不是说重传了ACK, 因为ACK不消耗序列号,因此不会简单重传ACK。而是由于对端重新传输了FIN报文。实际上TCP总是重传FIN,知道它收到最后一个ACK。

​ 这种2MSL等待的另一个结果是这个TCP连接在2MSL等待期间,定义这个连接(客户的I P地址和端口号,服务器的 I P地址和端口号)不能再被使用。这个连接只能在2MSL结束后才能再被使用。在连接处于2 M S L等待时,任何迟到的报文段将被丢弃。

客户端执行主动关闭并进入TIME_WAIT是正常的。服务器通常执行被动 关闭,不会进入TIME_WAIT状态。这暗示如果我们终止一个客户程序,并立即重新启动这个客户程序,则这个新客户程序将不能重用相同的本地端口。这不会带来什么问题,因为客户使用本地端口是由操作系统分配的临时可用的端口号,而并不关心这个端口号是什么

​ 然而,对于服务器,情况就有所不同,因为服务器使用熟知固定端口。如果我们终止一个已 经建立连接的服务器程序,并试图立即重新启动这个服务器程序,服务器程序将不能把它的 这个熟知端口赋值给它的端点,因为那个端口是处于2MSL连接的一部分。在重新启动服务器 程序前,它需要在1 ~ 4分钟。想象以下:淘宝服务器关闭四分钟,那会是怎样的损失呢!!!

解决办法:地址端口的快速复用

某些实现和A P I提供了一种避开这个限制的方法。使用套接字API时,可说明其中的 SO_RUSEADDR选项。它将让调用者对处于2 M S L等待的本地端口进行赋值,但我们 将看到TCP原则上仍将避免使用仍处于2MSL连接中的端口。

TCP协议中的TIME_WAIT详细说明的更多相关文章

  1. tcp协议close_wait与time_wait状态含义

    题目描述 1.什么是三次握手,四次挥手?为什么分别要三次与四次? 2.tcp协议中,close_wait与time_wait状态分别代表什么含义,为什么要设计这两种状态,解决了什么问题? 3.time ...

  2. TCP协议中的三次握手和四次挥手(图解)【转】

    建立TCP需要三次握手才能建立,而断开连接则需要四次握手.整个过程如下图所示: 先来看看如何建立连接的. [更新于2017.01.04 ]该部分内容配图有误,请大家见谅,正确的配图如下,错误配图也不删 ...

  3. python中TCP协议中的粘包问题

    TCP协议中的粘包问题 1.粘包现象 基于TCP实现一个简易远程cmd功能 #服务端 import socket import subprocess sever = socket.socket() s ...

  4. 从TCP三次握手说起–浅析TCP协议中的疑难杂症(2)

    版权声明:本文由黄日成原创文章,转载请注明出处: 文章原文链接:https://www.qcloud.com/community/article/108 来源:腾云阁 https://www.qclo ...

  5. TCP协议中的SO_LINGER选项

    TCP协议中的SO_LINGER选项 SO_LINGER选项用来设置延迟关闭的时间,等待套接字发送缓冲区中的数据发送完成.没有设置该选项时,在调用close()后,在发送完FIN后会立即进行一些清理工 ...

  6. TCP 协议中的 Window Size与吞吐量

    原地址:http://blog.sina.com.cn/s/blog_c5c2d6690102wpxl.html TCP协议中影响实际业务流量的参数很多,这里主要分析一下窗口的影响. ​TCP窗口目的 ...

  7. 客户端验证、tcp协议中多个客户端的同时在线

    一.客户端验证 当在一个局域网内需要验证是否为合法的客户端连接时,我们需要写代码进行验证. Server端 import os import hmac import socket def auth(c ...

  8. TCP 连接中的TIME_WAIT

    原文:http://blog.csdn.net/wangpengqi/article/details/17245349 这就有个细节,一次http请求,谁会先断开TCP连接?什么情况下客户端先断,什么 ...

  9. tcp连接的状态变迁以及如何调整tcp连接中处于time_wait的时间

    一.状态变迁图 二.time_wait状态 针对time_wait和close_wait有个简单的描述帮助理解: Due to the way TCP/IP works, connections ca ...

随机推荐

  1. 能够进行多段文本匹配的NFA改良算法

    下面的代码基于NFA算法实现了在多段字符串中匹配正则表达式,对比NFA算法可以看到它将pc由局部变量提升为类成员,以保存中间匹配状态,另外在匹配成功后将pc恢复到null状态.实际使用中,此类还应该增 ...

  2. 【笔记】matplotilb数据可视化基础

    matplotilb基础 matplotilb是我们使用的一个基础的可视化方法 一般来说,使用matplotilb是较为专业的绘制图形的选择 不需要很专业的时候可以只是用matplotilb的子模块p ...

  3. ☕【Java技术指南】「Guava Collections」实战使用相关Guava不一般的集合框架

    Google Guava Collections 使用介绍 简介 Google Guava Collections 是一个对 Java Collections Framework 增强和扩展的一个开源 ...

  4. Dart空安全的底层原理与适配

    一.在空安全推出之前,静态类型系统允许所有类型的表达式中的每一处都可以有 null. 从类型理论的角度来说,Null 类型被看作是所有类型的子类: 类型会定义一些操作对象,包括 getters.set ...

  5. 从零开始实现简单 RPC 框架 4:注册中心

    RPC 中服务消费端(Consumer) 需要请求服务提供方(Provider)的接口,必须要知道 Provider 的地址才能请求到. 那么,Consumer 要从哪里获取 Provider 的地址 ...

  6. noip15

    童话故事专场 T1 首先,dead line 是一条直线,而不是线段.考试的时候一直以为是线段,那么横竖共有n+m条,考虑斜着的,斜着的交点为有穷的,则需要满足斜率不同,那么只需要统计一边的,再乘2就 ...

  7. NOIP 模拟 $23\; \rm 联$

    题解 \(by\;zj\varphi\) 区间上的问题,一般都用线段树来解决(但是这题也可以用 \(\rm ODT\)) 对于每段段区间设置三个参数,分别表示这个区间是否只有 \(1\) 或 \(0\ ...

  8. 题解 Merchant

    传送门 可以发现如果我们最终选择的物品集合已经确定,就很好求了 \(\sum k*t+\sum b \geqslant s\) ,二分即可 但现在我们无法确定该选哪些物品 因此我们只需要check一下 ...

  9. luoguP1528&2329 栅栏&切蛋糕

    前言 蒟弱本来是在亿万年前做二分答案专题栅栏的,由于数据水所以过掉了,后来发现有一个数据加强版,也就是本题,于是爆T了...过了有个五六个月回来填坑了...现在开O2是在最优解第一个(自豪ing 题目 ...

  10. 教你IO流来便利电脑磁盘所有文件,把图片放到一个文件夹里(会发现什么不可告人的密码)

    一.需求 我要把C盘下面的所有图片都拿出来,放到一个新文件夹中.今天小编一身正气,看看有没有什么意外发现!!学会看看自己的盘,悄悄的哦!!! 二.代码展示(运行时间可能有点长) import java ...