TCP协议中断开连接机制

news2024/11/16 13:47:32

目录

客户端与服务端四次挥手

关于TIME_WAIT状态

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


客户端与服务端四次挥手

基于TCP协议通信的客户端与服务端断开连接就要进行四次挥手,如下图:

e286b7b6c8de4bc8b7755a333f359126.png

四次挥手过程中客户端与服务端状态转化:

客户端

ESTABLISHED->FIN_WAIT1:客户端主动调用close时,向服务器发送结束报文段,同时进入FIN_WAIT1状态。

FIN_WAIT1->FIN_WAIT2:客户端收到服务器对结束报文段的确认,进入FIN_WAIT2状态,开始等待服务器的结束报文段。

FIN_WAIT2->TIME_WAIT:客户端收到服务端发来的结束报文段,并确认应答。

TIME_WAIT->CLOSED:客户端需要等待一个2MSL(Max Segment Life,报文最大存活时间)才会进入CLOSED状态。

服务端

ESTABLISHED->CLOSE_WAIT:客户端主动调用close关闭连接,服务端收到结束报文段并确认应答。

CLOSE_WAIT->LAST_ACK:服务端调用close,向客户端发送结束报文段,等待确认应答。

LAST_ACK->CLOSED:服务器收到最后一个确认应答后连接被关闭。

注意:对于四次挥手,客户端和服务端有先断开连接与后端开断开连接之分。

关于TIME_WAIT状态

做一个测试:

先启动server后启动client,再ctrl+c服务端(ctrl+c就等价于close(fd)先让服务端从状态ESTABLISHED->FIN_WAIT1),然后再ctrl+c客户端,此时在服务端使用指令netstat -ntp会看到server的状态是TIME_WAIT,然后迅速启动server会出现如下情况:8bc30275260c46a6b81436d983062d2d.png

出现绑定套接字失败的错误,TCP协议规定:主动关闭连接的一方,在四次挥手完成后,要处于TIME_ WAIT状态(即连接没有关闭),等待2MSL的时间后才能转化为CLOSED状态连接才能断开,由于server是主动断开连接的一方,四次挥手后进入TIME_WAIT状态仍然不能再次监听同样的server端口因此会出现上图中的报错。

使用setsockopt()设置socket描述符的 选项SO_REUSEADDR为1, 表示允许创建端口号相同但IP地址不同的多个socket描述符
c3564c9f59484bd3b7933b34a8c4ca68.png

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

1、让通信双方历史数据得以消散。MSL是TCP报文的最大生存时间, 因此TIME_WAIT持续存在2MSL就能保证在两个传输方向上的尚未被接收或迟到的报文段都已经消失(否则服务器立刻重启,可能会收到来自上一个进程的迟到的数据, 但是这种数据很可能是错误的)
2、四次挥手断开连接时,具有较好的容错性。保证最后一个报文可靠到达(假设最后一个ACK丢失, 客户端会再重发一个FIN, 这 时服务端的连接没有断开,客户端仍然可以重发FIN。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/2076347.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

Rocm-Programming with HIP 内存分配

1. 主机内存(Host Memory) hipHostMalloc 是 HIP API 中的一个函数,它用于在主机上分配特殊的内存,这种内存被称为 "pinned" 或 "page-locked" 内存。这种内存有以下特点和用途: GPU 地址空间映射…

SD6201 同步增压DC/DC调节器芯片IC

一般描述 SD6201是高效率同步、PWM升压型DC/DC转换器,专为中型功率系统提供高效率解决方案而优化。该器件在0.9 V至4.4V的输入电压下工作,开关频率为1.4 MHz。这些功能允许使用微小、低剖面的电感和陶瓷电容器,从而最大限度地减少了整…

LivePortrait模型构建指南

一、介绍 快手可灵大模型团队开源了名为 LivePortrait 的可控人像视频生成框架,能够准确、实时地将驱动视频的表情、姿态迁移到静态或动态人像视频上,生成极具表现力的视频结果。该项目的模型产生了定性肖像动画,只要输入一张静态的肖像图像…

多线程面试常问

一、创建线程的几种方式 1、继承Thread类并重写run()方法。 public class MyThread extends Thread {Overridepublic void run() {System.out.println("通过集成 Thread 类实现线程"); } } // 如何使用 new MyThread().start() 2、实现Runnable接口并重写run()方法…

deepin(深度)社区亮相2024 RISC-V中国峰会,全力推动RISC-V生态发展

8月21日—23日,全球三大RISC-V专业展会之一、国内最大的RISC-V年度盛会——2024 RISC-V中国峰会于浙江杭州盛大召开!deepin(深度)社区携手合作伙伴出席峰会,与国内外业界专家、企业代表、研究机构及社区伙伴&#xff0…

python如何通过Json路径返回Json响应对应的值例子解析

在Python中,处理JSON数据通常使用标准库中的json模块来解析和操作JSON格式的数据。如果你想要通过JSON路径来获取JSON响应中的值,你可以使用第三方库,如jsonpath-ng,它允许你使用类似XPath的语法来查询JSON对象。 首先&#xff0…

mysql读写分离(mysql路由)

mysql路由 1. server4路由主机操作 rpm -ivh mysql-router-community-8.0.21-1.el7.x86_64.rpm # 安装路由工具 cd /etc/mysqlrouter/ vim mysqlrouter.conf # 配置文件# 均摊 [routing:ro] bind_address 0.0.0.0 bind_port 7001 destinations 192.168.228.11:3306,192.168…

LLM自对齐技术最新研究分享(一):对齐 Pipeline 数据合成(上)

欢迎关注 OpenMMLab 公众号获取一手技术干货 当我们向 ChatGPT 提问时,我们希望他能准确地回答我们的问题。当我们向他提出不合理的要求,比如询问如何制作炸弹或者如何考试作弊,我们希望他能拒绝回答并及时纠正我们的错误。AI 对齐&#xff0…

GAMES104:09高级动画技术:动画树、IK和表情动画-学习笔记

文章目录 一,动画混合1.1 数学混合:线性插值1.2 混合空间Blend Space1.2.1 1D Blend Space1.2.2 2D Blend Space1.2.3 Skeleton Masked Blending骨骼遮罩混合1.2.4 Addictive Blending 二,动画状态机Animation State Machine(ASM&…

JMeter之插件jp@gc - Stepping Thread Group

文章目录 业务场景核心功能安装教程常规使用 业务场景 在性能测试中,希望jemter能动态设置线程数,并且线程数量能从低到高依次压测接口,比如线程数量从10增加到50,通过设定一定的并发线程数,给定加压规则,遵…

并发服务器

服务器,后台服务软件,后端开发,为软件客户端提供支持,数据支持,存储支持,数据中转 高并发要求,随着用户数量的增长,服务器的设计结构扩展,为更多用户提供服务器。 Web服…

深入了解:浅拷贝深拷贝

浅拷贝和深拷贝 在java中 理解深拷贝和浅拷贝的概念对于处理对象复制时 保持数据的一致性和独立性至关重要 这两种拷贝方式主要区别在于它们如何处理对象内部的引用类型成员变量 在学习浅拷贝和深拷贝前 我们要区分 对象引用 和 对象本身的区别 对象引用:在Java中…

线上考试系统---虚拟化技术部署

部署前端服务器 1.将资源上传到服务器 scp -r dist/ root192.168.1.50:~2.在服务器上创建基础容器 [rootdocker0 ~]# docker run -it --name c0 centos:latest /bin/bash [rootc1092b8c9ce5 /]# [rootdocker0 ~]# [rootdocker0 ~]# docker attach c0 3.在容器中修改yum源 …

Using Managed Identity to Access Azure OpenAI Service

题意:使用托管身份访问 Azure OpenAI 服务 问题背景: Im working with Azure OpenAI service, and want to test its Managed Identity support. According to the docs it supports Managed Identity authentication, for example - using a VM. 我正…

鸿蒙界面开发(四):支付宝首页开发实战

利用了层叠布局和一个scroll滚动组件。 包括底部导航、顶部导航、主体的滚动窗口。 主体的滚动窗口又包括一个快捷导航栏和一个导航窗口、以及主体部分 import text from ohos.graphics.text;Entry Component struct Index {State message: string Hello World;//支付宝首页b…

全网最最最详细的企业级WEB应用服务器TOMCAT

目录 一:tomcat的介绍 Tomcat请求过程 实验部分: 1:安装 Tomcat 1.1:安装java环境 1.2:安装并启动tomcat 1.3: 查看端口 1.4:浏览器访问以下试试 2:tomcat的文件结构和组成 3&…

高性能web服务器4——Nginx反向代理A

Nginx 反向代理 Nginx 的反向代理功能是其最强大的特性之一,它允许 Nginx 作为中间层来接收客户端的请求,并将这些请求转发到后端服务器。这种架构不仅可以提高安全性,还可以实现负载均衡、缓存和内容过滤等功能。本文将详细介绍 Nginx 反向…

【neo4j】neo4j-Desktop安装

Neo4j是一个高性能的图数据库,它使用图形结构来存储和处理数据。它是一个开源的、完全事务的数据库,专门设计用于大规模的图形数据。Neo4j使用一种名为Cypher的查询语言来处理图形数据,使用户能够方便地进行复杂的图形查询和分析。 Neo4j的主…

AIGC 大模型:实践与未来

一、AIGC 大模型的概念与发展 (一)AIGC 大模型的定义与特点 AIGC(AI Generated Content)大模型是一种基于大规模数据训练的人工智能模型,具备强大的内容生成能力和多模态交互能力。它能够理解和处理多种类型的信息&a…

找不到工作四处闲逛github,我发现了一个找工作的神器

前言 到底是谁把我那不值钱的班给上了,博主找不到工作,天天游荡。 终于在github上发现一个找工作的神器,那就是:get_gobs 该项目支持定时投递,自动编写打招呼语,妈妈,再也不用担心我打招呼的…