TCP四次挥手详解(含常见面试题)

TCP四次挥手详解 1、四次挥手状态及消息类型 第一次挥手:假设客户端打算关闭连接,发送一个TCP首部FIN被置1的FIN报文给服务端。 第二次挥手:服务端收到以后,向客户端发送ACK应答报文。 第三次挥手:等待服务端处理完数据后,向客户端发送FIN报文。 第四次挥手:客户端接收到FIN报文后回一个ACK应答报文。 服务器收到ACK报文后,进入close状态,服务器完成连接关闭。 客户端在经过 2MSL一段时间后,自动进入close状态,至此客户端也完成连接的关闭。 2、为什么挥手需要四次? 关闭连接时,客户端发送FIN报 阅读详情
AI摘要

本文详细解析了TCP连接的四次挥手过程,包括客户端和服务端的状态转换,并探讨了挥手过程中可能出现的报文丢失情况及处理机制。TIME_WAIT状态的作用在于防止错误接收历史报文和确保双方正常关闭连接。此外,文中还讨论了TIME_WAIT等待时间2MSL的设定原因,以及过多TIME_WAIT状态的危害及优化策略。

TCP四次挥手过程

  1. 客户端发起fin位为1的FIN报文,此时客户端进入FIN_WAIT_1状态
  2. 服务端接受到FIN 报文后,发送ack应答报文,此时服务端进入close_wait状态
  3. 客户端接受到ack应答报文后,进入FIN_WAIT_2状态
  4. 服务端处理完数据后,向客户端发送FIN报文,此时服务端进入LAST_ACK状态
  5. 客户端接受到FIN报文后,客户端发送应答ack报文,进入TIME_WAIT阶段
  6. 服务端接受到ack报文后,断开连接,处于close状态
  7. 客户端过一段时间后,也就是2MSL后,进入close状态

在这里插入图片描述
主动关闭连接的,才有TIME_WAIT状态

为什么挥手需要四次?

由于 TCP 的半关闭(half-close)特性,TCP 提供了连接的一端在结束它的发送后还能接收来自另一端数据的能力。

任何一方都可以在数据传送结束后发出连接释放的通知,待对方确认后进入半关闭状态。当另一方也没有数据再发送的时候,则发出连接释放通知,对方确认后就完全关闭了TCP连接。
通俗的来说,两次握手就可以释放一端到另一端的 TCP 连接,完全释放连接一共需要四次握手。

举个例子:A 和 B 打电话,通话即将结束后,A 说 “我没啥要说的了”,B 回答 “我知道了”,于是 A 向 B 的连接释放了。但是 B 可能还会有要说的话,于是 B 可能又巴拉巴拉说了一通,最后 B 说“我说完了”,A 回答“知道了”,于是 B 向 A 的连接释放了,这样整个通话就结束了。

挥手报文丢失会发生什么?

第一次挥手丢失

当客户端调用close函数后,就会向服务端发送FIN报文,试图与服务端断开联系,此时客户端进入FIN_WAIT_1状态。

如果客户端一直收不到ack应答报文的话,就会触发超时重传机制,最大重传次数由tcp_orphan_retries参数决定。当超过指定次数时,就不再发送报文,直接进入close状态

第二次挥手丢失

当接受到客户端的FIN报文,就会先回应一个ack报文,此时服务端进入close_wait状态。

当ack报文丢失时,ack是不会重传的。服务端的ack报文丢失了,客户端就会触发超时重传,直到收到ack报文或则到达超时重传次数

第三次挥手丢失

当服务端接收到客户端的fin报文时,内核会自动回复ack应答报文,然后处于CLOSE_WAIT状态,他必须等待应用进程调用close函数关闭连接。

调用close函数后,内核就会发出FIN报文,进入LAST_ACK状态,等待客户端返回ack来确认关闭连接。

如果服务端没有收到ack,则会跟客户端重传FIN报文一样

第四次挥手丢失

当客户端接收到服务端发来的FIN报文后,就会回应ack应答报文,进入TIME_WAIT状态。

服务端没有收到ack报文之前,还是处于LAST_ACK状态

如果服务端没有收到ack报文的话,服务端就会重发FIN报文,重发次数仍然由tcp_orphan_retries参数控制

为什么需要TIME_WAIT状态

主要是两方面:

  • 防止错误接收历史报文
  • 保证双方能够正常关闭

防止错误接收历史报文

tcp序列号可能会发生绕回问题,这就意味着无法通过tcp序列号来判断是不是历史报文。(时间戳可以解决是不是历史报文问题,时间戳还可以精确计算RTT)

假设没有TIME_WAIT状态,那么在关闭连接前有个报文被延迟了。关闭后,又重新建立了相同四元组的连接,此时前一个被延迟的数据包到达了(没有到达最大生存时间),并且正好在接收窗口内,那么服务端就会错误接收,使得数据混乱。
在这里插入图片描述

因此有了这个TIME_WAIT字段,可以保证两边的历史数据都被丢弃了,以后的数据包都是新建立连接的。

保证双方能够正常关闭

如果没有TIME_WAIT状态的话,客户端最后一次发送ack应答报文后就进入了close阶段。如果服务端没有收到ack报文的话,就会重传FIN报文,而此时客户端已经close了,就会返回一个RST错误报文。
在这里插入图片描述

而有了TIME_WAIT状态的话,客户端并不会着急关闭,而是等待了2MSL再关闭,这样的话就算重传的fin报文也能正确响应,保证了服务端的正确关闭
这里客户端重新接收到了重发的fin报文,time_wait就会重置(也是为了重复报文的消失,不然的话ack报文可能就会到下一次连接中了),相当于可以重传多次fin报文,直到fin报文上限

为什么TIME_WAIT等待时间是2MSL?

MSL是报文的最大生存时间,超过这个时间,报文就将丢弃。
因为tcp是基于ip协议的,ip头中有一个ttl字段,表示ip数据包可以经过的最大路由数。每经过一个节点时,就减一,减为0则丢弃报文。
MSL和TTL的区别:MSL的单位是时间,而TTL的单位则是路由跳数。所以MSL应该大于等于TTL的时间,确保报文已经消亡

TIME_WAIT比较合理的解释是:确保对方能够收到最后一个ack报文,如果服务端没有收到最后的ack报文,就会触发超时重传fin报文,从客户端发送ack报文到接到到服务端重传的fin报文,一去一来,最晚要2msl

为什么不是1MSL??

  • 因为1MSL可能导致历史数据还没有消亡,导致被后面相同的四元组接收。比如服务端重发的fin报文
  • 客户端发送的ack报文不允许丢失,不然重发的fin报文不能抵达客户端,导致服务端RST关闭

为什么不是4MSL或8MSL

  • 因为如果客户端发送的ack报文丢失,服务端重发的fin报文也丢失了,那么2MSL就不起作用了。那么需要给它设置更长时间??我们设想在一个丢包率为1%的糟糕网络中,两次连续丢包的概率为万分之一,忽略它显然给解决它更具有实际意义

TIME_WAIT过多有什么危害?

  • 服务端受内存资源占用
    当服务端有过多的的TCP连接时,虽然理论上可以建立很多连接,因为一个服务端只监听一个端口,不会导致端口资源受限。但是tcp连接需要占用系统资源,比如cpu资源,文件描述符,线程资源等等
  • 客户端受端口资源的占用
    一个tcp占用一个发起连接方的一个本地端口,如果tcp连接过多,则会导致端口资源不足,无法建立新连接

如何优化TIME_WAIT??

  • 打开net.ipv4.tcp_tw_reuse 和 net.ipv4.tcp_timestamps 选项
    net.ipv4.tcp_tw_reuse之只能用于客户端,当有连接时,客户端会随机找一个time_wait状态超过1s的连接给新连接复用。
    net.ipv4.tcp_timestamps开启时间戳,可以保证历史连接不会被下一个相同的四元组接收
  • net.ipv4.tcp_max_tw_buckets
    这个值默认为18000,当系统处于time_wait状态的连接大于这个值时,后面的连接状态就会被重置,不会产生新的time_wait状态
  • 程序中使用 SO_LINGER
    在这里插入图片描述
    当l_onoff为非0,l_linger为0时,调用close关闭连接时就会直接发送RST报文,直接跳过四次挥手阶段

如果服务端要尽量避免TIME_WAIT状态的连接,就尽量不要让服务端来断开连接,承受time_wait状态,而是尽量让我们发布各地的客户端来断开连接

《UNIX网络编程》一书中却说道:TIME_WAIT 是我们的朋友,它是有助于我们的,不要试图避免这个状态,而是应该弄清楚它。

如果已经建立了连接,但是另一端突然出现故障,会发生什么???

TCP有一个保活机制,当一端时间相互直接没有发送数据时,就会触发保活机制。即每隔一段时间都发送一次探测报文给对方,如果几次都不回应的话,就会认为对方已经死亡了,那么就会断开连接。
如果需要使用保活机制,那么需要在soket接口设置so_keepliive才能生效,如果没有设置,则不可以生效
TCP的检测时间有点长,我们可以在应用层实现一个心跳机制。
web服务一般都会提供time_keeplive参数,用来指定http长连接超时时间。

TCP四次挥手过程 四次挥手 状态转化:A、B连接建立状态ESTABLISHED -> A终止等待1状态FIN-WAIT-1 -> B关闭等待状态2CLOSE-WAIT -> A终止等待2状态FIN-WAIT-2 -> B最后确认状态LAST-ACK -> A时间等待状态TIME-WAIT -> B、A关闭状态CLOSED 四次挥手过程 第一次挥手:A数据传输完毕需... 阅读详情

相关推荐

详解TCP四次挥手(断开TCP连接过程)

在讲述TCP三次握手,即建立TCP连接的过程之前,需要先介绍一下TCP协议的包结构。 TCP协议包结构: 这里只对涉及到三次握手过程的字段做解释 (1) 序号(Sequence number) 我们通过 TCP 协议将数据发送给对方,就比如 hellotcp,这一串字节流,假设被拆分成了三个 TCP 报文段,第一个报文段携带了 hel,第二个报文段携带了 lot,第三个报文段携带了 cp,这三个报文段不一定是按照顺序送到对端的,那么对端收到这三个段是如何确定他们的顺序的呢?此时序号的意义就体现在这里。 T

Three__Curry的博客 9290

TCP连接的“三次握手”与“4次挥手”

“三次握手”:所谓的三次握手即TCP连接的建立。这个连接必须是一方主动打开,另一方被动打开的。 以下为客户端主动发起连接的图解: 握手之前主动打开连接的客户端结束CLOSED阶段,被动打开的服务器端也结束CLOSED阶段,并进入LISTEN阶段。随后开始“三次握手”: (1)首先客户端向服务器端发送一段TCP报文,其中:标记位为SYN,表示“请求建立新连接”;序号为Seq=X(X一般为1);随后客户端进入SYN-SENT阶段。 (2)服务器端接收到来自客户端的TCP报文之后,结束LISTE.

corner_dust的专栏 829

TCP常见面试题

1.画出TCP的报头 2.说一下TCP的三次握手过程3.为什么TCP握手需要三次?TCP是可靠的传输控制协议,三次握手能保证数据可靠传输又能提高传输效率。如果TCP的握手是两次: <1>如果client发给server的SYN报文因为网络原因,延迟发送。由于client没有收到server对SYN的确认报文,会重发SYN报文,服务器和回复ACK,连接建立。数据发送完毕,这条连接被正常关闭。这时,

wendy_keeping的博客 2万+

TCP的三次握手和四次挥手及常见面试题

一、前言 今天上掘金查看热门文章,发现一篇好文★前端 100 问:能搞懂 80% 的请把简历给我★,此文包含100个前端面试问题,仔细阅读完所有题目后,顿感身中数刀无法呼吸,留下了没有技术的泪水,只好回炉重塑 ~ 文章第16题:谈谈你对TCP三次握手和四次挥手的理解? 这是前端面试频率特别高的一个题目,接下来我们学习一下TCP的三次握手和四次挥手 二...

越努力,越幸运! 1万+

TCP三次握手四次挥手以及常见面试题

举例:两个人要对讲,首先要确保双方都能说也能听 A:喂喂喂,在吗? --》A能说 B:在呢在呢,收到收到 --》B能说 也能听 A:好的好的 --》A能听 A:你在干嘛呢? B:我正吃饭呢? A:你吃的啥? B:你猜? A:我猜你吃的肉夹馍 A:不和你聊了,拜拜 A-->不说了 B:收到 ---》B--》不听了 B:其实我吃的油泼面 B:拜拜 B---》不说了 A:好的 A--》不听了 三次握手四次挥手: 第一次握手:客户端向服务器发送...

qq_60174363的博客 568

TCP三次握手、四次挥手及常见面试题全集

TCP三次握手、四次挥手几常见面试题全集TCP报文首部TCP连接的建立(三次握手)TCP连接的释放(四次挥手)常见面试题汇总 本文按照先介绍TCP的三次握手和四次挥手的详细过程,再列出面试过程中常见的问题。 TCP报文首部 源端口和目的端口,各占2个字节,分别写入源端口和目的端口; 序号,占4个字节,TCP连接中传送的字节流中的每个字节都按顺序编号。例如,一段报文的序号字段值是 301 ,而携...

迈微AI研习社 · 号主 1283

TCP三次握手及四次挥手详解及常见面试题

TCP的报头: 1. 源端口号:表示发送端端口号,字段长为16位。 2. 目标端口号:表示接收端口号,字段长为16位。 3. 序列号:表示发送数据的位置,字段长为32位。每发送一次数据,就累加一次该数据字节数的大小。 注意:序列号不会从0或1开始,而是在建立连接时由计算机生成的一个随机数作为其初始值,通过SYN包发送给接收端主机。然后再将每转发过去的字节数累加到初始值上表示数据的位置。...

ZWE7616175的博客 4万+

WSL2+Ubuntu20.04纯root环境搭建指南:告别权限烦恼的终极方案

本文提供了一份详细的WSL2+Ubuntu20.04纯root环境搭建指南,旨在为本地开发与学习打造一个免去权限干扰、极致流畅的Linux子系统环境。通过启用WSL2、安装Ubuntu 20.04,并执行核心的root用户设置,开发者可以彻底告别频繁的sudo操作,提升在文件操作、容器调试和系统配置等方面的效率。

time3的博客 474

深入浅出TCP四次挥手 (多图详解)

多图详解,深入浅出TCP四次挥手

林深不见鹿 的博客 3万+

解读文献(五)------基于阻抗控制

文章目录背景主动柔顺控制阻抗控制基于力的阻抗控制基于位置的阻抗控制力位混合控制 背景 主动柔顺控制 阻抗控制 基于力的阻抗控制 基于位置的阻抗控制 力位混合控制 ...

accumulation 1万+

关于并网继电器的继电器自检逻辑及实现方式

对于常规的光伏并网逆变器来说,继电器控制至关重要。继电器一般位于逆变电感后,共模电感前,用于将逆变电压与电网电压脱开,一般国外有双继电器的安规强制认证要求,国内目前只需要单继电器要求(后续应该会有双继电器要求,个人感觉)

weixin_29982209的博客 2616

TCP三次握手与四次挥手详解

本文详细介绍了TCP连接中的三次握手和四次挥手的原理,并在此基础上,详细介绍了其衍生的十多个面试问题。

青灯文案的博客 1万+

国产平替NeuroSky?实测金牛座TGAM脑电模块,从Arduino到Python的完整数据采集指南

本文详细介绍了国产金牛座TGAM脑电模块的完整使用流程,包括硬件连接、数据采集和Python分析。通过Arduino和Python的实战案例,展示了如何从脑电波传感器获取并解析专注度、放松度等数据,适用于专注力训练和脑机接口开发。

weixin_30735745的博客 576

TCP的三次握手与四次挥手详解

TCP 协议简述 TCP 提供面向有连接的通信传输,面向有连接是指在传送数据之前必须先建立连接,数据传送完成后要释放连接。 无论哪一方向另一方发送数据之前,都必须先在双方之间建立一条连接。在TCP/IP协议中,TCP协议提供可靠的连接服务,连接是通过三次握手进行初始化的。 同时由于TCP协议是一种面向连接的、可靠的、基于字节流的运输层通信协议,TCP是全双工模式,所以需要四次挥手关闭连接。 TCP 三次握手建立连接 所谓三次握手(Three-way Handshake),是指建立一个 TCP 连接时,需要客

m0_45861545的博客 1万+

【搭建实战】全国天气预报看板搭建

不仅如此,码匠还一站式提供了企业内部系统常用的租户管理、细粒度的权限控制、审计日志等功能,让您快速搭建后台应用的同时,也为您的企业信息安全保驾护航。是一款国内研发的开发者友好的低代码平台,您无需了解React/Vue等框架的开发、部署等各种细节,就可以快速打通前后端,连接RESTAPI、MySQL、MongoDB等多种数据源,然后通过一套开箱即用的组件,轻松搭建功能完善的数据看板、数据洞察、Admin管理后台等多种应用。天气预报对我们的各项活动有很大的帮助,可以让我们合理安排自己的出行等活动。...

weixin_39545889的博客 429

新手入门:N-CMAPSS数据集解析与实战指南

本文详细解析了N-CMAPSS数据集的结构与应用,为新手提供航空发动机故障预测的实战指南。通过Python代码示例展示数据加载、探索和特征工程技巧,帮助读者快速掌握剩余寿命(RUL)预测的关键步骤,并分享常见问题解决方案与进阶学习路径。

weixin_29056701的博客 376

TCP三次握手、四次挥手过程详解

为什么“握手”是三次,“挥手”却要四次? 为什么客户端在TIME-WAIT阶段要等2MSL? 如果只有两次握手会发生什么? 如果已经建立了连接,但是客户端突然出现故障了怎么办? 看看详解吧!

CC_Together的博客 6893

从零开始学习CANoe(十六)—— Graphics

Graphics是一种以时间轴为横坐标,符号值为纵坐标的显示分析方法,相对于Trace来说,更直观的观察出信号的跳变

蚂蚁小兵 9194

一文彻底搞懂TCP三次握手和四次挥手,及常见的面试题带答案

TCP(传输控制协议)是一种可靠的、面向连接的协议。在TCP/IP协议栈中,它负责在两个网络应用程序之间建立可靠的会话连接。TCP通过“三次握手”建立连接,通过“四次挥手”断开连接。本文将详细介绍这两个过程,并给出一些面试题及答案。

码农code之路 1742

【软件测试】- 公有云、私有云、混合云简介以及如何在公有云与私有云上分别搭建测试环境

公有云、私有云以及混合云是目前云计算领域的三种主要模式。它们之间的区别主要在于部署方式、数据访问和管理控制的不同。在阿里云或腾讯云上使用 Kubernetes 和 Docker 搭建测试环境可以提供高度的可伸缩性和灵活性。这样的环境非常适合于需要在多种配置和条件下进行测试的复杂应用。通过云服务提供的工具和服务,可以轻松管理和监控整个测试过程。在云服务上搭建测试环境涉及选择合适的云提供商、配置云资源、安装和设置所需软件等步骤。### 1. 选择云服务提供商。

weixin_46453070的博客 2342

NTscan扫描工具

ntscan是一个扫描器,可以扫描没有密码和弱密码的共享,先到配置文件中填写猜测的用户名和密码,扫描过程中右侧出现的是扫描日志。

经典面试题:TCP 三次握手、四次挥手详解

在面试过程中,TCP 三次握手、四次挥手也经常被问到的问题。本文就来快速、详细的介绍下 TCP 三次握手、四次挥手的全部过程。

分享 Go、云原生、AI Infra 相关技术 1127

TMS_WebGMaps_1.9.8.0_Full_Source

TMS_WebGMaps_1.9.8.0_Full_Source 全源码 delphi cbuilder

【计网】TCP 协议详解 与 常见面试题

介绍了TCP/IP模型,以及各个层次的作用和协议,还详细介绍了TCP协议的建立与端口过程

xiaoxualg的博客 1686

IEM模型,地表粗糙度模拟

利用微波反演土壤水分时候,利用IEM模型可以实现对随机地表的模拟

怀旧版电脑GBC模拟器

再现原版GBC掌机的界面,电脑运行连游戏界面都一样大小,很怀旧,很真实,(英文版)强烈推荐,很小的文件,很难才找到的。

常见面试题:TCP的四次挥手和TCP的滑动窗口

咱们来总结一下 TCP 采用四次挥手来释放连接,在第一次挥手的过程中呢,client 向 server 呢发送了一个报文。用来关闭 client 到 server 的数据传送。client 呢,就进入到了 finish wait 1 这么一个状态当中。在第二次挥手的过程中,我们的这个 server 在收到了 client 发来的包文之后。会发送一个 ack 给 client,并且我们的小写的 ack 及确认序号,就是我们之前收到的这个 client 发来的。序号加一。

程序员波特 1149

TCP的三次握手,四次挥手及常见面试题详解

TCP的三次握手,四次挥手及常见面试题详解 一.引子 网络之间数据的传输离不开TCP和UDP协议,我们常用的微信就是基于UDP协议进行传输的。详细了解这两个协议对我们服务器的排错,以及安全防护可以起到不错的作用。笔者整理了下面的文档,希望对大家的学习有帮助。 二.TCP的三次握手和四次挥手 1…基本概念(两者区别及TCP头部) 1)TCP和UDP的区别: TCP:Transmission Control Protocol 传输控制协议 UDP:User Datagram Protocol 用户数据报协议

weixin_47678667的博客 1320
上一篇: TCP半连接队列和全连接队列
下一篇: 如何理解TCP是面向字节流协议及粘包问题解决
small_engineer
博客等级 码龄7年 3191粉丝 54原创
评论 2
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值