TCP三次握手四次挥手及time_wait状态解析

news2024/12/25 0:53:59

TCP的建立——三次握手

在这里插入图片描述
1.服务器必须准备好接受外来的连接。通常通过调用socket,bind,listen这三个函数来完成,我们称之为被动打开(passive open)。
2. 客户端通过调用connect函数发起主动的打开(active open)。这导致客户TCP发送一个SYN(同步)分节,它告诉服务器客户将在(待建立的)连接中发送的数据的初始序列号。通常SYN分节不携带任何数据,其所在IP数据报只含有一个IP首部,一个TCP首部以及可能有的TCP选项。
3. 服务器必须确认(ACK)客户的SYN,同时自己也发送一个SYN分节,它含有服务器将在同一连接中发送的数据的初始序列号。服务器单个分节中发送SYN和客户SYN的ACK(确认)。(客户端的connect函数返回)
4. 客户必须确认服务器发来的SYN,发送一个ACK,然后服务器的accept函数返回。

这种交换至少需要三个分组,因此称之为TCP的三次握手。上图展示了所交换的三个分节。

SYN、ACK的序列号

上图给出的客户初始序列号为J,服务器的初始序列号为K。ACK中的确认号发送这个ACK一端所期待的下一个序列号。因为SYN占据一个字节的序列号空间,所以每一个SYN的ACK确认号就是SYN的初始序列号加1。类似的下文中断开连接的FIN的ACK也是FIN的序列号加1。

当然三次握手最主要的目的是为了知道双方的初始序列号,因为TCP是全双工通信。这样后续的信息的收发才能确保准确安全

TCP断开——四次挥手

在这里插入图片描述

TCP终止一个连接需要四个分节。
1.某个应用进程首先调用close,我们称之为该端执行主动关闭(active close)。该端的TCP于是发送一个FIN分节,表示数据发送完毕。
2.接收到这个FIN的对端执行被动关闭(passive close)。这个FIN由TCP确认(发送ACK进行确认)。它的接收也作为一个文件结束符(end-of-file)传递给接收端应用进程(放在已排队等候应用进程接收的任何其它数据之后),因为FIN的接收意味着接收端应用进程在相应连接上再无额外数据可接收。
3.一段时间后,接收到这个文件结束符的应用进程将调用close关闭它的套接字。这导致它的TCP也发送一个FIN。
4.接收这个最终FIN的原发送端TCP(即主动关闭的那一端)确认这个FIN(发送ACK进行确认)。

既然每个方向都需要一个FIN和一个ACK,因此通常需要四个分节,所以我们称他为四次挥手。

在步骤2与步骤3之间,执行被动关闭的一端到执行主动关闭一端数据流动是可能的。这称为半关闭

面试经典问题,tcp四次挥手可以变成三次吗?
答案是可以的。我们先抓个包来验证一下:
在这里插入图片描述
大家可以看到,这里我将客户端关闭并抓包进行查看,首先是客户端(port = 44722)给服务端(port = 8848)发送了一个FIN请求关闭,然后服务端将FIN和ack合并成一条发给了客户端,然后客户端在发送ack给服务端,关闭完成。
这里四次挥手->三次挥手就是服务端将FIN和ack合并成一条进行发送。为什么会进行合并呢?是因为在关闭的时候,服务端没有数据发送给客户端,然后优化后就会将FIN和ack合并在一起发送给客户端。


time_wait

1. 首先什么是time_wait

在这里插入图片描述
如上图,在服务器端发送一个FIN时,客户端会处于time_wait状态。当处于time_wait状态时,我们无法创建新的连接,因为端口被占用。

2. time_wait有什么作用

(1)可靠的终止TCP连接。
若处于time_wait的客户端发送给服务器确认报文段丢失的话,服务器将在此重新发送FIN报文段,那么客户端必须处于一个可接收的状态就是time_wait状态而不是close状态。
(2)保证让迟来的TCP报文段有足够的时间识别并丢弃
linux中一个TCP端口不能被打开两次或两次以上,当客户端处于time_wait状态时我们将无法使用此端口建立新连接,如果不存在time_wait状态,新连接可能会收到旧连接的数据。

为什么在time_wait中就可以保证旧数据完全被销毁?

因为网络中数据存在时间最大为MSL(maxinum segment lifetime),而time_wait 持续时间为2MSL所以保证网络中的数据可以丢弃。

3一定是客户端才有time_wait状态吗?

不一定。
 当客户端进行主动关闭时,time_wait存在于客户端,但是当服务器执行主动关闭或者发生异常时,会产生在服务器,所以当服务器异常断开时,你可能需要等待一会才能重启服务器,如果你立即重启服务器,终端会提醒你端口被占用。

在这里插入图片描述
上图是我们启动服务器正常运转,当我的服务器发生异常时,time_wait就存在于服务器,然后我立即重启服务器,则bind函数会返回,如下图所示,端口被占用。
在这里插入图片描述

如何避免time_wait状态占用资源

如果是客户端,我们一般不需要担心,因为客户端一般选择的都是临时端口,再次创建新的连接会分配未被占用的端口。除非客户端指定使用某一个端口,但是不需要这么做。
如果在服务器主动关闭后异常终止,因为服务器使用的是指定的服务器端口,所以time_wait状态将导致它不能重启,需要等待一段时间,但在大型服务器中,会造成巨额的损失。
如何避免这种情况的发生呢? 
1.我们可以使用socket的选项SO_REUSEADDR来强制进程立即使用time_wait状态的连接占用端口。通过setsockopt设置后,即使服务器处于time_wait状态,与之绑定的socket地址也可以立即被重启使用。

setsockopt的用法
在这里插入图片描述
当我在我的服务器中设置好之后,我异常关闭服务器再立即重启就不会显示端口被占用,而是立即可以重启。

2、设置SO_LINGER套接字选项也可以避免TCP的time_wait状态。

#include<sys/socket.h>
struct linger
{
	int l_onoff;
	int l_linger;
};

如果将l_onoff设置为非0值,而l_linger为0。那么当close某个连接时,TCP将中止该连接。这就是说TCP将丢弃保留在套接字发送缓冲区的任何数据,并发送RST给一个对端,而没有通常的四次挥手连接终止序列。这么一来就避免了TIME_WAIT状态。
但是会存在一个问题,在2MSL秒内我们创建该连接的一个化身,导致来自刚被终止的连接上的旧的重复分节被不正确地递送到新的化身上。
下面我们用实际例子进行讲解

我们在服务器端给监听套接字listenfd设置了SO_LINGER选项
    //设置SO_LINGER选项
    struct linger ser_lin;
    ser_lin.l_onoff = 1;
    ser_lin.l_linger = 0;
    setsockopt(listenfd, SOL_SOCKET, SO_LINGER, &ser_lin, sizeof(ser_lin));

然后我们用客户端进行连接,并断开,我用tcpdump抓到如下的包

可以看到当客户端(port = 39624)给服务端(port = 6666)发送了一个FIN分节,告知服务器。因为服务端设置了如上的SO_LINGER选项,导致服务端给客户端发送了RST分节,当客户收到这个分节后就立即断开。因为没有了正常的四次挥手断开连接,所以避免了TIME_WAIT状态。

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

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

相关文章

【分享】除了压缩文件,WinRAR还有这些好用的功能

WinRAR是一款功能强大的压缩软件&#xff0c;可以解压缩RAR、ZIP及其它类型文件。但很多人不知道&#xff0c;除了解压、压缩文件&#xff0c;WinRAR还有其他的功能&#xff0c;今天小编就来分享一下。 功能一&#xff1a;锁定文件&#xff0c;禁止增删或修改压缩包里的文件 W…

国内外人工智能AI工具网站大全(一键收藏,应有尽有)

本文由 大侠(AhcaoZhu)原创&#xff0c;转载请声明。 链接: https://blog.csdn.net/Ahcao2008 国内外人工智能AI工具网站大全&#xff08;一键收藏&#xff0c;应有尽有&#xff09;摘要一、AI写作工具二、AI图像工具2.1、常用AI图像工具2.2、AI图片插画生成2.3、AI图片背景移除…

基于电子商务平台客户管理系统的设计与实现_kaic

摘要 本论文旨在设计和实现一个基于电子商务平台的客户关系管理系统&#xff0c;以提高企业与客户之间的互动和关系维护效率。本文首先介绍了客户关系管理系统的相关理论和技术&#xff0c;并分析了其在电子商务平台中的应用价值。接着&#xff0c;进行了电子商务平台客户关系管…

微信小程序python+vue今日菜谱美食点赞收藏评价系统

谈到外出就餐&#xff0c;我们除了怕排队&#xff0c;也怕这家餐厅的服务员不够用&#xff0c;没人为我们点餐&#xff0c;那么一餐饭排队一小时&#xff0c;点餐恐怕也要花个半小时&#xff0c;这样不仅给消费者的用餐体验大打折扣同时也给商家的口碑造成了严重负面的影响&…

【LeetCode: 剑指 Offer II 090. 环形房屋偷盗(打家窃舍) | 暴力递归=>记忆化搜索=>动态规划】

&#x1f34e;作者简介&#xff1a;硕风和炜&#xff0c;CSDN-Java领域新星创作者&#x1f3c6;&#xff0c;保研|国家奖学金|高中学习JAVA|大学完善JAVA开发技术栈|面试刷题|面经八股文|经验分享|好用的网站工具分享&#x1f48e;&#x1f48e;&#x1f48e; &#x1f34e;座右…

不可区分混淆:GGH+13

参考资料&#xff1a; Joe Kilian. Founding cryptography on oblivious transfer. In Janos Simon, editor, STOC, pages 20–31. ACM, 1988.Barak B, Goldreich O, Impagliazzo R, et al. On the (im) possibility of obfuscating programs[C]//Advances in Cryptology—CRY…

音视频八股文(2)--ffmpeg常见命令(1)

官方文档&#xff1a; https://www.ffmpeg.org/ffplay-all.html https://www.ffmpeg.org/ffmpeg-all.html 01-Windows FFMPEG命令行环境搭建 要在Windows系统上使用FFmpeg命令行&#xff0c;可以按照以下步骤搭建环境&#xff1a; 1.访问FFmpeg官方网站&#xff0c;下载已经…

《趣学数据结构》大纲

文章目录趣学数据结构一、数据结构入门&#xff08;一&#xff09;数据结构的基础知识1、基本概念&#xff08;1&#xff09;数据&#xff08;2&#xff09;数据元素&#xff08;3&#xff09;数据项&#xff08;4&#xff09;数据对象&#xff08;5&#xff09;数据结构2、逻辑…

利用在线Linux内核代码阅读分析网站linux kernel map分析CFS调度器代码调用链路

linux kernel map网址 https://makelinux.github.io/kernel/map/ 源码分析 点击Scheduler标签内的kernel/sched/ 左侧菜单&#xff0c;选择一个内核版本 Search Identifier搜索框输入要搜索的函数&#xff0c;回车执行搜索 结果列出了一处函数定义及两处引用 新窗口打开定义 …

14.Java面向对象----Object类

Object类 Java中Object 类是所有类的父类&#xff0c;也就是说 Java 的所有类都继承了 Object&#xff0c;子类可以使用 Object 的所有方法。 Object 类位于 java.lang 包中&#xff0c;编译时会自动导入&#xff0c;我们创建一个类时&#xff0c;如果没有明确继承一个父类&am…

【Spark】介绍 快速入门

目录 介绍 Spark and Hadoop Spark or Hadoop 核心模块 Spark Core Spark SQL Spark Streaming Spark MLlib Spark GraphX 快速上手 来源&#xff1a; 介绍 Spark 是一种基于内存的快速、通用、可扩展的大数据分析计算引擎。 Spark and Hadoop HadoopHadoop 是由 java…

Linux 网络I/O模型

一、Linux下面的I/O模型 Linux下面一共有五种可以使用的I/O模型&#xff0c;如下&#xff1a; 1&#xff09;阻塞式I/O 2&#xff09;非阻塞式I/O 3&#xff09;I/O多路复用&#xff08;select与epoll&#xff09; 4&#xff09;信号驱动式I/O 5&#xff09;异步I/O 下面重点介…

知识图谱-实体抽取

命名实体识别&#xff08;Named Entity Recognition&#xff0c;简称NER&#xff09;是信息抽取、问答系统、句法分析、机器翻译等应用领域的重要基础工具&#xff0c;在自然语言处理技术走向实用化的过程中占有重要地位。一般来说&#xff0c;命名实体识别的任务就是识别出待处…

【产品设计】电商后台系统设计--库存

电商后台产品&#xff0c;涉及众多模块&#xff0c;而以商品、订单、库存为核心模块&#xff0c;模块间存在大量交互。库存决定商品是否可售卖&#xff0c;下单是否能成功。 电商中的库存管理是为了保证前台商品的正常售卖&#xff0c;库存的管理和仓库密不可分&#xff0c;而仓…

Midjourney详细注册和使用教程

来源&#xff1a;Midjoureny详细注册使用教程【探索ChatGPT】 Midjourney&#xff0c;用户只需要输入一段图片的文字描述&#xff0c;即可生成精美的绘画&#xff0c;相信了解Midjourey的小伙伴已经对它强大之处而赞叹&#xff01; 下面是用通俗易懂的步骤教会大家如何注册和…

【严蔚敏版数据结构】你分得清顺序栈和链栈吗

【严蔚敏版数据结构】顺序栈和链栈的剖析和对比一、顺序栈和链栈的存储结构二、顺序栈和链栈的初始化三、顺序栈和链栈的判断是否栈空四、顺序栈和链栈的入栈五、顺序栈和链栈的弹栈六、顺序栈和链栈的取栈顶元素一、顺序栈和链栈的存储结构 顺序栈的存储结构图如下&#xff1…

Windows 10系统,JDK安装与环境变量配置

引言 随着互联网的日益发展, 越来越多的小伙伴加入了程序员这个行列, 也有很多小伙伴正计划学习编程, 学习Java 那么对于新手来说, 第一件事就是下载安装Java开发工具包, 也就是JDK, 今天我们就来一起详细的说说怎么操作 JDK版本描述 学习环境中, 我们通常使用较新版本的JD…

支持PHP运行环境和系统防火墙配置管理,1Panel开源面板v1.1.0发布

2023年4月17日&#xff0c;现代化、开源的Linux服务器运维管理面板1Panel正式发布v1.1.0版本。 在这一版本中&#xff0c;1Panel新增支持PHP运行环境、系统防火墙配置管理以及同步本地应用等功能&#xff0c;并带来了40多项功能更新和问题修复&#xff0c;感谢各位社区用户的反…

回归预测 | MATLAB实现GA-LSTM遗传算法优化长短期记忆网络的数据多输入单输出回归预测

回归预测 | MATLAB实现GA-LSTM遗传算法优化长短期记忆网络的数据多输入单输出回归预测 目录回归预测 | MATLAB实现GA-LSTM遗传算法优化长短期记忆网络的数据多输入单输出回归预测效果一览基本介绍程序设计参考资料效果一览 基本介绍 MATLAB实现GA-LSTM遗传算法优化长短期记忆网…

nvm管理node

开发的时候node版本不兼容问题频频出现&#xff0c;就得安装多个版本node&#xff0c;nvm管理起来就很方便。 首先nvm是一个nodejs的版本管理工具。为了解决node.js各种版本存在不兼容现象可以通过它安装和切换不同版本的node.js。 打开CMD&#xff0c;输入命令 nvm &#xf…